Feign + Hystrix 服務熔斷和服務降級
阿新 • • 發佈:2018-11-10
本機IP為 192.168.1.102
1. 新建 Maven 專案 feign
2. 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>com.java</groupId> <artifactId>feign</artifactId> <version>1.0.0-SNAPSHOT</version> <packaging>war</packaging> <name>${project.artifactId}</name> <!-- 配置版本常量--> <properties> <jdk.version>1.8</jdk.version> <spring.cloud.version>2.0.0.RELEASE</spring.cloud.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.5.RELEASE</version> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> <version>${spring.cloud.version}</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>${spring.cloud.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.49</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <!-- 熱部署 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.8.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <pluginManagement> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <source>${jdk.version}</source> <target>${jdk.version}</target> <encoding>UTF-8</encoding> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>3.2.2</version> </plugin> </plugins> </pluginManagement> </build> </project>
3. application.yml
server: port: 80 feign: hystrix: enabled: true eureka: client: register-with-eureka: false service-url: defaultZone: http://192.168.1.102:8080/eureka/ #defaultZone: http://s0.com:8080/eureka/,http://s1.com:8080/eureka/,http://s2.com:8080/eureka/
4. HostService.java
package com.java.feign.service; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import com.alibaba.fastjson.JSONObject; @FeignClient(value = "MICROSERVICE", fallbackFactory = HostServiceFallbackFactory.class) public interface HostService { @GetMapping("/getHostMessage/{id}") public JSONObject getHostMessage(@PathVariable String id); }
5. HostServiceFallbackFactory.java
package com.java.feign.service; import org.springframework.stereotype.Component; import com.alibaba.fastjson.JSONObject; import feign.hystrix.FallbackFactory; @Component public class HostServiceFallbackFactory implements FallbackFactory<HostService> { @Override public HostService create(Throwable cause) { return new HostService() { @Override public JSONObject getHostMessage(String id) { JSONObject json = new JSONObject(); json.put("id", id); json.put("description", "服務異常演習專用!"); json.put("msg", cause.getMessage()); return json; } }; } }
6. HostController.java
package com.java.feign.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import com.alibaba.fastjson.JSONObject; import com.java.feign.service.HostService; @RestController public class HostController { @Autowired private HostService hostService; @GetMapping("/getHostMessage/{id}") public JSONObject getHostMessage(@PathVariable String id) { return hostService.getHostMessage(id); } }
7. FeignStarter.java
package com.java.feign; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.openfeign.EnableFeignClients; import org.springframework.context.annotation.ComponentScan; @EnableEurekaClient @SpringBootApplication @EnableFeignClients(basePackages = { "com.java.feign.service" }) @ComponentScan(basePackages = { "com.java.feign" }) public class FeignStarter extends SpringBootServletInitializer { public static void main(String[] args) { SpringApplication.run(FeignStarter.class, args); } @Override protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { return builder.sources(FeignStarter.class); } }
8. 執行測試
啟動 Eureka 服務註冊中心,參考 https://www.cnblogs.com/jonban/p/9931412.html
啟動 MicroService 微服務, 參考 https://www.cnblogs.com/jonban/p/9931579.html
啟動 Feign服務,執行 FeignStarter.java
瀏覽器輸入URL
http://192.168.1.102/getHostMessage/hello
或
http://127.0.0.1/getHostMessage/hello
返回資料如下:
{"hostname":"F6RK2EXYAFARPPS","hostAddress":"192.168.1.102","id":"hello"}
截圖如下:
搭建成功,程式正常執行。
下面開始測試異常
關掉微服務提供者 microservice 伺服器
瀏覽器輸入URL
http://192.168.1.102/getHostMessage/hello
或
http://127.0.0.1/getHostMessage/hello
返回資料如下:
{"msg":"com.netflix.client.ClientException: Load balancer does not have available server for client: MICROSERVICE","description":"服務異常演習專用!","id":"hello"}
截圖如下:
服務異常生效,符合預期結果。
.