第六次课:声明式REST客户端Feign
分类: Java springboot 专栏: 分布式学习 标签: Feign
2023-06-19 00:30:56 692浏览
前言
RestTemplate方式调用存在的问题
- 代码可读性差,编程体验不统一
- 参数复杂URL难以维护
Feign
Feign是一个声明式的http客户端, 官方地址: https://github.com/OpenFeign/feign
其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
使用步骤
依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
加@EnableFeignClients
在需要远程调用的微服务的启动类上加注解:@EnableFeignClients
编写feign客户端
编写要远程调用接口的方法签名,主要是基于springMvc的注解声明远程调用的信息
- 服务名称: user-service
- 请求方式: GET
- 请求路径: /user/{id}
- 请求参数: Long id
- 返回值类型: User
@FeignClient("user-service") @RequestMapping("/user") public interface UserClient { @GetMapping("{id}") User get(@PathVariable Long id); }
调用代码
@Autowired UserClient userClient; // ..... order.setUser(userClient.get(order.getUserId()));
打印日志
先把日志级别调成debug模式
logging: level: com.jf3q.feign: debug
- 全局生效
feign: client: config: default: #这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置 loggerLevel: FULL #日志级别
- 局部生效
feign: client: config: user-service: #这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置 loggerLevel: FULL #日志级别
性能优化
Feign底层的客户端实现:
- URLConnection: 默认实现,不支持连接池
- Apache HttpClient :支持连接池
- OKHttp:支持连接池
所以我们改用Apache HttpClient ,并且日志级别要么直接不用要么选用BASIC
依赖
<!--httpclient的依赖--> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-httpclient</artifactId> </dependency>
feign: client: config: default: #这里用default就是全局配置,如果是写服务名称,则是针对某个微服务的配置 loggerLevel: BASIC #日志级别 httpclient: enabled: true #开启feign.对HttpClient的支持 max-connections: 200 #最大的连接数 max-connections-per-route: 50 #每个路径的最大连接数
抽离feign模块
把feign单独抽离出去成一个模块,打成jar供需要远程调用的微服务注入使用
注意,启动类和feign客户端不在一个模块的时候。要加@EnableFeignClients(clients ={OssClient.class} )
远程调用的时候参数传递失败
这个@RequestParam(name = "path")去掉就传不过来了。
远程调用携带token
写一个配置类
@Configuration public class FeignConfig implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); HttpServletRequest request = attributes.getRequest(); requestTemplate.header("Authorization", request.getHeader("Authorization")); } }
然后在feign客户端加configuration属性
@FeignClient(value = "upload-service",configuration = FeignConfig.class) @RequestMapping("/oss") public interface UploadClient { @DeleteMapping ResultDto del(@RequestParam(name = "path") String path); }
好博客就要一起分享哦!分享海报
此处可发布评论
评论(13)展开评论
2023-06-19 15:47:11
2023-06-19 14:14:54
展开评论
您可能感兴趣的博客