Feign、参数传递、Gzip、RestFul代码

一、Feign简介

    1.Feign概念:Feign是一种声明式、模板化的HTTP客户端应用【插件】(仅在Consumer中使用)

    2.声明式服务调用:声明式调用就像调用本地方法一样调用远程方法,无感知远程http请求(不需像以前一样暴露API)

    3.声明式服务调用的作用:

        a.Spring  Cloud的声明式调用,可以做到使用HTTP请求远程服务时就能像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个HTTP请求;

        b.它像Duubo一样,Cousumer直接调用接口方法调用Provider,而不需要通过常规的Http  Client构造请求再解析返回数据。

    4.声明式服务调用解决的问题:它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注于远程的交互细节,更无需关注分布式环境开发。

Feign、参数传递、Gzip、RestFul代码_第1张图片
简图理解

二、Feigh入门案例

    1.创建Service(Feign)

        a.创建服务的API项目,配置相关依赖

Feign、参数传递、Gzip、RestFul代码_第2张图片
Pom.xml

        b.编写服务接口

Feign、参数传递、Gzip、RestFul代码_第3张图片
编写服务接口

        c.项目结构

Feign、参数传递、Gzip、RestFul代码_第4张图片
项目结构

    2.创建Provider

        a.创建项目,配置依赖修改pom文件(需注入服务的API坐标)

Feign、参数传递、Gzip、RestFul代码_第5张图片
Pom文件

        b.修改application.properties/yml文件,配置应用和服务注册中心

application.properties/yml

        c.创建Controller实现服务的API中的接口,并重写接口中的抽象方法

Feign、参数传递、Gzip、RestFul代码_第6张图片
Controller

        d.项目结构

Feign、参数传递、Gzip、RestFul代码_第7张图片
项目结构

    3.创建Consumer

        a.创建项目,配置依赖修改pom文件(需注入服务的API坐标)

        b.创建ProductConsumerService接口,继承ProductService(服务的API),配置@FeignClient注解并通过value/name属性指定要调用的Provider的应用名

Feign、参数传递、Gzip、RestFul代码_第8张图片
ProductConsumerService接口

        c.创建ProductConsumerController暴露要消费的方法

Feign、参数传递、Gzip、RestFul代码_第9张图片
ProductConsumerController

        d.修改启动类,配置注解

Feign、参数传递、Gzip、RestFul代码_第10张图片
修改启动类

    Feign中常用的注解

        @FeignClient:标识当前类是Feign客户端,并通过value/name属性指定要调用的Provider

        @EnbaleFeignClients:一般在启动类上添加,标识启动时加载(开启)Feign客户端应用(插肩)

        @EnableDiscoveryClient(@EnableEurekaClient):一般在启动类上添加,@EnableDiscoveryClient和@EnableEurekaClient共同点就是:都是能够让注册中心能够发现,扫描到该服务。

        e.项目结构

Feign、参数传递、Gzip、RestFul代码_第11张图片
项目结构

三、Feign中的参数传递(1.需要在服务API中编写,2.需要在Provider编写。Consumer中直接调用)

    1.单个参数传递:借助@RequestParam注解实现

服务API项目

Feign、参数传递、Gzip、RestFul代码_第12张图片
服务API项目

Provider项目

Feign、参数传递、Gzip、RestFul代码_第13张图片
Provider项目

    2.多个参数传递

        a.GET请求方式:借助@RequestParam注解实现,多个参数使用“,”分隔

        b.POST请求方式:借助@RequestBody注解实现

服务API项目

Feign、参数传递、Gzip、RestFul代码_第14张图片
服务API项目

Provider项目

Feign、参数传递、Gzip、RestFul代码_第15张图片
Provider项目

四、Gzip介绍以及Http协议中的传输规则

    1.Gzip概念:Gzip是一种数据格式,采用deflate算法压缩data;gzip是一种流行的文件压缩算法,应用十分广泛,尤其是在Linux平台

    2.Gzip能力:当gzip压缩到一个纯文本时,效果是非常明显的,大约可以减少70%以上的文件大小

    3.Gzip作用:网络数据经过压缩后实际降低了网络传输的字节书,最明显的好处就是可以加快网页加载的速度。网页加载速度加快的好处不言而喻,除了节省流量,改善用户的浏览体验外,另一个潜在的好处就是Gzip与搜索的引擎的抓取工具有着更好的关系。例如Google就可以直接通过读取gzip文件来比普通手工抓取更快的检索网页

