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

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

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

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

在這里插入圖片描述

我們通過Spring boot技術(shù)很容易實現(xiàn):
創(chuàng)建一個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ù)地址恬叹,實現(xiàn)代碼如下:
1、創(chuàng)建Controller

@RestController
public class RestProviderController {

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

        return "provider invoke";
    }
}

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

server:
    port:56010

創(chuàng)建Service A(服務(wù)消費者)
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(){
        //遠程調(diào)用
        RestTemplate restTemplate = new RestTemplate();
        String forObject = restTemplate.getForObject("http://" + provider + "service", String.class);
        return "消費成功"+forObject;
    }
}

配置文件

server:
  port: 56020

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

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

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

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


在這里插入圖片描述

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


在這里插入圖片描述

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

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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市酌呆,隨后出現(xiàn)的幾起案子衡载,更是在濱河造成了極大的恐慌,老刑警劉巖隙袁,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件痰娱,死亡現(xiàn)場離奇詭異,居然都是意外死亡菩收,警方通過查閱死者的電腦和手機猜揪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坛梁,“玉大人,你說我怎么就攤上這事腊凶』溃” “怎么了?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵钧萍,是天一觀的道長褐缠。 經(jīng)常有香客問我,道長风瘦,這世上最難降的妖魔是什么队魏? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮万搔,結(jié)果婚禮上胡桨,老公的妹妹穿的比我還像新娘。我一直安慰自己瞬雹,他們只是感情好昧谊,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著酗捌,像睡著了一般呢诬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胖缤,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天尚镰,我揣著相機與錄音,去河邊找鬼哪廓。 笑死狗唉,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的撩独。 我是一名探鬼主播敞曹,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼账月,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了澳迫?” 一聲冷哼從身側(cè)響起局齿,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎橄登,沒想到半個月后抓歼,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡拢锹,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年谣妻,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片卒稳。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡蹋半,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出充坑,到底是詐尸還是另有隱情减江,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布捻爷,位于F島的核電站辈灼,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏也榄。R本人自食惡果不足惜巡莹,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望甜紫。 院中可真熱鬧降宅,春花似錦、人聲如沸棵介。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽邮辽。三九已至唠雕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吨述,已是汗流浹背岩睁。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留揣云,地道東北人捕儒。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親刘莹。 傳聞我的和親對象是個殘疾皇子阎毅,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內(nèi)容