1. 前言

微服务拥有完整的额熔断机制,比如限流,隔离,熔断等。具体详细信息还需要自己去查找资料研究一下。当我们的某个微服务中的某个接口出现错误后,这个微服务不会挂掉,而是以一种“优雅”的方式返回给用户回应。

2. 断路器的作用

首先,由于断路器允许开发人员处理服务故障,客户端可以以一种优雅的方式随时间动态地适应服务可用性的变化。

其次,在微服务架构中共享状态的断路器提供了网络效果,可以显著提高故障响应能力。

第三,断路器与智能路由和负载均衡相结合,可以自动用健康的服务实例替换故障的服务实例,从而促进自修复。

3. 代码的编写

3.1 加入依赖,修改父pom文件

熔断有两种依赖,一个是专业的熔断器:hystrix。一个是我们用于微服务之间通信的openfeign。其中openfeign已经包含了hystrix。但是为了学习熔断,我们还是使用hystrix。

<!--熔断-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.1.3.RELEASE</version>
</dependency>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

我们在my-user和my-student的微服务中都加入这个依赖。

3.2 加入注解StuApplication.java

以my-student微服务为例

修改StuApplication.java,加入注解

@EnableCircuitBreaker
  • 1.
3.3 修改配置文件my-student-dev.yml
# 开启熔断
feign:
  hystrix:
    enable: true
  • 1.
  • 2.
  • 3.
  • 4.
3.4 加入断路器函数
//学生查询
@RequestMapping(value = "/get", method = RequestMethod.POST)
@HystrixCommand(fallbackMethod = "postFallBack", commandProperties = {
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000")
})
public JSONObject getStudent(@RequestBody JSONObject jsonObject){
 ...
 ...
}
/**
 * 获取学生姓名和学号
 * */
@RequestMapping(value = "/stu_name/&/stu_no/get", method = RequestMethod.GET)
@HystrixCommand(fallbackMethod = "getFallBack", commandProperties = {
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000")
})
public JSONObject getStuNameAndNo(){
...
...
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.

可见我们在接口函数上面分别加入了熔断器

@HystrixCommand(fallbackMethod = "postFallBack", commandProperties = {
        @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "5000")
})
  • 1.
  • 2.
  • 3.

这段话的意思是指:若下面函数(getStudent)出现错误的时候,熔断器便自动会去执行postFallBack这个方法。commandProperties={…}:服务降级的一些设置,当调用函数等待超过5s,就会自动发生服务降级,去执行postFallBack。

其他函数也是加入如上两个断路器设置。

3.5 熔断函数
/**
 * 熔断函数
 * */
public JSONObject getFallBack(){
    JSONObject result = new JSONObject();
    result.put("state",201);
    return result;
}

public JSONObject postFallBack(JSONObject jsonObject){
    JSONObject result = new JSONObject();
    result.put("state",201);
    return result;
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.

设计期望:当发生熔断后,返回前端代码201。

4. 总结

熔断有很多策略,会设计到很多知识,这里展示的只是一个最简单的应用。还没想到如何测试熔断,所以先写上再说。