Hystrix做爲一款服務治理框架,被使用的不少,可是官方已經再也不維護,取而代之的是Resilience4j框架。java
因此本文簡單介紹Hystrix的使用,把重點放在下一篇的Resilience4j的講解上。git
一、Eureka服務註冊和發現
二、一個服務提供者waiter-service
三、基於Feign實現的調用者customer-service,調用waiter-service的方法,服務治理在customer-service上使用。
四、Hsytrix dashboard 用於監控服務調用狀況。github
一、啓動文件:web
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module; import java.util.TimeZone; @SpringBootApplication @EnableJpaRepositories @EnableCaching @EnableDiscoveryClient public class WaiterServiceApplication implements WebMvcConfigurer { public static void main(String[] args) { SpringApplication.run(WaiterServiceApplication.class, args); } }
二、POM文件spring
<?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.h2database</groupId> <artifactId>h2</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>
三、配置文件:apache
spring.application.name=waiter-service management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always info.app.author=DigitalSonic info.app.encoding=@project.build.sourceEncoding@ eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/ server.port=8091
四、方法文件app
import java.util.ArrayList; import java.util.List; @RestController @RequestMapping("/coffee") @Slf4j public 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; } }
五、啓動後Eureka效果框架
一、啓動文件maven
import lombok.extern.slf4j.Slf4j; import java.util.concurrent.TimeUnit; @SpringBootApplication @Slf4j @EnableDiscoveryClient @EnableFeignClients @EnableCircuitBreaker public 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(); } }
二、pom文件ide
<?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>
三、配置文件
server.port=8090 spring.application.name=customer-service management.endpoints.web.exposure.include=* management.endpoint.health.show-details=always feign.client.config.default.connect-timeout=500 feign.client.config.default.read-timeout=500 feign.hystrix.enabled=true eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/
四、控制器url
import java.util.Arrays; import java.util.List; @RestController @RequestMapping("/customer") @Slf4j public 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; } }
五、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); }
六、運行後,eureka效果
一、啓動文件:
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 @EnableHystrixDashboard public 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; } }
二、配置文件
server.port=9090
三、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>
三、啓動後效果以下
四、將地址輸入上述文本框,並點擊Monitor Stream按鈕
http://127.0.0.1:8090/actuator/hystrix.stream
五、調用以下請求:
六、查看Hystrix-dashboard 效果
七、中止waiter-service服務,再次調用,能夠看到錯誤