微服务day04-基于Feign的远程调用

一.Feign的认识

是http客户端,因为使用RestTemplate存在一些问题:代码可读性差,参数配置费事,不够优雅…

String url="http://userservice/user/"+order.getUserId();
User user=restTemplate.getForObject(url,User.class);

Feign是一个声明式的HTTP客户端,可以帮助我们发送更加方便的发送HTTP请求。

1.1 Feign的使用

1.导入依赖
在order-service中导入依赖

	<!-- fiegn客户端 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

2.开启注解
在oder-service启动类上加上注解@EnableFeignClients

3.编写Feign客户端
在cn.itcast.order包下添加接口clients.UserClient,在接口上添加注解@FeignClient(“userservice”),并且括号里边声明你要请求的服务,之后编写接口函数,类似Controller。

@FeignClient("userservice")
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);}

4.注释掉原来的RestTemplate相关代码,改造service中代码

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate UserClient userClient;//    @Autowired
//    private RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);// 2.Feign远程调用User user=userClient.findById(order.getUserId());// 3.配置orderjorder.setUser(user);// 4.返回return order;}
}

配置成功之后结果图:
在这里插入图片描述

1.2 自定义Feign配置

Feign支持许多自定配置,比如:

类型作用说明
feign.Logger.Level修改日志级别包含四种不同的级别:NONE、BASIC、HEADERS、FULL
feign.codec.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象
feign.codec.Encoder请求参数编码将请求参数编码,便于通过http请求发送
feign. Contract支持的注解格式默认是SpringMVC的注解
feign. Retryer失败重试机制请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

配置日志方式一
基于配置文件修改feign的日志级别可以针对单个服务:

# feign日志级别配置
feign:  client:config: userservice: # 针对某个微服务的配置loggerLevel: FULL #  日志级别 

也可以针对所有服务:

# feign日志级别配置
feign:client:config:default: # 针对全局的配置loggerLevel: FULL # FULL:这是最详细的日志级别,Feign 会输出所有请求和响应的详细信息

日志级别生效结果:
在这里插入图片描述
配置日志方式二
也可以基于Java代码来修改日志级别,先声明一个类,然后声明一个Logger.Level的对象:

public class DefaultFeignConfiguration  {@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.BASIC; // 日志级别为BASIC}
}

如果要全局生效,将其放到启动类的@EnableFeignClients这个注解中:

@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration .class) 

如果是局部生效,则把它放到对应的@FeignClient这个注解中:

@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration .class) 

比如:

@FeignClient(value = "userservice", configuration = DefaultFeignConfiguration.class)
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);
}

1.3 Feign性能调优

Feign性能调优主要有2点:

  • 1.改变Feign的底层客户端实现

  • 2.改变Feign的日志级别为Basic/None*

Feign底层发起http请求,依赖于其它的框架。其底层客户端实现包括:

  • URLConnection:默认实现,不支持连接池
  • Apache HttpClient :支持连接池
  • OKHttp:支持连接池

因此提高Feign的性能主要手段就是使用连接池代替默认的URLConnection。

1.1 在order-service的pom文件中引入Apache的HttpClient依赖:

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

1.2 配置连接池,在order-service的application.yml中添加配置:

# feign自定义配置
feign:client:config:default:
#        loggerLevel: FULLloggerLevel: BASIC # 日志级别,BASIC就是基本的请求和响应信息httpclient:enabled: true # 开启feign对HttpClient的支持max-connections: 200 # 最大的连接数max-connections-per-route: 50 # 每个路径的最大连接数

1.4 Feign最佳实践分析

由于Feign的客户端与服务提供者的controller代码非常相似,因此应当可以有某种办法简化这种代码的重复编写。
在这里插入图片描述
在这里插入图片描述
有2种方式:

  • 定义API接口并基于springMVC注解做声明;(紧耦合不推荐)
  • 将Feign抽取成独立的模块,并把与接口有关的POJO,默认的Feign配置都放在这个模块中,提供给所有消费者使用(松耦合,推荐使用)。例如,将UserClient、User、Feign的默认配置都抽取到一个feign-api包中,所有微服务引用该依赖包,即可直接使用。

Feign抽取成独立的模块实现方式:

  • 创建一个module,命名为feign-api,然后引入feign的starter依赖

在这里插入图片描述

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
  • 将order-service中的UserClient,User,DefaultFeignConfiguration移动到feign-api项目中

在这里插入图片描述

  • 在order-service中引入feign-api的依赖
