微服務(wù)新秀之Nacos等浊,看了就會腮郊,我說的

再講 Nacos 之前,我們需要了解什么是 Nacos:Nacos 是阿里的一個開源產(chǎn)品筹燕,它是針對微服務(wù)架構(gòu)中的 服務(wù)發(fā)現(xiàn)轧飞、配置管理服務(wù)治理 的綜合性解決方案撒踪。

官網(wǎng)給出的回答:

Nacos 致力于幫助您發(fā)現(xiàn)过咬、配置和管理微服務(wù)。Nacos 提供了一組簡單易用的特性集制妄,幫助您實現(xiàn)動態(tài)服務(wù)發(fā)現(xiàn)掸绞、服務(wù)配置管理、服務(wù)及流量管理耕捞。 Nacos 幫助您更敏捷和容易地構(gòu)建衔掸、交付和管理微服務(wù)平臺烫幕。Nacos 是構(gòu)建以“服務(wù)”為中心的現(xiàn)代應(yīng)用架構(gòu)(例如微服務(wù)范式、云原生范式)的服務(wù)基礎(chǔ)設(shè)施敞映。

綜上所述纬霞,得出 Nacos 的四大特性:

  • 服務(wù)發(fā)現(xiàn)與服務(wù)健康檢查
  • 動態(tài)配置管理
  • 動態(tài)DNS服務(wù)
  • 服務(wù)和元數(shù)據(jù)管理

附圖:

image

看到Nacos支持這么多主流的開源生態(tài),是心動的感覺驱显!

一诗芜、入門基操

使用方式

Nacos的使用方式也極其簡單,以下為 windows 下安裝方式

步驟1

點擊下載地址 下載最新穩(wěn)定版本

步驟2

雙擊 bin 目錄下的 startup.cmd 啟動服務(wù)器

步驟3

通過瀏覽器訪問 http://127.0.0.1:8848/nacos 打開 nacos 控制臺登錄頁面埃疫,默認用戶名密碼皆為:nacos伏恐,登錄成功后便可訪問主頁面。

image

擴展使用

發(fā)布配置

我們可以通過 地址 的方式發(fā)布配置:http://127.0.0.1:8848/nacos/v1/cs/configs栓霜,使用 postman 進行測試:

image
image

獲取配置

我們可以通過 地址 的方式獲取配置:http://127.0.0.1:8848/nacos/v1/cs/configs翠桦,使用 postman 進行測試:

image

發(fā)布服務(wù)

我們可以通過 地址 進行服務(wù)注冊:http://127.0.0.1:8848/nacos/v1/ns/instance,使用 postman 進行測試:

image
image

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

我們可以通過 地址 發(fā)現(xiàn)服務(wù):http://127.0.0.1:8848/nacos/v1/ns/instance/list胳蛮,

使用 postman 進行測試:

image

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

nacos默認是使用嵌入式數(shù)據(jù)庫實現(xiàn)數(shù)據(jù)的存儲销凑,如果我們要使用外部 mysql 存儲 nacos數(shù)據(jù),進行以下步驟:

  • 步驟1

安裝Mysql(5.6.5 ~ 8 之間的版本)

  • 步驟2

初始化 mysql 數(shù)據(jù)庫仅炊,新建數(shù)據(jù)庫 nacos斗幼,然后加載 conf/nacos-mysql.sql

  • 步驟3

修改 conf/application.properties文件,添加 mysql 數(shù)據(jù)源的配置抚垄,然后重啟蜕窿,便可生效

image

二、配置管理

在上述中我們已經(jīng)知道Nacos其中的一個功能便是用于配置中心呆馁。配置中心是在微服務(wù)架構(gòu)中桐经,當(dāng)系統(tǒng)從一個單體應(yīng)用被拆分為分布式系統(tǒng)上一個個服務(wù)節(jié)點時,配置文件也必須隨著遷移而分割浙滤,這樣配置就分散了阴挣,而且各個配置中也存在互相冗余的部分。

image

配置中心所擔(dān)任的角色:

image

配置中心將配置從各應(yīng)用中剝離出來纺腊,對配置進行統(tǒng)一管理畔咧,應(yīng)用自身不需要自己去管理配置

從圖中我們總結(jié)流程如下:

  • 用戶在配置中心更新配置信息
  • A 服務(wù)和 B 服務(wù)及時得到配置更新通知,從配置中心獲取更新

發(fā)布配置

image
  • 步驟1中我們可以創(chuàng)建命名空間摹菠,命名空間(NameSpace)是用于隔離多個環(huán)境的(如開發(fā)盒卸、測試、生產(chǎn))次氨,而每個應(yīng)用在不同環(huán)境的同一配置(如數(shù)據(jù)庫配置)的值是不一樣的蔽介。
  • 步驟2中我們可以切換不同命名空間來發(fā)布不同配置,命名空間下類似 UUID 的一串便是每個命名空間的唯一ID。
  • 步驟3中我們可以點擊發(fā)布配置虹蓄,其中 DataIdgroup 是必填項
