2.Nacos-服務(wù)發(fā)現(xiàn)和配置管理(RESTful服務(wù)發(fā)現(xiàn),RESTful,Dubbo)

前言:您可以在本篇學(xué)習(xí)到以下知識(shí)點(diǎn):

1)能夠理解微服務(wù)架構(gòu)的特點(diǎn)

2)能夠理解服務(wù)發(fā)現(xiàn)的流程

3)能夠說出Nacos的功能

4)掌握Nacos的安裝方法

5)掌握RESTful服務(wù)發(fā)現(xiàn)開發(fā)方法

6)掌握Dubbo服務(wù)發(fā)現(xiàn)開發(fā)方法

7)理解Nacos服務(wù)發(fā)現(xiàn)的數(shù)據(jù)模型

8)能夠掌握Nacos配置管理方法

9)掌握Nacos擴(kuò)展配置方法

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

1.1 微服務(wù)架構(gòu)

為適應(yīng)企業(yè)的業(yè)務(wù)發(fā)展,提高軟件研發(fā)的生產(chǎn)力,降低軟件研發(fā)的成本,軟件架構(gòu)也作了升級(jí)和優(yōu)化,將一個(gè)獨(dú)立的系統(tǒng)拆分成若干小的服務(wù),每個(gè)小服務(wù)運(yùn)行在不同的進(jìn)程中,服務(wù)與服務(wù)之間采用RESTful、RPC等協(xié)議傳輸數(shù)據(jù),每個(gè)服務(wù)所擁有的功能具有獨(dú)立性強(qiáng)的特點(diǎn),這樣的設(shè)計(jì)就實(shí)現(xiàn)了單個(gè)服務(wù)的高內(nèi)聚,服務(wù)與服務(wù)之間的低耦合效果,這些小服務(wù)就是微服務(wù),基于這種方法設(shè)計(jì)的系統(tǒng)架構(gòu)即微服務(wù)架構(gòu)。

特點(diǎn):

1、服務(wù)層按業(yè)務(wù)拆分為一個(gè)一個(gè)的微服務(wù)。

2、微服務(wù)的職責(zé)單一。

3、微服務(wù)之間采用RESTful、RPC等輕量級(jí)協(xié)議傳輸。

4、有利于采用前后端分離架構(gòu)。

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

1.2.1 測(cè)試環(huán)境

在微服務(wù)架構(gòu)中,整個(gè)系統(tǒng)會(huì)按職責(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)方,為了完成一次請(qǐng)求,消費(fèi)方需要知道服務(wù)生產(chǎn)方的網(wǎng)絡(luò)位置(IP地址和端口號(hào))

通過Spring boot技術(shù)很容易實(shí)現(xiàn)

1、創(chuàng)建nacos-discovery父工程

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">

<modelVersion>4.0.0</modelVersion>

<groupId>com.itheima.nacos</groupId>

<artifactId>nacos‐discovery</artifactId>

<version>1.0‐SNAPSHOT</version>

<packaging>pom</packaging>

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring‐boot‐dependencies</artifactId>

<version>2.1.3.RELEASE</version>

<type>pom</type>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

</project>

2、Service B(服務(wù)生產(chǎn)者)

創(chuàng)建服務(wù)提供者 nacos-restful-provider。

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>

<artifactId>nacos‐discovery</artifactId>

<groupId>com.itheima.nacos</groupId>

<version>1.0‐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

package com.itheima.nacos.provider.controller;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

@RestController

public class RestProviderController {

@GetMapping(value = "/service") //暴露服務(wù)

public String service(){

System.out.println("provider invoke");

return "provider invoke";

}

}

2、創(chuàng)建啟動(dòng)類

@SpringBootApplication

public class SpringRestProviderBootstrap {

public static void main(String[] args) {

SpringApplication.run(SpringRestProviderBootstrap.class, args);

}

}

配置文件:

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

server:

port:56010

3、Service A(服務(wù)消費(fèi)者)

