首頁 > 軟體

SpringCloud服務的發現與呼叫詳解

2022-07-16 18:01:04

相關推薦

上一章: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服務內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com