<dependency><groupId>cn.itcast.demo</groupId><artifactId>feign-api</artifactId><version>1.0</version>
</dependency>
  • 修改order-service中与上述3个组件有关的import部分

修改之后,发现UserClient对象爆红,提示“无法装配,未找到UserClient类型的Bean”,这是因为OrderApplication默认扫描cn.itcast.order下的包,而UserClient在被移动放到Feign-api模块之下,位于cn.itcast.feign包中,不会被OrderApplication扫描到,因而无法在spring容器中找到对应的Bean;
在这里插入图片描述
此时可以通过@EnableFeignClients(client=UserClient.class)(详细指定需要加载的Client接口)或者
指定需要加载的Client接口@EnableFeignClients(basePackages = “cn.itcast.feign.clients”)(加载了整个包进来)

  • 启动order-servcie与user-service微服务,效果如下:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/719486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

01.23 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、蔚来24届实习招聘特辑 | 软件&算法类&#xff08;内推&#xff09; 蔚来24届实习招聘特辑 | 软件&算法类&#xff08;内推&#xff09; 2、校招 | 普天科技2024校园招聘 校招…

初始计算机组成原理

1.初始计算机组成原理 本人相关文章&#xff1a;Linux之计算机概论 声明&#xff1a;大部分图片均来自网络&#xff0c;侵删 一个完整的计算机系统包括硬件子系统和软件子系统两大部分。 组成一台计算机的物理设备的总称叫做计算机硬件子系统,是看得见摸得着的实体,是计算机工…

华工的各类型PPT模板

华工的各类型PPT模板&#xff0c;包括原创的PPT及改良内容的PPT&#xff0c;适合科研/比赛/组会汇报等 前言各种毕业答辩夏令营答辩复试答辩奖学金答辩比赛/项目答辩组会汇报 前言 设计不易&#xff0c;排版不易&#xff0c;内容编排不易 待更新项目1 原创声明&#xff1a;不经…

【论文阅读】(2006)Dual-Optimal Inequalities for Stabilized Column Generation

文章目录 摘要一、介绍二、对偶最优不等式&#xff08;Dual-Optimal Inequalities&#xff09;三、确定P的最优原始解四、二元切割下料问题4.1 约束聚合4.2 相等约束4.3 计算结果 五、切割下料问题5.1 计算结果 六、三元组的深度对偶最优不等式&#xff08;Deep Dual-Optimal I…

C/C++ 乘积尾零问题(蓝桥杯)

如下的10行数据&#xff0c;每行有10个整数&#xff0c;请你求出它们的乘积的末尾有多少个零&#xff1f; 5650&#xff0c;4542 3554 473 946 4114 3871 9073 90 4329 2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 9937 1173 6866 3397 4759 7557 3070 2287 1453 9899…

代码随想录算法训练营第三十六天|435. 无重叠区间, 763.划分字母区间, 56. 合并区间

435. 无重叠区间 - LeetCode 思路&#xff1a; 本题是一个去除重叠区间的问题&#xff0c; 首先按照区间的 end_point 排序&#xff0c; 从第二个区间开始&#xff0c; 如果第二个区间和第一个区间有交集&#xff0c; 就要移除第二个区间。 因为容易证明之后的区间区间如果和…

做测试还是测试开发,选职业要慎重!

【软件测试面试突击班】2024吃透软件测试面试最全八股文攻略教程&#xff0c;一周学完让你面试通过率提高90%&#xff01;&#xff08;自动化测试&#xff09; 突然发现好像挺多人想投测开和测试的&#xff0c;很多人面试的时候也会被问到这几个职位的区别&#xff0c;然后有测…

每日五道java面试题之mysql数据库篇(三)

目录&#xff1a; 第一题. 百万级别或以上的数据如何删除&#xff1f;第二题. 前缀索引第三题. 什么是最左前缀原则&#xff1f;什么是最左匹配原则?第四题. B树和B树的区别第五题. 使用B树和B树好处 第一题. 百万级别或以上的数据如何删除&#xff1f; 关于索引&#xff1a;…

【设计】设计一个web版的数据库管理平台后端精要

需求 springboot设计开发一个系统&#xff0c;在这个系统的数据库表中存放着2000个数据库实例&#xff0c;有MySQL、Oracle、sql server3种数据库类型&#xff0c;用户可以在页面上选择不同的实例&#xff0c;连接这些实例上的数据库&#xff0c;来执行业务sql 实现 Service…