創(chuàng)建nacos-restful-consumer 服務(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>

<artifactId>nacos‐discovery</artifactId>

<groupId>com.itheima.nacos</groupId>

<version>1.0‐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>

實(shí)現(xiàn)代碼:

1、創(chuàng)建controller

package com.itheima.nacos.consumer.controller;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.client.RestTemplate;

@RestController

public class RestConsumerController {

@Value("${provider.address}")

private String providerAddress;

@GetMapping(value = "/service")

public String service(){

RestTemplate restTemplate = new RestTemplate();

//調(diào)用服務(wù)

String providerResult = restTemplate.getForObject("http://" + providerAddress +

"/service",String.class);

return "consumer invoke | " + providerResult;

}

}

2、創(chuàng)建啟動(dòng)類

@SpringBootApplication

public class SpringRestConsumerBootstrap {

public static void main(String[] args) {

SpringApplication.run(SpringRestConsumerBootstrap.class, args);

}

}

配置文件:

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

server.port = 56020

# 服務(wù)生產(chǎn)方地址

provider.address = 127.0.0.1:56010

訪問http://127.0.0.1:56020/service,輸出以下內(nèi)容:

consumer invoke | provider invoke

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

上邊的例子方案對(duì)于微服務(wù)應(yīng)用而言行不通。首先,微服務(wù)可能是部署在云環(huán)境的,服務(wù)實(shí)例的網(wǎng)絡(luò)位置或許是動(dòng)態(tài)分配的。另外,每一個(gè)服務(wù)一般會(huì)有多個(gè)實(shí)例來做負(fù)載均衡,由于宕機(jī)或升級(jí),服務(wù)實(shí)例網(wǎng)絡(luò)地址會(huì)經(jīng)常動(dòng)態(tài)改變。再者,每一個(gè)服務(wù)也可能應(yīng)對(duì)臨時(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)部都會(huì)包含服務(wù)發(fā)現(xiàn)客戶端。

(1)在每個(gè)服務(wù)啟動(dòng)時(shí)會(huì)向服務(wù)發(fā)現(xiàn)中心上報(bào)自己的網(wǎng)絡(luò)位置。這樣,在服務(wù)發(fā)現(xiàn)中心內(nèi)部會(huì)形成一個(gè)服務(wù)注冊(cè)表,服務(wù)注冊(cè)表是服務(wù)發(fā)現(xiàn)的核心部分,是包含所有服務(wù)實(shí)例的網(wǎng)絡(luò)地址的數(shù)據(jù)庫(kù)。

(2)服務(wù)發(fā)現(xiàn)客戶端會(huì)定期從服務(wù)發(fā)現(xiàn)中心同步服務(wù)注冊(cè)表 ,并緩存在客戶端。

(3)當(dāng)需要對(duì)某服務(wù)進(jìn)行請(qǐng)求時(shí),服務(wù)實(shí)例通過該注冊(cè)表,定位目標(biāo)服務(wù)網(wǎng)絡(luò)地址。若目標(biāo)服務(wù)存在多個(gè)網(wǎng)絡(luò)地址,則使用負(fù)載均衡算法從多個(gè)服務(wù)實(shí)例中選擇出一個(gè),然后發(fā)出請(qǐng)求。

總結(jié),在微服務(wù)環(huán)境中,由于服務(wù)運(yùn)行實(shí)例的網(wǎng)絡(luò)地址是不斷動(dòng)態(tài)變化的,服務(wù)實(shí)例數(shù)量的動(dòng)態(tài)變化 ,因此無法使用固定的配置文件來記錄服務(wù)提供方的網(wǎng)絡(luò)地址,必須使用動(dòng)態(tài)的服務(wù)發(fā)現(xiàn)機(jī)制用于實(shí)現(xiàn)微服務(wù)間的相互感知。

各服務(wù)實(shí)例會(huì)上報(bào)自己的網(wǎng)絡(luò)地址,這樣服務(wù)中心就形成了一個(gè)完整的服務(wù)注冊(cè)表,各服務(wù)實(shí)例會(huì)通過服務(wù)發(fā)現(xiàn)中心來獲取訪問目標(biāo)服務(wù)的網(wǎng)絡(luò)地址,從而實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)的機(jī)制。

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

2.1 Nacos簡(jiǎn)介

2.1.1 服務(wù)發(fā)現(xiàn)產(chǎn)品對(duì)比

從上面對(duì)比可以了解到,Nacos作為服務(wù)發(fā)現(xiàn)中心,具備更多的功能支持項(xiàng),且從長(zhǎng)遠(yuǎn)來看Nacos在以后的版本會(huì)支持SpringCLoud+Kubernetes的組合,填補(bǔ) 2 者的鴻溝,在兩套體系下可以采用同一套服務(wù)發(fā)現(xiàn)和配置管理的解決方案,這將大大的簡(jiǎn)化使用和維護(hù)的成本。另外,Nacos 計(jì)劃實(shí)現(xiàn) Service Mesh,也是未來微服務(wù)發(fā)展的趨勢(shì)。

2.1.2 Nacos簡(jiǎn)介

Nacos是阿里的一個(gè)開源產(chǎn)品,它是針對(duì)微服務(wù)架構(gòu)中的服務(wù)發(fā)現(xiàn)、配置管理、服務(wù)治理的綜合型解決方案。

2.1.3 Nacos特性

Nacos主要提供以下四大功能:

1. 服務(wù)發(fā)現(xiàn)與服務(wù)健康檢查

Nacos使服務(wù)更容易注冊(cè),并通過DNS或HTTP接口發(fā)現(xiàn)其他服務(wù),Nacos還提供服務(wù)的實(shí)時(shí)健康檢查,以防止向不健康的主機(jī)或服務(wù)實(shí)例發(fā)送請(qǐng)求。

2. 動(dòng)態(tài)配置管理

動(dòng)態(tài)配置服務(wù)允許您在所有環(huán)境中以集中和動(dòng)態(tài)的方式管理所有服務(wù)的配置。Nacos消除了在更新配置時(shí)重新部署應(yīng)用程序,這使配置的更改更加高效和靈活。

3. 動(dòng)態(tài)DNS服務(wù)

Nacos提供基于DNS【域名系統(tǒng)(Domain Name System,縮寫:DNS)】 協(xié)議的服務(wù)發(fā)現(xiàn)能力,旨在支持異構(gòu)語言的服務(wù)發(fā)現(xiàn),支持將注冊(cè)在Nacos上的服務(wù)以域名的方式暴露端點(diǎn),讓三方應(yīng)用方便的查閱及發(fā)現(xiàn)。

4. 服務(wù)和元數(shù)據(jù)管理

Nacos 能讓您從微服務(wù)平臺(tái)建設(shè)的視角管理數(shù)據(jù)中心的所有服務(wù)及元數(shù)據(jù),包括管理服務(wù)的描述、生命周期、服務(wù)的靜態(tài)依賴分析、服務(wù)的健康狀態(tài)、服務(wù)的流量管理、路由及安全策略。

2.2 安裝Nacos Server

2.2.1 預(yù)備環(huán)境準(zhǔn)備

Nacos 依賴 Java 環(huán)境來運(yùn)行。如果您是從代碼開始構(gòu)建并運(yùn)行Nacos,還需要為此配置 Maven環(huán)境,請(qǐng)確保是在

以下版本環(huán)境中安裝使用:

1. 64 bit OS,支持 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac。

2. 64 bit JDK 1.8+;下載 & 配置。

3. Maven 3.2.x+;下載 & 配置。

2.2.2 下載源碼或者安裝包

你可以通過源碼和發(fā)行包兩種方式來獲取 Nacos。

