在Spring boot项目中使用Spring cloud组件,首先要明白当前自己用的Spring boot对应的Spring cloud版本是什么。
参考 https://spring.io/projects/spring-cloud Release Trains 部分。一定要将注意版本问题,最好匹配下版本,不然容易出现意外的错误。
我的项目是基于spring boot 2.0.1.RELEASE的,所以以下dependence都是基于这个spring boot版本的。
首先spring cloud版本对应的使用:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR2</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
-
Eureka
服务注册中心
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
服务客户端
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
应用主类添加注解
@EnableDiscoveryClient
在Spring cloud Dalston版本前netflix下的项目在pom文件中的
artifactId
基本是spring-cloud-starter-eureka-server
,在Spring cloud F版本之后基本上是:spring-cloud-starter-netflix-eureka-client
名称加上了netflix。
-
Ribbon
负载均衡
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
-
Feign
Feign使得编写java http客户端变得更容易 https://github.com/OpenFeign/feign
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
应用主类添加注解
@EnableFeignClients
示例:
// 客户端名称 @FeignClient("risk-management") public interface RiskManagementClient { // controller中对外接口名称 @RequestMapping(value = "valid", method = RequestMethod.GET) String valid(); } //具体使用 @Autowired RiskManagementClient riskManagementClient; @RequestMapping(value = "/consumer", method = RequestMethod.GET) public ResponseEntity<Object> valid() { String msg = riskManagementClient.valid(); return Response.success(msg); }
使用Feign可以让通过Http调用远程接口的方式像调用接口一样轻松,Feign本身就有"假装,伪装"的意思,意思是使用Feign就像使用接口一样吧。
-
Hystrix
Hystrix是一个延迟和容错库,旨在隔离对远程系统,服务和第三方库的访问点,停止级联故障,并在复杂的分布式系统中实现弹性,在这些系统中,故障是不可避免的。
https://github.com/Netflix/Hystrix
应用主类中添加注解,开启Hystrix
@EnableCircuitBreaker
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency>
新增一个service
@Service public class RiskManagementService { @Autowired RiskManagementClient riskManagementClient; @HystrixCommand(fallbackMethod = "fallback") public String valid(OrderRBO orderRBO) { String msg = riskManagementClient.valid(orderRBO); return msg; } public String fallback(OrderRBO orderRBO) { return "银行服务升级中,暂不可用!"; } } ``` 前端controller中现在调用这个Service ``````java @Autowired RiskManagementService riskManagementService; @RequestMapping(value = "/consumer", method = RequestMethod.POST) public ResponseEntity<Object> valid(@RequestBody OrderRBO orderRBO) { String msg = riskManagementService.valid(orderRBO); return Response.success(msg); }
最终的应用主类如下:
@EnableFeignClients @EnableDiscoveryClient @SpringBootApplication @EnableCircuitBreaker public class BankServiceApplication { public static void main(String[] args) { SpringApplication.run(BankServiceApplication.class, args); } @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); } }
当服务提供方出现异常,没有正常返回时,valid接口回返回“银行服务升级中,暂不可用”。
如果出现:
No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-netflix-ribbon?
检查是否缺少以上几个包的引用。