每個方法都配備一個fallback方法
不利於開發的
用類的方式
並且整個方法都是在同一個線程池里面的
主要對於client的修改:
pom:
<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>com.toov5</groupId> <artifactId>parent</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>toov5-api-order-service-impl</artifactId> <dependencies> <dependency> <groupId>com.toov5</groupId> <artifactId>toov5-api-order-service</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.toov5</groupId> <artifactId>toov5-api-member-service</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> </dependencies> </project>
實現類
package com.toov5.api.service.impl; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand; import com.toov5.api.entity.UserEntity; import com.toov5.api.feign.MemberServiceFeign; import com.toov5.api.service.IOrderService; import com.toov5.base.BaseApiService; import com.toov5.base.ResponseBase; @RestController public class OrderServiceImpl extends BaseApiService implements IOrderService { @Autowired private MemberServiceFeign memberServiceFeign; @RequestMapping("/orderToMmeber") public String orderToMember(String name) { UserEntity user = memberServiceFeign.getMember(name); return user == null ? "沒有" : user.toString(); } @RequestMapping("/orderToMemberUserInfo") public ResponseBase orderToMemberUserInfo() { return memberServiceFeign.getUserInfo(); } @HystrixCommand(fallbackMethod = "orderToMemberUserInfoHystrixFallback") @RequestMapping("/orderToMemberUserInfoHystrix") public ResponseBase orderToMemberUserInfoHystrix() { System.out.println("orderToMemberUserInfoHystrix" + "線程池名稱" + Thread.currentThread().getName()); return memberServiceFeign.getUserInfo(); } public ResponseBase orderToMemberUserInfoHystrixFallback() { return setResultSuccess("請稍后再試~"); } @RequestMapping("/orderToMemberUserInfoHystrixdSecond") public ResponseBase orderToMemberUserInfoHystrix_demo02() { System.out.println("orderToMemberUserInfoHystrix" + "線程池名稱" + Thread.currentThread().getName()); return memberServiceFeign.getUserInfo(); } @RequestMapping("/orderInfo") public ResponseBase orderInfo() { System.out.println("orderInfo" + "線程池名稱" + Thread.currentThread().getName()); return setResultSuccess(); } }
feign
package com.toov5.api.feign; import org.springframework.cloud.openfeign.FeignClient; import com.toov5.api.fallback.MemberServiceFallback; import com.toov5.api.service.IMemberService; @FeignClient(value="app-toov5-member",fallback = MemberServiceFallback.class) public interface MemberServiceFeign extends IMemberService { }
fallback類
package com.toov5.api.fallback; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RequestMapping; import com.toov5.api.entity.UserEntity; import com.toov5.api.feign.MemberServiceFeign; import com.toov5.base.BaseApiService; import com.toov5.base.ResponseBase; @Component @RequestMapping("fallback/") //這個可以防止 容器中有與父類重復的 requestMapping!!! public class MemberServiceFallback extends BaseApiService implements MemberServiceFeign { @Override public ResponseBase getUserInfo() { return setResultError("來自類的提示:系統錯誤,請稍后重試!"); } @Override public UserEntity getMember(String name) { // TODO Auto-generated method stub return null; } }
啟動類:
package com.toov5.api; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; import org.springframework.cloud.netflix.hystrix.EnableHystrix; import org.springframework.cloud.openfeign.EnableFeignClients; @SpringBootApplication(scanBasePackages={"com.toov5.*"}) @EnableEurekaClient @EnableFeignClients @EnableHystrix public class AppOrder { public static void main(String[] args) { SpringApplication.run(AppOrder.class, args); } }
yml
###服務啟動端口號 server: port: 8020 ###服務名稱(服務注冊到eureka名稱) spring: application: name: app-toov5-order ###服務注冊到eureka地址 eureka: client: service-url: defaultZone: http://localhost:8100/eureka ###因為該應用為注冊中心,不會注冊自己 register-with-eureka: true ###是否需要從eureka上獲取注冊信息 fetch-registry: true ###設置feign客戶端超時時間 ribbon: ###指的是建立連接所用的時間,適用於網絡狀況正常的情況下,兩端連接所用的時間。 ReadTimeout: 5000 ###指的是建立連接后從服務器讀取到可用資源所用的時間。 ConnectTimeout: 5000 #spring cloud 默認開啟ribbon ##開啟Hystrix斷路器 feign: hystrix: enabled: true #### hystrix禁止服務超時時間 #hystrix: # command: # default: # execution: # timeout: # enabled: false
啟動后:
感謝:https://www.jb51.net/article/138758.htm 這篇文章的參考!
對於報錯:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource [org/springframework/boot/autoconfigure/web/servlet/WebMvcAutoConfiguration$EnableWebMvcConfiguration.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'com.toov5.api.feign.MemberServiceFeign' method
public abstract com.toov5.base.ResponseBase com.toov5.api.service.IMemberService.getUserInfo()
to {[/getUserInfo]}: There is already 'memberServiceFallback' bean metho
的解決辦法在 fallback的類上面加上
@RequestMapping("fallback/") //這個可以防止 容器中有與父類重復的 requestMapping!!!