從 Github 上下載源碼方式

git clone https://github.com/alibaba/nacos.git

cd nacos/

mvn ‐Prelease‐nacos clean install ‐U

ls ‐al distribution/target/

// change the $version to your actual path

cd distribution/target/nacos‐server‐$version/nacos/bin

下載編譯后壓縮包方式

您可以從 最新穩(wěn)定版本 下載 nacos-server-$version.zip 包,本教程使用nacos-server-1.1.3版本。

下載地址:https://github.com/alibaba/nacos/releases

下載后解壓:unzip nacos‐server‐$version.zip 或者 tar ‐xvf nacos‐server‐$version.tar.gz cd nacos/bin

2.2.3 啟動(dòng)服務(wù)器

nacos的默認(rèn)端口是8848,需要保證8848默認(rèn)端口沒有被其他進(jìn)程占用。

進(jìn)入安裝程序的bin目錄:

Linux/Unix/Mac啟動(dòng)方式:

啟動(dòng)命令(standalone代表著單機(jī)模式運(yùn)行,非集群模式):

sh startup.sh -m standalone

如果您使用的是ubuntu系統(tǒng),或者運(yùn)行腳本報(bào)錯(cuò)提示[[符號(hào)找不到,可嘗試如下運(yùn)行:

bash startup.sh -m standalone

Windows啟動(dòng)方式:

啟動(dòng)命令:

cmd startup.cmd

或者雙擊startup.cmd運(yùn)行文件。

啟動(dòng)成功,可通過瀏覽器訪問 http://127.0.0.1:8848/nacos ,打開如下nacos控制臺(tái)登錄頁(yè)面:

使用默認(rèn)用戶名:nacos,默認(rèn)密碼:nacos 登錄即可打開主頁(yè)面。

2.2.4 外部mysql數(shù)據(jù)庫(kù)支持

單機(jī)模式時(shí)nacos默認(rèn)使用嵌入式數(shù)據(jù)庫(kù)實(shí)現(xiàn)數(shù)據(jù)的存儲(chǔ),若想使用外部mysql存儲(chǔ)nacos數(shù)據(jù),需要進(jìn)行以下步驟:

1.安裝數(shù)據(jù)庫(kù),版本要求:5.6.5+ ,mysql 8 以下

2.初始化mysql數(shù)據(jù)庫(kù),新建數(shù)據(jù)庫(kù)nacos_confifig,數(shù)據(jù)庫(kù)初始化文件:${安裝路徑下}/conf/nacos-mysql.sql

3.修改${安裝路徑下}/conf/application.properties文件,增加支持mysql數(shù)據(jù)源配置(目前只支持mysql),添加mysql數(shù)據(jù)源的url、用戶名和密碼。

spring.datasource.platform=mysql

db.num=1

db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_config?

characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true

db.user=nacos_devtest

db.password=youdontknow

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

2.3.1 測(cè)試環(huán)境

本測(cè)試環(huán)境采用阿里開源的Spring Cloud Alibaba微服務(wù)開發(fā)框架,Spring Cloud Alibaba是阿里巴巴公司基于Spring Cloud標(biāo)準(zhǔn)實(shí)現(xiàn)一套微服務(wù)開發(fā)框架集合

通過Spring Cloud Alibaba實(shí)現(xiàn)解決:

1、服務(wù)發(fā)現(xiàn)客戶端從服務(wù)發(fā)現(xiàn)中心獲取服務(wù)列表

2、服務(wù)消費(fèi)方通過負(fù)載均衡獲取服務(wù)地址

#在nacos-discovery父工程中添加依賴管理

<dependencyManagement>

<dependencies>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring‐boot‐dependencies</artifactId>

<version>2.1.3.RELEASE</version>

<type>pom</type>

<scope>import</scope>

</dependency>

<dependency>

<groupId>org.springframework.cloud</groupId>

<artifactId>spring‐cloud‐dependencies</artifactId>

<version>Greenwich.RELEASE</version>

<type>pom</type>

<scope>import</scope>

</dependency>

<dependency>

<groupId>com.alibaba.cloud</groupId>

<artifactId>spring‐cloud‐alibaba‐dependencies</artifactId>

<version>2.1.0.RELEASE</version>

<type>pom</type>

<scope>import</scope>

</dependency>

</dependencies>

</dependencyManagement>

分別在服務(wù)提供及服務(wù)消費(fèi)工程中添加依賴,此依賴的作用是服務(wù)發(fā)現(xiàn)

<dependency>

<groupId>com.alibaba.cloud</groupId>

<artifactId>spring‐cloud‐starter‐alibaba‐nacos‐discovery</artifactId>

</dependency>

2.3.2 服務(wù)注冊(cè)

在服務(wù)提供工程中配置nacos服務(wù)發(fā)現(xiàn)相關(guān)的配置:

服務(wù)提供:

spring:

application:

name: nacos‐restful‐provider

cloud:

nacos:

discovery:

server‐addr: 127.0.0.1:8848

啟動(dòng)nacos

啟動(dòng)服務(wù)提供

觀察nacos服務(wù)列表,nacos-restful-provider注冊(cè)成功

服務(wù)名稱:每個(gè)服務(wù)在服務(wù)注冊(cè)中心的標(biāo)識(shí),相當(dāng)于Java中的類名。

服務(wù)實(shí)例:網(wǎng)絡(luò)中提供服務(wù)的實(shí)例,具有IP和端口,相當(dāng)于Java中的對(duì)象,一個(gè)實(shí)例即為運(yùn)行在服務(wù)器上的一個(gè)進(jìn)程。

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

在服務(wù)消費(fèi)工程中配置nacos服務(wù)發(fā)現(xiàn)相關(guān)的配置:

服務(wù)消費(fèi):

spring:

application:

name: nacos‐restful‐consumer

cloud:

nacos:

discovery:

server‐addr: 127.0.0.1:8848

修改Controller中遠(yuǎn)程調(diào)用的代碼:

//服務(wù)id即注冊(cè)中心的中的服務(wù)名

private String serviceId="nacos‐restful‐provider";

@Autowired

LoadBalancerClient loadBalancerClient;

@GetMapping(value = "/service")

public String service(){

RestTemplate restTemplate = new RestTemplate();

//調(diào)用服務(wù)

// String providerResult = restTemplate.getForObject("http://" + providerAddress +

"/service",String.class);

ServiceInstance serviceInstance = loadBalancerClient.choose(serviceId);

URI uri = serviceInstance.getUri();

String providerResult = restTemplate.getForObject(uri+"/service",String.class);

return "consumer invoke | " + providerResult;

}

2.3.4 負(fù)載均衡

在RESTful服務(wù)發(fā)現(xiàn)的流程中,ServiceA通過負(fù)載均衡調(diào)用ServiceB,下邊來了解一下負(fù)載均衡:

負(fù)載均衡就是將用戶請(qǐng)求(流量)通過一定的策略,分?jǐn)傇诙鄠€(gè)服務(wù)實(shí)例上執(zhí)行,它是系統(tǒng)處理高并發(fā)、緩解網(wǎng)絡(luò)壓力和進(jìn)行服務(wù)端擴(kuò)容的重要手段之一。它分為服務(wù)端負(fù)載均衡和客戶端負(fù)載均衡。

