Feign、參數(shù)傳遞胆敞、Gzip着帽、RestFul代碼

一、Feign簡(jiǎn)介

? ? 1.Feign概念:Feign是一種聲明式移层、模板化的HTTP客戶端應(yīng)用【插件】(僅在Consumer中使用)

? ? 2.聲明式服務(wù)調(diào)用:聲明式調(diào)用就像調(diào)用本地方法一樣調(diào)用遠(yuǎn)程方法启摄,無(wú)感知遠(yuǎn)程http請(qǐng)求(不需像以前一樣暴露API)

? ? 3.聲明式服務(wù)調(diào)用的作用:

? ? ? ? a.Spring? Cloud的聲明式調(diào)用,可以做到使用HTTP請(qǐng)求遠(yuǎn)程服務(wù)時(shí)就能像調(diào)用本地方法一樣的體驗(yàn)幽钢,開(kāi)發(fā)者完全感知不到這是遠(yuǎn)程方法歉备,更感知不到這是個(gè)HTTP請(qǐng)求;

? ? ? ? b.它像Duubo一樣匪燕,Cousumer直接調(diào)用接口方法調(diào)用Provider蕾羊,而不需要通過(guò)常規(guī)的Http? Client構(gòu)造請(qǐng)求再解析返回?cái)?shù)據(jù)。

? ? 4.聲明式服務(wù)調(diào)用解決的問(wèn)題:它解決了讓開(kāi)發(fā)者調(diào)用遠(yuǎn)程接口就跟調(diào)用本地方法一樣帽驯,無(wú)需關(guān)注于遠(yuǎn)程的交互細(xì)節(jié)龟再,更無(wú)需關(guān)注分布式環(huán)境開(kāi)發(fā)。

簡(jiǎn)圖理解

二尼变、Feigh入門(mén)案例

????1.創(chuàng)建Service(Feign)

? ? ? ? a.創(chuàng)建服務(wù)的API項(xiàng)目利凑,配置相關(guān)依賴

Pom.xml

? ? ? ? b.編寫(xiě)服務(wù)接口

編寫(xiě)服務(wù)接口

? ? ? ? c.項(xiàng)目結(jié)構(gòu)

項(xiàng)目結(jié)構(gòu)

? ? 2.創(chuàng)建Provider

? ? ? ? a.創(chuàng)建項(xiàng)目浆劲,配置依賴修改pom文件(需注入服務(wù)的API坐標(biāo))

Pom文件

? ? ? ? b.修改application.properties/yml文件,配置應(yīng)用和服務(wù)注冊(cè)中心

application.properties/yml

? ? ? ? c.創(chuàng)建Controller實(shí)現(xiàn)服務(wù)的API中的接口哀澈,并重寫(xiě)接口中的抽象方法

Controller

? ? ? ? d.項(xiàng)目結(jié)構(gòu)

項(xiàng)目結(jié)構(gòu)

? ? 3.創(chuàng)建Consumer

? ? ? ? a.創(chuàng)建項(xiàng)目牌借,配置依賴修改pom文件(需注入服務(wù)的API坐標(biāo))

? ? ? ? b.創(chuàng)建ProductConsumerService接口,繼承ProductService(服務(wù)的API)割按,配置@FeignClient注解并通過(guò)value/name屬性指定要調(diào)用的Provider的應(yīng)用名

ProductConsumerService接口

? ? ? ? c.創(chuàng)建ProductConsumerController暴露要消費(fèi)的方法

ProductConsumerController

? ? ? ? d.修改啟動(dòng)類膨报,配置注解

修改啟動(dòng)類

? ? Feign中常用的注解

? ? ? ? @FeignClient:標(biāo)識(shí)當(dāng)前類是Feign客戶端,并通過(guò)value/name屬性指定要調(diào)用的Provider

? ? ? ? @EnbaleFeignClients:一般在啟動(dòng)類上添加适荣,標(biāo)識(shí)啟動(dòng)時(shí)加載(開(kāi)啟)Feign客戶端應(yīng)用(插肩)

? ? ? ? @EnableDiscoveryClient(@EnableEurekaClient):一般在啟動(dòng)類上添加,@EnableDiscoveryClient和@EnableEurekaClient共同點(diǎn)就是:都是能夠讓注冊(cè)中心能夠發(fā)現(xiàn)现柠,掃描到該服務(wù)。

? ? ? ? e.項(xiàng)目結(jié)構(gòu)

項(xiàng)目結(jié)構(gòu)

三弛矛、Feign中的參數(shù)傳遞(1.需要在服務(wù)API中編寫(xiě)够吩,2.需要在Provider編寫(xiě)。Consumer中直接調(diào)用)

