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