服務(wù)器端負(fù)載均衡:當(dāng)客戶端請(qǐng)求來臨時(shí),負(fù)載均衡服務(wù)器按照某種配置好的規(guī)則(負(fù)載均衡算法)從可用服務(wù)實(shí)例清單中選取其一去處理客戶端的請(qǐng)求。這就是服務(wù)端負(fù)載均衡。

客戶端服務(wù)負(fù)載均衡:上邊使用的LoadBalancerClient就是一個(gè)客戶端負(fù)載均衡器,具體使用的是Ribbon客戶端負(fù)載均衡器。Ribbon在發(fā)送請(qǐng)求前通過負(fù)載均衡算法選擇一個(gè)服務(wù)實(shí)例,然后進(jìn)行訪問,這是客戶端負(fù)載均衡。即在客戶端就進(jìn)行負(fù)載均衡的分配。Ribbon核心組件IRule是負(fù)載均衡策略接口,它有如下實(shí)現(xiàn),大家僅做了解:RoundRobinRule(默認(rèn)):輪詢,即按一定的順序輪換獲取實(shí)例的地址。RandomRule:隨機(jī),即以隨機(jī)的方式獲取實(shí)例的地址。

Ribbon核心組件IRule是負(fù)載均衡策略接口,它有如下實(shí)現(xiàn),大家僅做了解:

RoundRobinRule(默認(rèn)):輪詢,即按一定的順序輪換獲取實(shí)例的地址。

RandomRule:隨機(jī),即以隨機(jī)的方式獲取實(shí)例的地址。

可通過下面方式在服務(wù)消費(fèi)方的 配置文件中修改默認(rèn)的負(fù)載均衡策略:

nacos‐restful‐provider:

ribbon:

NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

2.3.5 小結(jié)

服務(wù)注冊(cè)與發(fā)現(xiàn)流程:

1、服務(wù)提供方將自己注冊(cè)到服務(wù)注冊(cè)中心

2、服務(wù)消費(fèi)方從注冊(cè)中心獲取服務(wù)地址

3、通過客戶端負(fù)載均衡器進(jìn)行遠(yuǎn)程調(diào)用


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

Dubbo是阿里巴巴公司開源的RPC框架,在國(guó)內(nèi)有著非常大的用戶群體,但是其微服務(wù)開發(fā)組件相對(duì)Spring Cloud來說并不那么完善。

Spring Cloud Alibaba微服務(wù)開發(fā)框架集成了Dubbo,可實(shí)現(xiàn)微服務(wù)對(duì)外暴露Dubbo協(xié)議的接口,Dubbo協(xié)議相比RESTful協(xié)議速度更快。

RPC:RPC是遠(yuǎn)程過程調(diào)用(Remote Procedure Call)的縮寫形式,調(diào)用RPC遠(yuǎn)程方法就像調(diào)用本地方法一樣

交互流程:

1、網(wǎng)關(guān)負(fù)責(zé)客戶端請(qǐng)求的統(tǒng)一入口,路由轉(zhuǎn)發(fā),前端通過網(wǎng)關(guān)請(qǐng)求后端服務(wù)。

2、網(wǎng)關(guān)收到前端請(qǐng)求,轉(zhuǎn)發(fā)請(qǐng)求給應(yīng)用。

3、應(yīng)用接收前端請(qǐng)求,調(diào)用微服務(wù)進(jìn)行業(yè)務(wù)邏輯處理

4、微服務(wù)為應(yīng)用提供業(yè)務(wù)邏輯處理的支撐,為應(yīng)用提供Dubbo協(xié)議接口

優(yōu)勢(shì)分析:

此架構(gòu)同時(shí)提供RESTful和Dubbo接口服務(wù),應(yīng)用層對(duì)前端提供RESTful接口,RESTful是互聯(lián)網(wǎng)通用的輕量級(jí)交互

協(xié)議,方便前端接入系統(tǒng);微服務(wù)層向應(yīng)用層提供Dubbo接口,Dubbo接口基于RPC通信協(xié)議速度更快。

本架構(gòu)采用阿里開源的Nacos,集服務(wù)發(fā)現(xiàn)和配置中心于一身,支持RESTful及Dubbo服務(wù)的注冊(cè)。

2.4.2 測(cè)試環(huán)境

父工程:仍然使用nacos-dicovery。

application1:使用nacos-restful-consumer。

