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!

推薦閱讀: