一、概述
上一章已經看到 Eureka client 是如何注冊了 Eureka Server 中去的,在本文中將講解 服務間如何進行調用,在上一章已經提到 microserver-user-api會對外提供服務進行服務間調用,在本章將用到 microserver-test 進行服務間調用, 再次聲明:作者能力有限,表達能力不足,這里將不會講述概念性的講解,想了解概念的朋友可自行百度查閱或官網查閱自行理解,同時盡可能的照顧到新人朋友,教大家如何從官網中學習一門技術,如有錯誤的地方希望大家指出共同進步。
本文所有Demo都將上傳至GitHub中方便各位朋友查看學習,如您對本人的編碼風格或其他建議可以聯系博主。
二、目錄結構
三、如何使用 Spring Cloud OpenFeign
1)首先我們去官網介紹 Spring Cloud OpenFeign 中去了解下如何使用 OpenFeign,通過官網的介紹我們發現需要引入spring-cloud-starter-openfeign 包,並且看到在啟動類中多了個 @EnableFeignClients 注解。 從該注解的名字中我們大概已經猜出此注解的大概用途,接下來我們將根據官網文檔進行下一步延伸學習服務間是如何進行調用。
2)在下面這張圖片中可以看到 這里在我們看到了熟悉的注解 @RequestMapping 和這個比較陌生的 @FeignClient,通過官網的介紹,我們大致了解到@FeignClient 的value值指的是任意的客戶端的名稱,還有url 用來指定一個主機地址,其他屬性就不在做過多介紹了,有興趣的朋友自行了解,官網給的這段介紹中有段非常重要的描述在下文紅色區域進行描述,在這段描述中我們看到這樣的一段描述,如果你使用的是 Eureka Client 呢么將自動從 Eureka Server 注冊表中獲取服務,呢么這段描述我們可以理解為 Feign 默認是集成了 Eureka ,接下來我們來看下 為什么FeignClient 可以使用 Spring MVC 中的注解 @RequestMapping
3)在官網文檔中我們看到Feign 使用的一些默認配置,在下圖中我們看到Contract 使用的契約為 SpringVmcContract 因此在Feign 可以使用Spring MVC 注解,當然既然提供了這些默認的配置,呢么也是允許我們進行修改的,在本文中將不做詳細介紹,感興趣的朋友可以自行研究 ^_^ 畢竟使用 Spring MVC 的還是比較多的,接下來我們來看下官網給出的Feign 的配置信息。
4)從下圖中的代碼我們可以看到Feign 是如何進行配置的例如超時時間等等的設置,這里將不對這寫配置信息進行講解,有興趣的朋友可以自行了解下,我們只了解Feign yml大概有哪些配置信息,了解完這些信息我們就可以對之前的 microserver-user 服務進行改造
5)根據官網提供的文檔描述接下來我們將改造 microserver-user 服務
a.首先在我們啟動類增加 @EnableFeignClients 注解
b.接下來對我們的接口進行改造,在這里細心的朋友可能看到,我這里寫的與官網有點不太一樣,為什么這里寫了value,我們去看下FeigClient 注解的源碼就一切都明白了,
Service_APP_ID 則是我們注冊到 Eureka Server 中的服務名,改造完這些我們就需要去yml 中對 Feign 進行某些配置信息
c. yml的配置,由於目前還為整合 hystrix 所以根據官網的描述,我們還是先將 hystrix 功能進行關閉
feign: hystrix: enabled: false
做完這些我們基本上就已經對 microserver-user 服務 服務改造完畢,接下來我們將編寫 microserver-test 服務,進行服務間調用
四、使用 Spring Cloud OpenFeign 進行服務間調用
Spring Cloud OpenFeign 該如何使用在上文中已經講解到,這里就不在描述,直接編寫 microserver-test 服務嘗試進行服務間調用,為了更好的演示,將編寫一個 Controller 接口更直觀的看結果。
1)首先在 test 項目中引入 microserver-user-api
<dependency> <groupId>com.carl.microserver.app</groupId> <artifactId>microserver-user-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
2)編寫Controller,我這里的 TestUserService 已經編寫好的,所以。。。直接給上代碼
@RestController @ResponseStatus(HttpStatus.OK) public class TestUserServerController { @Autowired private TestUserService testUserService; @RequestMapping(method = RequestMethod.GET,value = "/find") public List<String> findUser(){ return testUserService.findUser(); } }
3)編寫 TestUserService ,大家可能有些疑惑為什么沒有看到Feign 相關的東西,怎么又注入了個 UserService,接下來我們將講解為什么要使用這種寫法,ps:可能有更好的寫法。如果您對本人編碼上有疑問或建議的話希望可以指出,一切都為了共同進步。
@Service public class TestUserService { @Autowired private UserService userService; public List<String> findUser(){ return userService.findUser(); } }
4)編寫 UserService 接口,這里我們又看到了熟悉的注解 FeignClient 同時也看到了上文 microserver-user 服務中提供的接口與 APP ID,服務名
@FeignClient(value = MicroServerUserConstants.SERVICE_APP_ID) public interface UserService extends UserRemontRestService { }
下圖中我們可以看到 remote包下的UserService同時也看到了Hystrix 包,下一篇博文中將會講到 Feign 如何使用 Hystrix 熔斷器 不了解的朋友可以先行度娘下Hystrix的概念
5)演示,首先我們先將服務都注冊到 Eureka Server 中,下圖中我們看到 test 服務的端口號 8000,user 服務的端口號 8080,然后訪問test 的find 接口看看效果。
五、Spring Cloud Feign 調用日志與壓縮
1)Feign 的壓縮默認為NONE,在實際應用中我們可能需要看到更詳細的信息這時我們就需要對 Feign 進行配置,我們先看看官方文檔是如何說明的
通過上圖,我們可以看到官方給出的日志方案,接下來我們的項目需要進,根據下圖效果我們可以看到了調用信息
2)Feign 對壓縮的支持,根據官方文檔了解到Feign對壓縮的支持非常簡單,只需要開啟對應的配置就可以搞定,接下來根據官網的描述修改我們自己的yml 配置
在下圖中可以看到按照官方文檔的描述修改了配置文件,在下面的代碼中朋友可能看到,開啟對壓縮的支持在項目啟動時會拋出異常信息,不過在作者寫這篇博客的時候
該問題已經得到答案,接下來看下項目中所拋出的異常信息
################################################# # # # 下面這段對Feign 壓縮的配置 會拋出異常信息,目前沒有找到解決方案 # 問題已提交至 GitHub 等待 Contributor 給出解決方案 ################################################# feign: hystrix: enabled: true # 開啟 Feign 對 Hystrix 的支持 compression: request: enabled: true # 開啟對 request 請求壓縮 mime-types: - text/xml - application/xml - application/json # 指定壓縮格式 min-request-size: 2048 # 壓縮的最小閥值,默認 2048,超過2048 (字節) 進行壓縮。 response: enabled: true # 開啟對 response 的壓縮
根據GitHub上的描述,在 1.4.4 版本以下使用的是 ApacheHttpClient 然而在 1.4.4 以上版本(含1.4.4)則改為 OkHttpClient,對此作者也對源碼進行了驗證在下圖中也可以看到
既然找到問題所在,呢么就該處理掉這種問題,在查看我們的Maven包中發現,然而我們並沒有引入 OkHttpClient 相關的jar包,接下來將 okhttp jar包引入到本地項目中,在看看效果
這時候我們可以去看看核心包里的的pom 信息里面找找看有沒有 okhttp 的Maven地址,一般來說必須要有的。。。。
博主在這里需要對剛入門的朋友語重心長的說一句話了。。如果想學習一門技術的話最好先看一看官網信息,看看各版本都對那些地方做了修改或優化,不然在搭建的時候需要浪費很多時間去處理一些不必要的問題。。。博主有點懶不喜歡看這些東西,所以在嘗鮮過程中遇到了一些坑。。
六、使用Ribbon負載均衡
1)由於Ribbon太過簡單所以不開一篇新的博客,在本文中帶過,先看看官網的描述,根據官網的描述Feign 默認是使用 Ribbon的,所以我們可以直接將對應的jar包引入
來實現負載均衡
2)如何修改 負載均衡策略,根據官網的描述我們可以使用下圖紅線中的方式進行修改負載均衡的策略,接下來我們來嘗試下
3)修改本地策略,在這里就不給大家看測試效果了,有興趣的朋友可以自行嘗試
microserver-user:
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
順便看看 Ribbon Rule 有哪些規則,同樣也是有興趣的朋友可以具體去了解下這些規則 ^ ^ 博主表達能力有限,怕描述的不是很准確被打臉,