-
正常操作
application.yml
spring: application: name: microservice-consumer-movie-feign-customizing-without-hystrix server: port: 7901 eureka: client: healthcheck: enabled: true serviceUrl: defaultZone: http://user:password123@localhost:8761/eureka instance: prefer-ip-address: true logging: level: com.itmuch.cloud.feign.UserFeignClient: DEBUG # 解决第一次请求报超时异常的方案: hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds: 5000 # 或者: # hystrix.command.default.execution.timeout.enabled: false # 或者: # 超时的issue:https://github.com/spring-cloud/spring-cloud-netflix/issues/768 # 超时的解决方案: http://stackoverflow.com/questions/27375557/hystrix-command-fails-with-timed-out-and-no-fallback-available # hystrix配置: https://github.com/Netflix/Hystrix/wiki/Configuration#execution.isolation.thread.timeoutInMilliseconds
UserFeignClient.java——内容
@FeignClient(name = "microservice-provider-user", configuration = Configuration1.class, fallback = HystrixClientFallback.class) public interface UserFeignClient { @RequestLine("GET /simple/{id}") public User findById(@Param("id") Long id); }
Configuration1.java内容
@Configuration public class Configuration1 { @Bean public Contract feignContract() { return new feign.Contract.Default(); } @Bean Logger.Level feignLoggerLevel() { return Logger.Level.FULL; } }
HystrixClientFallback.java——内容
@Component public class HystrixClientFallback implements UserFeignClient { @Override public User findById(Long id) { User user = new User(); user.setId(0L); return user; } }
-
禁用操作
UserFeignClient2.java——hystrix支持文档地址:https://projects.spring.io/spring-cloud/spring-cloud.html#spring-cloud-feign-hystrix
文档模版
@FeignClient(name = "hello", fallback = HystrixClientFallback.class)
protected interface HystrixClient {
@RequestMapping(method = RequestMethod.GET, value = "/hello")
Hello iFailSometimes();
}
static class HystrixClientFallback implements HystrixClient {
@Override
public Hello iFailSometimes() {
return new Hello("fallback");
}
}
@FeignClient(name = "xxxx", url = "http://localhost:8761/", configuration = Configuration2.class, fallback = FeignClient2Fallback.class) public interface FeignClient2 { @RequestMapping(value = "/eureka/apps/{serviceName}") public String findServiceInfoFromEurekaByServiceName(@PathVariable("serviceName") String serviceName); }
Configuration2.java内容
@Configuration public class Configuration2 { @Bean public BasicAuthRequestInterceptor basicAuthRequestInterceptor() { return new BasicAuthRequestInterceptor("user", "password123"); } @Bean @Scope("prototype") public Feign.Builder feignBuilder() { return Feign.builder(); } }
FeignClient2Fallback.java——内容
public class FeignClient2Fallback implements FeignClient2 { @Override public String findServiceInfoFromEurekaByServiceName(String serviceName) { return "haha"; } }
-
禁用测试eureka
Application | AMIs | Availability Zones | Status |
---|---|---|---|
MICROSERVICE-CONSUMER-MOVIE-FEIGN-CUSTOMIZING-WITHOUT-HYSTRIX | n/a(1) | (1) | UP (1) - MTC-20180821VUN:microservice-consumer-movie-feign-customizing-without-hystrix:7901 |
MICROSERVICE-PROVIDER-USER | n/a(1) | (1) | UP (1) - microservice-provider-user:192.168.4.160:7900 |
GET http://192.168.4.160:7901/microservice-provider-user 在user服务没有停掉的情况下会到FeignClient2.java
问:如果user服务停掉呢?
答:会返回默认的user对象。
F5多请求几次,打开断路器 http://192.168.4.160:7901/health
问:如果把eureka也停掉呢?
答:会返回默认的user对象。
分析:按理说返回haha