SpringCloud服務(wù)的發(fā)現(xiàn)與調(diào)用詳解
相關(guān)推薦
上一章:Eureka注冊中心
前言
上一章中,我們介紹了Eureka注冊中心及集群的搭建,這一節(jié)將介紹服務(wù)的發(fā)現(xiàn)和調(diào)用。注意,這個時候我們只有注冊中心,并沒有引入其他的組件,所以需要使用SpringCloud原生態(tài)的服務(wù)發(fā)現(xiàn)和調(diào)用的方式實(shí)現(xiàn),循序漸進(jìn)的帶你走入微服務(wù)的世界。
上篇文章我們已經(jīng)創(chuàng)建好了注冊中心,這次我們需要創(chuàng)建一個服務(wù)提供者(provider)和一個服務(wù)消費(fèi)者(consumer)兩個項(xiàng)目。
一、服務(wù)提供者
- 新建Maven項(xiàng)目provider
- 引入項(xiàng)目依賴
<parent> <groupId>com.cxy965</groupId> <artifactId>parent</artifactId> <version>1.0-SNAPSHOT</version> <relativePath>../parent/pom.xml</relativePath> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> </dependencies>
新建配置文件application.yml
server:
port: 8002
spring:
application:
name: provider
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/
fetch-registry: true
創(chuàng)建啟動類和服務(wù)接口,為了簡便,暫時將服務(wù)接口放在了啟動類,實(shí)際項(xiàng)目中,最好還是要放在controller中。
@EnableEurekaClient @SpringBootApplication @RestController public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(ProviderApplication.class, args); } @GetMapping("/hello") public String hello(String name) { return "Hello "+name; } }
啟動驗(yàn)證一下,可以正常返回。
二、服務(wù)消費(fèi)者
- 參考provider項(xiàng)目創(chuàng)建consumer項(xiàng)目
- 修改配置文件中的端口和應(yīng)用名稱為8003、consumer
- 創(chuàng)建啟動類和服務(wù)消費(fèi)代碼
@EnableEurekaClient @SpringBootApplication @RestController public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } @Bean RestTemplate restTemplate() { return new RestTemplate(); } @Autowired DiscoveryClient discoveryClient; @Autowired RestTemplate restTemplate; @GetMapping("/hello") public String hello(String name) { List<ServiceInstance> list = discoveryClient.getInstances("provider"); ServiceInstance instance = list.get(0); String host = instance.getHost(); int port = instance.getPort(); String returnInfo = restTemplate.getForObject("http://" + host + ":" + port + "/hello?name={1}", String.class, name); return returnInfo; } }
啟動驗(yàn)證一下
可以看到,我們調(diào)用8003消費(fèi)者服務(wù),消費(fèi)者服務(wù)又調(diào)用了8002服務(wù)提供者的接口,并正確返回了結(jié)果。
總結(jié)
我們來分析一下消費(fèi)者代碼,我們先創(chuàng)建了一個RestTemplate Bean實(shí)例,然后注入進(jìn)來,同時注入discoveryClient對象。
在接口中,通過discoveryClient.getInstances("provider")方法獲取注冊到注冊中心中的所有provider服務(wù)信息ServiceInstance集合,ServiceInstance其實(shí)是一個接口,真正的實(shí)現(xiàn)類是EurekaServiceInstance,通過查看EurekaServiceInstance的源碼,我們發(fā)現(xiàn)它里面包含了注冊中心中各服務(wù)的豐富的詳細(xì)信息(如主機(jī)地址、端口號、實(shí)例id,應(yīng)用名稱、應(yīng)用組名稱等)。
我們先拿到第一個服務(wù)提供者的的ip和端口(集群部署情況下,可能會有多個實(shí)例),然后通過調(diào)用restTemplate.getForObject()方法進(jìn)行接口的調(diào)用并獲取返回信息。
這樣就通過原生態(tài)的方式實(shí)現(xiàn)了服務(wù)的發(fā)現(xiàn)和調(diào)用。
拿到第一個實(shí)例進(jìn)行接口的調(diào)用,顯然沒有達(dá)到部署多服務(wù)實(shí)例的目的,下一篇文章將帶你實(shí)現(xiàn)一個自定義的負(fù)載均衡器,一起期待吧!
到此這篇關(guān)于SpringCloud服務(wù)的發(fā)現(xiàn)與調(diào)用詳解的文章就介紹到這了,更多相關(guān)SpringCloud服務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringCloud通過Nacos實(shí)現(xiàn)注冊中心與遠(yuǎn)程服務(wù)調(diào)用詳解流程
- SpringCloud超詳細(xì)講解Feign聲明式服務(wù)調(diào)用
- springcloud使用feign調(diào)用服務(wù)時參數(shù)內(nèi)容過大問題
- springcloud?feign服務(wù)之間調(diào)用,date類型轉(zhuǎn)換錯誤的問題
- SpringCloud之Feign代理,聲明式服務(wù)調(diào)用方式
- SpringCloud 服務(wù)負(fù)載均衡和調(diào)用 Ribbon、OpenFeign的方法
- SpringCloud讓微服務(wù)實(shí)現(xiàn)指定程序調(diào)用
- SpringCloud Feign服務(wù)調(diào)用請求方式總結(jié)
- SpringCloud遠(yuǎn)程服務(wù)調(diào)用三種方式及原理
相關(guān)文章
詳解SpringBoot集成消息隊(duì)列的案例應(yīng)用
Message?Queue又名消息隊(duì)列,是一種異步通訊的中間件??梢岳斫鉃猷]局,發(fā)送者將消息投遞到郵局,然后郵局幫我們發(fā)送給具體的接收者,具體發(fā)送過程和時間與我們無關(guān)。?消息隊(duì)列是分布式系統(tǒng)中重要的組件,消息隊(duì)列主要解決了應(yīng)用耦合、異步處理、流量削鋒等問題2022-04-04SpringBoot參數(shù)校驗(yàn)與國際化使用教程
這篇文章主要給大家介紹了關(guān)于SpringBoot參數(shù)校驗(yàn)與國際化使用教程的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11java用LocalDateTime類獲取當(dāng)天時間、前一天時間及本周/本月的開始和結(jié)束時間
這篇文章主要給大家介紹了關(guān)于java使用LocalDateTime類獲取當(dāng)天時間、前一天時間及本周/本月的開始和結(jié)束時間的相關(guān)資料,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08Java8中的LocalDateTime和Date一些時間操作方法
這篇文章主要介紹了Java8中的LocalDateTime和Date一些時間操作方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-04-04IDEA?mybatis?Mapper.xml報(bào)紅的最新解決辦法
這篇文章主要介紹了IDEA?mybatis?Mapper.xml報(bào)紅的解決辦法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-04-04SrpingDruid數(shù)據(jù)源加密數(shù)據(jù)庫密碼的示例代碼
本篇文章主要介紹了SrpingDruid數(shù)據(jù)源加密數(shù)據(jù)庫密碼的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-10-10