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