一、Feign简介
1.Feign概念:Feign是一种声明式、模板化的HTTP客户端应用【插件】(仅在Consumer中使用)
2.声明式服务调用:声明式调用就像调用本地方法一样调用远程方法,无感知远程http请求(不需像以前一样暴露API)
3.声明式服务调用的作用:
a.Spring Cloud的声明式调用,可以做到使用HTTP请求远程服务时就能像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求;
b.它像Duubo一样,Cousumer直接调用接口方法调用Provider,而不需要通过常规的Http Client构造请求再解析返回数据。
4.声明式服务调用解决的问题:它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注于远程的交互细节,更无需关注分布式环境开发。
二、Feigh入门案例
1.创建Service(Feign)
a.创建服务的API项目,配置相关依赖
b.编写服务接口
c.项目结构
2.创建Provider
a.创建项目,配置依赖修改pom文件(需注入服务的API坐标)
b.修改application.properties/yml文件,配置应用和服务注册中心
c.创建Controller实现服务的API中的接口,并重写接口中的抽象方法
d.项目结构
3.创建Consumer
a.创建项目,配置依赖修改pom文件(需注入服务的API坐标)
b.创建ProductConsumerService接口,继承ProductService(服务的API),配置@FeignClient注解并通过value/name属性指定要调用的Provider的应用名
c.创建ProductConsumerController暴露要消费的方法
d.修改启动类,配置注解
Feign中常用的注解
@FeignClient:标识当前类是Feign客户端,并通过value/name属性指定要调用的Provider
@EnbaleFeignClients:一般在启动类上添加,标识启动时加载(开启)Feign客户端应用(插肩)
@EnableDiscoveryClient(@EnableEurekaClient):一般在启动类上添加,@EnableDiscoveryClient和@EnableEurekaClient共同点就是:都是能够让注册中心能够发现,扫描到该服务。
e.项目结构
三、Feign中的参数传递(1.需要在服务API中编写,2.需要在Provider编写。Consumer中直接调用)
1.单个参数传递:借助@RequestParam注解实现
服务API项目
Provider项目
2.多个参数传递
a.GET请求方式:借助@RequestParam注解实现,多个参数使用“,”分隔
b.POST请求方式:借助@RequestBody注解实现
服务API项目
Provider项目
四、Gzip介绍以及Http协议中的传输规则
1.Gzip概念:Gzip是一种数据格式,采用deflate算法压缩data;gzip是一种流行的文件压缩算法,应用十分广泛,尤其是在Linux平台
2.Gzip能力:当gzip压缩到一个纯文本时,效果是非常明显的,大约可以减少70%以上的文件大小
3.Gzip作用:网络数据经过压缩后实际降低了网络传输的字节书,最明显的好处就是可以加快网页加载的速度。网页加载速度加快的好处不言而喻,除了节省流量,改善用户的浏览体验外,另一个潜在的好处就是Gzip与搜索的引擎的抓取工具有着更好的关系。例如Google就可以直接通过读取gzip文件来比普通手工抓取更快的检索网页
修改appication.properties/yml全局文件,配置Gzip
4.HTTP协议中关于压缩传输的规定
第一:客户端向服务器请求中带有:Accept-Encoding:gzip,deflate字段,向服务器标识,客户端支持的压缩格式(gzip或者deflate),如果不发送该消息头,服务器是不会压缩的
第二:服务端在收到请求之后,如果发现请求头中含有Accept-Encoding字段,并且支持该类型的压缩,就对响应报文压缩之后返回给客户端,并且携带Content-Encoding:gzip消息头,表示响应报文是根据该格式压缩过的
第三:客户端接收到请求之后,先判断是否有Content-Encoding消息头,如果有、则按该格式解压报文,否则按正常格式报文处理
5.Http的背景原理
a.两台服务器建立http的连接过程是很复杂的一个过程,设计到多个数据包的交换,并且也很耗时间
b.Http连接需要的3次握手和四次分手开销很大,这一开销对于大量的比较小的http消息来说更大
6.Http优化解决方案
a.如果我们直接采用http连接池,节约了大量的3次握手和4次分手,这样能大大提升吞吐率
b.Feign的http客户端支持3种框架:
HttpURLConnection(默认)
HttpClient
Okhttp
c.传统的HttpURLConnection是JDK自带的,并不支持连接池,如果要实现连接池的机制,还需要自己来管理来连接对象。对于网络请求这种底层相对复杂的操作,如果有可用的其他方案,也没有必要自己去管理连接对象
d.HttpClient相比传统JDK自带的HttpURLConnection,它封装了访问http的请求头,参数,内容提,响应等等;它不仅使客户端发送HTTP请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性;另外、高并发大量的请求网络的时候,还是用“连接池”提升吞吐量。
Gzip压缩Http连接的原理
浏览器通过http request 传到 Web服务器,request中包含了 Accept-Encoding:gzip,deflate(这是告诉服务器,浏览器支持gzip和deflate压缩.gzip和deflate相同,但也有差异,详情自行百度:http accept-encoding同时存在gzip和deflate)
Web服务器接收到request后,生成原始的response,在response中有原始的content-type和content-lenghtWeb服务器对response进行gzip编码,编码后的response包含content-type和content-lenght还有新增加的Accept-Encoding:gzip,
然后把response发送给浏览器浏览器对Web服务器返回的response,根据Accept-Encoding:gzip进行gzip解码,取到原始的response数据,显示出网页Content-Encoding的值:
gzip 表明实体采用GNU zip编码
compress 表明实体采用Unix的文件压缩程序
deflate 表明实体采用zlib格式压缩的
identity 表明没有对实体进行编码,当没有Content-Encoding header时,就默认为这种情况
gzip和compress以及deflate编码都是无损压缩算法,用于减少传输报文的大小,不会导致信息损失,其中gzip的效率最高,使用最为广泛。
使用Gzip压缩Http连接在处理参数时需注意
1.如果使用 HttpClient 作为 Feign 的客户端工具。那么在定义接口上的注解需要开启
在applicatin.properties/yml全局配置文件中添加相关信息
2.如果传递的是一个自定义的对象(对象会使用 json 格式来传递)。需要指定类型
五、配置微服务日志、配置Feign负载均衡请求时间
配置微服务日志,只需添加logback.xml即可(在配置文件中编写相应的日志打印规则)
1.添加logback.xml配置文件
2.修改启动类,即可启用微服务日志
3.通过applicaiton.propeteis/yml全局文件配置Feign负载均衡:底层原理还是通过Ribbon
六、SpringBoot+Eureka+SpringCloud整合Feign案例
项目需求(简介):由Provider操作数据持久层,Consumer需要通过Feign来进行调用处理来实现具体的功能,Provider和Consumer都要在Eureka服务中心注册,进行统一管理
1.创建Provider项目
a.添加Mybatis依赖,Mysql驱动 [连接池] ,开启Eureka客户端,以及Web启动器
b.修改application.properties/yml全局配置文件,添加各项信息(应用名、端口、Eureka注册中心,Mysql连接属性,连接池信息等)
c.编写实体类。Mapper层,定义操作数据库方法。编写Service层,定义业务逻辑。编写Controller层,暴露访问API,具体操作不再展示,贴上项目结构图
d.修改启动类,开启Eureka客户端,添加@MapperScan组件扫描注解(通过name/value属性指定Mapper层)
2.创建Feign项目
a.配置pom.xml文件,添加SpringCloud相关依赖,添加Feign依赖
b.将Provider中的实体类复制到本项目,编写Service接口,以便Consumer进行调用实现,添加FeignClient注解指定Feign客户端要调用的Provider
c.项目结构
3.创建Consumer项目
a.配置pom.xml文件,添加Feign客户端项目的GAV坐标,添加SpringCloud依赖,添加thymeleaf依赖,添加web启动器,添加Eureka服务依赖
b.修改applicaiton.properties/yml全局配置文件,添加相关信息(应用名,端口,Eureka注册中心地址)
c.编写ConsumerController、注入Feign客户端中的Service接口,用来调用处理业务逻辑
d.修改启动类,开启Eureka客户端,配置Feign客户端信息
e.项目结构
注意:参数传递方式规则要在Provider和Feign中定义,并且Provider和Feign两个项目中暴露的API访问路径要相同