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

简图理解

二、Feigh入门案例

    1.创建Service(Feign)

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

Pom.xml

        b.编写服务接口

编写服务接口

        c.项目结构

项目结构

    2.创建Provider

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

Pom文件

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

application.properties/yml

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

Controller

        d.项目结构

项目结构

    3.创建Consumer

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

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

ProductConsumerService接口

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

ProductConsumerController

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

修改启动类

    Feign中常用的注解

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

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

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

        e.项目结构

项目结构

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

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

服务API项目

服务API项目

Provider项目

Provider项目

    2.多个参数传递

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

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

服务API项目

服务API项目

Provider项目

Provider项目

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

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

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

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

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

配置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全局配置文件中添加相关信息

配置applicaiton.properties/yml

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

指定类型

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

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

        1.添加logback.xml配置文件

logback.xml

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

修改启动类

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

修改application.properties/yml全局配置文件

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

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

图形介绍

    1.创建Provider项目

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

Provider项目的的pom.xml

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

application.properties/yml

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

Provider项目结构

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

修改启动类

    2.创建Feign项目

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

pom.xml

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

service接口

        c.项目结构

Feign客户端项目结构

    3.创建Consumer项目

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

pom.xml文件

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

applicaiton.properties/yml

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

ConsumerController

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

Consumer启动类

        e.项目结构

Consumer项目结构

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


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容