前言
歡迎來(lái)到菜鳥(niǎo)SpringCloud入門(mén)實(shí)戰(zhàn)系列(SpringCloudForNoob),該系列通過(guò)層層遞進(jìn)的實(shí)戰(zhàn)視角躲叼,來(lái)一步步學(xué)習(xí)和理解SpringCloud。
本系列適合有一定Java以及SpringBoot基礎(chǔ)的同學(xué)閱讀沮尿。
每篇文章末尾都附有本文對(duì)應(yīng)的Github源代碼赖舟,方便同學(xué)調(diào)試提茁。
Github倉(cāng)庫(kù)地址:
https://github.com/qqxx6661/springcloud_for_noob
菜鳥(niǎo)SpringCloud入門(mén)實(shí)戰(zhàn)系列
你可以通過(guò)以下兩種途徑查看菜鳥(niǎo)SpringCloud入門(mén)實(shí)戰(zhàn)系列:
- 關(guān)注我的公眾號(hào):Rude3Knife 點(diǎn)擊公眾號(hào)下方:技術(shù)推文——SpringCloud
- 菜鳥(niǎo)SpringCloud實(shí)戰(zhàn)專(zhuān)欄導(dǎo)航頁(yè)(CSDN)
前文回顧:
- [菜鳥(niǎo)SpringCloud入門(mén)]第一章:構(gòu)建多模塊的Maven項(xiàng)目+創(chuàng)建注冊(cè)中心Eureka子模塊
- [菜鳥(niǎo)SpringCloud入門(mén)]第二章:創(chuàng)建服務(wù)提供者并在Eureka進(jìn)行注冊(cè)
- [菜鳥(niǎo)SpringCloud入門(mén)]第三章:將Eureka改造為高可用集群
- ...更多文章請(qǐng)查看上方:菜鳥(niǎo)SpringCloud入門(mén)實(shí)戰(zhàn)專(zhuān)欄導(dǎo)航頁(yè)
實(shí)戰(zhàn)版本
- SpringBoot:2.0.3.RELEASE
- SpringCloud:Finchley.RELEASE
-----正文開(kāi)始-----
遠(yuǎn)程調(diào)用服務(wù)實(shí)戰(zhàn)
本章節(jié)中需要有三個(gè)角色:服務(wù)注冊(cè)中心(對(duì)應(yīng)前文中我們的eureka子模塊)骂蓖、服務(wù)提供者(對(duì)應(yīng)前文中我們的eureka-hi子模塊)帆精、服務(wù)消費(fèi)者鸭蛙,其中服務(wù)注冊(cè)中心就是我們上一篇的eureka單機(jī)版啟動(dòng)既可摹恨,流程是首先啟動(dòng)注冊(cè)中心,服務(wù)提供者生產(chǎn)服務(wù)并注冊(cè)到服務(wù)中心中娶视,消費(fèi)者從服務(wù)中心中獲取服務(wù)并執(zhí)行晒哄。
服務(wù)提供者:使用原來(lái)的eureka-hi子模塊
子模塊不需要做更改睁宰。
值得注意的是,你可以使用@EnableDiscoveryClient代替@EnableEurekaClient
兩者的區(qū)別:
http://www.reibang.com/p/f6db3117864f
注解@EnableEurekaClient上有@EnableDiscoveryClient注解寝凌,可以說(shuō)基本就是EnableEurekaClient有@EnableDiscoveryClient的功能柒傻,另外上面的注釋中提到,其實(shí)@EnableEurekaClientz注解就是一種方便使用eureka的注解而已较木,可以說(shuō)使用其他的注冊(cè)中心后红符,都可以使用@EnableDiscoveryClient注解,但是使用@EnableEurekaClient的情景伐债,就是在服務(wù)采用eureka作為注冊(cè)中心的時(shí)候预侯,使用場(chǎng)景較為單一。
服務(wù)消費(fèi)者:新建service-feign子模塊
創(chuàng)建子模塊service-feign峰锁,步驟和之前類(lèi)似萎馅,請(qǐng)參考教程第一章。
修改pom.xml虹蒋,引入:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
然后在主程序引入:
@EnableFeignClients
@EnableEurekaClient
這時(shí)候糜芳,我的springboot2.0.3又出事了,@EnableFeignClients無(wú)法引入魄衅,需要將pom.xml的引入修改為:
<dependency>
<groupId>org.springframework.cloud</groupId>
<!--spring boot 2.0.3版本解決方案:spring-cloud-starter-feign-->
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
補(bǔ)充:Spring Boot 2下使用Feign找不到@EnableFeignClients的解決辦法
https://blog.csdn.net/alinyua/article/details/80070890
該作者給了一個(gè)完整的解決無(wú)法引入包問(wèn)題的思路峭竣,文章篇幅很長(zhǎng),思路值得學(xué)習(xí)晃虫!
之后邪驮,修改application.yml:
server:
# 服務(wù)端口號(hào)
port: 8765
spring:
application:
# 服務(wù)名,即serviceId
name: service-feign
eureka:
client:
serviceUrl:
# 安全認(rèn)證的服務(wù)注冊(cè)中心地址
defaultZone: http://localhost:8761/eureka
遠(yuǎn)程調(diào)用
首先回顧一下eureka-hi的方法傲茄,它提供了一個(gè)上述eureka-hi服務(wù)提供了一個(gè)RESTful風(fēng)格的接口:
/** 獲取端口號(hào) */
@Value("${server.port}")
String port;
/**
* 定義一個(gè)簡(jiǎn)單接口
* @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}
編寫(xiě)調(diào)用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>一個(gè)Feign服務(wù)消費(fèi)者接口</p>
**/
@FeignClient(value = "service-hi")
public interface ServiceHi {
/**
* <p>通過(guò)Feign偽Http客戶端調(diào)用service-hi提供的服務(wù)</p>
* @author hanchao 2018/5/19 17:59
**/
@GetMapping("/hi/{name}")
String sayHiFromServiceHi(@PathVariable(value = "name") String name);
}
說(shuō)明:
- 通過(guò)@FeignClient標(biāo)識(shí)當(dāng)前接口是一個(gè)Feign客戶端沮榜,value = "service-hi"表示其針對(duì)的是名為service-hi的服務(wù)盘榨。
- service-hi則是我們eureka-hi子模塊的spring.application.name,這個(gè)name已經(jīng)在eureka注冊(cè)過(guò)
- sayHiFromServiceHi方法為偽裝成HTTP客戶端方法蟆融,與eureka-hi的[GET] /hi/{name}服務(wù)接口相對(duì)應(yīng)草巡。
之后,新建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>服務(wù)消費(fèi)控制層</p>
**/
@RestController
public class HelloController {
/** 注入服務(wù)"service-hi"的Feign客戶端ServiceHi */
@Autowired
private ServiceHi serviceHi;
/**
* 調(diào)用Feign客戶端提供的服務(wù)山憨,自帶負(fù)載均衡
* @param name
* @return
*/
@GetMapping("/hello/{name}")
public String sayHi(@PathVariable String name){
//調(diào)用Feign客戶端ScheduleServiceHi的接口
return serviceHi.sayHiFromServiceHi(name);
}
}
重點(diǎn):
- serviceHi.sayHiFromServiceHi(name)即通過(guò)Feign調(diào)用偽HTTP客戶端的服務(wù)接口。
至此我們已經(jīng)配置完畢弥喉,依次啟動(dòng)服務(wù)eureka郁竟、eureka-hi和service-feign∮删常可以看到兩個(gè)服務(wù)都已經(jīng)在eureka注冊(cè):
訪問(wèn) http://localhost:8765/hello/rude3knife 棚亩,即service-feign提供的服務(wù)接口蓖议。
這個(gè)服務(wù)接口會(huì)通過(guò)Feign去調(diào)用服務(wù)eureka-hi提供的服務(wù)接口,結(jié)果顯示服務(wù)間調(diào)用成功讥蟆。
在該調(diào)用中勒虾,我們feign并不需要指定端口號(hào),它并不知道這個(gè)方法所在的服務(wù)提供者現(xiàn)在在哪個(gè)端口運(yùn)行瘸彤,我們只需要向eureka尋求服務(wù)修然。
三個(gè)模塊的拓?fù)鋱D如下:
測(cè)試Feign負(fù)載均衡
Feign會(huì)對(duì)服務(wù)調(diào)用進(jìn)行負(fù)載平衡,我們需要同時(shí)打開(kāi)兩個(gè)eureka-hi服務(wù)质况,由于在同一臺(tái)電腦上愕宋,就得把端口號(hào)從8763改為8764,然后同時(shí)開(kāi)啟8763和8764兩個(gè)服務(wù)拯杠。
要同時(shí)運(yùn)行兩個(gè)端口不同的相同服務(wù)掏婶,需要在run configuration里面把a(bǔ)llow parallle打開(kāi):
運(yùn)行結(jié)構(gòu)是這樣的:
可以看到有兩個(gè)Service-Hi進(jìn)行了注冊(cè):
訪問(wèn)http://localhost:8765/hello/rude3knife
連續(xù)訪問(wèn)兩次,發(fā)現(xiàn)兩次會(huì)分別取調(diào)用eureka-hi的兩個(gè)服務(wù)節(jié)點(diǎn):
最后是負(fù)載平衡的拓?fù)鋱D:
本章代碼
https://github.com/qqxx6661/springcloud_for_noob/tree/master/04-servier-feign
參考
Spring-Cloud筆記04:服務(wù)消費(fèi)者Feign
https://blog.csdn.net/hanchao5272/article/details/80574441
springcloud(三):服務(wù)提供與調(diào)用
http://www.ityouknow.com/springcloud/2017/05/12/eureka-provider-constomer.html
-----正文結(jié)束-----
菜鳥(niǎo)SpringCloud實(shí)戰(zhàn)專(zhuān)欄全導(dǎo)航:通過(guò)以下兩種途徑查看
- 關(guān)注我的公眾號(hào):Rude3Knife 點(diǎn)擊公眾號(hào)下方:技術(shù)推文——SpringCloud
- 菜鳥(niǎo)SpringCloud實(shí)戰(zhàn)專(zhuān)欄(CSDN)
關(guān)注我
我是蠻三刀把刀潭陪,后端開(kāi)發(fā)雄妥。
主要關(guān)注后端開(kāi)發(fā),數(shù)據(jù)安全依溯,爬蟲(chóng)等方向老厌。
來(lái)微信和我聊聊:yangzd1102
Github個(gè)人主頁(yè):
原創(chuàng)博客主要內(nèi)容
- Java知識(shí)點(diǎn)復(fù)習(xí)全手冊(cè)
- Leetcode算法題解析
- 劍指offer算法題解析
- Python爬蟲(chóng)相關(guān)技術(shù)實(shí)戰(zhàn)
- 后端開(kāi)發(fā)相關(guān)技術(shù)實(shí)戰(zhàn)
- SpringCloud入門(mén)實(shí)戰(zhàn)
同步更新公眾號(hào)及以下博客
1. Csdn
擁有專(zhuān)欄:
- Leetcode題解(Java/Python)
- Python爬蟲(chóng)實(shí)戰(zhàn)
- Java程序員知識(shí)點(diǎn)復(fù)習(xí)手冊(cè)
- SpringCloud入門(mén)實(shí)戰(zhàn)
2. 知乎
https://www.zhihu.com/people/yang-zhen-dong-1/
擁有專(zhuān)欄:
- Java程序員面試復(fù)習(xí)手冊(cè)
- LeetCode算法題詳解與代碼實(shí)現(xiàn)
- 后臺(tái)開(kāi)發(fā)實(shí)戰(zhàn)
3. 掘金
https://juejin.im/user/5b48015ce51d45191462ba55
4. 簡(jiǎn)書(shū)
http://www.reibang.com/u/b5f225ca2376
個(gè)人公眾號(hào):Rude3Knife
如果文章對(duì)你有幫助,不妨收藏起來(lái)并轉(zhuǎn)發(fā)給您的朋友們~