Spring Cloud Alibaba系列(一):手把手教你使用Nacos(實踐篇)

由于Eureka的停更豆胸,導致新的替代產(chǎn)品Spring Cloud Alibaba逐漸受到重視湿蛔,從本文開始怎燥,筆者將和大家一起學習Spring Cloud Alibaba全家桶荠锭。

本文示例項目地址:https://gitee.com/zhaowenyi/spring-cloud-alibaba-demo

1. 認識Nacos

Nacos官網(wǎng) : https://nacos.io/zh-cn/docs/what-is-nacos.html
Nacos Wiki: http://github.com/alibaba/nacos/wiki
Nacos是Spring Cloud Alibaba中命名與配置中心呼股,其中的Na就是Naming服務命名注冊的縮寫耕魄,Co就是Cofiguration配置的縮寫。因此Nacos的功能相當于Eureka和Spring Cloud Config的組合彭谁。Eureka的停更吸奴,導致眾多開發(fā)者不得不選擇新的墻頭,正好阿里的Nacos經(jīng)歷了多年的歷練,成功地經(jīng)受住了大流量则奥,高并發(fā)的考驗考润,成為了新的翹楚。

本文將從安裝到配置詳細的介紹Nacos的基本使用读处。

2. 下載Nacos

操作系統(tǒng): Mac
Maven: 3.6.3
Nacos Server :2.0.2
Spring Boot: 2.3.7.RELEASE
Spring Cloud Alibaba: 2.2.2.RELEASE

Nacos相當于一個軟件糊治,需要下載安裝nacos-server。Nacos Server下載地址

https://github.com/alibaba/nacos/releases

本文使用2.0.2版本


image.png

筆者使用的是mac電腦罚舱,所以下載的是 [nacos-server-2.0.2.tar.gz]

image.png

解壓壓縮包

image.png

3. 啟動Nacos

打開終端井辜,進入到解壓后的bin目錄中

image.png

Nacos啟動模式有單機模式和集群模式,在測試環(huán)境下我們以單機模式啟動管闷。執(zhí)行以下命令粥脚,以單機模式啟動

sh  startup.sh -m standalone 

如果出現(xiàn)以下內(nèi)容,說明啟動成功


image.png

4. 登錄Nacos

啟動成功后包个,在瀏覽器中輸入http://127.0.0.1:8848/nacos/#/login刷允,然后可以訪問到如頁面表示啟動成功。

賬號:nacos
密碼:nacos
image.png

登錄成功后碧囊,進入到以下頁面

image.png

5. 停止Nacos

進入安裝包的bin目錄树灶,執(zhí)行以下命令,停止Nacos

sh shutdown.sh

出現(xiàn)以下內(nèi)容呕臂,說明停止成功


image.png

6. 以Nacos作為注冊中心

服務的注冊與發(fā)現(xiàn)都是在nacos server端破托,每個微服務注冊到nacos server端即可肪跋,因此我們不需要像Eureka一樣新增一個Eureka Server項目歧蒋。在此例中,我們將創(chuàng)建兩個項目州既,一個是服務提供者provider-8081谜洽,一個服務消費者consumer-8091。

6.1 IDEA安裝插件Alibaba Cloud Toolkit

preferences -> plugins -> 搜索Alibaba Cloud 吴叶,選擇Alibaba Cloud Toolkit進行安裝

image.png
  1. 安裝后阐虚,重啟IDEA。在新建工程的面板左側找到 Alibaba Java Initializer蚌卤,選擇工程 SDK 1.8实束,點擊下一步;


    image.png

2.選擇工程元數(shù)據(jù)逊彭,輸入maven坐標咸灿,點擊下一步;

image.png
  1. 左側邊欄是可以引入的工具,左側欄選擇Spring Cloud Alibaba侮叮,勾選Nacos Service Discovery和Nacos Configuration后避矢,點擊下一步;
image.png
  1. 選擇項目的存儲路徑后,點擊finish完成。
