微服務(wù):服務(wù)發(fā)現(xiàn)

服務(wù)發(fā)現(xiàn)

什么是服務(wù)發(fā)現(xiàn)

在微服務(wù)架構(gòu)中,整個(gè)系統(tǒng)會按職責(zé)能力劃分為多個(gè)服務(wù),通過服務(wù)之間協(xié)作來實(shí)現(xiàn)業(yè)務(wù)目標(biāo)。這樣在我們的代碼 中免不了要進(jìn)行服務(wù)間的遠(yuǎn)程調(diào)用,服務(wù)的消費(fèi)方要調(diào)用服務(wù)的生產(chǎn)方,為了完成一次請求,消費(fèi)方需要知道服務(wù) 生產(chǎn)方的網(wǎng)絡(luò)位置(IP地址和端口號)。
我們的代碼可以通過讀取配置文件的方式讀取服務(wù)生產(chǎn)方網(wǎng)絡(luò)位置,如下:

在這里插入圖片描述

我們通過Spring boot技術(shù)很容易實(shí)現(xiàn):
創(chuàng)建一個(gè)spring-boot父工程
創(chuàng)建Service B(服務(wù)生產(chǎn)者)
pom.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.xu.nacos</groupId>
        <artifactId>nacos-discovery</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-restful-provider</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>


</project>

Service B是服務(wù)的生產(chǎn)方,暴露/service服務(wù)地址,實(shí)現(xiàn)代碼如下:
1、創(chuàng)建Controller

@RestController
public class RestProviderController {

    //暴露一個(gè)Restful接口
    @GetMapping("/service")
    public String service(){

        return "provider invoke";
    }
}

創(chuàng)建application.yml,內(nèi)容如下:

server:
    port:56010

創(chuàng)建Service A(服務(wù)消費(fèi)者)
pom.xml如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.xu.nacos</groupId>
        <artifactId>nacos-discovery</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-restful-consumer</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>


</project>

創(chuàng)建controller

@RestController
public class RestConsumerController {

    @Value("${provider.address}")
    private String provider;


    @GetMapping("service")
    public String service(){
        //遠(yuǎn)程調(diào)用
        RestTemplate restTemplate = new RestTemplate();
        String forObject = restTemplate.getForObject("http://" + provider + "service", String.class);
        return "消費(fèi)成功"+forObject;
    }
}

配置文件

server:
  port: 56020

#配置服務(wù)提供方的ip和端口
provider:
  address: 127.0.0.1:56010

以上消費(fèi)方找到服務(wù)方并進(jìn)行遠(yuǎn)程調(diào)用就叫服務(wù)發(fā)現(xiàn)
那么該如何來發(fā)現(xiàn)這些服務(wù)呢?服務(wù)方實(shí)例的增加對服務(wù)的發(fā)現(xiàn)會產(chǎn)生哪些問題呢?

服務(wù)發(fā)現(xiàn)流程

上邊的例子看上去很完美,但是,仔細(xì)考慮以下,此方案對于微服務(wù)應(yīng)用而言行不通。首先,微服務(wù)可能是部署在 云環(huán)境的,服務(wù)實(shí)例的網(wǎng)絡(luò)位置或許是動態(tài)分配的。另外,每一個(gè)服務(wù)一般會有多個(gè)實(shí)例來做負(fù)載均衡,由于宕機(jī) 或升級,服務(wù)實(shí)例網(wǎng)絡(luò)地址會經(jīng)常動態(tài)改變。再者,每一個(gè)服務(wù)也可能應(yīng)對臨時(shí)訪問壓力增加新的服務(wù)節(jié)點(diǎn)。正如 下圖所示:


在這里插入圖片描述

基于以上的問題,服務(wù)之間如何相互發(fā)現(xiàn)?服務(wù)如何管理?這就是服務(wù)發(fā)現(xiàn)的問題了。 服務(wù)發(fā)現(xiàn)就是服務(wù)消費(fèi)方通過服務(wù)發(fā)現(xiàn)中心智能發(fā)現(xiàn)服務(wù)提供方,從而進(jìn)行遠(yuǎn)程調(diào)用的過程。 如下圖:


在這里插入圖片描述

上圖中服務(wù)實(shí)例本身并不記錄服務(wù)生產(chǎn)方的網(wǎng)絡(luò)地址,所有服務(wù)實(shí)例內(nèi)部都會包含服務(wù)發(fā)現(xiàn)客戶端。

(1)在每個(gè)服務(wù)啟動時(shí)會向服務(wù)發(fā)現(xiàn)中心上報(bào)自己的網(wǎng)絡(luò)位置。這樣,在服務(wù)發(fā)現(xiàn)中心內(nèi)部會形成一個(gè)服務(wù)注冊 表,服務(wù)注冊表是服務(wù)發(fā)現(xiàn)的核心部分,是包含所有服務(wù)實(shí)例的網(wǎng)絡(luò)地址的數(shù)據(jù)庫。
(2)服務(wù)發(fā)現(xiàn)客戶端定期從服務(wù)發(fā)現(xiàn)中心同步服務(wù)注冊表 ,并緩存在客戶端。
(3)當(dāng)需要對某服務(wù)進(jìn)行請求時(shí),服務(wù)實(shí)例通過該注冊表,定位目標(biāo)服務(wù)網(wǎng)絡(luò)地址。若目標(biāo)服務(wù)存在多個(gè)網(wǎng)絡(luò)地 址,則使用負(fù)載均衡算法從多個(gè)服務(wù)實(shí)例中選擇出一個(gè),然后發(fā)出請求。

總結(jié):
在微服務(wù)環(huán)境中,由于服務(wù)運(yùn)行實(shí)例的網(wǎng)絡(luò)地址是不斷動態(tài)變化的,服務(wù)實(shí)例數(shù)量的動態(tài)變化 ,因此無法 使用固定的配置文件來記錄服務(wù)提供方的網(wǎng)絡(luò)地址,必須使用動態(tài)的服務(wù)發(fā)現(xiàn)機(jī)制用于實(shí)現(xiàn)微服務(wù)間的相互感知。 各服務(wù)實(shí)例會上報(bào)自己的網(wǎng)絡(luò)地址,這樣服務(wù)中心就形成了一個(gè)完整的服務(wù)注冊表,各服務(wù)實(shí)例會通過服務(wù)發(fā)現(xiàn)中 心來獲取訪問目標(biāo)服務(wù)的網(wǎng)絡(luò)地址,從而實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)的機(jī)制。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容