微服务中的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的最佳实践:

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

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

具体实现:

相关推荐
华仔啊5 分钟前
Java序列化详解:什么情况下必须用它?
java
BillKu1 小时前
Spring Boot Controller 使用 @RequestBody + @ModelAttribute 接收请求
java·spring boot·后端
chenglin0162 小时前
C#_接口设计:角色与契约的分离
java·前端·c#
chenglin0162 小时前
ES_多表关联
java·前端·elasticsearch
l5657582 小时前
第四十二天(Java开发 &Servlet&Filter & Lister)
java·笔记
杯莫停丶2 小时前
Spring Boot全局异常捕获指南
java·spring boot
许苑向上2 小时前
【BeanDefinitionRegistryPostProcessor 和 BeanFactoryPostProcessor 详细解答】
java·spring boot·启动流程
admiraldeworm10 小时前
Spring Boot + Spring AI 最小可运行 Demo
java·人工智能·ai
chenglin01610 小时前
ES_数据存储知识
java·服务器·elasticsearch
fs哆哆10 小时前
在VB.net中一维数组,与VBA有什么区别
java·开发语言·数据结构·算法·.net