6.2 新建provider-8081項目
  1. 按照上面的步驟創(chuàng)建provider-8081項目审胸,項目結構如下
  1. 完整的pom.xml內(nèi)容如下亥宿,其中主要是spring-cloud-starter-alibaba-nacos-discovery這個依賴
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.elio.springcloud.alibaba.demo</groupId>
    <artifactId>provider-8081</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>provider-8081</name>
    <description>Demo project for Spring Cloud Alibaba</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.2.0.RELEASE</spring-boot.version>
        <spring-cloud-alibaba.version>2.2.4.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.elio.springcloud.alibaba.demo.Provider8081Application</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>


  1. NacosDiscoveryConfiguration 主要是啟用Nacos Client,作為客戶端注冊到服務中心
package com.elio.springcloud.alibaba.demo.nacosdiscovery;

import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Configuration;

/**
 * @author <a href="mailto:chenxilzx1@gmail.com">theonefx</a>
 */
@EnableDiscoveryClient
@Configuration
public class NacosDiscoveryConfiguration {
}

  1. application.properties內(nèi)容如下砂沛,主要是配置Nacos Server的地址
# 應用名稱
spring.application.name=provider-8081

# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html
# Nacos認證信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服務發(fā)現(xiàn)與注冊配置烫扼,其中子屬性 server-addr 指定 Nacos 服務器主機和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注冊到 nacos 的指定 namespace,默認為 public
spring.cloud.nacos.discovery.namespace=public

server.port=8081

  1. 啟動項目碍庵,如果啟動日志出現(xiàn)以下記錄材蛛,說明注冊成功
 nacos registry, DEFAULT_GROUP provider-8081 172.18.41.106:8081 register finished
image.png
  1. 查看Nacos管理界面,發(fā)現(xiàn)已經(jīng)成功注冊了provider-8081
image.png
6.3 新建provider-8081項目
  1. 同provider-8081項目怎抛,新增consumer-8091項目卑吭,項目結構如下
image.png
  1. pom.xml完整內(nèi)容如下
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.elio.springcloud.demo</groupId>
    <artifactId>consumer-8091</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>consumer-8091</name>
    <description>Demo project for Spring Cloud Alibaba</description>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.3.7.RELEASE</spring-boot.version>
        <spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.7.RELEASE</version>
                <configuration>
                    <mainClass>com.elio.springcloud.demo.Consumer8091Application</mainClass>
                </configuration>
                <executions>
                    <execution>
                        <id>repackage</id>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

</project>

  1. application.properties內(nèi)容如下
# 應用名稱
spring.application.name=consumer-8091

# 應用服務 WEB 訪問端口
server.port=8091

# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html
# Nacos認證信息
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos
# Nacos 服務發(fā)現(xiàn)與注冊配置,其中子屬性 server-addr 指定 Nacos 服務器主機和端口
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 注冊到 nacos 的指定 namespace马绝,默認為 public
spring.cloud.nacos.discovery.namespace=public


  1. 啟動項目豆赏,注冊成功
image.png
image.png
6.4 總結

至此,我們已經(jīng)成功將兩個項目成功注冊到Nacos上富稻。通過注冊中心掷邦,服務可以拉取到別的服務的相關信息。

7 以Nacos作為配置中心

7.1 相關概念
  • profile概念
    Java項目中的配置文件一般分為多個環(huán)境配置椭赋,生產(chǎn)環(huán)境(prod)抚岗,測試環(huán)境(test),開發(fā)環(huán)境(dev)哪怔,然后通過spring.profiles.active可以指定使用哪個環(huán)境的配置宣蔚。比如sspring.profiles.active=dev將會讀取application-dev.properties的配置內(nèi)容。

當項目配置文件眾多认境,修改了配置文件內(nèi)容還需要重啟服務胚委,導致配置文件難以管理。Nacos Config的作用就是將這些配置文件集中管理起來叉信,從而可以統(tǒng)一管理并且可以修改實時刷新亩冬。

  • NameSpace概念

NameSpace 默認是public,可以區(qū)分不同的環(huán)境硼身,比如dev,test,prod等硅急。

  • Group概念

如果配置文件名相同,可以用Group區(qū)分佳遂,因此可以區(qū)分不同項目中营袜,配置文件名相同的配置。Group 默認為 DEFAULT_GROUP讶迁,可以通過 spring.cloud.nacos.config.group 來配置连茧,當配置項太多或者有重名時核蘸,可以通過分組來方便管理。

  • Data Id概念