image

完成上面三個步驟后我們便可以看到生成了一條剛剛配置過的信息

獲取配置

然后我們在項目中便可讀取配置中的內(nèi)容犀呼,步驟如下:

  • 步驟1

在 pom 文件中引入 nacos-client包:

<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>1.1.3</version>
</dependency>
  • 步驟2

通過 nacos-client 包下提供的 API,來獲取配置:

public static void main(String[] args) throws NacosException {
    //使用nacos client遠程獲取nacos服務(wù)上的配置信息
    //nacos server地址
    String serverAddr = "127.0.0.1:8848";
    //data id
    String dataId = "application-dev.properties";
    //group
    String group = "DEFAULT_GROUP";

    //namespace
    String namespace = "dfa1c276-69f7-47d6-9903-6850b9c248f7";
    Properties properties =new Properties();
    properties.put("serverAddr",serverAddr);
    properties.put("namespace",namespace);

    //獲取配置
    ConfigService configService = NacosFactory.createConfigService(properties);

    // String dataId, String group, long timeoutMs
    String config = configService.getConfig(dataId, group, 5000);
    System.out.println(config);
}
/* OUTPUT:
spring.datasource.mysql.driverClassName = com.mysql.cj.jdbc.Driver
*/

配置的管理模型如下圖所示:

image
  • 命名空間(NameSpace)

命名空間(NameSpace)用于不同環(huán)境(開發(fā)環(huán)境薇组、測試環(huán)境和生產(chǎn)環(huán)境)的配置隔離外臂。不同的命名空間下,可以存在相同名稱的配置分組(Group)或配置集律胀。

  • 配置分組(Group)

配置分組是對配置集進行分組宋光,不同的配置分組下可以有相同的配置集(DateId)。默認的配置分組名稱為 DEFAULT_GROUP炭菌。用于區(qū)分不同的項目或應(yīng)用罪佳。

  • 配置集(DataId)

在系統(tǒng)中,一個配置文件通常就是一個 配置集黑低,一個配置集可以包含了系統(tǒng)的各種配置信息赘艳,例如一個配置集可能包含了數(shù)據(jù)源、線程池克握、日志級別等配置項蕾管。每個配置集都可以定義一個有意義的名稱。

image

分布式配置

在了解通過 Nacos 集中管理多個服務(wù)的配置之前菩暗,我們先大概了解下以下概念:

傳統(tǒng)單體架構(gòu)

image

所有功能模塊打包到一起并放在一個 web 容器中運行掰曾,所有功能模塊使用同一個數(shù)據(jù)庫。

特點

  • 開發(fā)效率高
  • 容易測試
  • 容易部署

缺點:

  • 復(fù)雜性會逐漸變高勋眯,維護性逐漸變差
  • 版本迭代逐漸變慢
  • 阻礙技術(shù)創(chuàng)新
  • 無法按需伸縮

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

image

微服務(wù)簡單來說就是將一個項目拆分成多個服務(wù)婴梧。每一個微服務(wù)都是完整的應(yīng)用,都有自己的業(yè)務(wù)邏輯和數(shù)據(jù)庫客蹋。每一個業(yè)務(wù)模塊都是用獨立的服務(wù)完成,這種微服務(wù)架構(gòu)模式也影響了應(yīng)用和數(shù)據(jù)庫之間的關(guān)系孽江,不像傳統(tǒng)多個業(yè)務(wù)模塊共享一個數(shù)據(jù)庫讶坯,微服務(wù)架構(gòu)每個服務(wù)都有自己的數(shù)據(jù)庫。

優(yōu)點:

  • 分而治之岗屏,職責(zé)單一
  • 可伸縮
  • 局部容易修改辆琅、替換、部署这刷,有利于持續(xù)集成和快速迭代
  • 不會受限于任何技術(shù)棧

Nacos

image

話不多說婉烟,我們直接用代碼來演示配置中心的用法:

  • 步驟1 - 發(fā)布配置

我們在Nacos主頁中創(chuàng)建兩個配置文件:

service_a.properties:

image

service_b.properties:

image
  • 步驟2 - 創(chuàng)建父工程

pom.xml 如下:

image
  • 步驟3 - 創(chuàng)建子模塊service-a

pom.xml 如下:

image

bootstrap.yml如下:

image
  • 步驟4 - 創(chuàng)建子模塊service-b

pom.xml 如下:

image

bootstrap.yml如下:

image

工程目錄結(jié)構(gòu)如下:

image

ConfigController如下:

image

service-a運行結(jié)果為:

image

