SpringCloud服務(wù)的發(fā)現(xiàn)與調(diào)用詳解
相關(guān)推薦
上一章:Eureka注冊(cè)中心
前言
上一章中,我們介紹了Eureka注冊(cè)中心及集群的搭建,這一節(jié)將介紹服務(wù)的發(fā)現(xiàn)和調(diào)用。注意,這個(gè)時(shí)候我們只有注冊(cè)中心,并沒(méi)有引入其他的組件,所以需要使用SpringCloud原生態(tài)的服務(wù)發(fā)現(xiàn)和調(diào)用的方式實(shí)現(xiàn),循序漸進(jìn)的帶你走入微服務(wù)的世界。
上篇文章我們已經(jīng)創(chuàng)建好了注冊(cè)中心,這次我們需要?jiǎng)?chuàng)建一個(gè)服務(wù)提供者(provider)和一個(gè)服務(wù)消費(fèi)者(consumer)兩個(gè)項(xiàng)目。
一、服務(wù)提供者
- 新建Maven項(xiàng)目provider
- 引入項(xiàng)目依賴(lài)
<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)建啟動(dòng)類(lèi)和服務(wù)接口,為了簡(jiǎn)便,暫時(shí)將服務(wù)接口放在了啟動(dòng)類(lèi),實(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; } }
啟動(dòng)驗(yàn)證一下,可以正常返回。
二、服務(wù)消費(fèi)者
- 參考provider項(xiàng)目創(chuàng)建consumer項(xiàng)目
- 修改配置文件中的端口和應(yīng)用名稱(chēng)為8003、consumer
- 創(chuàng)建啟動(dòng)類(lèi)和服務(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; } }
啟動(dòng)驗(yàn)證一下
可以看到,我們調(diào)用8003消費(fèi)者服務(wù),消費(fèi)者服務(wù)又調(diào)用了8002服務(wù)提供者的接口,并正確返回了結(jié)果。
總結(jié)
我們來(lái)分析一下消費(fèi)者代碼,我們先創(chuàng)建了一個(gè)RestTemplate Bean實(shí)例,然后注入進(jìn)來(lái),同時(shí)注入discoveryClient對(duì)象。
在接口中,通過(guò)discoveryClient.getInstances("provider")方法獲取注冊(cè)到注冊(cè)中心中的所有provider服務(wù)信息ServiceInstance集合,ServiceInstance其實(shí)是一個(gè)接口,真正的實(shí)現(xiàn)類(lèi)是EurekaServiceInstance,通過(guò)查看EurekaServiceInstance的源碼,我們發(fā)現(xiàn)它里面包含了注冊(cè)中心中各服務(wù)的豐富的詳細(xì)信息(如主機(jī)地址、端口號(hào)、實(shí)例id,應(yīng)用名稱(chēng)、應(yīng)用組名稱(chēng)等)。
我們先拿到第一個(gè)服務(wù)提供者的的ip和端口(集群部署情況下,可能會(huì)有多個(gè)實(shí)例),然后通過(guò)調(diào)用restTemplate.getForObject()方法進(jìn)行接口的調(diào)用并獲取返回信息。
這樣就通過(guò)原生態(tài)的方式實(shí)現(xiàn)了服務(wù)的發(fā)現(xiàn)和調(diào)用。
拿到第一個(gè)實(shí)例進(jìn)行接口的調(diào)用,顯然沒(méi)有達(dá)到部署多服務(wù)實(shí)例的目的,下一篇文章將帶你實(shí)現(xiàn)一個(gè)自定義的負(fù)載均衡器,一起期待吧!
到此這篇關(guān)于SpringCloud服務(wù)的發(fā)現(xiàn)與調(diào)用詳解的文章就介紹到這了,更多相關(guān)SpringCloud服務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- SpringCloud通過(guò)Nacos實(shí)現(xiàn)注冊(cè)中心與遠(yuǎn)程服務(wù)調(diào)用詳解流程
- SpringCloud超詳細(xì)講解Feign聲明式服務(wù)調(diào)用
- springcloud使用feign調(diào)用服務(wù)時(shí)參數(shù)內(nèi)容過(guò)大問(wèn)題
- springcloud?feign服務(wù)之間調(diào)用,date類(lèi)型轉(zhuǎn)換錯(cuò)誤的問(wè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)用請(qǐng)求方式總結(jié)
- SpringCloud遠(yuǎn)程服務(wù)調(diào)用三種方式及原理
相關(guān)文章
詳解SpringBoot集成消息隊(duì)列的案例應(yīng)用
Message?Queue又名消息隊(duì)列,是一種異步通訊的中間件??梢岳斫鉃猷]局,發(fā)送者將消息投遞到郵局,然后郵局幫我們發(fā)送給具體的接收者,具體發(fā)送過(guò)程和時(shí)間與我們無(wú)關(guān)。?消息隊(duì)列是分布式系統(tǒng)中重要的組件,消息隊(duì)列主要解決了應(yīng)用耦合、異步處理、流量削鋒等問(wèn)題2022-04-04SpringBoot參數(shù)校驗(yàn)與國(guó)際化使用教程
這篇文章主要給大家介紹了關(guān)于SpringBoot參數(shù)校驗(yàn)與國(guó)際化使用教程的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11java用LocalDateTime類(lèi)獲取當(dāng)天時(shí)間、前一天時(shí)間及本周/本月的開(kāi)始和結(jié)束時(shí)間
這篇文章主要給大家介紹了關(guān)于java使用LocalDateTime類(lèi)獲取當(dāng)天時(shí)間、前一天時(shí)間及本周/本月的開(kāi)始和結(jié)束時(shí)間的相關(guān)資料,文中通過(guò)代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2023-08-08Spring Data Redis對(duì)象緩存序列化問(wèn)題解決
相信在項(xiàng)目中,你一定是經(jīng)常使用Redis,在使用時(shí),有沒(méi)有遇到同我一樣,對(duì)象緩存序列化問(wèn)題的呢,本文主要介紹了Spring Data Redis對(duì)象緩存序列化問(wèn)題解決,感興趣的可以了解一下2024-01-01Java8中的LocalDateTime和Date一些時(shí)間操作方法
這篇文章主要介紹了Java8中的LocalDateTime和Date一些時(shí)間操作方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04IDEA?mybatis?Mapper.xml報(bào)紅的最新解決辦法
這篇文章主要介紹了IDEA?mybatis?Mapper.xml報(bào)紅的解決辦法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-04-04SrpingDruid數(shù)據(jù)源加密數(shù)據(jù)庫(kù)密碼的示例代碼
本篇文章主要介紹了SrpingDruid數(shù)據(jù)源加密數(shù)據(jù)庫(kù)密碼的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-10-10