SpringCloud教程(Finchley版本)-04:断路器(Hystrix-Ribbon)
##### 在微服务系统中,我们把系统拆分成了很多小的服务,各个服务之间通过不同的方式进行依赖和调用,为了保证服务的高可用性,单个服务通常会集群部署,此时,许多服务由于各种问题可能会调用失败,比如超时、异常等。如何能够保证在一个依赖出问题的情况下,不会出现故障传播,导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。
##### 本文介绍如何结合上一文[SpringCloud教程(Finchley版本)-03:负载均衡(Ribbon)](https://blog.csdn.net/weixin_39800144/article/details/84638394),使用Hystrix来实现断路器功能。主要分为以下几个步骤:
- 1.创建项目
- 2.引入依赖
- 3.修改配置文件
- 4.添加启动注解
- 5.注入模板类
- 6.跨服务调用
- 7.启动项目,测试
### 1.创建项目
新建一个Springboot项目hystrix_ribbon_server1。
### 2.引入依赖
```
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--eureka ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</dependency>
<!--hystrix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
```
```
<!--springcloud依赖管理-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
```
```
<spring-cloud.version>Finchley.SR2</spring-cloud.version>
```
### 3.修改配置文件
```
server:
port: 8017
spring:
application:
name: hystrix-ribbon-server
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
```
### 4.添加启动注解
### 5.注入模板类
4.5步骤和前文的Ribbon一样。
```
package com.java4all.hystrix_ribbon_server1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@EnableHystrix
@EnableEurekaClient
@SpringBootApplication
public class HystrixRibbonServer1Application {
/**
*
* @Bean : 注入一个名为restTemplate的bean
* @LoadBalanced :表明这个 restTemplate 开启了负载均衡的功能
*
* */
@Bean
@LoadBalanced
RestTemplate restTemplate(){return new RestTemplate();}
public static void main(String[] args) {
SpringApplication.run(HystrixRibbonServer1Application.class, args);
}
}
```
### 6.跨服务调用
写一套简单的业务代码,然后调用前面创建的company-server服务提供的接口。
#### 6.1 controller
```
@RestController
@RequestMapping(value = "hrs")
public class HrsController {
@Autowired
private HrsService hrsService;
@GetMapping(value = "getCompany")
public String getCompany(String id){
String company = hrsService.getCompany(id);
System.out.println(company);
return company;
}
}
```
#### 6.2 service
```
public interface RibbonService {
String getCompany(String id);
}
```
#### 6.3 serviceImpl
在serviceImpl实现类中,我们引入前面的RestTemplate模板类,来跨服务调用,并开启了负载均衡功能。
在getCompany方法上添加@HystrixCommand注解。该注解对该方法创建了熔断器的功能,并指定了fallbackMethod熔断方法erroCompany,熔断方法直接返回了一个字符串
```
@Service
public class HrsServiceImpl implements HrsService{
//启动类中注入了此模板,并且开启了负载均衡功能
@Autowired
RestTemplate restTemplate;
//给方法添加熔断器的功能,并指定熔断方法
@HystrixCommand(fallbackMethod = "erroCompany")
@Override
public String getCompany(String id) {
//程序名替代服务地址,ribbon会根据服务名自动选择服务实例
String company = restTemplate
.getForObject("http://company-server/company/get?id=" + id, String.class);
return company;
}
/**熔断方法*/
public String erroCompany(String id){
return "服务出错,返回默认企业:"+id;
}
}
```
### 7.启动项目,测试
此时,启动项目,访问http://localhost:8017/hrs/getCompany?id=234,我们这个项目的接口会去调用前面启动的企业服务,由于企业服务启动了两台:8011,8014,那么,通过ribbon负载均衡后,会分发到两台服务上。如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181211160156742.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181211160207398.png)
当我们把8011挂掉后,此时,由于eureka更新服务列表默认时间为30s,这之间,如果请求落在8011上,那么,就会调用熔断方法,返回指定的结果,如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181211160217240.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181211160223627.png)
下一篇:[SpringCloud教程(Finchley版本)-05:负载均衡(Feign)](https://blog.csdn.net/weixin_39800144/article/details/84960372)
完整源码参考:https://github.com/myJava4all/springcloudfinchley
- 点赞
- 收藏
- 关注作者
评论(0)