? ? 1.單個(gè)參數(shù)傳遞:借助@RequestParam注解實(shí)現(xiàn)

服務(wù)API項(xiàng)目

服務(wù)API項(xiàng)目

Provider項(xiàng)目

Provider項(xiàng)目

? ??2.多個(gè)參數(shù)傳遞

? ? ? ? a.GET請(qǐng)求方式:借助@RequestParam注解實(shí)現(xiàn)丈氓,多個(gè)參數(shù)使用“周循,”分隔

? ? ? ? b.POST請(qǐng)求方式:借助@RequestBody注解實(shí)現(xiàn)

服務(wù)API項(xiàng)目

服務(wù)API項(xiàng)目

Provider項(xiàng)目

Provider項(xiàng)目

四、Gzip介紹以及Http協(xié)議中的傳輸規(guī)則

? ? 1.Gzip概念:Gzip是一種數(shù)據(jù)格式扒寄,采用deflate算法壓縮data鱼鼓;gzip是一種流行的文件壓縮算法,應(yīng)用十分廣泛该编,尤其是在Linux平臺(tái)

? ? 2.Gzip能力:當(dāng)gzip壓縮到一個(gè)純文本時(shí)迄本,效果是非常明顯的,大約可以減少70%以上的文件大小

? ? 3.Gzip作用:網(wǎng)絡(luò)數(shù)據(jù)經(jīng)過(guò)壓縮后實(shí)際降低了網(wǎng)絡(luò)傳輸?shù)淖止?jié)書(shū)课竣,最明顯的好處就是可以加快網(wǎng)頁(yè)加載的速度嘉赎。網(wǎng)頁(yè)加載速度加快的好處不言而喻,除了節(jié)省流量于樟,改善用戶的瀏覽體驗(yàn)外公条,另一個(gè)潛在的好處就是Gzip與搜索的引擎的抓取工具有著更好的關(guān)系又厉。例如Google就可以直接通過(guò)讀取gzip文件來(lái)比普通手工抓取更快的檢索網(wǎng)頁(yè)

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

配置Gzip

? ? 4.HTTP協(xié)議中關(guān)于壓縮傳輸?shù)囊?guī)定

? ? ????第一:客戶端向服務(wù)器請(qǐng)求中帶有:Accept-Encoding:gzip,deflate字段营袜,向服務(wù)器標(biāo)識(shí)路捧,客戶端支持的壓縮格式(gzip或者deflate)关霸,如果不發(fā)送該消息頭,服務(wù)器是不會(huì)壓縮的

? ? ????第二:服務(wù)端在收到請(qǐng)求之后杰扫,如果發(fā)現(xiàn)請(qǐng)求頭中含有Accept-Encoding字段队寇,并且支持該類型的壓縮,就對(duì)響應(yīng)報(bào)文壓縮之后返回給客戶端章姓,并且攜帶Content-Encoding:gzip消息頭佳遣,表示響應(yīng)報(bào)文是根據(jù)該格式壓縮過(guò)的

? ? ? ? 第三:客戶端接收到請(qǐng)求之后识埋,先判斷是否有Content-Encoding消息頭,如果有零渐、則按該格式解壓報(bào)文窒舟,否則按正常格式報(bào)文處理

? ? 5.Http的背景原理

? ? ? ? a.兩臺(tái)服務(wù)器建立http的連接過(guò)程是很復(fù)雜的一個(gè)過(guò)程,設(shè)計(jì)到多個(gè)數(shù)據(jù)包的交換相恃,并且也很耗時(shí)間

? ? ? ? b.Http連接需要的3次握手四次分手開(kāi)銷很大辜纲,這一開(kāi)銷對(duì)于大量的比較小的http消息來(lái)說(shuō)更大

? ? 6.Http優(yōu)化解決方案

? ? ? ? a.如果我們直接采用http連接池笨觅,節(jié)約了大量的3次握手和4次分手拦耐,這樣能大大提升吞吐率

? ? ? ? b.Feign的http客戶端支持3種框架:

? ? ? ? ? ? HttpURLConnection(默認(rèn))

? ? ? ? ? ? HttpClient

? ? ? ? ? ? Okhttp

? ? ? ? c.傳統(tǒng)的HttpURLConnection是JDK自帶的,并不支持連接池见剩,如果要實(shí)現(xiàn)連接池的機(jī)制杀糯,還需要自己來(lái)管理來(lái)連接對(duì)象。對(duì)于網(wǎng)絡(luò)請(qǐng)求這種底層相對(duì)復(fù)雜的操作苍苞,如果有可用的其他方案固翰,也沒(méi)有必要自己去管理連接對(duì)象

