spring cloud之hystrix

1.依赖引入

        <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>
        </dependency>
        <dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
        </dependency>
<!--hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
<!--hystrix仪表盘-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>

2.配置

server:
  port: 6065

logging:
  level:
    com.d4c: debug

eureka:
  instance:
    prefer-ip-address: false
  client:
    register-with-eureka: true
    fetch-registry: true
    service-url:
      defaultZone: http://peer1:6001/eureka/,http://peer2:6002/eureka/
spring:
  cloud:
    loadbalancer:
      retry:
        enabled: true # 开启Spring Cloud的重试功能
  application:
    name: consumer-hystrix

ribbon:
  restclient:
    enabled: true  #没有这个ribbon超时配置不会生效,是
  ReadTimeout: 1000
  ConnectTimeout: 300
  MaxAutoRetries: 1 #同一台实例最大重试次数,不包括首次调用
  MaxAutoRetriesNextServer: 1 #重试负载均衡其他的实例最大重试次数,不包括首次调用
  #当OkToRetryOnAllOperations设置为false时,只会对get请求进行重试。
  #如果设置为true,便会对所有的请求进行重试,如果是put或post等写操作,如果服务器接口没做幂等性,会产生不好的结果,所以OkToRetryOnAllOperations慎用。
  OkToRetryOnAllOperations: false  #是否所有操作都重试

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 6000 # 设置hystrix的超时时间为6000ms

3.

启动类

@SpringBootApplication
@EnableDiscoveryClient//开启服务发现
@EnableCircuitBreaker//开启熔断器
@EnableHystrixDashboard//开启hystrix仪表盘
public class ConsumerHystrixpplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerHystrixpplication.class, args);
    }
}

配置类

@Configuration
public class CommonConfig {
    //方式二
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
        return builder.build();
    }
}

service

@Service
public class AccountConsumerService {

    @Resource
    private RestTemplate restTemplate;

    @HystrixCommand(fallbackMethod = "fallback")
    public String hystrixCommand(Long id) throws Exception {
        String url = "http://account-demo/account/get/" + id;
        String forObject = restTemplate.getForObject(url, String.class);
        System.out.println("forObject = " + forObject);
        return forObject;
    }

    public String fallback(Long id) {
        return "I am fallback!";
    }
}

controller

@RestController
@RequestMapping("consumer")
public class AccountConsumerController {

    @Resource
    private AccountConsumerService accountConsumerService;

    @RequestMapping("fallback/{id}")
    public String fallback(@PathVariable Long id) throws Exception{
        String s = accountConsumerService.hystrixCommand(id);
        return s;
    }
}

参考 参考Spring Cloud官方文档第13、14、15章

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容