spring cloud: Hystrix(五):如禁止單個FeignClient使用hystrix
首先application.yml / applicatoin.propreties的配置項:feign.hystrix.enabled=true是針對全局的。
feign.hystrix.enabled=true 或者 feign: hystrix: enabled: true
那么怎么配置禁止單個的FeignClient使用hystrix呢。
在自定義的configuration.java的配置文件里加入:
//關閉feign的hystrix @Bean @Scope("property") public Feign.Builder feignBuilder() { return Feign.builder(); }
例子:復寫Feign的默認配置(fooConfiguration.java)
看例子:
1.入口文件,開啟eureka, feign配置
@EnableEurekaClient @SpringBootApplication @EnableFeignClients public class FeignApp { public static void main(String[] args) { SpringApplication.run(FeignApp.class, args); } }
2.復寫Feign的默認配置(fooConfiguration.java, fooConfiguration2.java,這兩個文件一個是關閉hystrix的,一個沒有關閉)
a.返回默認的feign配置
@Configuration public class FooConfiguration { @Bean public Contract feignContract() { return new feign.Contract.Default(); } }
b.返回默認的feign配置,以及關閉Hystrix
@Configuration public class FooConfiguration2 { /** * 配置Url用戶和密碼,當eureka啟用用戶名和密碼時 * @return */ /*@Bean public BasicAuthRequestInterceptor basicAuthRequestInterceptor() { return new BasicAuthRequestInterceptor("root", "root123"); }*/ //默認配置 @Bean public Contract getContract() { return new feign.Contract.Default(); } //feign日志配置 @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } //關閉feign的hystrix @Bean @Scope("prototype") public Feign.Builder feignBuilder() { return Feign.builder(); } }
3.FeignClient的代碼
a.調取spring-boot-user服務器
@FeignClient(name="spring-boot-user", configuration=FooConfiguration.class, fallback=HystrixClientFallback.class) public interface UserFeignClient { /** * 代用feign原生模式 * @param id * @return */ @RequestLine("GET /simple/{id}") public User findById(@Param("id") Long id); }
b.調取eureka的apps/serviceName(要填入具體項目名稱)服務
/** * 當@FeignClient有name和url還有configuration時,取值為url的地址,name只是為一個名稱而已(無意義) * 當@FeignClient只有name和configuration時,name的取值為eureka中的application項目的名稱即虛擬地址 * @author Administrator * */ @FeignClient(name="boot-user", url="http://localhost:8761", configuration=FooConfiguration2.class, fallback=HystrixClientFallback2.class) public interface UserFeignClient2 { @RequestLine("GET /eureka/apps/{serviceName}") public String findServiceInfoFromEurekaByServiceName(@Param("serviceName") String serviceName); //@RequestLine("GET /simple/{id}") //public User findById(@Param("id") Long id); }
4.fallback方法,hystrix的斷容器代碼
a.
@Component public class HystrixClientFallback implements UserFeignClient{ @Override public User findById(Long id) { // TODO Auto-generated method stub User user = new User(); user.setId(0L); return user; } }
b.直接返回字符
@Component public class HystrixClientFallback2 implements UserFeignClient2 { @Override public String findServiceInfoFromEurekaByServiceName(String serviceName) { // TODO Auto-generated method stub return "hahah"; } }
5.controller代碼
@RestController public class UserController { @Autowired private UserFeignClient userFeignClient; @Autowired private UserFeignClient2 userFeignClient2; @GetMapping("/simple/{id}") public User findById(@PathVariable Long id) { return this.userFeignClient.findById(id); } @GetMapping("/eureka/apps/{serviceName}") public String findEurekaInfo(@PathVariable String serviceName) { return this.userFeignClient2.findServiceInfoFromEurekaByServiceName(serviceName); } }
6測試
a.eureka服務,spring-boot-user服務未關閉的情況
b.eureka服務器、spring-boot-user服務器關閉