SpringCloud五大组件Hystrix

分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务。如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,最终可能导致整个商品服务资源耗尽,无法继续对外提供服务。并且这种不可用可能沿请求调用链向上传递,这种现象被称为雪崩效应。

一、在原有的user服务上进行改造,添加Hystrix断路器,pom配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache/POM/4.0.0"
         xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache/POM/4.0.0 http://maven.apache/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>父GroupId</groupId>
        <artifactId>父ArtifactId</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.lezhu.cloud</groupId>
    <artifactId>user</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>user</name>
    <packaging>pom</packaging>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-netflix-core</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

</project>

二、user服务yml配置,配置如下:

spring:
  application:
    name: user
server:
  port: 28666
eureka:
  instance:
    #开启IP注册
    prefer-ip-address: true
    #地址名称
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
    #心跳
    lease-renewal-interval-in-seconds: 5
    #无心跳,十秒踢出
    lease-expiration-duration-in-seconds: 10
    #获取此实例的相对健康检查URL路径。 健康检查页面URL,然后构造出主机名和通信的类型 - 安全或不安全,如securePort和nonSecurePort规定。 它通常用于制造基于实例的健康做出明智的决策 - 例如,它可以被用来确定是否进行部署到整个服务器场或停止部署,而不会造成进一步的损害。
    health-check-url-path: /actuator/health
    #获取与此实例相关联的元数据名称/值对。 该信息被发送到服务器eureka,可以通过其他情况下使用。
    metadata-map:
      user.name: ${spring.security.user.name}
      user.password: ${spring.security.user.password}
  client:
    #表示的频率(以秒为单位)来从eureka服务器注册表的信息
    registryFetchIntervalSeconds: 5
    service-url:
      defaultZone: ${EUREKA_SERVICE_URL:http://127.0.0.1:28001}/eureka/
### Feign 配置
feign:
  compression:
    request:
      # 开启请求压缩
      enabled: true
      # 配置压缩的 MIME TYPE
      mime-types: text/xml,application/xml,application/json
      # 配置压缩数据大小的下限
      min-request-size: 2048
    response:
      # 开启响应压缩
      enabled: true
  hystrix:
    #断路器打开  feign开启熔断器必须加这句话,不然无法使用,直接报500状态码
    enabled: true

三、我们使用Feign来断路,User服务Feign接口改造,代码如下:
只需要在FeignClient的MemberServiceFeign接口的注解中加上fallback的指定类就行了

@FeignClient(value = "member",fallback = MemberServiceFeignHystric.class)
public interface MemberServiceFeign {

    /**
     * 远程调用会员接口
     *
     * @param name
     * @return
     */
    @GetMapping("/member/sayHiMember")
    String sayHiMember(@RequestParam(value = "name") String name);

    /**
     * 远程调用接口
     *
     * @param name
     * @return
     */
    @GetMapping("/member/port")
    String port(@RequestParam(value = "name") String name);

}

四、我们接下来创建一个接口实现类,代码如下:
我们在这里需要实现MemberServiceFeign接口并注入到Ioc容器中

@Component
public class MemberServiceFeignHystric implements MemberServiceFeign {
    @Override
    public String sayHiMember(String name) {
        return "FeignSayHiMember使用了断路器【熔断器】,限制服务处于熔断状态,运行了类似于抛出异常的方法,时间=" + new Date();
    }

    @Override
    public String port(String name) {
        return "FeignPort使用了断路器【熔断器】,限制服务处于熔断状态,运行了类似于抛出异常的方法,时间=" + new Date();
    }
}

五、启动类添加@EnableHystrix注解,进行开启断路器,代码如下:

@EnableEurekaClient
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
@EnableHystrix
public class ServiceUserApplication {

    public static void main(String[] args) {
        SpringApplication.run(ServiceUserApplication.class, args);
    }

    @Bean
    @LoadBalanced
    RestTemplate restTemplate() {
        return new RestTemplate();
    }

}

六、我们先启动User服务,然后不去启动Member服务,现在我们在网址上输入这个地址:http://127.0.0.1:28666/user/userInfo?name=张三,显示如下图,就证明断路器已经启动

我们在启动Member服务再看下返回结果:

SpringCloud五大组件之一Hystrix断路器已到此结束

更多推荐

SpringCloud五大组件Hystrix