service1微服務(wù):需要新建

service2微服務(wù):需要新建

api網(wǎng)關(guān):后邊的課程內(nèi)容講解。

2.4.3 service2微服務(wù)

service2對(duì)外暴露dubbo協(xié)議的接口,考慮遠(yuǎn)程接口可能 會(huì)被其它多個(gè)服務(wù)調(diào)用,這里將service2的接口單獨(dú)抽取

出api工程,service2微服務(wù)工程的結(jié)構(gòu)如下:

service2-api:存放接口,獨(dú)立成一個(gè)工程方便被其它服務(wù)工程依賴。

service2-server:存放接口實(shí)現(xiàn),即dubbo服務(wù)的實(shí)現(xiàn)部分。

2.4.3.1 定義service2-api

1、創(chuàng)建service2工程

<?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>

<artifactId>nacos‐discovery</artifactId>

<groupId>com.itheima.nacos</groupId>

<version>1.0‐SNAPSHOT</version>

</parent>

<modelVersion>4.0.0</modelVersion>

<artifactId>nacos‐dubbo‐service2</artifactId>

<packaging>pom</packaging>

</project>

2、創(chuàng)建service2-api工程

<?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>

<artifactId>nacos‐dubbo‐service1</artifactId>

<groupId>com.itheima.nacos</groupId>

<version>1.0‐SNAPSHOT</version>

</parent>

<modelVersion>4.0.0</modelVersion>

<artifactId>service2‐api</artifactId>

3、定義接口

package com.itheima.microservice.service2.api;

public interface Service2Api {

public String dubboService2();

}

2.4.3.2 定義service2-server

1、創(chuàng)建service2-server工程

<?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>

<artifactId>nacos‐dubbo‐service1</artifactId>

<groupId>com.itheima.nacos</groupId>

<version>1.0‐SNAPSHOT</version>

</parent>

<modelVersion>4.0.0</modelVersion>

<artifactId>service2‐server</artifactId>

<dependencies>

<dependency>

<groupId>com.itheima.nacos</groupId>

<artifactId>service2‐api</artifactId>

<version>1.0‐SNAPSHOT</version>

</dependency>

<dependency>

<groupId>com.alibaba.cloud</groupId>

<artifactId>spring‐cloud‐starter‐alibaba‐nacos‐discovery</artifactId>

</dependency>

<dependency>

<groupId>com.alibaba.cloud</groupId>

<artifactId>spring‐cloud‐starter‐dubbo</artifactId>

</dependency>

</dependencies>

</project>

2、定義接口實(shí)現(xiàn)

注意:使用@org.apache.dubbo.confifig.annotation.Service標(biāo)記dubbo服務(wù)

package com.itheima.microservice.service2.service;

import com.itheima.microservice.service2.api.Service2Api;

@org.apache.dubbo.config.annotation.Service

public class Service2ApiImpl implements Service2Api {

public String dubboService2() {

return "dubboService2";

}

}

3、定義啟動(dòng)類

package com.itheima.microservice.service2;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class Service2Bootstrap {

public static void main(String[] args) {

SpringApplication.run(Service2Bootstrap.class, args);

}

}

4、定義配置文件bootstrap.yml

server:

port: 56040 #啟動(dòng)端口 命令行注入

spring:

application:

name: dubbo‐service2

main:

allow‐bean‐definition‐overriding: true # Spring Boot 2.1 需要設(shè)定

cloud:

nacos:

discovery:

server‐addr: 127.0.0.1:8848

dubbo:

scan:

# dubbo 服務(wù)掃描基準(zhǔn)包

base‐packages: com.itheima.microservice.service2.service

protocol:

# dubbo 協(xié)議

name: dubbo

# dubbo 協(xié)議端口

port: 20891

registry:

address: nacos://127.0.0.1:8848

application:

qos‐enable: false #dubbo運(yùn)維服務(wù)是否開啟

consumer:

check: false #啟動(dòng)時(shí)就否檢查依賴的服務(wù)

5、啟動(dòng)service2-server

啟動(dòng)成功觀察nacos的服務(wù)列表

2.4.4 application1調(diào)用service2

根據(jù)dubbo服務(wù)的架構(gòu)圖,本章節(jié)將nacos-restful-consumer作為application1,實(shí)現(xiàn)application1調(diào)用

service2。

2.4.4.1 引用service2

在nacos-restful-consumer工程中引用service2依賴

在pom.xml中引入service2-api的依賴

<dependency>

<groupId>com.itheima.nacos</groupId>

<artifactId>service2‐api</artifactId>

<version>1.0‐SNAPSHOT</version>

</dependency>

引入 spring-cloud-starter-dubbo依賴,它會(huì)根據(jù)接口生成代理對(duì)象

<dependency>

<groupId>com.alibaba.cloud</groupId>

<artifactId>spring‐cloud‐starter‐dubbo</artifactId>

</dependency>

2.4.4.2 實(shí)現(xiàn)遠(yuǎn)程調(diào)用

修改nacos-restful-consumer工程的RestConsumerController:

@org.apache.dubbo.config.annotation.Reference

private Service2Api service2Api;

@GetMapping(value = "/service2")

public String service2(){

//遠(yuǎn)程調(diào)用service2

String providerResult = service2Api.dubboService2();

return "consumer dubbo invoke | " + providerResult;

}

注意:這里的 @Reference 注解是 org.apache.dubbo.config.annotation.Reference

測(cè)試請(qǐng)求:http://127.0.0.1:56020/service2

顯示:consumer dubbo invoke | dubboService2 表明service2調(diào)用成功。

2.4.5 service1微服務(wù)

service1采用和service2相同的工程結(jié)構(gòu)。

本節(jié)實(shí)現(xiàn)service1對(duì)外暴露dubbo接口,并用實(shí)現(xiàn)service1調(diào)用service2。