修改appication.properties/yml全局文件,配置Gzip

Feign、参数传递、Gzip、RestFul代码_第16张图片
配置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的效率最高,使用最为广泛。

转自HTTP系列之压缩原理

使用Gzip压缩Http连接在处理参数时需注意

        1.如果使用 HttpClient 作为 Feign 的客户端工具。那么在定义接口上的注解需要开启

    在applicatin.properties/yml全局配置文件中添加相关信息

Feign、参数传递、Gzip、RestFul代码_第17张图片
配置applicaiton.properties/yml

        2.如果传递的是一个自定义的对象(对象会使用 json 格式来传递)。需要指定类型

Feign、参数传递、Gzip、RestFul代码_第18张图片
指定类型

五、配置微服务日志、配置Feign负载均衡请求时间

    配置微服务日志,只需添加logback.xml即可(在配置文件中编写相应的日志打印规则)

        1.添加logback.xml配置文件

Feign、参数传递、Gzip、RestFul代码_第19张图片
logback.xml

        2.修改启动类,即可启用微服务日志

Feign、参数传递、Gzip、RestFul代码_第20张图片
修改启动类

    3.通过applicaiton.propeteis/yml全局文件配置Feign负载均衡:底层原理还是通过Ribbon

Feign、参数传递、Gzip、RestFul代码_第21张图片
修改application.properties/yml全局配置文件

六、SpringBoot+Eureka+SpringCloud整合Feign案例

    项目需求(简介):由Provider操作数据持久层,Consumer需要通过Feign来进行调用处理来实现具体的功能,Provider和Consumer都要在Eureka服务中心注册,进行统一管理

Feign、参数传递、Gzip、RestFul代码_第22张图片
图形介绍

    1.创建Provider项目

        a.添加Mybatis依赖,Mysql驱动 [连接池] ,开启Eureka客户端,以及Web启动器

Feign、参数传递、Gzip、RestFul代码_第23张图片
Provider项目的的pom.xml

        b.修改application.properties/yml全局配置文件,添加各项信息(应用名、端口、Eureka注册中心,Mysql连接属性,连接池信息等)

Feign、参数传递、Gzip、RestFul代码_第24张图片
application.properties/yml

        c.编写实体类。Mapper层,定义操作数据库方法。编写Service层,定义业务逻辑。编写Controller层,暴露访问API,具体操作不再展示,贴上项目结构图

Feign、参数传递、Gzip、RestFul代码_第25张图片
Provider项目结构

        d.修改启动类,开启Eureka客户端,添加@MapperScan组件扫描注解(通过name/value属性指定Mapper层)

Feign、参数传递、Gzip、RestFul代码_第26张图片
修改启动类

    2.创建Feign项目

        a.配置pom.xml文件,添加SpringCloud相关依赖,添加Feign依赖

Feign、参数传递、Gzip、RestFul代码_第27张图片
pom.xml

        b.将Provider中的实体类复制到本项目,编写Service接口,以便Consumer进行调用实现,添加FeignClient注解指定Feign客户端要调用的Provider

Feign、参数传递、Gzip、RestFul代码_第28张图片
service接口

        c.项目结构

Feign、参数传递、Gzip、RestFul代码_第29张图片
Feign客户端项目结构

    3.创建Consumer项目

        a.配置pom.xml文件,添加Feign客户端项目的GAV坐标,添加SpringCloud依赖,添加thymeleaf依赖,添加web启动器,添加Eureka服务依赖

Feign、参数传递、Gzip、RestFul代码_第30张图片
pom.xml文件

        b.修改applicaiton.properties/yml全局配置文件,添加相关信息(应用名,端口,Eureka注册中心地址)

Feign、参数传递、Gzip、RestFul代码_第31张图片
applicaiton.properties/yml

        c.编写ConsumerController、注入Feign客户端中的Service接口,用来调用处理业务逻辑

Feign、参数传递、Gzip、RestFul代码_第32张图片
ConsumerController

        d.修改启动类,开启Eureka客户端,配置Feign客户端信息

Feign、参数传递、Gzip、RestFul代码_第33张图片
Consumer启动类

        e.项目结构

Feign、参数传递、Gzip、RestFul代码_第34张图片
Consumer项目结构

注意:参数传递方式规则要在Provider和Feign中定义,并且Provider和Feign两个项目中暴露的API访问路径要相同


你可能感兴趣的:(Feign、参数传递、Gzip、RestFul代码)