一、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ā)。
二尼变、Feigh入門(mén)案例
????1.創(chuàng)建Service(Feign)
? ? ? ? a.創(chuàng)建服務(wù)的API項(xiàng)目利凑,配置相關(guān)依賴
? ? ? ? b.編寫(xiě)服務(wù)接口
? ? ? ? c.項(xiàng)目結(jié)構(gòu)
? ? 2.創(chuàng)建Provider
? ? ? ? a.創(chuàng)建項(xiàng)目浆劲,配置依賴修改pom文件(需注入服務(wù)的API坐標(biāo))
? ? ? ? b.修改application.properties/yml文件,配置應(yīng)用和服務(wù)注冊(cè)中心
? ? ? ? c.創(chuàng)建Controller實(shí)現(xiàn)服務(wù)的API中的接口哀澈,并重寫(xiě)接口中的抽象方法
? ? ? ? d.項(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)用名
? ? ? ? c.創(chuàng)建ProductConsumerController暴露要消費(fèi)的方法
? ? ? ? d.修改啟動(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)
三弛矛、Feign中的參數(shù)傳遞(1.需要在服務(wù)API中編寫(xiě)够吩,2.需要在Provider編寫(xiě)。Consumer中直接調(diào)用)
? ? 1.單個(gè)參數(shù)傳遞:借助@RequestParam注解實(shí)現(xiàn)
服務(wù)API項(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)目
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
? ? 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的效率最高,使用最為廣泛翅楼。
使用Gzip壓縮Http連接在處理參數(shù)時(shí)需注意
????????1.如果使用 HttpClient 作為 Feign 的客戶端工具尉剩。那么在定義接口上的注解需要開(kāi)啟
? ??在applicatin.properties/yml全局配置文件中添加相關(guān)信息
????????2.如果傳遞的是一個(gè)自定義的對(duì)象(對(duì)象會(huì)使用 json 格式來(lái)傳遞)。需要指定類型
五毅臊、配置微服務(wù)日志理茎、配置Feign負(fù)載均衡請(qǐng)求時(shí)間
? ??配置微服務(wù)日志,只需添加logback.xml即可(在配置文件中編寫(xiě)相應(yīng)的日志打印規(guī)則)
????????1.添加logback.xml配置文件
????????2.修改啟動(dòng)類管嬉,即可啟用微服務(wù)日志
? ? 3.通過(guò)applicaiton.propeteis/yml全局文件配置Feign負(fù)載均衡:底層原理還是通過(guò)Ribbon
六皂林、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)器
? ? ? ? b.修改application.properties/yml全局配置文件,添加各項(xiàng)信息(應(yīng)用名犹菇、端口德迹、Eureka注冊(cè)中心,Mysql連接屬性揭芍,連接池信息等)
? ? ? ? c.編寫(xiě)實(shí)體類胳搞。Mapper層,定義操作數(shù)據(jù)庫(kù)方法沼沈。編寫(xiě)Service層流酬,定義業(yè)務(wù)邏輯。編寫(xiě)Controller層列另,暴露訪問(wèn)API芽腾,具體操作不再展示,貼上項(xiàng)目結(jié)構(gòu)圖
? ? ? ? d.修改啟動(dòng)類页衙,開(kāi)啟Eureka客戶端摊滔,添加@MapperScan組件掃描注解(通過(guò)name/value屬性指定Mapper層)
? ? 2.創(chuàng)建Feign項(xiàng)目
? ? ? ? a.配置pom.xml文件,添加SpringCloud相關(guān)依賴店乐,添加Feign依賴
? ? ? ? b.將Provider中的實(shí)體類復(fù)制到本項(xiàng)目艰躺,編寫(xiě)Service接口,以便Consumer進(jìn)行調(diào)用實(shí)現(xiàn)眨八,添加FeignClient注解指定Feign客戶端要調(diào)用的Provider
? ? ? ? c.項(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ù)依賴
? ? ? ? b.修改applicaiton.properties/yml全局配置文件,添加相關(guān)信息(應(yīng)用名闰蚕,端口栈拖,Eureka注冊(cè)中心地址)
? ? ? ? c.編寫(xiě)ConsumerController、注入Feign客戶端中的Service接口没陡,用來(lái)調(diào)用處理業(yè)務(wù)邏輯
? ? ? ? d.修改啟動(dòng)類涩哟,開(kāi)啟Eureka客戶端,配置Feign客戶端信息
? ? ? ? e.項(xiàng)目結(jié)構(gòu)
注意:參數(shù)傳遞方式規(guī)則要在Provider和Feign中定義盼玄,并且Provider和Feign兩個(gè)項(xiàng)目中暴露的API訪問(wèn)路徑要相同