第六次课:声明式REST客户端Feign

飞一样的编程
飞一样的编程
擅长邻域:Java,MySQL,Linux,nginx,springboot,mongodb,微信小程序,vue

分类: Java springboot 专栏: 分布式学习 标签: Feign

2023-06-19 00:30:56 496浏览

声明式REST客户端Feign

前言

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展开评论

林俊杰jjj 能力:10

2023-06-19 15:47:11

梦为努力浇了水;爱在背后往前推;当我抬起头儿才发觉;我是不是忘了谁;累到整夜不能睡;夜色哪里都是美;一定有个人;她躲过避过闪过瞒过;她是谁她是谁
林俊杰jjj 能力:10

2023-06-19 15:43:47

哈哈哈哈,我也来入驻杰凡IT了,大家多多支持
蓝色妖姬 能力:10

2023-06-19 15:07:02

就算没有人心疼鸡宇哥,我也会心疼,被骂也不自觉,他值得被疼爱,他懂我的期待
周杰伦 能力:10

2023-06-19 15:03:33

残个
蓝色妖姬 能力:10

2023-06-19 15:02:02

一支蚊 香
周杰伦 能力:10

2023-06-19 15:01:32

残疾
蓝色妖姬 能力:10

2023-06-19 15:00:55

沟纹个
大傻逼一个 能力:10

2023-06-19 14:14:54

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>2.2.9.RELEASE</version> </dependency>
蓝色妖姬 能力:10

2023-06-19 14:05:55

薛之谦,我的偶像,你什么时候来湖南开演唱会,我带你打王者
蓝色的妖姬 能力:10

2023-06-19 09:48:17

今天的课谁都懂说容易爱透了还要嘴硬
点击查看更多评论

展开评论

您可能感兴趣的博客

客服QQ 1913284695