目录:
(1)Feign的远程调用
(2)Feign的自定义配置
(3) Feign的性能优化
(4)Feign的最佳实践
(5)实现Feign的最佳实践
(1)Feign的远程调用
声明式请求客户端,早期我们在学习事务的时候,我们需要做事务的开启提交等操作,后来有了Spring,Spring的声明式事务,只需要你在Spring的配置文件里告诉Spring我要对谁加事务,把规则定义好,我们就不用管理,以后的事务都交给Spring来给我们做 ,声明式Http客户端也是如此,你不是要发Http请求吗,不好发怎么办?你把发请求的信息声明出来,剩下的事你不用管了,剩下的由Feign来帮你做
例:
第一步:
在order-service的pom.xml 添加一个依赖:
第二步 :
在order-service的主启动列OrderApplication中添加注解,@EnableFeignClient
开启Fieign的开关
第三步:编写客户端,做接口声明:UserClient
第四部
注释掉:
OrderService中原发发起远程调用的请求:
换成这个:注入userClient,更改发送请求方法
重新启动OrderService,在浏览器发送几次请求。
8081、8082都访问到了
说明我们不仅实现了远程调用,还实现了负载均衡。
(2)Feign的自定义配置
演示修改配置文件:
有两种方式:第一种基于配置文件的方式:
在order-service的配置文件中加入:
当没有重启服务发送请求只有sql的日志:
重启服务在次发送请求:日志显示了很多
第二种方式基于java代码的方式:
注释:
创建一个日志Bean
这个类让他生效需要使用注解,可以加到两个地方:
第一个地方是具体的Client上
还可以加载启动类上:
重启服务:发送请求
发现除了sql语句之外,还是有其他的日志,请求行,响应行这就是basic模式
日志有很多级别:如果你是调试错误建议使用FULL,平常情况下使用Basic、或者Null,因为日志会消耗一定的性能
(3) Feign的性能优化
URLConnection发送远程请求调用的时候是没有连接池的功能的,也就是所每次发送远程调用都需要一个新的连接,执行完业务再去关闭连接,我们知道Http请求,底层都是Http,每一次建立连接都需要3次握手,结束连接还要四次挥手,对性能的损耗是比较大的,因此我们使用连接池的方式,提高性能
Apache HttpClient、OKHttp支持连接池
第一步引入依赖:
第二步:
在配置文件中加入:
配置好之后怎么去验证一下呢?
验证一下Feign的底层是不是使用的Apache HttpClient的
这个客户端Apache HttpClient是给UserClient用的但是它是一个接口,在OrderService可以直接使用这个接口,为什么可以使用呢?它的底层一定是使用了动态代理,动态的给这个接口创建了对象,当发送请求的时候,就会用到这个客户端
采用debug形式打断点,发现这个客户端是一个而代理对象,所有的代理对象,当函数在执行的时候的底层是InvocationHandler去执行的
追踪到底层发现是ApacheHttpClient实现的
(4)Feign的最佳实践
我们发现UserClient的客户端和UserController中的方法是类似的,因此可以进行下面的实践
继承、抽取
他们都由缺优点,具体情况而定选择方式
(5)实现Feign的最佳实践
实现一下方式二:
步骤:首先新建一个Module:
引入feign的依赖:
接下来赋值代码:把客户端、配置、实体类都复制过去
以后任何人都可以直接使用这个不用他们自己写了 :
clients 和config User实体类,都不需要写了,可以删除了,引入上面的Module就行
删完之后会报错,需要在pom文件中引入上面那个新建的Module依赖
需要把保红的更换包的导入的包
这样order-service就不用写feign的客户端相关代码了:
启动报错,是因为找不到创建的对象,因为注解扫描不到
解决方案:
在启动类的@EnableFeignClients()加上clients=UserClient.class
重新启动:正常运行
发送请求进行测试:就实现了最佳实践的抽取方式