service-b運行結(jié)果為:

image

可以看到通過以上步驟成功獲取到了我們在nacos中創(chuàng)建配置文件的內(nèi)容。其中我們需要注意關(guān)鍵的步驟為:1. 引入 spring-cloud-alibaba-dependencies 和 spring-cloud-starter-alibaba-nacos-config 的 jar包暇屋。 2. 我們在 resources 下創(chuàng)建的配置文件必須是 bootstrap 而不能是 application 3. bootstrap.yml中的配置

bootstrap.yml另有玄機似袁?

我們在上面看到配置核心點在于:

spring:
  application:
    name: service_a
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848                     # 配置中心地址
        # spring.application.name + file-extension = service_a.properties
        file-extension: properties                      # dataid名稱的后綴
        namespace: dfa1c276-69f7-47d6-9903-6850b9c248f7 # 指定具體的namespace
        group: TEST_GROUP

這個是讀取指定配置組下的指定配置,我們都知道開發(fā)講究高內(nèi)聚低耦合,如果有相同的配置項我們可以獨立抽取成一個文件昙衅,這樣我們就得引入多個配置文件扬霜,當(dāng)然nacos也是支持的,配置如下:

spring:
  application:
    name: service_a
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848                     # 配置中心地址
        # spring.application.name + file-extension = service_a.properties
        file-extension: properties                      # dataid名稱的后綴
        namespace: dfa1c276-69f7-47d6-9903-6850b9c248f7 # 指定具體的namespace
        group: TEST_GROUP
        # 通過 ext-config 來配合使用
        ext-config[0]:
          data-id: service-common_1.properties
        ext-config[1]:
          data-id: service-common_2.properties
          group: GLOBALE_GROUP
        ext-config[2]:
          data-id: service-common_3.properties
          group: REFRESH_GROUP
          refresh: true  #動態(tài)刷新配置

注意ext-config 得從 0 開始而涉,其中 refresh 標(biāo)簽用來實現(xiàn)動態(tài)刷新著瓶,就是配置文件修改后,項目不用重啟也能實時讀取最新的配置文件啼县。

可能你會覺得通過 ext-config 有點麻煩材原,需要寫那么多,為了簡化我們還可以使用 shared-dataids 和 refreshable-dataids 實現(xiàn)同上一樣的功能季眷,如下:

spring:
  application:
    name: service_a
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848                     # 配置中心地址
        # spring.application.name + file-extension = service_a.properties
        file-extension: properties                      # dataid名稱的后綴
        namespace: dfa1c276-69f7-47d6-9903-6850b9c248f7 # 指定具體的namespace
        group: TEST_GROUP

        shared-dataids: service-common_1.properties,service-common_2.properties,service-common_3.properties
        refreshable-dataids: service-common_3.properties

通過 shared-dataids 來支持多個共享 Data Id 的配置余蟹,多個之間用逗號隔開。 通過 refreshable-dataids 來支持哪些共享配置的 Data Id 在配置變化時瘟裸,應(yīng)用中是否可動態(tài)刷新客叉,感知到最新的配置值,多個 Data Id 之間用逗號隔開话告。如果沒有明確配置兼搏,默認情況下所有共享配置的 Data Id 都不支持動態(tài)刷新。

配置項的優(yōu)先級

#方式1
file-extension: properties                      # dataid名稱的后綴
namespace: dfa1c276-69f7-47d6-9903-6850b9c248f7 # 指定具體的namespace
group: TEST_GROUP

#方式2
ext-config[0]:
data-id: service-common_1.properties
ext-config[1]:
data-id: service-common_2.properties
group: GLOBALE_GROUP
ext-config[2]:
data-id: service-common_3.properties
group: REFRESH_GROUP
refresh: true  #動態(tài)刷新配置

#方式3
shared-dataids: service-common_1.properties,service-common_2.properties,service-common_3.properties
refreshable-dataids: service-common_3.properties

以上我們了解到了 nacos 有三種配置方式沙郭,其中優(yōu)先級:

方式1 > 方式2(內(nèi)部比較:n越大佛呻,優(yōu)先級越高) > 方式3

以上我們已經(jīng)了解完了Nacos作為配置中心的使用,接下來我們來看看Nacos作為服務(wù)的注冊中心有什么奧秘病线!

三吓著、服務(wù)發(fā)現(xiàn)

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

