微服务中的Feign远程调用

Feign的个人理解

Feign在英文中是"装"的意思,但在微服务中他是远程调用的一种方式,我的理解是:他替代了RestTemplate+Nacos中的URL编码的方式,显得很高大上,所以很装:(声明式事务,只需要在Spring中把需要发请求的信息声明出来,剩下的交给"Feign装"帮你搞定)

Feign的使用

步骤很简单,首先我们需要引入依赖,然后再启动类上开启注解,编写Feign的客户端。部分代码对比:不难发现我们只需要少量的XXClient就可以替代大量的URL地址代码。

复制代码
<!--Feign的依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
复制代码
@Autowired
    private OrderMapper orderMapper;

    @Autowired
    private UserClient userClient;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        //2.利用UserClient发送请求
        User user = userClient.findById(order.getUserId());
        //3.封装user到order中去
        order.setUser(user);
        // 4.返回
        return order;
    }
    /*@Autowired
    private RestTemplate restTemplate;

    public Order queryOrderById(Long orderId) {
        // 1.查询订单
        Order order = orderMapper.findById(orderId);
        //2.利用RestTemplate发送请求
        String url = "http://userservice/user/"+order.getUserId();
        User user = restTemplate.getForObject(url, User.class);
        //3.封装user到order中去
        order.setUser(user);
        // 4.返回
        return order;
    }*/

再Feign的内部集成了Ribbon,所以不需要担心负载均衡的问题

除此之外Feign还给我们提供了许多默认配置,包括我们可以自定义的一些常用配置:

feign.Logger.Level中NONE:没有日志信息(默认),BASIC:Http请求的开始时间结束时间和持续时间等基本信息,HEADDERS:除了记录请求的基本信息之外还给你记录下请求头和响应头信息,FULL:记录所有的信息

修改配置文件来达到修改日志级别的效果和使用Java代码来实现修改日志级别的效果

方式二:注释掉方式一的前提下我们先创建一个config类:

然后我们可以选择不同的作用范围:作用在@FeignClient注解里面表示配置在当前服务器生效

作用在启动类上的@EnableFeignClients上代表作用在全局

以上的记录日志会消耗一定的性能。

自然而然我们也会有相应的性能优化:

主要是通过连接池的配置来实现的

还是老样子,我们首先要引入依赖,然后再配置文件中配置连接池

<!--httpClient的依赖 -->

<dependency>

<groupId>io.github.openfeign</groupId>

<artifactId>feign-httpclient</artifactId>

</dependency>

配置文件:

feign:

client:

config:

default: # default全局的配置

loggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息

httpclient:

enabled: true # 开启feign对HttpClient的支持

max-connections: 200 # 最大的连接数

max-connections-per-route: 50 # 每个路径的最大连接数

Feign的最佳实践:

第一种:继承(面向契约的思想,紧耦合)

第二种:抽取(松耦合,但相对可能会引入不需要的依赖)

具体实现:

相关推荐
拿破轮4 分钟前
使用通义灵码解决复杂正则表达式替换字符串的问题.
java·服务器·前端
j***51894 分钟前
Java进阶,时间与日期,包装类,正则表达式
java·mysql·正则表达式
WZTTMoon41 分钟前
Spring Boot 启动全解析:4 大关键动作 + 底层逻辑
java·spring boot·后端
章鱼哥73042 分钟前
[特殊字符] SpringBoot 自定义系统健康检测:数据库、Redis、表统计、更新时长、系统性能全链路监控
java·数据库·redis
深圳佛手1 小时前
Sharding-JDBC 和 Sharding-Proxy 区别
java
kk哥88991 小时前
inout参数传递机制的底层原理是什么?
java·开发语言
拾忆,想起2 小时前
Dubbo服务调用流程全解析:从请求到响应的微服务通信之旅
服务器·网络·微服务·云原生·架构·dubbo
小二·2 小时前
Spring框架入门:深入理解Spring DI的注入方式
java·后端·spring
避避风港2 小时前
转发与重定向
java·servlet