在使用Nacos Config的過程中啸驯,數(shù)據(jù)存儲在Data Id下面客扎,一個Data Id對應一個profile文件。

Data ID的拼接格式:{prefix} -{spring.profiles.active} . ${file-extension}

prefix 默認為 spring.application.name 的值罚斗,也可以通過配置項 spring.cloud.nacos.config.prefix 來配置

spring.profiles.active 取 spring.profiles.active 的值徙鱼,即為當前環(huán)境對應的 profile

file-extension 為配置內(nèi)容的數(shù)據(jù)格式,可以通過配置項 spring.cloud.nacos.config.file-extension 來配置

7.2 引入Nacos Config依賴

接下來的例子都以provider-8081為例针姿,來介紹如何使用Nacos Config

  1. pom.xml引入以下依賴
      <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
  1. application.properties新增以下配置
# Nacos幫助文檔: https://nacos.io/zh-cn/docs/concepts.html
# Nacos認證信息
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.cloud.nacos.config.contextPath=/nacos
# 設置配置中心服務端地址
spring.cloud.nacos.config.server-addr=localhost:8848
# Nacos 配置中心的namespace袱吆。需要注意,如果使用 public 的 namcespace 距淫,請不要填寫這個值绞绒,直接留空即可
# spring.cloud.nacos.config.namespace=
spring.cloud.nacos.config.prefix= ${spring.application.name}
# 默認是DEFAULT_GROUP
# spring.cloud.nacos.config.group=

  1. 新增測試接口com/elio/springcloud/alibaba/demo/controller/TestController.java
package com.elio.springcloud.alibaba.demo.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @ClassName : TestController
 * @Description : 測試
 * @Author : zhaowenyi
 * @Date: 2021/06/23
 */
@RestController
public class TestController {

    @Value("${nacos.config.test:hello world}")
    private String testValue;

    @GetMapping(value = "/hello")
    public String hello() {
        return testValue;
    }
}

image.png
  1. Nacos 管理界面,新增配置
image.png
image.png
image.png
  1. 測試接口, 成功獲取到dev的配置
image.png

如果修改配置榕暇,可以實時刷新

image.png
image.png
  1. 回滾配置
image.png
image.png

參考:
https://blog.csdn.net/qq_42200163/article/details/109711035

https://www.cnblogs.com/crazymakercircle/p/14231815.html

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蓬衡,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子彤枢,更是在濱河造成了極大的恐慌狰晚,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缴啡,死亡現(xiàn)場離奇詭異壁晒,居然都是意外死亡,警方通過查閱死者的電腦和手機业栅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門秒咐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人式镐,你說我怎么就攤上這事反镇。” “怎么了娘汞?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長夕玩。 經(jīng)常有香客問我你弦,道長,這世上最難降的妖魔是什么燎孟? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任禽作,我火速辦了婚禮,結果婚禮上揩页,老公的妹妹穿的比我還像新娘旷偿。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布萍程。 她就那樣靜靜地躺著幢妄,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茫负。 梳的紋絲不亂的頭發(fā)上蕉鸳,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天,我揣著相機與錄音忍法,去河邊找鬼潮尝。 笑死,一個胖子當著我的面吹牛饿序,可吹牛的內(nèi)容都是我干的勉失。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼原探,長吁一口氣:“原來是場噩夢啊……” “哼戴质!你這毒婦竟也來了?” 一聲冷哼從身側響起踢匣,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤告匠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后离唬,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體后专,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年输莺,在試婚紗的時候發(fā)現(xiàn)自己被綠了戚哎。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡嫂用,死狀恐怖型凳,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情嘱函,我是刑警寧澤甘畅,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站往弓,受9級特大地震影響疏唾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜函似,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一槐脏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧撇寞,春花似錦顿天、人聲如沸堂氯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽咽白。三九已至,卻和暖如春畔规,著一層夾襖步出監(jiān)牢的瞬間局扶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工叁扫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留三妈,地道東北人。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓莫绣,卻偏偏與公主長得像畴蒲,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子对室,可洞房花燭夜當晚...
    茶點故事閱讀 44,979評論 2 355

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