zoukankan      html  css  js  c++  java
  • Springcloud 整合Hystrix 断路器,支持Feign客户端调用

    1,在这篇博文中,已经大致说过了Springcloud服务保护框架 Hystrix在服务隔离,服务降级,以及服务熔断中的使用

    https://www.cnblogs.com/pickKnow/p/11250374.html

    2,声明式的调用hystrix,也是很重要的,以及用整合feign 客户端

    maven:

    <!-- hystrix断路器 -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    </dependency>

    3,使用@HystrixCommand 

    //@HystrixCommand 默认开启服务隔离,是以线程池方式
    //@HystrixCommand 默认开启服务降级,fallbackMethod 方法名就是服务的降级名称
    //@HystrixCommand 默认开启服务熔断机制
    //@Hystrix 要禁止超时时间,默认1 秒,如果没有即使响应,会走业务逻辑,但是也会走服务降级方法,所以要禁止超时时间,实际项目中,要把超时时间设长一点
    @RestController
    public class MemberServiceImpl {
    
        @Autowired
        private OrderServiceFeign orderServiceFeign;
    
        //@HystrixCommand 默认开启服务隔离,是以线程池方式
        //@HystrixCommand 默认开启服务降级,fallbackMethod 方法名就是服务的降级名称
        //@HystrixCommand 默认开启服务熔断机制
        //@Hystrix 要禁止超时时间,默认1 秒,如果没有即使响应,会走业务逻辑,但是也会走服务降级方法,所以要禁止超时时间
        @HystrixCommand(fallbackMethod = "orderServiceFallback")
        @RequestMapping("/getOrder")
        public Order getOrder(String orderId) {
            System.out.println("orderToUserInfo:" + "当前线程池名称:" + Thread.currentThread().getName());
            return orderServiceFeign.getOrder(orderId);
        }
        
        @RequestMapping("/orderServiceFallback")
        public String orderServiceFallback() {
            return "服务器繁忙,请稍后重试";
        }
    
    }

    4,配置文件

    ###服务启动端口号
    server:
      port: 8000
    ###服务名称(服务注册到eureka名称)  
    spring:
        application:
            name: app-aiyuesheng-member
    ###服务注册到eureka地址
    eureka:
      client:
        service-url:
               defaultZone: http://localhost:8100/eureka
    
               
    ###因为该应用为注册中心,不会注册自己
        register-with-eureka: true
    ###是否需要从eureka上获取注册信息
        fetch-registry: true
    
    ###设置feign客户端超时时间
    ribbon:
    ###指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
     ReadTimeout: 5000
    ###指的是建立连接后从服务器读取到可用资源所用的时间。 
     ConnectTimeout: 5000   
        
    feign:
      hystrix:
    enabled: true
        
    #### hystrix禁止服务超时时间
    hystrix:  
     command: 
       default: 
          execution: 
           timeout: 
            enabled: false

    5,在启动类上加上使用Hystrix的注解

    @SpringBootApplication
    @EnableEurekaClient
    @EnableFeignClients
    @EnableHystrix
    public class MemberApp {
        public static void main(String[] args) {
            SpringApplication.run(MemberApp.class, args);
        }
    
    }

     缺点: 每个服务隔离都会写一个服务降级的方法,很繁琐,所以我们用类的方式去实现:

    @Component
    public class OrderServiceFeignFallback implements OrderServiceFeign{
    
        @Override
        public Order getOrder(String orderId) {
            Order order = new Order();
            order.setOrderName("服务降级");
            // 可以添加个Response 来返回
            return order;
            
        }
    
    }

    feign 客户端添加fallback 的类:

    @FeignClient(value = "app-aiyuesheng-order",fallback = OrderServiceFeignFallback.class)
    public interface OrderServiceFeign extends IOrderService {
        
        
    
    }

    这样接口在掉用的时候,不会整个方法都新创建的线程池,只有feign 客户端调用的会调用线程池:

        @RequestMapping("/getOrder2")
        public Order getOrder2(String orderId) {
            System.out.println("orderToUserInfo:" + "当前线程池名称:" + Thread.currentThread().getName());
            return orderServiceFeign.getOrder(orderId); //如果有必要,会走服务降级的方法
        }
  • 相关阅读:
    多维数组和元组
    字符串
    列表
    JQuery事件的绑定
    JQuery设置缓慢下拉大行多次执行的解决办法,以及stop()函数的简单理解
    JQuery_AJAX简单笔记
    C#后台验证身份证号码的一个方法
    JQuery AJAX请求aspx后台方法
    网络编辑器插件ckeditor+ckfinder配置
    请编程实现:产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复(百度了一下,get一种高性能算法,非递归)
  • 原文地址:https://www.cnblogs.com/pickKnow/p/11388954.html
Copyright © 2011-2022 走看看