天天看点

Spring Cloud Greenwich.RELEASE 官方文档中文翻译特性III. Spring Cloud NetflixIV. Spring Cloud OpenFeign

2019.3 计划翻译 Spring Cloud Netflix 和 Spring Cloud OpenFeign

跳转 Spring Cloud Greenwich.RELEASE 官方文档 原文

@[toc]d

特性

III. Spring Cloud Netflix

13. 断路器: Hystrix 客户端

Hystrix 是 Netflix 下一个实现了 circuit breaker pattern 的库,在微服务架构中,服务调用通常存在多层,如下图所示:

图 13.1. 微服务图

Spring Cloud Greenwich.RELEASE 官方文档中文翻译特性III. Spring Cloud NetflixIV. Spring Cloud OpenFeign

较低层级的服务故障将引起上层服务的级联故障。当在

metrics.rollingStats.timeInMilliseconds

(默认值为 10 秒)时间内对指定服务调用超过

circuitBreaker.requestVolumeThreshold

(默认值为 20 次请求)次,且失败的比例大于

circuitBreaker.errorThresholdPercentage

(默认值为 50%),断路器打开同时服务不可达。在出现错误且断路器打开时,开发者可以提供一个回退逻辑。

图 13.2. Hystrix 回退防止级联故障

Spring Cloud Greenwich.RELEASE 官方文档中文翻译特性III. Spring Cloud NetflixIV. Spring Cloud OpenFeign

通过打开断路器防止级联故障,并给予不止所措甚至失败的服务一段时间,用以恢复正常,回退逻辑可以是另一个 Hystrix 保护的调用、静态数据或一个空值,一个请求的回退逻辑本身能被其他业务请求作为回退逻辑调用,这些调用最终都将得到静态数据。

13.1. 怎样引入 Hystrix

在项目中,通过 starter 使用 group ID:

org.springframework.cloud

artifact ID:

spring-cloud-starter-netflix-hystrix

引入 Hystrix。构建系统时,使用当前的

Spring Cloud Release Train

,详情查阅 Spring Cloud Project page 。

一个使用 Eureka 服务端和 Hystrix 断路器的程序示例:

@SpringBootApplication
@EnableCircuitBreaker
public class Application {

    public static void main(String[] args) {
        new SpringApplicationBuilder(Application.class).web(true).run(args);
    }

}

@Component
public class StoreIntegration {

    @HystrixCommand(fallbackMethod = "defaultStores")
    public Object getStores(Map<String, Object> parameters) {
        //do stuff that might fail
    }

    public Object defaultStores(Map<String, Object> parameters) {
        return /* something useful */;
    }
}
           

@HystrixCommand

由名为 “javanica” 的 Netflix 库提供,Spring Cloud 将使用 @HystrixCommand 注解的 Spring beans 自动包装成一个连接到 Hystrix 断路器的代理。断路器自行计算何时打开和关闭,以及在故障时做什么。

要配置

@HystrixCommand

,你可以使用一个

@HystrixProperty

注解列表填充

commandProperties

属性,在 这里 查看更多详情,在 Hystrix 维基 查看更多可用属性。

13.2. 传递安全上下文或使用 Spring 作用域

如果你希望某些本地线程上下文传递到

@HystrixCommand

,默认的声明将失效,因为它在线程池中执行命令(超时时)。你可以通过配置或直接在注解中开启让 Hystrix 在同一个线程中调用,这要求使用不同的 “隔离策略”,在注解中设置线程的示例如下:

@HystrixCommand(fallbackMethod = "stubMyService",
    commandProperties = {
      @HystrixProperty(name="execution.isolation.strategy", value="SEMAPHORE")
    }
)
...
           

你可以使用

@SessionScope

@RequestScope

来完成同样的事情。如果遇到运行时异常,说明找不到作用域内的上下文,你需要使用同一个线程来执行。

你也可以设置

hystrix.shareSecurityContext

属性为

true

