旧的远程调用方法
底层把mall-order从注册中心拿到实例转成ip和端口
缺陷:耦合太强 需要改代码
- 代码可读性差,编程体验不统一
- 参数复杂时URL难以维护
微服务调用组件Spring Cloud OpenFeign
2.1 什么是Spring Cloud OpenFeign
Feign是Netflix开发的声明式、模板化的HTTP客户端,Feign可帮助我们更加便捷、优雅地调用HTTP API。Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。
//本地调用
R result = orderService.findOrderByUserId(id);
//openFeign远程调用 orderService为代理对象
R result = orderService.findOrderByUserId(id);
Spring Cloud OpenFeign对Feign进行了增强,使其支持Spring MVC注解,从而使得Feign的使用更加方便。
官方文档: Spring Cloud OpenFeign
2.2微服务快速整合OpenFeign实战
第三步:实现接口
value:要调用的微服务的名字
path:要调用微服务的前缀
编写接口:
原封不动把Controller里的方法全部复制到接口去
复制到接口去 带上springMvc注解
最后一步,注入刚才的接口,直接调用
注意:
接口定义的方法名和参数名是允许修改的
如果参数不加注解 默认会加@RequestBody,但是2个@RequestBody会有问题的,这里就会报错
错误示范:
解决办法:
带上@SpringQueryMap注解会把参数全部转成表单类型
?xxx=xx&xxx=xx
OpenFeign的调用流程
要生成接口的代理对象,只能是jdk动态代理
原生的Feign是不支持mvc注解的,feign有自己的注解如@RequestLine,
现在只要使用mvc的注解就可以
需要进行序列化,编码解码
底层调其他服务,我们openFeign底层用的是http协议
http和rpc协议区别:
HTTP 接口与 RPC 接口的区别和相同之处
-
通信协议不同:HTTP 使用文本协议,RPC 使用二进制协议。
-
调用方式不同:HTTP 接口通过 URL 进行调用,RPC 接口通过函数调用进行调用。
-
参数传递方式不同:HTTP 接口使用 URL 参数或者请求体进行参数传递,RPC 接口使用函数参数进行传递。
-
接口描述方式不同:HTTP 接口使用 RESTful 架构描述接口,RPC 接口使用接口定义语言(IDL)描述接口。
-
性能表现不同:RPC 接口通常比 HTTP 接口更快,因为它使用二进制协议进行通信,而且使用了一些性能优化技术,例如连接池、批处理等。此外,RPC 接口通常支持异步调用,可以更好地处理高并发场景。
HTTP 接口和 RPC 接口的相同之处在于,它们都是用于接口通信的协议。它们都需要定义接口、参数和返回值等信息,并通过网络进行通信。此外,它们都支持多种数据格式的编解码,可以根据需求进行灵活的选择。
可以优化的参数
全局生效,输出日志
如果想要局部生效
不能使用全局注解,
让指定的微服务生效
使用yaml更方便,指定微服务名字
超时时间配置
契约配置
可以切回Feign的注解使用
客户端做替换
第一步引入依赖
第二步开启httpClinet5 只要引入依赖默认也会开启
也可以采用okhttp
GZIP压缩
浏览器调用请求其实默认就会压缩GZIP
但是现在是A调用B,B用openFeign调用C,此时B调用C就没有对请求做压缩处理
编码器解码器
例子:
也可以指定微服务开启编解码
通过json编码解码
如果此时还是直接调用接口就会报错,因为传参不是json
解法,RequestMapping指定headers
拦截器配置
利用openFeign把参数往下游传递
第一种用的比较少
第二种 自行实现RequestInterceptor接口,实现自己的一些逻辑
例子:
模拟认证逻辑
拿请求,拿到request后,往里面去放,就会自己往下游传递
拦截器配置记得打开 ,下游的mvc服务被调用端里就能拿到Authorization的值了。
方案1:不会这么干
方案2:
添加拦截器
代码实现:
也可以在yaml中配置