#搭建 Eureka 服务
pom.xml
<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>
<groupId>org.crazyit.cloud</groupId>
<artifactId>first-hystrix-server</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>1.5.4.RELEASE</version>
</dependency>
</dependencies>
</project>
applicaiton.yml
server:
port: 8761
eureka:
client:
registerWithEureka: false
fetchRegistry: false
logging:
level:
com.netflix: INFO
启动类
搭建 provider
pom.xml
<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>
<groupId>org.crazyit.cloud</groupId>
<artifactId>spring-hystrix-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
</project>
application.yml
spring:
application:
name: spring-hystrix-provider
eureka:
instance:
hostname: localhost
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
实体类 Person
Controller 类
搭建调用方
pom.xml
<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>
<groupId>org.crazyit.cloud</groupId>
<artifactId>spring-hystrix-invoker</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.5.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.2</version>
</dependency>
</dependencies>
</project>
application.yml
server:
port: 9000
spring:
application:
name: spring-hystrix-invoker
eureka:
instance:
hostname: localhost
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
feign:
hystrix:
enabled: true
hystrix:
command:
HelloClient#hello():
execution:
isolation:
thread:
timeoutInMilliseconds: 500
circuitBreaker:
requestVolumeThreshold: 3
InvokerApplication 在启动类上面加入断路器注解 @EnableCircuitBreaker
InvokerController
Person
PersonService
HystrixFilter
CacheService
CollapseService
feign 相关
HelloClient
HelloController
TestFeignClient
访问 http://localhost:9000/router/111
把 provider 服务停止后
可见 @HystrixCommand 注解的 PersonService.getPerson
方法断路器生效了。
默认配置
对于一些默认的配置,例如命令组的key等,可以使用@DefaultProperties注解,这样就减少了@HystrixCommand注解的代码量
缓存注解:
* 缓存与合并请求功能需要先初始化请求上下文才能实现,所有才有了上面的HystrixFilter
* CacheService中getPerson方法使用注解`@CacheResult`
调用 http://localhost:9000/cache1/22
输出:
执行 getPerson 方法
控制器调用服务 0
控制器调用服务 1
控制器调用服务 2
可见 @CacheResult
注解的 getPerson 方法其实只执行了一次,缓存生效。
缓存主要 3 个注解:
- @CacheResult: 注释方法,标识被注解的方法返回结构将会被缓存,需要与 @HystrixCommand 一起使用
- @CacheRemove: 用于修饰方法让缓存失效,需要与 @CacheResult 的缓存 key 关联。
- @CacheKey: 用于修饰方法参数,标识该参数作为缓存的 key.
如上述代码 CacheService 中,先调用 cacheMethod 方法会把结果存储起来,再次调用则不会执行方法,然后调用 updateMethod 方法可以清除对应的缓存,下次再调用 cacheMethod 方法则会执行具体的方法逻辑。
访问 http://localhost:9000/cache2
输出如下:
执行命令
控制器调用服务 0
控制器调用服务 1
控制器调用服务 2
========== 清空了缓存
执行命令
控制器调用服务 0
控制器调用服务 1
控制器调用服务 2
注意: 这里说的缓存指的是在一次请求中,如果单独请求多次,则每次都会执行对应的方法。
合并请求注解 见代码 CollapseService
最后真实执行的方法为 getPersons,getSinglePerson 方法使用了 @HystrixCollapser 注解,会收集 1s 内调用 getSinglePerson 的请求,放到 getPersons 方法中进行批处理。
访问 http://localhost:9000/collapse
控制台输出:
收集请求,参数数量:3
1---crazyit
2---crazyit
3---crazyit
Feign 与 Hystrix 整合
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
feign:
hystrix:
enabled: true
启动类加对应注解:
@SpringBootApplication
@EnableDiscoveryClient
@EnableCircuitBreaker
@ServletComponentScan
@EnableFeignClients
新建 Feign 接口
Hystrix 监控
加入Actuator
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.5.3.RELEASE</version>
</dependency>
访问 http://localhost:9000/hystrix.stream 会输出 stream 数据
新建一个监控项目加入依赖:
<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>
<groupId>org.crazyit.cloud</groupId>
<artifactId>hystrix-dashboard</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>1.5.3.RELEASE</version>
</dependency>
</dependencies>
</project>
打开 @EnableHystrixDashboard
注解:
可以看到 HelloClient#hello()断路器被打开了。
如果需要监控整个集群的情况,可以使用 Turbine 框架。
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于