。这样会自动配置一个 Hystrix 并发策略插件钩子,用来将

SecurityContext

从主线程转换到 Hystrix 命令执行线程。Hystrix 不允许注册多个 Hystrix 并发策略,因此可以将自定义一个

HystrixConcurrencyStrategy

声明为 Spring bean 的形式作为扩展机制。Spring Cloud 将在 Spring 上下文中查找你的实现,并将其包装到自己的插件中。

13.3. 健康指示器

连接断路器的状态同样通过调用应用程序的

/health

端点暴露,如下所示:

{
    "hystrix": {
        "openCircuitBreakers": [
            "StoreIntegration::getStoresByLocationLink"
        ],
        "status": "CIRCUIT_OPEN"
    },
    "status": "UP"
}
           
13.4. Hystrix 指标流

要使用 Hystrix 指标流,引入依赖

spring-boot-starter-actuator

并配置

management.endpoints.web.exposure.include: hystrix.stream

,暴露

/actuator/hystrix.stream

作为管理端点,如下所示:

<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
           

14. 断路器: Hystrix 仪表盘

Hystrix 的主要优点之一是它收集每个 HystrixCommand 的一套指标,Hystrix 仪表盘以有效的方式显示每个断路器的健康状况。

图 14.1. Hystrix 仪表盘

Spring Cloud Greenwich.RELEASE 官方文档中文翻译特性III. Spring Cloud NetflixIV. Spring Cloud OpenFeign

15. Hystrix 超时和 Ribbon 客户端

当使用包含 Ribbon 客户端的Hystrix 命令时,你需要确保 Hystrix 超时配置长于 Ribbon 超时配置,包括可能发生的任何潜在的重试,比如,你的 Ribbon 连接超时配置为一秒,Hystrix 可能重试三次请求,你的 Hystrix 超时配置应超过三秒钟。

15.1. 怎样引入 Hystrix 仪表盘

在项目中,通过 starter 使用 group ID: org.springframework.cloud artifact ID: spring-cloud-starter-netflix-hystrix-dashboard 引入 Hystrix 仪表盘。构建系统时,使用当前的

Spring Cloud Release Train

,详情查阅 Spring Cloud Project page 。

要运行 Hystrix 仪表盘,使用

@EnableHystrixDashboard

注解修饰你的 Spring Boot 主类,然后访问

/hystrix

,并将仪表板指向 Hystrix 客户端应用程序中的单个实例

/hystrix.stream

端点。

连接到使用HTTPS的

/hystrix.stream

端点时,服务器使用的证书必须由JVM信任。如果证书不可信,需要将证书导入到 JVM,以便 Hystrix 仪表盘成功连接到流端点

15.2. Turbine

15.2.1 Clusters Endpoint

15.2. Turbine Stream

16. 客户端负载均衡器: Ribbon

16.1. 怎样引入 Ribbon
16.2. 自定义 Ribbon 客户端
16.3. 自定义所有 Ribbon 客户端的默认配置
16.4. 通过配置属性自定义 Ribbon 客户端
16.5. 在 Eureka 中使用 Ribbon
16.6. 示例: 脱离 Eureka 使用 Ribbon
16.7. 示例: 在 Ribbon 中不使用 Eureka
16.8. 直接使用 Ribbon API
16.9. 缓存 Ribbon 配置
16.10. 怎样配置 Hystrix 线程池
16.11. How to Provide a Key to Ribbon’s IRule

17. 外部配置: Archaius

IV. Spring Cloud OpenFeign

23. Declarative REST Client: Feign

23.1. 怎样引入 Feign
23.2. 覆盖 Feign 默认值
23.3. 手动创建 Feign 客户端
23.4. Feign Hystrix 支持
23.5. Feign Hystrix 回退
23.6. Feign 和 @Primary
23.7. Feign Inheritance 支持
23.8. Feign 请求/应答 压缩
23.9. Feign 日志
23.10. Feign @QueryMap 支持

继续阅读