spring cloud备忘笔记-5-熔断器
笔记索引:
spring cloud备忘笔记-0-目录索引
服务雪崩
在微服务架构中,我们是根据业务来拆分成一个个服务,而服务与服务之间可以通过 RPC 相互调用,比如Spring Cloud : RestTemplate + Ribbon 、 Feign 。
为了保证其高可用,单个服务通常会集群部署。由于网络震荡或者自身的原因,服务并不能保证 100% 可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet 容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间由于具有依赖性(RPC同步通信方式),故障会传播,对整个微服务系统造成灾难性后果,这就是服务故障的 “雪崩” 效应。
而Spring cloud 采取一种熔断器
的方式来防止雪崩,它主要是整合了Netflix 开源的 Hystrix 组件。
一个请求可能会调用多个服务,而我们RPC采用的是同步的链式调用方式,
Ribbon添加熔断器
pom依赖
添加到ribbon项目中
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
然后再入口类上增加注解开启熔断器@EnableHystrix
之后我们在service中写一个熔断方法
package com.momomian.hi.spring.cloud.web.admin.ribbon.service;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
@Service
public class AdminService {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "hiError")
public String sayHi(String message) {
return restTemplate.getForObject("http://HI-SPRING-CLOUD-SERVICE-ADMIN/hi?message=" + message, String.class);
}
public String hiError(String message) {
return String.format("your message is : %s but request fail",message);
}
}
在你实际的方法上增加注解@HystrixCommand,表示这个方法启动了熔断器,fallbackMethod 是指定回调方法,一旦连不上了就会返回这个hiError方法。
你可以自己测试一下,将服务提供者项目停掉即可测试是否调用了熔断方法。
Feign使用熔断
feign自带了熔断的机制,默认是关闭的。因此我们只需要在配置文件中将其开启,实际开发中也会使用feign。
application.yml添加
feign:
hystrix:
enabled: true
此时由于feign是接口的service,我们要自己创建一个熔断器类来实现这个接口,我们在service包下创建一个hystrix包
package com.momomian.hi.spring.cloud.web.admin.feign.service.hystrix;
import com.momomian.hi.spring.cloud.web.admin.feign.service.AdminService;
import org.springframework.stereotype.Component;
@Component
public class AdminServiceHystrix implements AdminService {
@Override
public String sayHi(String message) {
return String.format("your message is : %s but request fail",message);
}
}
我们只要重写这个需要熔断器的方法,这里重写的方法就是熔断后执行的方法。记住这里这个实现类要交给spring管理。
然后我们只是实现了这个接口,但是service接口本身不知道有这个熔断类的存在,我们必须回到接口处,将原先接口的注解改为:以便告知回调方法。
@FeignClient(value = "hi-spring-cloud-service-admin",fallback = AdminServiceHystrix.class)
在实际开发的时候我们就用feign,它相当于把ribbon封装了一下。这里我们也能看出单一职责原则,一个类只做一件事。面向接口编程等编程思想。
监控熔断
使用熔断器仪表盘监控熔断的地方,方便我们管理检测。
在项目feign中增加一个依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
然后我们在入口类增加注解:@EnableHystrixDashboard
由于我们使用的是Spring Boot 2.x 这里还需要增加配置一个servlet。
我们在feign包下增加一个包config,
HystrixDashboardConfiguration .java
package com.momomian.hi.spring.cloud.web.admin.feign.config;
import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class HystrixDashboardConfiguration {
@Bean
public ServletRegistrationBean getServlet() {
HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet();
ServletRegistrationBean registrationBean = new ServletRegistrationBean(streamServlet);
registrationBean.setLoadOnStartup(1);
registrationBean.addUrlMappings("/hystrix.stream");
registrationBean.setName("HystrixMetricsStreamServlet");
return registrationBean;
}
}
这里我们使用spring boot web servlet提供的ServletRegistrationBean 类,然后配置servlet的启动顺序、访问路径、name。然后将这个对象返回给spring管理。
这样我们就配置好了。
重新启动全部项目,浏览器进入http://localhost:8785/hystrix出现以下画面。
这里长框填入我们servlet配置的映射。title随便启。点击Monitor Stream
。然后我们要去触发熔断器。我们调用写的接口:http://localhost:8785/hi?message=hello
我们可以通过关闭服务提供者项目模拟触发熔断,观察下面的变化就可以检测熔断了。
这里接口的代码可以参考前面的博客
笔记索引:
spring cloud备忘笔记-0-目录索引