SpringCloud入门(九)Feign实战应用和性能优化

一、Feign实战应用

Feign的客户端与服务提供者的controller代码非常相似:

有没有一种办法简化这种重复的代码编写呢?

方式一:继承

优点: 简单。实现了代码共享。

缺点:服务提供方、服务消费方紧耦合。参数列表中的注解映射并不会继承,因此Controller中必须再次声明方法、参数列表、注解。

方式二:抽取。

抽取:将Feign的Client抽取为独立模块,并且把接口有关的POJO、默认的Feign配置都放到这个模块中,提供给所有消费者使用。

例如,将UserClient、User、Feign的默认配置都抽取到一个feign-api包中,所有微服务引用该依赖包,即可直接使用。

实现抽取的步骤如下:

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

2.将order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中

3.在order-service中引入feign-api的依赖

4.修改order-service中的所有与上述三个组件有关的import部分,改成导入feign-api中的包

5.重启测试

具体实现如下:

步骤1:首先创建一个module,命名为feign-api:

步骤2:在feign-api中然后引入feign的starter依赖:

XML 复制代码
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

步骤3:然后,order-service中编写的UserClient、User、DefaultFeignConfiguration都复制到feign-api项目中:

步骤4:在order-service中使用feign-api

首先,删除order-service中的UserClient、User、DefaultFeignConfiguration等类或接口。

在order-service的pom文件中中引入feign-api的依赖:

XML 复制代码
<dependency>
    <groupId>cn.it.feign</groupId>
    <artifactId>feign-api</artifactId>
    <version>1.0</version>
</dependency>

修改order-service中的所有与上述三个组件有关的导包部分,改成导入feign-api中的包

步骤5:重启测试:

因为UserClient现在在cn.it.feign.clients包下,而order-service的@EnableFeignClients注解是在cn.it.order包下,不在同一个包,无法扫描到UserClient。

解决扫描包问题:

方式一:

指定Feign应该扫描的包:

java 复制代码
@EnableFeignClients(basePackages = "cn.it.feign.clients")

方式二:

指定需要加载的Client接口:

java 复制代码
@EnableFeignClients(clients = {UserClient.class})

二、Feign性能优化

Feign底层的客户端实现:

URLConnection:默认实现,不支持连接池。

Apache HttpClient :支持连接池。

OKHttp:支持连接池。

因此优化Feign的性能主要包括:

1.使用连接池代替默认的URLConnection。

2.日志级别,最好用basic或none。

Feign的优化:

1.日志级别尽量用basic

2.使用HttpClient或OKHttp代替URLConnection:(1)引入feign-httpClient依赖。(2)配置文件开启httpClient功能,设置连接池参数

相关推荐
数据库技术讲堂5 分钟前
从 GitOps 到数据库变更:NineData 如何打通 CI/CD 的数据库治理链路
java·数据库·ci/cd
深海呐16 分钟前
Java 位运算符的实际应用:不止面试刷题,业务同样能用
java·位运算符·java 位运算·java 开发技巧·状态位设计·java 高阶用法·位运算符实战
2602_9599609218 分钟前
电商场景Java面试:Spring Boot、JVM、Redis、Kafka、微服务与分布式事务考点解析——谢飞机的作死面试记
java·jvm·spring boot·redis·面试题
路多辛20 分钟前
一个 Go 写的全能 AI Agent,讲讲 covo-agent
java·开发语言·golang
杨丰玮41824 分钟前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(四)
java·游戏·计算机外设
阿沐沐,27 分钟前
PowerShell 里改了 config.toml,Codex CLI 仍用旧值:先分清该改哪一层
java·服务器·数据库·人工智能·ai·ai编程
杨丰玮41830 分钟前
从零手写Java飞机躲障碍游戏|Swing绘图、鼠标跟随、计时器碰撞检测实战(二)
java·游戏·计算机外设
Rain的Java大神之路34 分钟前
如何避免订单重复提交
java·redis·后端·面试·架构·rabbitmq·rocketmq
ps酷教程1 小时前
解析自定义数据
java