? ? ? ? d.HttpClient相比傳統(tǒng)JDK自帶的HttpURLConnection,它封裝了訪問(wèn)http的請(qǐng)求頭羹呵,參數(shù)骂际,內(nèi)容提,響應(yīng)等等冈欢;它不僅使客戶端發(fā)送HTTP請(qǐng)求變得容易歉铝,而且也方便了開(kāi)發(fā)人員測(cè)試接口(基于Http協(xié)議的),即提高了開(kāi)發(fā)的效率凑耻,也方便提高代碼的健壯性太示;另外、高并發(fā)大量的請(qǐng)求網(wǎng)絡(luò)的時(shí)候香浩,還是用“連接池”提升吞吐量类缤。


????Gzip壓縮Http連接的原理

????????瀏覽器通過(guò)http request 傳到 Web服務(wù)器,request中包含了 Accept-Encoding:gzip,deflate(這是告訴服務(wù)器邻吭,瀏覽器支持gzip和deflate壓縮.gzip和deflate相同餐弱,但也有差異,詳情自行百度:http accept-encoding同時(shí)存在gzip和deflate)

????????Web服務(wù)器接收到request后囱晴,生成原始的response,在response中有原始的content-type和content-lenghtWeb服務(wù)器對(duì)response進(jìn)行g(shù)zip編碼,編碼后的response包含content-type和content-lenght還有新增加的Accept-Encoding:gzip,

????????然后把response發(fā)送給瀏覽器瀏覽器對(duì)Web服務(wù)器返回的response膏蚓,根據(jù)Accept-Encoding:gzip進(jìn)行g(shù)zip解碼,取到原始的response數(shù)據(jù)速缆,顯示出網(wǎng)頁(yè)Content-Encoding的值:

gzip 表明實(shí)體采用GNU zip編碼

compress 表明實(shí)體采用Unix的文件壓縮程序

deflate 表明實(shí)體采用zlib格式壓縮的

identity 表明沒(méi)有對(duì)實(shí)體進(jìn)行編碼降允,當(dāng)沒(méi)有Content-Encoding header時(shí),就默認(rèn)為這種情況

gzip和compress以及deflate編碼都是無(wú)損壓縮算法艺糜,用于減少傳輸報(bào)文的大小剧董,不會(huì)導(dǎo)致信息損失幢尚,其中g(shù)zip的效率最高,使用最為廣泛翅楼。

轉(zhuǎn)自HTTP系列之壓縮原理

使用Gzip壓縮Http連接在處理參數(shù)時(shí)需注意

????????1.如果使用 HttpClient 作為 Feign 的客戶端工具尉剩。那么在定義接口上的注解需要開(kāi)啟

? ??在applicatin.properties/yml全局配置文件中添加相關(guān)信息

配置applicaiton.properties/yml

????????2.如果傳遞的是一個(gè)自定義的對(duì)象(對(duì)象會(huì)使用 json 格式來(lái)傳遞)。需要指定類型

指定類型

五毅臊、配置微服務(wù)日志理茎、配置Feign負(fù)載均衡請(qǐng)求時(shí)間

? ??配置微服務(wù)日志,只需添加logback.xml即可(在配置文件中編寫(xiě)相應(yīng)的日志打印規(guī)則)

????????1.添加logback.xml配置文件

logback.xml

????????2.修改啟動(dòng)類管嬉,即可啟用微服務(wù)日志

修改啟動(dòng)類

? ? 3.通過(guò)applicaiton.propeteis/yml全局文件配置Feign負(fù)載均衡:底層原理還是通過(guò)Ribbon

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

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

? ? 項(xiàng)目需求(簡(jiǎn)介):由Provider操作數(shù)據(jù)持久層,Consumer需要通過(guò)Feign來(lái)進(jìn)行調(diào)用處理來(lái)實(shí)現(xiàn)具體的功能蚯撩,Provider和Consumer都要在Eureka服務(wù)中心注冊(cè)础倍,進(jìn)行統(tǒng)一管理

圖形介紹

? ? 1.創(chuàng)建Provider項(xiàng)目

? ? ? ? a.添加Mybatis依賴,Mysql驅(qū)動(dòng) [連接池] 胎挎,開(kāi)啟Eureka客戶端沟启,以及Web啟動(dòng)器

Provider項(xiàng)目的的pom.xml

? ? ? ? b.修改application.properties/yml全局配置文件,添加各項(xiàng)信息(應(yīng)用名犹菇、端口德迹、Eureka注冊(cè)中心,Mysql連接屬性揭芍,連接池信息等)

application.properties/yml

? ? ? ? c.編寫(xiě)實(shí)體類胳搞。Mapper層,定義操作數(shù)據(jù)庫(kù)方法沼沈。編寫(xiě)Service層流酬,定義業(yè)務(wù)邏輯。編寫(xiě)Controller層列另,暴露訪問(wèn)API芽腾,具體操作不再展示,貼上項(xiàng)目結(jié)構(gòu)圖

