Spring Cloud 中使用Feign进行远程调用

news/2025/1/11 7:47:33/

🍓 简介:java系列技术分享(👉持续更新中…🔥)
🍓 初衷:一起学习、一起进步、坚持不懈
🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏
🍓 希望这篇文章对你有所帮助,欢迎点赞 👍 收藏 ⭐留言 📝

🍓 更多文章请点击
在这里插入图片描述在这里插入图片描述

文章目录

  • 一、Feign简介
  • 二、RestTemplate方式调用存在问题
  • 三、Feign的使用步骤
    • 3.1 引入依赖
    • 3.2 添加@EnableFeignClients注解
    • 3.3 编写FeignClient接口
    • 3.4 使用Feign客户端代用RestTemplate
  • 四、日志配置
    • 4.1 日志级别介绍
    • 4.2 配置日志
  • 五、Feign的性能优化
  • 六、Feign的实际应用

一、Feign简介

Feign官网:https://github.com/OpenFeign/feign

Fegin是声明式、模块化的Http客户端,可以帮助我们快捷优雅的调用HTTP接口。在SpringCloud中可以很方便的创建一个Feign客户端,只需声明一个接口,并加上对应的注解就能完成对HTTP接口的调用。
在这里插入图片描述

二、RestTemplate方式调用存在问题

可读性差,参数复杂难以维护

   //2远程查询用户信息String url="http://provider-server/provider/"+order.getUserId();//3. 发起调用User user = restTemplate.getForObject(url, User.class);

三、Feign的使用步骤

在服务消费者端添加如下

3.1 引入依赖

  <!-- 加入feign的依赖 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

3.2 添加@EnableFeignClients注解

在启动类或者配置类添加

@EnableFeignClients

3.3 编写FeignClient接口

@FeignClient("provider-server")
public interface ProviderServeClient {/*** 根据id查询用户信息*/@GetMapping("/provider/{id}")User queryById(@PathVariable("id") Long id);}
  • 服务名称:provider-server
  • 请求路径:/provider/{id}
  • 请求方式:GET
  • 请求参数:Long id
  • 返回值类型:User

3.4 使用Feign客户端代用RestTemplate

    @Autowiredprivate ProviderServeClient providerServeClient;/*** 根据id查询订单并返回*/@Overridepublic Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);//2远程查询用户信息
//        String url="http://provider-server/provider/"+order.getUserId();//2. 发起调用
//        User user = restTemplate.getForObject(url, User.class);User user = providerServeClient.queryById(order.getUserId());//3. 存入orderorder.setUser(user);// 4.返回return order;}

启动调用成功
在这里插入图片描述

四、日志配置

4.1 日志级别介绍

在这里插入图片描述1. NONE: 不记录任何日志信息,默认值
2. BASIC: 仅记录请求的方法,URL以及响应状态码和执行时间
3. HEADERS: 在BASIC的基础上,增加了请求和响应头信息
4. FULL: 记录所有请求和响应的明细,包括头信息,请求体,元数据

4.2 配置日志

方式一: 配置文件方式

全局配置

feign:client:config:default: # 全局的配置loggerLevel: BASIC 

局部配置

feign:client:config:provider-server: # 写服务名称,则针对某个微服务的配置loggerLevel: FULL

方式二: java代码方式

public class FeignClientConfiguration {public Logger.Level feignLogLevel(){return Logger.Level.BASIC;}
}
  1. 全局配置,添加到@EnableFeignClients注解中
@EnableFeignClients(defaultConfiguration = FeignClientConfiguration.class)
  1. 局部配置,添加到服务对应的@FeignClient注解中
@FeignClient(value = "provider-server",configuration = FeignClientConfiguration.class)

五、Feign的性能优化

Feign底层的客户端实现:

  1. URLConnection :默认实现,不支持连接池
  2. Apache HttpClient:支持连接池
  3. OKHttp : 支持链接池
  • 使用连接池代替默认的URLConnection
  • 日志级别最好使用BASIC或者NONE

引入依赖

        <!--httpClient的依赖 --><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId></dependency>

配置连接池

  httpclient:enabled: true # 开启feign对HttpClient的支持max-connections: 200 # 最大的连接数max-connections-per-route: 30 # 每个路径的最大连接数

