zoukankan      html  css  js  c++  java
  • Feign 实现微服务调用及进行服务熔断与降级

    本文为博主原创,未经允许不得转载:  

      1. Feign 日志级别配置

      2. Feign client 封装调用

      3. Feign 定义熔断降级方法

      4. 通过 FallbackFactory 工厂 实现降级

      5. 配置 @FeignClient 的 configuration 属性

      6. 配置http 连接池

      7. feign 配合 hystrix 超时熔断配置

      

      Feign 是NetFlix 开源的声明式的 HTTP 客户端。一般在服务消费端实现 Feign 的客户端,进行服务调用。

      1. Feign 日志级别配置

        Feign 默认实现调用时,不会打印调用的请求日志。配置 feign client 调用日志打印:

    feign:
      client:
        config:
          # 全局配置
          default:
            loggerLevel: full

       Feign 日志级别及打印内容:

    日志级别 打印内容
    NONE(默认值) 不打印任何日志
    BASIC 仅记录请求方法,url,响应状态以及执行时间
    HEADERS 在BASIC的基础上,记录了请求和响应的HEADER
    FULL 记录请求和响应的header,body和元数据

      2.Feign client 封装调用:

         2.1 添加 feign 的pom 依赖:

    <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
            <dependency>

        2.2 定义Feign client接口,并在启动类添加 @EnableFeignClients 注解

    import com.contentcenter.domain.dto.user.UserDTO;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    
    @FeignClient(name
    = "user-center") // name为调用的服务模块名称 public interface UserCenterFeignClient { /** * http://user-center/users/{id} * * @param id * @return */ @GetMapping("/users/{id}") UserDTO findById(@PathVariable Integer id); }

        2.3 非用户中心可通过在自己侧封装的 Feign client 进行调用,获取用户数据:

        @Autowire
        private UserCenterFeignClient userFeignClient;
        
        @Test
        public void test(){
            UserDTO userDto = userFeignClient.findById(11);
            system.out.println(JSON.toJsonString(userDto));
        }

      

      3. Feign 定义熔断降级方法

        3.1 自定义实现 FeignClient 的接口返回

    @Component
    public class UserCenterFeignClientFallback implements UserCenterFeignClient {
        @Override
        public UserDTO findById(Integer id) {
            UserDTO userDTO = new UserDTO();
            userDTO.setWxNickname("流控/降级返回的用户");
            return userDTO;
        }
    }

        3.2 在定义Feign client 时指定 fallback 方法

    import com.contentcenter.domain.dto.user.UserDTO;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PathVariable;
    
    @FeignClient(name = "user-center",fallback = UserCenterFeignClientFallback.class)
    public interface UserCenterFeignClient {
        /**
         * http://user-center/users/{id}
         *
         * @param id
         * @return
         */
        @GetMapping("/users/{id}")
        UserDTO findById(@PathVariable Integer id);
    }

      4. 通过 FallbackFactory 工厂 实现降级

          通过 FallbackFactory 实现的降级可以捕获 熔断的异常信息,而通过方法实现的熔断,则不能获取熔断的异常信息。

        所以推荐使用 FallbackFactory 进行降级实现。

    import com.contentcenter.domain.dto.user.UserDTO;
    import com.contentcenter.feignclient.UserCenterFeignClient;
    import feign.hystrix.FallbackFactory;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.stereotype.Component;
    
    @Component
    @Slf4j
    public class UserCenterFeignClientFallbackFactory implements FallbackFactory<UserCenterFeignClient> {
        @Override
        public UserCenterFeignClient create(Throwable cause) {
            return new UserCenterFeignClient() {
         // 当 UserCenterFeignClient 有多个方法时,在这里逐个重写实现即可 @Override
    public UserDTO findById(Integer id) { log.warn("远程调用被限流/降级了", cause); UserDTO userDTO = new UserDTO(); userDTO.setWxNickname("流控/降级返回的用户"); return userDTO; } }; } }

      调用方式:

    @FeignClient(name = "user-center",fallbackFactory = UserCenterFeignClientFallbackFactory.class)

      5. 配置 @FeignClient 的 configuration 属性

        通过@FeignClient 的 configuration 属性可以实现对 feign请求的自定义封装。如实现拦截配置,对 feign 请求添加认证请求头,添加 ssl 认证等等。

        具体可参考我的这篇文章: spring cloud 通过feign请求设置请求头    https://www.cnblogs.com/zjdxr-up/p/14152438.html

       

      6. 配置http 连接池

        添加依赖

        <dependency>
                <groupId>io.github.openfeign</groupId>
                <artifactId>feign-httpclient</artifactId>
            </dependency>

        添加配置:

    feign:
      httpclient:
        # 让feign使用apache httpclient做请求;而不是默认的urlconnection
        enabled: true
        # feign的最大连接数
        max-connections: 200
        # feign单个路径的最大连接数
        max-connections-per-route: 50

       7. feign 配合 hystrix 超时熔断配置:

          Spring Cloud Feign HTTP请求异常 Fallback 容错机制,它是基于Hystrix实现的,所以要通过配置参数 feign.hystrix.enabled=true 

        开启该功能,以及配置 hystrix 超时时间。

    feign:
      hystrix:
        enabled:true 
    hystrix:
      command:
        default:
          execution:
            isolation:
              thread:
                timeoutInMilliseconds: 1000

       

  • 相关阅读:
    mysqladmin命令的用法
    利用cacti监控多端口memcache
    Msyqlproxy的编译安装
    eclipse下SVN subclipse插件
    Asp.net SqlDataSource用法 插入 更新 删除
    C#的匿名方法
    MDHH使用图解
    SVN入门及配置使用(多平台)
    编写Windows Live Writer插件(1)
    防止事件冒泡
  • 原文地址:https://www.cnblogs.com/zjdxr-up/p/15085498.html
Copyright © 2011-2022 走看看