2.4.5.1 定義service1-api

1、創(chuàng)建service1工程

<?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>

<artifactId>nacos‐discovery</artifactId>

<groupId>com.itheima.nacos</groupId>

<version>1.0‐SNAPSHOT</version>

</parent>

<modelVersion>4.0.0</modelVersion>

<artifactId>nacos‐dubbo‐service1</artifactId>

<packaging>pom</packaging>

</project>

2、創(chuàng)建service1-api工程

<?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>

<artifactId>nacos‐dubbo‐service1</artifactId>

<groupId>com.itheima.nacos</groupId>

<version>1.0‐SNAPSHOT</version>

</parent>

<modelVersion>4.0.0</modelVersion>

<artifactId>service1‐api</artifactId>

</project>

3、定義接口

package com.itheima.microservice.service1.api;

public interface Service1Api {

public String dubboService1();

}

2.4.5.2 定義service1-server

1、創(chuàng)建service1-server工程

由于實(shí)現(xiàn)service1調(diào)用service2,這里需要引入 service2依賴。

<?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>

<artifactId>nacos‐dubbo‐service1</artifactId>

<groupId>com.itheima.nacos</groupId>

<version>1.0‐SNAPSHOT</version>

</parent>

<modelVersion>4.0.0</modelVersion>

<artifactId>service1‐server</artifactId>

<dependencies>

<dependency>

<groupId>com.itheima.nacos</groupId>

<artifactId>service1‐api</artifactId>

<version>1.0‐SNAPSHOT</version>

</dependency>

<dependency>

<groupId>com.itheima.nacos</groupId>

<artifactId>service2‐api</artifactId>

<version>1.0‐SNAPSHOT</version>

</dependency>

<dependency>

<groupId>com.alibaba.cloud</groupId>

<artifactId>spring‐cloud‐starter‐alibaba‐nacos‐discovery</artifactId>

</dependency>

<dependency>

<groupId>com.alibaba.cloud</groupId>

<artifactId>spring‐cloud‐starter‐dubbo</artifactId>

</dependency>

</dependencies>

</project>

2、定義接口實(shí)現(xiàn)

package com.itheima.microservice.service1.service;

import com.itheima.microservice.service1.api.Service1Api;

import com.itheima.microservice.service2.api.Service2Api;

import org.apache.dubbo.config.annotation.Reference;

@org.apache.dubbo.config.annotation.Service

public class Service1ApiImpl implements Service1Api {

@Reference

Service2Api service2Api;

public String dubboService1() {

String s = service2Api.dubboService2();

return "dubboService1|"+s;

}

}

3、定義啟動(dòng)類

package com.itheima.microservice.service1;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

public class Service1Bootstrap {

public static void main(String[] args) {

SpringApplication.run(Service1Bootstrap.class, args);

}

}

4、定義配置文件bootstrap.yml

server:

port: 56030 #啟動(dòng)端口 命令行注入

spring:

application:

name: dubbo‐service1

main:

allow‐bean‐definition‐overriding: true # Spring Boot 2.1 需要設(shè)定

cloud:

nacos:

discovery:

server‐addr: 127.0.0.1:8848

dubbo:

scan:

# dubbo 服務(wù)掃描基準(zhǔn)包

base‐packages: com.itheima.microservice.service1.service

protocol:

# dubbo 協(xié)議

name: dubbo

# dubbo 協(xié)議端口

port: 20881

registry:

address: nacos://127.0.0.1:8848

application:

qos‐enable: false #dubbo運(yùn)維服務(wù)是否開啟

consumer:

check: false #啟動(dòng)時(shí)就否檢查依賴的服務(wù)

5、啟動(dòng)service1-server

啟動(dòng)成功觀察nacos的服務(wù)列表

2.4.5.3 application1調(diào)用service1

參考 application1調(diào)用service2的方法實(shí)現(xiàn)。

1、在application1引入 service1-api的依賴

2、在application1的controller中調(diào)用service1接口

@Reference

private Service1Api service1Api;

@GetMapping(value = "/service3")

public String service1(){

String providerResult = service1Api.dubboService1();

return "consumer dubbo invoke | " + providerResult;

}

3、測(cè)試,請(qǐng)求http://127.0.0.1:56020/service3

顯示 :consumer dubbo invoke | dubboService1|dubboService2,表明調(diào)用service1成功,service1調(diào)用

service2成功。

2.5 服務(wù)發(fā)現(xiàn)數(shù)據(jù)模型

2.5.1Namespace 隔離設(shè)計(jì)

命名空間(Namespace)用于進(jìn)行租戶粒度的隔離,Namespace 的常用場(chǎng)景之一是不同環(huán)境的隔離,例如開發(fā)測(cè)試

環(huán)境和生產(chǎn)環(huán)境的資源(如配置、服務(wù))隔離等。

從一個(gè)租戶(用戶)的角度來看,如果有多套不同的環(huán)境,那么這個(gè)時(shí)候可以根據(jù)指定的環(huán)境來創(chuàng)建不同的

namespce,以此來實(shí)現(xiàn)多環(huán)境的隔離。例如,你可能有開發(fā),測(cè)試和生產(chǎn)三個(gè)不同的環(huán)境,那么使用一套

nacos 集群可以分別建以下三個(gè)不同的 namespace

2.5.2 命名空間管理

前面已經(jīng)介紹過,命名空間(Namespace)是用于隔離多個(gè)環(huán)境的(如開發(fā)、測(cè)試、生產(chǎn)),而每個(gè)應(yīng)用在不同環(huán)

境的同一個(gè)配置(如數(shù)據(jù)庫(kù)數(shù)據(jù)源)的值是不一樣的。因此,我們應(yīng)針對(duì)企業(yè)項(xiàng)目實(shí)際研發(fā)流程、環(huán)境進(jìn)行規(guī)劃。

