SpringCloud微服务 之hystrix(二) 偏执的太偏执、 2022-04-22 07:56 258阅读 0赞 ## 前言 ## 上一小节为我们从概念上认识了Hystrix,本小节我们将通过实例来学习一下Hystrix的熔断机制以及Hystrux的断路器。 ## 案例 ## * Eureka Server端编写(参考前例) ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0Mzc3ODE_size_16_color_FFFFFF_t_70] * Eureka Client端服务提供方编写。 * 项目结构 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0Mzc3ODE_size_16_color_FFFFFF_t_70 1] * CoreCode @SpringBootApplication @EnableDiscoveryClient @EnableCircuitBreaker //开启Hystrix熔断机制 public class MicroserviceDealBrokerHystrixApplication { @Bean @LoadBalanced /** * 添加 @LoadBalanced 使该RestTemplate具备Ribbon均衡负载算法功能 * @return */ public RestTemplate restTemplate() { return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(MicroserviceDealBrokerHystrixApplication.class, args); } } /** * SpringCould 2.0+需要为HystrixMricsStreamServlet手动注入到ServletRegistrationBean中 * @author Administrator * */ @Component public class HystrtixStreamServlet { @Bean public ServletRegistrationBean<Servlet> getSerlvet(){ HystrixMetricsStreamServlet streamServlet = new HystrixMetricsStreamServlet(); ServletRegistrationBean<Servlet> registrationBean = new ServletRegistrationBean<>(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.addUrlMappings("/hystrix.stream"); //registrationBean.addUrlMappings("/hystrix"); registrationBean.setName("HystrixMricsStreamServlet"); return registrationBean; } } @RestController public class BrokerController { @Autowired private RestTemplate restTemplate; @Value("${server.port}") private String port; // 注入普通字符串 @GetMapping("/deal/{id}") @HystrixCommand(fallbackMethod = "findByIdFallBack") public Deal findById(@PathVariable Long id) { return this.restTemplate.getForObject("http://microservice-deal-cloud/deal/" + id, Deal.class); } /** * findById fallBack方法 * 主方法与fallback方法应保持一致(入参、返回值) * @param id * @return */ public Deal findByIdFallBack(Long id){ Deal deal = new Deal(); deal.setId(id.intValue()); deal.setName("Dustyone"); deal.setPort(port); return deal; } } server: port: 8082 spring: application: name: microservice-deal-broker-cloud-hystrix eureka: client: serviceUrl: defaultZone: http://localhost:8080/eureka/ instance: prefer-ip-address: true #开放所有的监控节点 management: endpoints: web: exposure: include: '*' #设置feign的hystrix响应超时时间(必须) hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 5000 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>microservice-deal-broker-cloud-hystrix</artifactId> <packaging>jar</packaging> <name>microservice-deal-broker-cloud-hystrix</name> <description>Demo project for Spring Boot</description> <parent> <groupId>com.example</groupId> <artifactId>microservice-deal-parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <dependencies> <!-- Eureka CLient核心组件 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!-- Ribbon核心组件 可声明此依赖也可以不生命,因为Eureka Client已依赖了Ribbon --> <!-- <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> --> <!-- pringCloud Hystrix依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> </dependencies> </project> * Eureka Client端服务提消费编写(单实例) (参考前例)。 * 访问:[http://localhost:8082/deal/2][http_localhost_8082_deal_2] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0Mzc3ODE_size_16_color_FFFFFF_t_70 2] 如上图所示,服务消费者和服务提供者正常时我们能通过消费者请求到提供者。 * 现在我们把服务提供者手动shutdown掉, ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0Mzc3ODE_size_16_color_FFFFFF_t_70 3] * 然后再访问:[http://localhost:8082/deal/1][http_localhost_8082_deal_1] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0Mzc3ODE_size_16_color_FFFFFF_t_70 4] * 然后我们访问:[http://localhost:8082/hystrix.stream][http_localhost_8082_hystrix.stream] 此时我们可以看到Hystrix 会一直再ping 降级服务(即服务提供者),这就是所谓的断路器半开状态,一旦降级服务宕机,服务消费者就会一直去尝试访问降级服务。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0Mzc3ODE_size_16_color_FFFFFF_t_70 5] * 然后我们重新将降级服务启动: ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0Mzc3ODE_size_16_color_FFFFFF_t_70 6] * 访问:[http://localhost:8082/deal/2][http_localhost_8082_deal_2] ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0Mzc3ODE_size_16_color_FFFFFF_t_70 7] 此时所有服务又都正常了,能正常访问了,Hystrix 断路器关闭。 ## 小结 ## * 要使用Hystrix功能先加入Hystrix依赖:spring-cloud-starter-netflix-hystrix(V 2.0+)然后再主类上开起Hystrix熔断机制:@EnableCircuitBreaker * 对指定的方法添加FallBack方法:@HystrixCommand(fallbackMethod = “findByIdFallBack”),需要注意的是:主方法与fallback方法应保持一致(入参、返回值)。 * 对于SpringCloud V2.0+ 当我们使用Hystrix.stream来对查看断路器监控信息是需要自定义一个HystrixMetricsStreamServlet,并将该servlet加入到ServletRegistrationBean中。并尝试着开放所有的监控节点(建议),当然如果你想对一些特定监控接口要求授权之后才能访问,可以自定义监控端点。 * 本小节用的案例:microservice-deal-eureka、microservice-deal-cloud、microservice-deal-broker-cloud-hystrix [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0Mzc3ODE_size_16_color_FFFFFF_t_70]: /images/20220422/a138b09afcbc4365b9cd8b48ad63aa9d.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0Mzc3ODE_size_16_color_FFFFFF_t_70 1]: /images/20220422/cbe8a481b4be4178a1dc74cd119027ba.png [http_localhost_8082_deal_2]: http://localhost:8082/deal/2 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0Mzc3ODE_size_16_color_FFFFFF_t_70 2]: /images/20220422/8c851ceaa6ce4475801226ca0c311091.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0Mzc3ODE_size_16_color_FFFFFF_t_70 3]: /images/20220422/2345e0a736eb4bb9a066a8dbed72aacb.png [http_localhost_8082_deal_1]: http://localhost:8082/deal/1 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0Mzc3ODE_size_16_color_FFFFFF_t_70 4]: /images/20220422/0c2c3e10d65c4f9b945927b7b5eee3c3.png [http_localhost_8082_hystrix.stream]: http://localhost:8082/hystrix.stream [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0Mzc3ODE_size_16_color_FFFFFF_t_70 5]: /images/20220422/076781d65c6644448b41dc983b8814df.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0Mzc3ODE_size_16_color_FFFFFF_t_70 6]: /images/20220422/6cd2745eb56c4b4d8878c759df4baa9f.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3UwMTI0Mzc3ODE_size_16_color_FFFFFF_t_70 7]: /images/20220422/4d9ccd244b6b42bfa2d4ba43dc141f9a.png
还没有评论,来说两句吧...