Hystrix作为一款服务治理框架,被使用的很多,但是官方已经不再维护,取而代之的是Resilience4j框架。

所以本文简单介绍Hystrix的使用,把重点放在下一篇的Resilience4j的讲解上。

案例

1、Eureka服务注册和发现
2、一个服务提供者waiter-service
3、基于Feign实现的调用者customer-service,调用waiter-service的方法,服务治理在customer-service上使用。
4、Hsytrix dashboard 用于监控服务调用情况。

步骤启动watier-service,并注册uereka

1、启动文件:

import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;import java.util.TimeZone;@SpringBootApplication@EnableJpaRepositories@EnableCaching@EnableDiscoveryClientpublic class WaiterServiceApplication implements WebMvcConfigurer { public static void main(String[] args) { SpringApplication.run(WaiterServiceApplication.class, args); }}

2、POM文件

<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>jane.spring.com</groupId> <artifactId>waiter-service</artifactId> <version>0.0.1-SNAPSHOT</version> <name>waiter-service</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> </dependency> <dependency> <groupId>org.joda</groupId> <artifactId>joda-money</artifactId> <version>1.0.1</version> </dependency> <dependency> <groupId>org.jadira.usertype</groupId> <artifactId>usertype.core</artifactId> <version>6.0.1.GA</version> </dependency> <!-- 增加Jackson的Hibernate类型支持 --> <dependency> <groupId>com.fasterxml.jackson.datatype</groupId> <artifactId>jackson-datatype-hibernate5</artifactId> <version>2.9.8</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>com.h3database</groupId> <artifactId>h3</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>

3、配置文件:

spring.application.name=waiter-servicemanagement.endpoints.web.exposure.include=*management.endpoint.health.show-details=alwaysinfo.app.author=DigitalSonicinfo.app.encoding=@project.build.sourceEncoding@eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/server.port=8091

4、方法文件

import java.util.ArrayList;import java.util.List;@RestController@RequestMapping("/coffee")@Slf4jpublic class CoffeeController { @Autowired private CoffeeService coffeeService; @GetMapping("/{id}") public Coffee getById(@PathVariable Long id) { Coffee coffee = coffeeService.getCoffee(id); log.info("Coffee {}:", coffee); return coffee; }}

5、启动后Eureka效果

启动customer-service服务

1、启动文件

import lombok.extern.slf4j.Slf4j;import java.util.concurrent.TimeUnit;@SpringBootApplication@Slf4j@EnableDiscoveryClient@EnableFeignClients@EnableCircuitBreakerpublic class CustomerServiceApplication { public static void main(String[] args) { SpringApplication.run(CustomerServiceApplication.class, args); } @Bean public CloseableHttpClient httpClient() { return HttpClients.custom() .setConnectionTimeToLive(30, TimeUnit.SECONDS) .evictIdleConnections(30, TimeUnit.SECONDS) .setMaxConnTotal(200) .setMaxConnPerRoute(20) .disableAutomaticRetries() .setKeepAliveStrategy(new CustomConnectionKeepAliveStrategy()) .build(); }}

2、pom文件

<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>jane.spring.com</groupId> <artifactId>customer-service</artifactId> <version>0.0.1-SNAPSHOT</version> <name>customer-service</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>2.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency> <dependency> <groupId>org.joda</groupId> <artifactId>joda-money</artifactId> <version>1.0.1</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> </dependency> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.7</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>

3、配置文件

server.port=8090spring.application.name=customer-servicemanagement.endpoints.web.exposure.include=*management.endpoint.health.show-details=alwaysfeign.client.config.default.connect-timeout=500feign.client.config.default.read-timeout=500feign.hystrix.enabled=trueeureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/

4、控制器url

import java.util.Arrays;import java.util.List;@RestController@RequestMapping("/customer")@Slf4jpublic class CustomerController { @Autowired private CoffeeService coffeeService; @GetMapping("/coffee") @HystrixCommand(fallbackMethod = "fallbackMethod") public Coffee getCoffee() { Coffee list = coffeeService.getById(1l); log.info("Read coffee: {} coffee", list); return list; } public Coffee fallbackMethod() { log.warn("Fallback ......"); return null; }}

5、fegin客户端

import org.springframework.cloud.openfeign.FeignClient;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.PathVariable;import org.springframework.web.bind.annotation.RequestParam;import java.util.List;@FeignClient(name = "waiter-service", contextId = "coffee", qualifier = "coffeeService", path="/coffee", fallback = FallbackCoffeeService.class)// 如果用了Fallback,不要在接口上加@RequestMapping,path可以用在这里public interface CoffeeService { @GetMapping("/{id}") Coffee getById(@PathVariable Long id);}

6、运行后,eureka效果

启动Hystrix-dashboard

1、启动文件:

import com.netflix.hystrix.contrib.metrics.eventstream.HystrixMetricsStreamServlet;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.boot.web.servlet.ServletRegistrationBean;import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;import org.springframework.context.annotation.Bean;@SpringBootApplication@EnableHystrixDashboardpublic class HystrixDashboardDemoApplication { public static void main(String[] args) { SpringApplication.run(HystrixDashboardDemoApplication.class, args); } @Bean public ServletRegistrationBean ServletRegistrationBeangetServlet() { HystrixMetricsStreamServlet streamServlet =new HystrixMetricsStreamServlet(); ServletRegistrationBean registrationBean =new ServletRegistrationBean(streamServlet); registrationBean.setLoadOnStartup(1); registrationBean.addUrlMappings("/hystrix.stream"); registrationBean.setName("HystrixMetricsStreamServlet"); return registrationBean; }}

2、配置文件

server.port=9090

3、pom文件

<?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> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.4.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>jane.spring.cloud</groupId> <artifactId>hystrix-dashboard-demo</artifactId> <version>0.0.1-SNAPSHOT</version> <name>hystrix-dashboard-demo</name> <description>Demo project for Spring Boot</description> <properties> <java.version>1.8</java.version> <spring-cloud.version>Greenwich.SR1</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>

3、启动后效果如下

4、将地址输入上述文本框,并点击Monitor Stream按钮

http://127.0.0.1:8090/actuator/hystrix.stream

5、调用如下请求:

6、查看Hystrix-dashboard 效果

7、停止waiter-service服务,再次调用,可以看到错误