什么是SpringCloud,官网解释:Spring Cloud provides tools for developers to quickly build some of the common patterns in distributed systems.
SpringCloud提供工具给开发者,使其可以很快的创建通用式的分布式系统,目前使用比较广的是SpringCloud Eureka(服务治理框架),下面主要通过简单的demo对Eureka的使用做演示
1)首先创建SpringBoot项目(SpringCloud框架基于SpringBoot)增加pom依赖
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> |
由于是要创建Eureka Server,所以在SpringBoot启动类上增加注解@EnableEurekaServer
@EnableEurekaServer @SpringBootApplication public class SpringCloudServerApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudServerApplication.class, args); } } |
这样启动时,应用将完全只用默认配置,如果想给服务命名,或者是修改监听端口,可以在 resource/application.properties 中进行如下配置。由于此工程就是唯一的一个 EurekaServer ,这里就不向自己注册自己了,将 register-with-eureka 设置成 false。
spring.application.name=eureka-server server.port=8083 eureka.client.register-with-eureka=false |
启动服务,查看8083
可以看到没有服务注册在Eureka上
2)创建一个服务端,增加pom依赖
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> |
这是一个服务提供者,需要在启动类增加client注解,代码如下
@SpringBootApplication @EnableDiscoveryClient public class SpringCloudProviderApplication { public static void main(String[] args) { SpringApplication.run(SpringCloudProviderApplication.class, args); } } |
创建Controller类
@RestController public class Controller { @RequestMapping(value = "/test/{string}", method = RequestMethod.GET) public String echo(@PathVariable String string) { return string; } } |
最后同样是配置,除去配置应用名与监听端口外,还需要配置一下 Eureka Server 的地址。
spring.application.name=service-provider server.port=8084 eureka.client.serviceUrl.defaultZone=http://localhost:8083/eureka/ |
启动项目,刷新server服务,可以看到已经有一个client注册
调用localhost:8084/test/abcd,可以正常返回,至此服务端完成
3)编写调用方,增加pom依赖
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.SR4</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> |
客户端使用的是Spring Cloud Feign,Spring Cloud Feign是一套基于Netflix Feign实现的声明式服务调用客户端,所以pom引入了spring-cloud-starter-feign,配置好依赖,在启动类中增加注解
使用 @EnableDiscoveryClient 注解启用服务注册与发现,使用 @EnableFeignClients 注解激活 FeignClients,添加 @LoadBalanced 注解将 RestTemplate 与 AsyncRestTemplate 与服务发现结合。
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class SpringCloudConsumerApplication { @LoadBalanced @Bean public RestTemplate restTemplate() { return new RestTemplate(); } @LoadBalanced @Bean public AsyncRestTemplate asyncRestTemplate(){ return new AsyncRestTemplate(); } public static void main(String[] args) { SpringApplication.run(SpringCloudConsumerApplication.class, args); } } |
在使用 FeignClient 之前,我们还需要完善它的配置,配置服务名以及方法对应的HTTP请求,其中代码如下:
@FeignClient(name = "service-provider") public interface TestService { @RequestMapping(value = "/test/{str}", method = RequestMethod.GET) String echo(@PathVariable("str") String str); } |
最后增加配置
spring.application.name=service-consumer server.port=8085 eureka.client.serviceUrl.defaultZone=http://localhost:8083/eureka/ |
现在就可以在controller中使用
@RestController public class Controller { @Autowired private RestTemplate restTemplate; @Autowired private AsyncRestTemplate asyncRestTemplate; @Autowired private TestService testService; @RequestMapping(value = "/echo-rest/{str}", method = RequestMethod.GET) public String rest(@PathVariable String str) { return restTemplate.getForObject("http://service-provider/test/" + str, String.class); } @RequestMapping(value = "/echo-async-rest/{str}", method = RequestMethod.GET) public String asyncRest(@PathVariable String str) throws Exception{ ListenableFuture<ResponseEntity<String>> future = asyncRestTemplate. getForEntity("http://service-provider/test/"+str, String.class); return future.get().getBody(); } @RequestMapping(value = "/echo-feign/{str}", method = RequestMethod.GET) public String feign(@PathVariable String str) { return testService.echo(str); } } |
启动项目可以正常访问所有方法,这是一个简单的demo实际应用中会更为复杂