六、Feign的实际应用

  1. 继承方式,给消费者的FeginClient和提供者的controller定义统一的父接口(不推荐)

    缺点:

    • 耦合度高
    • 参数无法继承
  2. 模块抽-----取将FeignClient抽取为独立模块,并把所有接口有关的配置都放到这个模块中,提供给所有消费者使用,这样就不用每个消费者都定义自己的Feign客户端,避免重复开发

抽取启动可能会报错如下:
ProviderServeClient没有找到
在这里插入图片描述

Description:Field providerServeClient in com.xing.service.impl.ConsumerServiceImpl required a bean of type 'com.api.clients.ProviderServeClient' that could not be found.The injection point has the following annotations:- @org.springframework.beans.factory.annotation.Autowired(required=true)

原因:

  1. 启动类所在包:package com.xing
  2. fegin模块客户端所在包为:package com.api;
  3. Spring Boot启动默认扫描启动类所在包及其所有子包,而fegin客户端所在包没有扫描到,所以报错ProviderServeClient没有找到

解决方案:

  1. 指定FeignClient所在包
    @EnableFeignClients(basePackages = "com.api")
    
  2. 指定FeignClient字节码
    @EnableFeignClients(clients = {ProviderServeClient.class})
    

启动成功
在这里插入图片描述
测试接口调用成功在这里插入图片描述
在这里插入图片描述在这里插入图片描述


http://www.ppmy.cn/news/799228.html

相关文章

第几周来着

周一凌晨四点多&#xff0c;被一群快乐的人的吵闹声吵醒后&#xff0c;拿起手机关掉耳机中的广播开始刷些视频&#xff0c;刷到了一些小说&#xff0c;一些漫画&#xff0c;忽然意识到自这次开学心里都不清净&#xff0c;总是不能安静下来&#xff0c;总是在想一些无关紧要的事…

计算从指定日期开始的第几周的周几的日期

项目场景&#xff1a; 拿到的排课表数据&#xff0c;里面没有具体日期&#xff0c;而是第几周&#xff0c;周几的形式&#xff0c;需要转换成具体日期。 问题描述 其中的周几是从周一开始的&#xff0c;从1 到7&#xff0c;转换时也是按这个顺序来 原因分析&#xff1a; 先需…

求出本周是第几周,本周的周一和周日时间

DateFormat dfnew SimpleDateFormat("yyyy-MM-dd"); Calendar calendar Calendar.getInstance(); //获取日历 System.out.println(calendar.get(Calendar.WEEK_OF_YEAR)); //获取是一年的第几周 calendar.set( Calendar.DAY_OF_WEEK, Cale…

当年的第几周

//年的第几周 echo intval(date(W,strtotime(2012-10-30))); echo floor(((mktime (0,0,0,10,25,2008) - mktime(0,0,0,1,1,2008)))/(3600*24*7))1,"\n"; //取出格式如&#xff1a; 2014-20 $strdate2; $dateym"2014-52"; $arrdate explode("-&…

excel中求某个日期是第几周

第一&#xff0c;excel计算第几周的方法 excel计算第几周&#xff0c;一般是根据指定的任意日期判断所属日位于本年中的周数。 具体如下面的截图&#xff1a;A2单元格是任意一个日期&#xff0c;在B2单元格用excel计算第几周。 如果一周开始于星期一&#xff1a;weeknum(date…

算出指定日期在当年的第几周

假定我们是按周一算一周开始。 基本计算应该是算出指定日期在当年的第几天&#xff0c;然后算出这些天换算成周&#xff0c;除以7&#xff0c;向下取整1 比如 当周7号&#xff0c;7-1 6 &#xff0c;6/70 余 6 这里涉及到的就是开始日期和结束日期&#xff0c;这样才能算出…

BTG7016A带诊断的开关芯片

目录 1、概述 ​编辑1.1、特征 1.2、潜在应用 1.3、描述 1.4、诊断特征 1.5、保护特征

元素配对----贪心1 (爱思创)

源代码 #include <bits/stdc.h> using namespace std; int main() {int n,data,sum0;cin>>n;vector<int> vec1,vec2;for(int i0; i<n; i){cin>>data;vec1.push_back(data);}for(int i0; i<n; i){cin>>data;vec2.push_back(data);}sort(ve…