前言
歡迎來到菜鳥SpringCloud入門實戰系列(SpringCloudForNoob),該系列通過層層遞進的實戰視角,來一步步學習和理解SpringCloud。
本系列適合有一定Java以及SpringBoot基礎的同學閱讀。
每篇文章末尾都附有本文對應的Github原始碼,方便同學除錯。
Github倉庫地址:
https://github.com/qqxx6661/springcloud_for_noob
菜鳥SpringCloud入門實戰系列
你可以通過以下兩種途徑檢視菜鳥SpringCloud入門實戰系列:
- 關注我的公眾號:Rude3Knife 點選公眾號下方:技術推文——SpringCloud
- 菜鳥SpringCloud實戰專欄導航頁(CSDN)
前文回顧:
- [菜鳥SpringCloud入門]第一章:構建多模組的Maven專案+建立註冊中心Eureka子模組
- [菜鳥SpringCloud入門]第二章:建立服務提供者並在Eureka進行註冊
- [菜鳥SpringCloud入門]第三章:將Eureka改造為高可用叢集
- ...更多文章請檢視上方:菜鳥SpringCloud入門實戰專欄導航頁
實戰版本
- SpringBoot:2.0.3.RELEASE
- SpringCloud:Finchley.RELEASE
-----正文開始-----
遠端呼叫服務實戰
本章節中需要有三個角色:服務註冊中心(對應前文中我們的eureka子模組)、服務提供者(對應前文中我們的eureka-hi子模組)、服務消費者,其中服務註冊中心就是我們上一篇的eureka單機版啟動既可,流程是首先啟動註冊中心,服務提供者生產服務並註冊到服務中心中,消費者從服務中心中獲取服務並執行。
服務提供者:使用原來的eureka-hi子模組
子模組不需要做更改。
值得注意的是,你可以使用@EnableDiscoveryClient代替@EnableEurekaClient
兩者的區別:
https://www.jianshu.com/p/f6db3117864f
註解@EnableEurekaClient上有@EnableDiscoveryClient註解,可以說基本就是EnableEurekaClient有@EnableDiscoveryClient的功能,另外上面的註釋中提到,其實@EnableEurekaClientz註解就是一種方便使用eureka的註解而已,可以說使用其他的註冊中心後,都可以使用@EnableDiscoveryClient註解,但是使用@EnableEurekaClient的情景,就是在服務採用eureka作為註冊中心的時候,使用場景較為單一。
服務消費者:新建service-feign子模組
建立子模組service-feign,步驟和之前類似,請參考教程第一章。
修改pom.xml,引入:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
複製程式碼
然後在主程式引入:
@EnableFeignClients
@EnableEurekaClient
複製程式碼
這時候,我的springboot2.0.3又出事了,@EnableFeignClients無法引入,需要將pom.xml的引入修改為:
<dependency>
<groupId>org.springframework.cloud</groupId>
<!--spring boot 2.0.3版本解決方案:spring-cloud-starter-feign-->
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
複製程式碼
補充:Spring Boot 2下使用Feign找不到@EnableFeignClients的解決辦法
https://blog.csdn.net/alinyua/article/details/80070890
該作者給了一個完整的解決無法引入包問題的思路,文章篇幅很長,思路值得學習!
之後,修改application.yml:
server:
# 服務埠號
port: 8765
spring:
application:
# 服務名,即serviceId
name: service-feign
eureka:
client:
serviceUrl:
# 安全認證的服務註冊中心地址
defaultZone: http://localhost:8761/eureka
複製程式碼
遠端呼叫
首先回顧一下eureka-hi的方法,它提供了一個上述eureka-hi服務提供了一個RESTful風格的介面:
/** 獲取埠號 */
@Value("${server.port}")
String port;
/**
* 定義一個簡單介面
* @param name
* @return
*/
@GetMapping("/hi/{name}")
public String home(@PathVariable String name){
return "hi " + name + ",I am from service-hi, port :" + port;
}
複製程式碼
- 行為:GET
- 資源:/hi/{name}
編寫呼叫eureka-hi提供的介面的本地介面ServiceHi.java,如下:
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* <p>一個Feign服務消費者介面</p>
**/
@FeignClient(value = "service-hi")
public interface ServiceHi {
/**
* <p>通過Feign偽Http客戶端呼叫service-hi提供的服務</p>
* @author hanchao 2018/5/19 17:59
**/
@GetMapping("/hi/{name}")
String sayHiFromServiceHi(@PathVariable(value = "name") String name);
}
複製程式碼
說明:
- 通過@FeignClient標識當前介面是一個Feign客戶端,value = "service-hi"表示其針對的是名為service-hi的服務。
- service-hi則是我們eureka-hi子模組的spring.application.name,這個name已經在eureka註冊過
- sayHiFromServiceHi方法為偽裝成HTTP客戶端方法,與eureka-hi的[GET] /hi/{name}服務介面相對應。
之後,新建HelloController.java,如下:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>服務消費控制層</p>
**/
@RestController
public class HelloController {
/** 注入服務"service-hi"的Feign客戶端ServiceHi */
@Autowired
private ServiceHi serviceHi;
/**
* 呼叫Feign客戶端提供的服務,自帶負載均衡
* @param name
* @return
*/
@GetMapping("/hello/{name}")
public String sayHi(@PathVariable String name){
//呼叫Feign客戶端ScheduleServiceHi的介面
return serviceHi.sayHiFromServiceHi(name);
}
}
複製程式碼
重點:
- serviceHi.sayHiFromServiceHi(name)即通過Feign呼叫偽HTTP客戶端的服務介面。
至此我們已經配置完畢,依次啟動服務eureka、eureka-hi和service-feign。可以看到兩個服務都已經在eureka註冊:
訪問 http://localhost:8765/hello/rude3knife ,即service-feign提供的服務介面。 這個服務介面會通過Feign去呼叫服務eureka-hi提供的服務介面,結果顯示服務間呼叫成功。
在該呼叫中,我們feign並不需要指定埠號,它並不知道這個方法所在的服務提供者現在在哪個埠執行,我們只需要向eureka尋求服務。
三個模組的拓撲圖如下:
測試Feign負載均衡
Feign會對服務呼叫進行負載平衡,我們需要同時開啟兩個eureka-hi服務,由於在同一臺電腦上,就得把埠號從8763改為8764,然後同時開啟8763和8764兩個服務。
要同時執行兩個埠不同的相同服務,需要在run configuration裡面把allow parallle開啟:
執行結構是這樣的:
可以看到有兩個Service-Hi進行了註冊:訪問http://localhost:8765/hello/rude3knife
連續訪問兩次,發現兩次會分別取呼叫eureka-hi的兩個服務節點:
最後是負載平衡的拓撲圖:
本章程式碼
https://github.com/qqxx6661/springcloud_for_noob/tree/master/04-servier-feign
參考
Spring-Cloud筆記04:服務消費者Feign
https://blog.csdn.net/hanchao5272/article/details/80574441
springcloud(三):服務提供與呼叫
http://www.ityouknow.com/springcloud/2017/05/12/eureka-provider-constomer.html
-----正文結束-----
菜鳥SpringCloud實戰專欄全導航:通過以下兩種途徑檢視
- 關注我的公眾號:Rude3Knife 點選公眾號下方:技術推文——SpringCloud
- 菜鳥SpringCloud實戰專欄(CSDN)
關注我
我是蠻三刀把刀,後端開發。
主要關注後端開發,資料安全,爬蟲等方向。
來微信和我聊聊:yangzd1102
Github個人主頁:
原創部落格主要內容
- Java知識點複習全手冊
- Leetcode演算法題解析
- 劍指offer演算法題解析
- Python爬蟲相關技術實戰
- 後端開發相關技術實戰
- SpringCloud入門實戰
同步更新公眾號及以下部落格
1. Csdn
擁有專欄:
- Leetcode題解(Java/Python)
- Python爬蟲實戰
- Java程式設計師知識點複習手冊
- SpringCloud入門實戰
2. 知乎
擁有專欄:
- Java程式設計師面試複習手冊
- LeetCode演算法題詳解與程式碼實現
- 後臺開發實戰
3. 掘金
4. 簡書
個人公眾號:Rude3Knife
如果文章對你有幫助,不妨收藏起來並轉發給您的朋友們~