Provider項(xiàng)目結(jié)構(gòu)

? ? ? ? d.修改啟動(dòng)類页衙,開(kāi)啟Eureka客戶端摊滔,添加@MapperScan組件掃描注解(通過(guò)name/value屬性指定Mapper層)

修改啟動(dòng)類

? ? 2.創(chuàng)建Feign項(xiàng)目

? ? ? ? a.配置pom.xml文件,添加SpringCloud相關(guān)依賴店乐,添加Feign依賴

pom.xml

? ? ? ? b.將Provider中的實(shí)體類復(fù)制到本項(xiàng)目艰躺,編寫(xiě)Service接口,以便Consumer進(jìn)行調(diào)用實(shí)現(xiàn)眨八,添加FeignClient注解指定Feign客戶端要調(diào)用的Provider

service接口

? ? ? ? c.項(xiàng)目結(jié)構(gòu)

Feign客戶端項(xiàng)目結(jié)構(gòu)

? ? 3.創(chuàng)建Consumer項(xiàng)目

? ? ? ? a.配置pom.xml文件腺兴,添加Feign客戶端項(xiàng)目的GAV坐標(biāo),添加SpringCloud依賴廉侧,添加thymeleaf依賴页响,添加web啟動(dòng)器篓足,添加Eureka服務(wù)依賴

pom.xml文件

? ? ? ? b.修改applicaiton.properties/yml全局配置文件,添加相關(guān)信息(應(yīng)用名闰蚕,端口栈拖,Eureka注冊(cè)中心地址)

applicaiton.properties/yml

? ? ? ? c.編寫(xiě)ConsumerController、注入Feign客戶端中的Service接口没陡,用來(lái)調(diào)用處理業(yè)務(wù)邏輯

ConsumerController

? ? ? ? d.修改啟動(dòng)類涩哟,開(kāi)啟Eureka客戶端,配置Feign客戶端信息

Consumer啟動(dòng)類

? ? ? ? e.項(xiàng)目結(jié)構(gòu)

Consumer項(xiàng)目結(jié)構(gòu)

注意:參數(shù)傳遞方式規(guī)則要在Provider和Feign中定義盼玄,并且Provider和Feign兩個(gè)項(xiàng)目中暴露的API訪問(wèn)路徑要相同


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末贴彼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子强岸,更是在濱河造成了極大的恐慌锻弓,老刑警劉巖砾赔,帶你破解...
    沈念sama閱讀 216,843評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蝌箍,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡暴心,警方通過(guò)查閱死者的電腦和手機(jī)妓盲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)专普,“玉大人悯衬,你說(shuō)我怎么就攤上這事√醇校” “怎么了筋粗?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,187評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)炸渡。 經(jīng)常有香客問(wèn)我娜亿,道長(zhǎng),這世上最難降的妖魔是什么蚌堵? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,264評(píng)論 1 292
  • 正文 為了忘掉前任买决,我火速辦了婚禮,結(jié)果婚禮上吼畏,老公的妹妹穿的比我還像新娘督赤。我一直安慰自己,他們只是感情好泻蚊,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,289評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布躲舌。 她就那樣靜靜地躺著,像睡著了一般性雄。 火紅的嫁衣襯著肌膚如雪没卸。 梳的紋絲不亂的頭發(fā)上枯冈,一...
    開(kāi)封第一講書(shū)人閱讀 51,231評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音办悟,去河邊找鬼尘奏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛病蛉,可吹牛的內(nèi)容都是我干的炫加。 我是一名探鬼主播,決...
    沈念sama閱讀 40,116評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼铺然,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼俗孝!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起魄健,我...
    開(kāi)封第一講書(shū)人閱讀 38,945評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤赋铝,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后沽瘦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體革骨,經(jīng)...
    沈念sama閱讀 45,367評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,581評(píng)論 2 333
  • 正文 我和宋清朗相戀三年析恋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了良哲。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,754評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡助隧,死狀恐怖筑凫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情并村,我是刑警寧澤巍实,帶...
    沈念sama閱讀 35,458評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站哩牍,受9級(jí)特大地震影響棚潦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜姐叁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,068評(píng)論 3 327
  • 文/蒙蒙 一瓦盛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧外潜,春花似錦原环、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,692評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春谒麦,著一層夾襖步出監(jiān)牢的瞬間俄讹,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,842評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工绕德, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留患膛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,797評(píng)論 2 369
  • 正文 我出身青樓耻蛇,卻偏偏與公主長(zhǎng)得像踪蹬,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子臣咖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,654評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容