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); //如果有必要,会走服务降级的方法
        }
  • 相关阅读:
    编译原理-第二章 一个简单的语法指导编译器-2.4 语法制导翻译
    编译原理-第二章 一个简单的语法指导编译器-2.3 语法定义
    编译原理-第二章 一个简单的语法指导编译器-2.2 词法分析
    LeetCode 1347. Minimum Number of Steps to Make Two Strings Anagram
    LeetCode 1348. Tweet Counts Per Frequency
    1349. Maximum Students Taking Exam(DP,状态压缩)
    LeetCode 1345. Jump Game IV(BFS)
    LeetCode 212. Word Search II
    LeetCode 188. Best Time to Buy and Sell Stock IV (动态规划)
    LeetCode 187. Repeated DNA Sequences(位运算,hash)
  • 原文地址:https://www.cnblogs.com/pickKnow/p/11388954.html
Copyright © 2011-2022 走看看