如某軟件公司擁有開發(fā)、測(cè)試、生產(chǎn)三套環(huán)境,那么我們應(yīng)該針對(duì)這三個(gè)環(huán)境分別建立三個(gè)namespace。


Nacos在經(jīng)過阿里內(nèi)部多年生產(chǎn)經(jīng)驗(yàn)后提煉出的數(shù)據(jù)模型,則是一種服務(wù)-集群-實(shí)例的三層模型,這樣基本可以滿

足服務(wù)在所有場(chǎng)景下的數(shù)據(jù)存儲(chǔ)和管理。

例子如下:

指定namespace的id:a1f8e863-3117-48c4-9dd3-e9ddc2af90a8(注意根據(jù)自己環(huán)境設(shè)置namespace的id)

指定集群名稱:DEFAULT表示默認(rèn)集群,可不填寫

spring:

application:

name: transaction‐service

cloud:

nacos:

discovery:

server‐addr: 127.0.0.1:7283 # 注冊(cè)中心地址

namespace: a1f8e863‐3117‐48c4‐9dd3‐e9ddc2af90a8 # 開發(fā)環(huán)境

cluster‐name: DEFAULT # 默認(rèn)集群,可不填寫

3 Nacos配置管理

3.1 理解配置中心

3.1.1 什么是配置

應(yīng)用程序在啟動(dòng)和運(yùn)行的時(shí)候往往需要讀取一些配置信息,配置基本上伴隨著應(yīng)用程序的整個(gè)生命周期,比如:數(shù)

據(jù)庫(kù)連接參數(shù)、啟動(dòng)參數(shù)等。

3.1.2 什么是配置中心

在微服務(wù)架構(gòu)中,當(dāng)系統(tǒng)從一個(gè)單體應(yīng)用,被拆分成分布式系統(tǒng)上一個(gè)個(gè)服務(wù)節(jié)點(diǎn)后,配置文件也必須跟著遷移

(分割),這樣配置就分散了,不僅如此,分散中還包含著冗余,總得來說,配置中心就是一種統(tǒng)一管理各種應(yīng)用配置的基礎(chǔ)服務(wù)組件。

Nacos的一大優(yōu)勢(shì)是整合了注冊(cè)中心、配置中心功能,部署和操作相比Apollo都要直觀簡(jiǎn)單,因此它簡(jiǎn)化了架構(gòu)復(fù)雜度,并減輕運(yùn)維及部署工作。

3.2 Nacos配置管理

3.2.1 發(fā)布配置

首先在nacos發(fā)布配置,nacos-restful-consumer服務(wù)從nacos讀取配置。

瀏覽器訪問 http://127.0.0.1:8848/nacos ,打開nacos控制臺(tái),并點(diǎn)擊菜單配置管理->配置列表:

在Nacos添加如下的配置:

nacos-restful-consumer:

Namespace: public

Data ID: nacos‐restful‐consumer.yaml

Group : DEFAULT_GROUP

配置格式: YAML

配置內(nèi)容: common:

name: application1 config


3.2.2 獲取配置

要想從配置中心獲取配置添加nacos-confifig的依賴:

<dependency>

<groupId>com.alibaba.cloud</groupId>

<artifactId>spring‐cloud‐starter‐alibaba‐nacos‐config</artifactId>

</dependency>

在bootstrap.yml添加配置:

spring:

cloud:

nacos:

config:

server‐addr: 127.0.0.1:8848 # 配置中心地址

file‐extension: yaml

group: DEFAULT_GROUP

注意:要使用配置中心就要在bootstrap.yml中來配置,bootstrap.yml配置文件的加載順序要比application.yml要

優(yōu)先。

在nacos-restful-consumer工程的controller中增加獲取配置的web訪問端點(diǎn)/configs,通過標(biāo)準(zhǔn)的spring @Value

方式。

@Value("${common.name}")

private String common_name;

@GetMapping(value = "/configs")

public String getvalue(){

return common_name;

}

基于上面的例子,若要實(shí)現(xiàn)配置的動(dòng)態(tài)更新,只需要進(jìn)行如下改造:

// 注入配置文件上下文

@Autowired

private ConfigurableApplicationContext applicationContext;

@GetMapping(value = "/configs")

public String getConfigs(){

return applicationContext.getEnvironment().getProperty("common.name");

}

我們通過nacos控制臺(tái)更新common.name的配置值,再次訪問web端點(diǎn)/confifigs,發(fā)現(xiàn)應(yīng)用程序能夠獲取到最新

的配置值,說明spring-cloud-starter-alibaba-nacos-confifig 支持配置的動(dòng)態(tài)更新。

3.2.3 配置管理模型

對(duì)于Nacos配置管理,通過Namespace、group、Data ID能夠定位到一個(gè)配置集。

Nacos抽象定義了Namespace、Group、Data ID的概念,具體這幾個(gè)概念代表什么,取決于我們把它們看成什

么,這里推薦給大家一種用法,如下圖:

Namespace:代表不同環(huán)境,如開發(fā)、測(cè)試、生產(chǎn)環(huán)境。

Group:代表某項(xiàng)目,如XX醫(yī)療項(xiàng)目、XX電商項(xiàng)目

DataId:每個(gè)項(xiàng)目下往往有若干個(gè)工程,每個(gè)配置集(DataId)是一個(gè)工程的主配置文件

獲取某配置集的代碼:

獲取配置集需要指定:

1、nacos服務(wù)地址,必須指定

2、namespace,如不指定默認(rèn)public

在confifig中指定namespace,例子如下:

config:

server‐addr: 127.0.0.1:8848 # 配置中心地址

file‐extension: yaml

namespace: a1f8e863‐3117‐48c4‐9dd3‐e9ddc2af90a8 # 開發(fā)環(huán)境

