• Spring Cloud(三):服务容错保护——Spring Cloud Hystrix


      在微服务架构中,通常会出现服务不可用的现象,假设A为服务提供者,B为A服务的调用者,C、D为B服务的调用者,那么当A服务不可用之后,随着时间的推移就会导致B服务不可用,B服务的不可用可能会导致C、D服务的不可用,最终导致整个系统的不可用,为了解决这种级联失败的问题,在分布式架构中出现了断路器等一系列服务保护机制。

      在Spring Cloud中使用Hystrix实现断路器,Spring Cloud Hystrix是基于Netflix的开源框架Hystrix实现的。断路器的开关由关闭到打开的状态是通过当前服务健康状态(服务健康状态=请求失败数/请求总数)和设定阈值(默认10秒内的20次故障)比较决定的。当断路器开关关闭时,请求允许通过断路器,如果当前服务健康状态高于设定的阈值,则开关继续保持关闭;如果当前服务状态低于设置的阈值,则开关切换为打开状态。当断路器开关打开时,请求禁止通过,如果设置了fallback方法,则会进入fallback的流程,当断路器开关处于打开状态时,经过一段时间,断路器会自动进入半开状态并允许一个请求通过,如果该请求调用成功,则断路器会恢复到断开状态,否则继续保持打开状态。

      本节在上一节的项目基础上进行搭建,项目地址:https://github.com/francis785/springclouddemo.git ,要使用Spring Cloud Hystrix,只需要做如下几步即可:

    1. 创建 springcloud-demo-user-hystrix 的模块, pom.xml 文件内容如下:

    <?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">
        <parent>
            <artifactId>springcloud-demo-parent</artifactId>
            <groupId>com.fix</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
    
        <artifactId>springcloud-demo-user-hystrix</artifactId>
        <dependencies>
            <!--Finchley,Greenwich版本的spring cloud,创建客户端工程的时候需要引入该依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
            <!--hystrix断路器支持-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            </dependency>
            <!--hystrixCommandAspect 的初始化依赖于com.google.common.collect.ImmutableMap-->
            <dependency>
                <groupId>com.google.guava</groupId>
                <artifactId>guava</artifactId>
                <version>28.0-jre</version>
            </dependency>
        </dependencies>
    </project>

    2. 编写 application.yaml :

    server:
      port: 8030
    eureka:
      instance:
        prefer-ip-address: true     #是否显示主机的Ip
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/     #指定eureka服务端地址
    spring:
      application:
        name: springcloud-demo-user-hystrix

    3. 编写主类 UserHystrixMain ,并给主类加上 @EnableCircuitBreaker 注解表示开启断路器功能:

    @SpringBootApplication
    @EnableEurekaClient
    @EnableCircuitBreaker
    public class UserHystrixMain {
        public static void main(String[] args) {
            SpringApplication.run(UserHystrixMain.class, args);
        }
    
        @Bean
        @LoadBalanced
        public RestTemplate initRestTemplate() {
            return new RestTemplate();
        }
    }

    4. 编写 UserController ,并在 findOrderByUser() 方法上面加上 @HystrixCommand 注解,来指定回调方法:

    @RestController
    public class UserController {
        @Autowired
        private RestTemplate restTemplate;
    
        /**
         * 按照用户id查询订单信息
         * @param id 用户id
         * @return 用户订单信息
         */
        @GetMapping("/findOrderByUser/{id}")
        @HystrixCommand(fallbackMethod = "fallBackMethod")
        public String findOrderByUser(@PathVariable String id) {
            int orderId = 123;
            return this.restTemplate.getForObject("http://SPRINGCLOUD-DEMO-ORDER/order/" + orderId, String.class);
        }
    
        /**
         * 调用订单查询接口失败后的返回信息
         * @param id
         * @return
         */
        public String fallBackMethod(@PathVariable String id){
            return "服务不可用,当前查询id="+id;
        }
    }

    5. 功能验证

      依次启动服务注册中心,以及其他模块,此时服务注册中心有如下服务实例:

      在浏览器中访问:http://localhost:8030/findOrderByUser/1 可以正常访问:

      然后关闭 springcloud-demo-order 服务,继续访问http://localhost:8030/findOrderByUser/1链接,就会提示如下信息:

      说明Spring Cloud Hystrix配置生效。

  • 相关阅读:
    算法实现:在10个数中选6个数,显示所有组合
    转载:PostgreSQL和MySQL协议简介
    转载:国内外高精地图厂商一览
    使用带key访问iPortalREST服务
    cass启动提示Frame主框架程序没有加载
    设置Gridview单元格内容不换行
    Sql自定义编号唯一性问题
    关于EXCEL数据导入到SQLServer中字段存在NULL的问题
    Gridview显示网格线
    ComboBox自动匹配查找
  • 原文地址:https://www.cnblogs.com/fengweiweicoder/p/11075054.html
Copyright © 2020-2023  润新知