SpringCloud教程(Finchley版本)-06:断路器(Hystrix-Feign)
##### 在微服务系统中,我们把系统拆分成了很多小的服务,各个服务之间通过不同的方式进行依赖和调用,为了保证服务的高可用性,单个服务通常会集群部署,此时,许多服务由于各种问题可能会调用失败,比如超时、异常等。如何能够保证在一个依赖出问题的情况下,不会出现故障传播,导致整体服务失败,这个就是Hystrix需要做的事情。Hystrix提供了熔断、隔离、Fallback、cache、监控等功能,能够在一个、或多个依赖同时出现问题时保证系统依然可用。
##### 本文介绍如何结合上一文[SpringCloud教程(Finchley版本)-05:负载均衡(Feign)](https://blog.csdn.net/weixin_39800144/article/details/84960372),使用Hystrix来实现熔断功能。主要分为以下几个步骤:
- 1.创建项目
- 2.引入依赖
- 3.修改配置文件
- 4.添加启动注解
- 5.跨服务调用
- 6.熔断实现
- 7.启动项目,测试
### 1.创建项目
新建一个Springboot项目feign_server1。
### 2.引入依赖
```
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
```
```
<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: 8015
spring:
application:
name: feign-server1
eureka:
client:
service-url:
default: http://localhost:8761/eureka/
feign:
hystrix:
enabled: true
```
### 4.添加启动注解
启动类添加@EnableFeignClients,开启Feign的负载均衡功能
```
//开启Feign的负载均衡功能
@EnableFeignClients
@EnableEurekaClient
@SpringBootApplication
public class FeignServer1Application {
public static void main(String[] args) {
SpringApplication.run(FeignServer1Application.class, args);
}
}
```
### 5.跨服务调用
写个简单的接口方法来调用。
#### 5.1controller
```
@RestController
//@RequestMapping(value = "feign")
public class FeignController {
//编译报错,可以不用管,程序启动时才会注入此bean
@Autowired
FeignService feignService;
@GetMapping("getCompany")
public String getCompany(String id){
String company = feignService.getCompany(id);
System.out.println(company);
return company;
}
}
```
#### 5.2service
通过@FeignClient来指定我们调用哪个服务,前面启动了两个服务,都为company-server,feign会通过服务名来调用服务。
```
//通过此注解,来指定调用哪个服务
@FeignClient(value = "company-server")
public interface FeignService {
/**调用company-server服务中的company/get接口*/
@GetMapping(value = "/company/get")
String getCompany(@RequestParam(value = "id")String id);
}
```
### 6.熔断实现
Feign中实现熔断功能非常简单,只需要在上面的@FeignClient中指定fallback的实现即可,然后在接口的实现类中添加熔断逻辑。
#### 6.1service
只是在上面5.2中做了简单的修改
```
//通过此注解,来指定调用哪个服务
//如果开启了断路器,只需要添加fallback,在此接口实现类中添加熔断方法即可
@FeignClient(value = "company-server",fallback = FeignServiceImpl.class)
public interface FeignService {
/**调用company-server服务中的company/get接口*/
@GetMapping(value = "/company/get")
String getCompany(@RequestParam(value = "id")String id);
}
```
#### 6.2serviceImpl
添加断路器的实现逻辑,实现熔断方法。
```
@Component
public class FeignServiceImpl implements FeignService{
//熔断方法
@Override
public String getCompany(String id) {
return "服务出错,返回指定企业信息:华为"+id;
}
}
```
### 7.启动项目,测试
启动项目,然后访问接口http://localhost:8015/getCompany?id=36,可以看到服务会自动负载到两台服务上。
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181211195801510.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181211195814614.png)
如果挂掉8011服务,可以看到访问结果如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181211195825748.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181211195837421.png)
下一篇:[SpringCloud教程(Finchley版本)-07:网关(zuul)](https://blog.csdn.net/weixin_39800144/article/details/85012374)
完整源码参考:https://github.com/myJava4all/springcloudfinchley
- 点赞
- 收藏
- 关注作者
评论(0)