SpringCloud服務的發現與調用詳解
相關推薦
上一章:Eureka註冊中心
前言
上一章中,我們介紹瞭Eureka註冊中心及集群的搭建,這一節將介紹服務的發現和調用。註意,這個時候我們隻有註冊中心,並沒有引入其他的組件,所以需要使用SpringCloud原生態的服務發現和調用的方式實現,循序漸進的帶你走入微服務的世界。
上篇文章我們已經創建好瞭註冊中心,這次我們需要創建一個服務提供者(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
創建啟動類和服務接口,為瞭簡便,暫時將服務接口放在瞭啟動類,實際項目中,最好還是要放在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項目創建consumer項目
- 修改配置文件中的端口和應用名稱為8003、consumer
- 創建啟動類和服務消費代碼
@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; } }
啟動驗證一下
可以看到,我們調用8003消費者服務,消費者服務又調用瞭8002服務提供者的接口,並正確返回瞭結果。
總結
我們來分析一下消費者代碼,我們先創建瞭一個RestTemplate Bean實例,然後註入進來,同時註入discoveryClient對象。
在接口中,通過discoveryClient.getInstances("provider")方法獲取註冊到註冊中心中的所有provider服務信息ServiceInstance集合,ServiceInstance其實是一個接口,真正的實現類是EurekaServiceInstance,通過查看EurekaServiceInstance的源碼,我們發現它裡面包含瞭註冊中心中各服務的豐富的詳細信息(如主機地址、端口號、實例id,應用名稱、應用組名稱等)。
我們先拿到第一個服務提供者的的ip和端口(集群部署情況下,可能會有多個實例),然後通過調用restTemplate.getForObject()方法進行接口的調用並獲取返回信息。
這樣就通過原生態的方式實現瞭服務的發現和調用。
拿到第一個實例進行接口的調用,顯然沒有達到部署多服務實例的目的,下一篇文章將帶你實現一個自定義的負載均衡器,一起期待吧!
到此這篇關於SpringCloud服務的發現與調用詳解的文章就介紹到這瞭,更多相關SpringCloud服務內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- SpringCloud筆記(Hoxton)Netflix之Ribbon負載均衡示例代碼
- Java Spring Cloud 負載均衡詳解
- SpringCloud Eureka的使用教程
- SpringCloud實現Eureka服務註冊與發現
- springCloud項目搭建流程步驟分解