Hystrix配合feign

221 阅读1分钟

上一篇文章介绍feign调用远程服务

再启动eureka服务器后,把provider和consumer注册到上面

导入包

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
            <version>2.2.8.RELEASE</version>
        </dependency>

这里为了测试 就再provider里面故意制造错误

@Override
	public String isAlive() {

		try {
			System.out.println("准备睡");

			Thread.sleep(500);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		int i = count.getAndIncrement();
		int j=1/0;
		System.out.println("====好的第:" + i + "次调用");
		return "port:" + port;

consumer调用 这边可以指定fallbackFactory或者fallback 但是异常捕捉只有fallbackFactory有

@FeignClient(name = "user-provider",fallbackFactory = WebError.class)
public interface ConsumerApi  {

	@RequestMapping(value = "/user/isAlive",method = RequestMethod.GET)
	public String alive();

来写这个fallbackFactory类

必须继承这个类 如果可以处理降级或者熔断

import java.util.Map;
@Component
public class WebError implements FallbackFactory<ConsumerApi> {
	@Override
	public ConsumerApi create(Throwable cause) {
		return new ConsumerApi() {
			@Override
			public String alive() {
				System.out.println(cause);
				if (cause instanceof HttpServerErrorException.InternalServerError){
					return "远程服务报错";
				}
				else if(cause instanceof RuntimeException){
					return "运行时异常";
				}
				else {
					return "都算不上";
				}
			}

加上注解后yml配置

@EnableFeignClients
@SpringBootApplication
public class UserConsumerApplication {

	public static void main(String[] args) {
		SpringApplication.run(UserConsumerApplication.class, args);
	}

}
feign:
  circuitbreaker:
    enabled: true