group: DEFAULT_GROUP # xx業(yè)務(wù)組

3、group,如不指定默認(rèn) DEFAULT_GROUP

見上邊第2點(diǎn)的例子。

4、dataId,必須指定,名稱為應(yīng)用名稱+配置文件擴(kuò)展名

3.3 自定義擴(kuò)展的 Data Id 配置

3.3.1 ext-confifig擴(kuò)展配置

Spring Cloud Alibaba Nacos Confifig可支持自定義 Data Id 的配置。 一個(gè)完整的配置案例如下所示:

spring:

application:

name: service2

cloud:

nacos:

config:

server‐addr: 127.0.0.1:8848 # 配置中心地址

file‐extension: yaml

# namespace: a1f8e863‐3117‐48c4‐9dd3‐e9ddc2af90a8 # 開發(fā)環(huán)境

group: DEFAULT_GROUP

# config external configuration

# 1、Data Id group:組名,refresh:動(dòng)態(tài)刷新

ext‐config[0]:

data‐id: ext‐config‐common01.yaml

group: COMMON_GROUP

refresh: true

ext‐config[1]:

data‐id: ext‐config‐common02.yaml

group: COMMON_GROUP

refresh: true

可以看到:

通過 spring.cloud.nacos.config.ext-config[n].data-id 的配置方式來支持多個(gè) Data Id 的配置。

通過 spring.cloud.nacos.config.ext-config[n].group 的配置方式自定義 Data Id 所在的組,不明確配置

的話,默認(rèn)是 DEFAULT_GROUP。


@GetMapping(value = "/configs")

public String getvalue(){

String name = applicationContext.getEnvironment().getProperty("common.name");

String address = applicationContext.getEnvironment().getProperty("common.addr");

return name+address;

}

重啟nacos-restful-consumer工程

訪問:http://127.0.0.1:56020/confifigs

通過測(cè)試發(fā)現(xiàn):

擴(kuò)展配置優(yōu)先級(jí)是 spring.cloud.nacos.config.ext-config[n].data-id 其中 n 的值越大,優(yōu)先級(jí)越高。

通過內(nèi)部相關(guān)規(guī)則(應(yīng)用名、擴(kuò)展名 )自動(dòng)生成相關(guān)的 Data Id 配置的優(yōu)先級(jí)最大

3.3.2 案例

案例需求如下:

1、抽取servlet公用的配置到獨(dú)立的配置文件,配置文件內(nèi)容如下:

#HTTP格式配置

spring:

http:

encoding:

charset: UTF‐8

force: true

enabled: true

messages:

encoding: UTF‐8

#tomcat頭信息和訪問路徑配置

server:

tomcat:

remote_ip_header: x‐forwarded‐for

protocol_header: x‐forwarded‐proto

servlet:

context‐path: /a

use‐forward‐headers: true


發(fā)布配置,重啟nacos-restful-consumer

訪問http://127.0.0.1:56020/a/confifigs驗(yàn)證配置是否生效

4 總結(jié)

Nacos用來干什么?

Nacos是阿里巴巴公司開源的項(xiàng)目,它用來實(shí)現(xiàn)配置中心和服務(wù)注冊(cè)中心。

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

在微服務(wù)架構(gòu)中一個(gè)業(yè)務(wù)流程需要多個(gè)微服務(wù)通過網(wǎng)絡(luò)接口調(diào)用完成業(yè)務(wù)處理,服務(wù)消費(fèi)方從服務(wù)注冊(cè)中心獲取服

務(wù)提供方的地址,從而進(jìn)行遠(yuǎn)程調(diào)用,這個(gè)過程叫做服務(wù)發(fā)現(xiàn)。

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

1、服務(wù)發(fā)現(xiàn)的客戶端從服務(wù)注冊(cè)中心獲取服務(wù)列表

2、服務(wù)消費(fèi)方通過客戶端負(fù)載均衡獲取服務(wù)實(shí)例地址,進(jìn)行遠(yuǎn)程調(diào)用。

什么是配置中心?

在微服務(wù)架構(gòu)中為了統(tǒng)一管理各各微服務(wù)的配置信息專門設(shè)置配置中心,配置中心就是一種統(tǒng)一管理各種應(yīng)用配置

的基礎(chǔ)服務(wù)組件。

配置中心的應(yīng)用流程是什么?

1、發(fā)布配置,將配置信息發(fā)布到配置中心。

2、獲取配置,配置中心客戶端得到配置中心的通知,從配置中心獲取配置。

Spring Cloud是什么?

Spring Cloud是一套微服務(wù)開發(fā)框架集合,包括微服務(wù)開發(fā)的方方頁(yè)面,Spring Cloud是一套微服務(wù)開發(fā)的標(biāo)準(zhǔn),

集成了很多優(yōu)秀的開源框架,比如有名的Netflflix公司的眾多項(xiàng)目。

Spring Cloud Alibaba是什么?

Spring Cloud Alibaba是阿里巴巴公司基于Spring Cloud標(biāo)準(zhǔn)實(shí)現(xiàn)一套微服務(wù)開發(fā)框架集合,它和Netflflix一樣都是

Spring Cloud微服務(wù)開發(fā)實(shí)現(xiàn)方案。

Dubbo服務(wù)開發(fā)流程是什么?

1、定義api工程。

方便其它服務(wù)原來api工程,遠(yuǎn)程調(diào)用dubbo服務(wù)。

2、定義api實(shí)現(xiàn)工程。

service實(shí)現(xiàn)類使用 @org.apache.dubbo.confifig.annotation.Service注解標(biāo)記為dubbo服務(wù)。

3、服務(wù)消費(fèi)方開發(fā)

引入api工程依賴

使用org.apache.dubbo.confifig.annotation.Reference注解注入service,發(fā)起遠(yuǎn)程調(diào)用

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

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

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