首页 > 其他分享 >Feign 实现微服务调用及进行服务熔断与降级

Feign 实现微服务调用及进行服务熔断与降级

时间:2023-03-23 10:07:57浏览次数:37  
标签:FeignClient Feign 服务 feign 熔断 import UserDTO id

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

  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请求设置请求头    javascript:void(0)

   

  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

 

 

   



标签:FeignClient,Feign,服务,feign,熔断,import,UserDTO,id
From: https://blog.51cto.com/u_15535797/6144355

相关文章