光伏储能MPPT控制系统如何进行浪涌静电保护?

MPPT&#xff08;Maximum Power Point Tracking&#xff09;是太阳能电池板光伏发电系统中重要的一种控制技术。MPPT控制器能够实时侦测太阳能板的发电电压&#xff0c;并追踪最高电压电流值&#xff08;VI&#xff09;&#xff0c;使系统以最大功率输出对蓄电池充电&#xff0…

06 - ip route和route -n的区别

1 ip route和route -n的区别 ip route 和 route -n 都是用于查看和管理Linux系统路由表的命令。但下面是它们的区别&#xff1a; ip route&#xff1a;是Linux系统中的现代工具&#xff0c;它属于iproute2套件&#xff1b;它提供了更多的选项&#xff0c;可以更精确地控制路由表…

使用git的小笔记

平时工作中使用git存储项目代码&#xff0c; 常用的命令 拉取仓库代码 git clone http://100.100.100.100:9080/my_test/test.git 拉取到以后&#xff0c; 先切换到自己的分支 git checkout my_name 一顿魔改代码 然后 add 新增的文件或者修改的文件 git add * 然后提交 并写…

【go从入门到精通】什么是go?为什么要选择go?

go的出生&#xff1a; go语言&#xff08;或Golang&#xff09;是Google开发的开源编程语言&#xff0c;诞生于2006年1月2日下午15点4分5秒&#xff0c;于2009年11月开源&#xff0c;2012年发布go稳定版。Go语言在多核并发上拥有原生的设计优势&#xff0c;Go语言从底层原生支持…

拦截大语言模型API调用 无需深究文档源码

背景众多库致力于通过自动重构或创建提示符来优化大语言模型的输出。这些建库宣称能够使大语言模型的输出更加&#xff1a; 安全(例如&#xff1a;安全护栏) 可预测(例如&#xff1a;智能指导) 结构化(例如&#xff1a;指令生成器) 鲁棒(例如&#xff1a;语言链) … 或者针…

如何在 Windows 上安装 ONLYOFFICE 文档 8.0

使用社区版&#xff0c;您可以在本地服务器上安装 ONLYOFFICE 文档&#xff0c;并将在线编辑器与 ONLYOFFICE 协作平台或其他热门系统集成在一起。 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一个功能强大的文档编辑器&#xff0c;支持处理文本文档、电子表格、演示文稿、可填写…

FPGA时序约束与分析--数据到达路径和数据需求路径

文章目录 前言一、定义二、时序模型三、公式推导前言 时序约束的定义–设计者根据实际的系统功能,通过时序约束的方式提出时序要求; FPGA 编译工具根据设计者的时序要求,进行布局布线;编译完成后, FPGA 编译工具还需要针对布局布线的结果,套用特定的时序模型( FPGA 器件…

Andorid 13 修改默认音量区间、默认音量值

Andorid 13 默认音量区间是 [0,15] &#xff0c;默认音量 5。 需求是&#xff1a;音量区间为 [0,100] &#xff0c;默认音量 30 。 找到对应产品的 device.mk &#xff0c;添加如下 #default volume PRODUCT_PROPERTY_OVERRIDES \ro.config.media_vol_steps100 \ro.config.…

无人机遥感在农林信息提取中的实现方法与GIS融合应用

在新一轮互联网信息技术大发展的现今&#xff0c;无人机、大数据、人工智能、物联网等新兴技术在各行各业都处于大爆发的前夜。为了将人工智能方法引入农业生产领域。首先在种植、养护等生产作业环节&#xff0c;逐步摆脱人力依赖&#xff1b;在施肥灌溉环节构建智慧节能系统&a…

openlayers 路线规划 高德坐标转wgs84 wgs84转天地图

在https://blog.csdn.net/qq_36287830/article/details/136321365改善而来的 需要进行坐标转换 不转换你画的线和实际数据是无法一一对应的 会出现偏移 关键代码 模拟请求后获取到数据场景 fetch(./a.json).then(async (res) > {//等待数据格式化为Jsonlet json await res.…

【C++第三课 - 类和对象中】构造函数、析构函数、拷贝构造函数

目录 类的6个默认成员函数构造函数自己写的构造函数默认生成的构造函数 析构函数概念特征 拷贝构造函数特征 运算符重载 、 >、 < 赋值重载Date类的完善构造函数的完善用复用 类的6个默认成员函数 默认成员函数&#xff1a;不写编译器也会默认生成一份 构造函数 自己…