在微服務(wù)架構(gòu)中,整個系統(tǒng)會按職責(zé)劃分為多個服務(wù)送挑,通過服務(wù)之間且做來實現(xiàn)業(yè)務(wù)目標(biāo)绑莺。這樣在我們的代碼中免不了要進行服務(wù)間的遠程調(diào)用,服務(wù)的消費方要調(diào)用服務(wù)的生產(chǎn)方惕耕,為了完成這一次請求纺裁,消費方需要知道服務(wù)生產(chǎn)方的網(wǎng)絡(luò)位置(IP地址和端口號

image

服務(wù)發(fā)現(xiàn)中心對比

image

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

百說不如一練,咱們話不多說司澎,直接上代碼:

  • 步驟1 - 新建父工程

pom.xml如下:

image
  • 步驟2 - 新建服務(wù)生產(chǎn)者

pom.xml如下:

image

application.yml如下:

image

啟動類如下:

image

ProviderController.java如下:

image

以上便是生成者的代碼欺缘,其中關(guān)鍵點在于:1. 引入 spring-cloud-starter-alibaba-nacos-discovery jar包 2. 在啟動類標(biāo)注 @EnableDiscoveryClient 注解 3. 在 application.yml 中配置nacos服務(wù)中心的地址 4. 在 controller 中暴露服務(wù)

  • 步驟3 - 新建服務(wù)消費者

pom.xml如下:

image

application.yml如下:

image

啟動類如下:

image

ConsumerController.java如下:

image

以上便是消費者的代碼,其中關(guān)鍵點在于:1. 引入 spring-cloud-starter-alibaba-nacos-discovery jar包 2. 在啟動類標(biāo)注 @EnableDiscoveryClient 注解 3. 在 application.yml 中配置nacos服務(wù)中心的地址 4. 在 controller 中使用RestTemplate 調(diào)用服務(wù)挤安。

以上我們可以看到在Nacos中注冊了兩個服務(wù)谚殊,分別是 service-provider 和 service-consumer,我們也可以在Nacos控制臺看到:

image

同樣蛤铜,服務(wù)注冊也支持命名空間的隔離嫩絮,我們只需在application.yml中添加配置:

server:
  port: 8083

spring:
  application:
    name: service-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        # 命名空間
        namespace: dfa1c276-69f7-47d6-9903-6850b9c248f7
        cluster-name: DEFAULT

Feign 的使用

Feign是Netflix開發(fā)的聲明式丛肢、模板化的HTTP客戶端,F(xiàn)eign可以幫助我們更快捷絮记、優(yōu)雅地調(diào)用HTTP API摔踱。

Feign的使用方式也十分簡單,幾個步驟如下:

  • 步驟1

聲明 Feign 客戶端:

@FeignClient(value = "service-provider") //生產(chǎn)者名稱
public interface ConsumerService {

    @GetMapping("/getData")
    String getDate();
}
  • 步驟2

啟動類 添加 @EnableFeignClients 注解

  • 步驟3

在 controller 層進行調(diào)用:

@RestController
public class ConsumerController {

    @Autowired
    private ConsumerService consumerService;

    @GetMapping("/getData")
    public String getData() {
        String date = consumerService.getDate();
        return "consumer consumer ---" + date;
    }
}

結(jié)果

image

簡單的使用,減少了與業(yè)務(wù)無關(guān)的 HTTP 請求相關(guān)代碼的編寫,使業(yè)務(wù)邏輯清晰嫡霞。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市篮愉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌差导,老刑警劉巖试躏,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異设褐,居然都是意外死亡颠蕴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門助析,熙熙樓的掌柜王于貴愁眉苦臉地迎上來犀被,“玉大人,你說我怎么就攤上這事外冀」鸭” “怎么了?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵雪隧,是天一觀的道長西轩。 經(jīng)常有香客問我,道長脑沿,這世上最難降的妖魔是什么藕畔? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮庄拇,結(jié)果婚禮上劫流,老公的妹妹穿的比我還像新娘。我一直安慰自己丛忆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布仍秤。 她就那樣靜靜地躺著熄诡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪诗力。 梳的紋絲不亂的頭發(fā)上凰浮,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天我抠,我揣著相機與錄音,去河邊找鬼袜茧。 笑死菜拓,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的笛厦。 我是一名探鬼主播纳鼎,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼裳凸!你這毒婦竟也來了贱鄙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤姨谷,失蹤者是張志新(化名)和其女友劉穎逗宁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體梦湘,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡瞎颗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了捌议。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片哼拔。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖禁灼,靈堂內(nèi)的尸體忽然破棺而出管挟,到底是詐尸還是另有隱情,我是刑警寧澤弄捕,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布僻孝,位于F島的核電站,受9級特大地震影響守谓,放射性物質(zhì)發(fā)生泄漏穿铆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一斋荞、第九天 我趴在偏房一處隱蔽的房頂上張望荞雏。 院中可真熱鬧,春花似錦平酿、人聲如沸凤优。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽筑辨。三九已至,卻和暖如春幸逆,著一層夾襖步出監(jiān)牢的瞬間棍辕,已是汗流浹背暮现。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留楚昭,地道東北人栖袋。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像抚太,于是被迫代替她去往敵國和親塘幅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355