使用Nacos作為注冊中心和配置中心

關于Nacos

Nacos是阿里巴巴最新開源的項目怔匣,核心定位是“一個更易于幫助構建云原生應用的動態(tài)服務發(fā)現(xiàn)、配置和服務管理平臺”

為什么叫Nacos

前四個字母分別為Naming和Configuration的前兩個字母苔严,最后的s為Service定枷。

Nacos能做什么

Nacos 地圖

Nacos核心提供兩個功能:服務注冊與發(fā)現(xiàn)孤澎,動態(tài)配置管理。

  • 服務注冊與發(fā)現(xiàn)

    ? Nacos提供基于DNS和基于RPC的服務發(fā)現(xiàn)欠窒,即能被用來支持https/http的服務注冊與發(fā)現(xiàn)覆旭,也支持RPC如dubbo的服務注冊與發(fā)現(xiàn)。

    ? 與Dubbo使用的zookeeper相比而言岖妄,兩者差異還是比較大的型将,zookeeper是一種分布式的協(xié)調服務,它天生是作為分布式數(shù)據(jù)一致性場景下的解決方案荐虐,所以zookeeper是CP的七兜,它犧牲了可用性來保證一致性,在極端情況下(master選舉期間)服務會對外停止福扬,對于服務可用性要求比較高的系統(tǒng)是難以接受的腕铸。Nacos是一種去中心化的架構,屬于CAP理論里的AP架構铛碑,支持最終一致性狠裹,在分布式服務發(fā)現(xiàn)與注冊場景下具有很不錯的性能。目前dubbo官方也支持使用Nacos代替zookeeper汽烦。

  • 動態(tài)配置服務

    與SpringCloud config 和 SpringCloud Bus類似涛菠,Nacos的動態(tài)配置服務更加靈活與簡便,不需要重啟服務可以做到配置實時生效,非常適合“配置優(yōu)先”的服務開發(fā)俗冻。

Nacos就是注冊中心+配置中心的組合

Nacos 生態(tài)

Nacos 無縫支持一些主流的開源生態(tài)礁叔,如下圖:

nacos 生態(tài)圖

使用 Nacos 簡化服務發(fā)現(xiàn)、配置管理言疗、服務治理及管理的解決方案晴圾,讓微服務的發(fā)現(xiàn)、管理噪奄、共享死姚、組合更加容易,它能很方便的和SpringCloud勤篮、K8S都毒、Dubbo、gRPC碰缔、lstio一起使用账劲。

安裝Nacos

官方地址

安裝方法

Nacos 支持三種部署模式:單機模式、集群模式和多集群模式金抡,Nacos默認將數(shù)據(jù)存儲在自帶的嵌入式數(shù)據(jù)庫derby里面瀑焦,支持mysql數(shù)據(jù)庫,如果部署集群的話必須要使用mysql來保存數(shù)據(jù)梗肝,以保證統(tǒng)一的數(shù)據(jù)源榛瓮。因為主要為了測試Nacos的注冊中心和配置中心的功能,我這邊部署單機模式并使用derby數(shù)據(jù)庫巫击。

前提環(huán)境

Nacos 依賴 Java 環(huán)境來運行禀晓。如果您是從代碼開始構建并運行Nacos,還需要為此配置 Maven環(huán)境坝锰,請確保是在以下版本環(huán)境中安裝使用:

  1. 64 bit OS粹懒,支持 Linux/Unix/Mac/Windows,推薦選用 Linux/Unix/Mac顷级。
  2. 64 bit JDK 1.8+凫乖;下載 & 配置
  3. Maven 3.2.x+弓颈;下載 & 配置帽芽。

方式一 源碼安裝

git clone https://github.com/alibaba/nacos.git
cd nacos/
mvn -Prelease-nacos -Dmaven.test.skip=true clean install -U  
ls -al distribution/target/
// change the $version to your actual path
cd distribution/target/nacos-server-$version/nacos/bin

方式二 發(fā)行包安裝

官方倉庫提供了發(fā)行包下載,可以從 版本庫中下載nacos-server-$version.zip /nacos-server-$version.tar.gz 包恨豁,解壓后嚣镜,在包目錄下的bin文件夾中有可執(zhí)行腳本運行即可。

方式三 Docker安裝

除了以上兩種方式安裝docker以外橘蜜,還可以使用docker的方式安裝

docker run -tid  --env MODE=standalone --name nacos -p 8848:8848 nacos/nacos-server

MODE是指定運行模式菊匿,有cluster模式/standalone模式

安裝完成之后付呕,訪問http://localhost:8848/nacos/index.html即可打開nacos的web管理界面

Nacos管理界面

Nacos作為注冊中心

根項目配置

使用SpringCloud alibaba 需要在 dependencyManagement 中添加相應配置,因為我這里是多模塊開發(fā)跌捆,所以將 dependencyManagement添加到根pom文件中徽职。

    <dependencyManagement>
        <dependencies>
            <!--spring boot 2.2.2-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--spring cloud Hoxton.SR1-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--     SpringCloud Alibaba       -->
            <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>

服務生產者

依賴

                    ...
<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-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
                    ...

配置文件

我們將項目端口配置為9001,并配置nacos注冊中心地址佩厚,以及暴露端點姆钉。

server:
  port: 9001

spring:
  application:
    name: nacos-provide-userinfo
  cloud:
    # nacos 配置
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848 # 配置nacos地址
#暴露端點
management:
  endpoints:
    web:
      exposure:
        include: '*'

測試接口

@RestController
public class EchoController {

    @Value("${server.port}")
    String serverPort;


    @GetMapping("/echo")
    public String echo(){
        return "Hello serverPort : "+serverPort+" uuid :"+ UUID.randomUUID().toString();
    }

}

啟動類

@SpringBootApplication
@EnableDiscoveryClient
public class NacosProvideUserInfo9001 {
    public static void main(String[] args) {
        SpringApplication.run(NacosProvideUserInfo9001.class,args);
    }
}

啟動后,再次打開nacos管理界面中 服務管理 下的 服務列表

服務注冊成功

我們已經可以看到服務已經注冊成功了抄瓦。我們以上面這個服務為模板潮瓶,再建立一個端口為9002的服務

多服務實例

服務消費者

依賴

<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-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置文件

server:
  port: 9091

spring:
  application:
    name: nacos-consume-useradmin
  cloud:
    # nacos 配置
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

RestTemplate注入

Nacos集成了Ribbon,RestTemplate需要添加@LoadBalanced開啟負載均衡功能钙姊。

@Configuration
public class ApplicationContextConfig {

    @Bean
    @LoadBalanced  // 沒有加這個的話沒有辦法使用服務名來調用接口
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

}

測試接口

@RestController
@RequestMapping("/consume")
public class UserAdminController {
    @Resource
    RestTemplate restTemplate;

    String URL_PREFIX = "http://nacos-provide-userinfo";

    @GetMapping("/echo")
    public String getUser(){
        return restTemplate.getForObject(URL_PREFIX+"/echo", String.class);
    }

}

啟動類

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumeUserAdmin9091 {
    public static void main(String[] args) {
        SpringApplication.run(NacosConsumeUserAdmin9091.class,args);
    }
}

啟動后查看管理界面毯辅,可以看到消費者服務也已經注冊進入的注冊中心了。

消費者服務注冊

請求消費者/consume/echo的時候煞额,消費者會去調用生產者的服務思恐,因為nacos集成了ribbon,所以自帶負載均衡功能膊毁,會根據(jù)一定算法來選擇注冊中心上的服務實例胀莹。

作為配置中心

依賴

<!-- nacos config-->
<dependency>
  <groupId>com.alibaba.cloud</groupId>
  <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--   nacos server     -->
<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-web</artifactId>
</dependency>
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置文件

注意,這里是創(chuàng)建bootstrap.yml,這個配置?件的作?是,先到配置中?加載配置,然后加載到application.yml中婚温。

application.yml是用戶級的資源配置項描焰。

bootstrap.yml是系統(tǒng)級的,優(yōu)先級比application.yml更高缭召。

  • Bootstrap.yml

    server:
      port: 99
    
    spring:
      application:
        name: nacos-config-client # 這個名稱涉及到遠程配置文件的名稱
      cloud:
        # nacos 配置
        nacos:
          discovery:
            server-addr: 127.0.0.1:8848 #注冊中心地址
          config:
            server-addr: 127.0.0.1:8848 # nacos 作為配置中心地址
            file-extension: yaml # 指定配置文件的格式
    
  • Application.yml

    spring:
      profiles:
        active: dev # 表示開發(fā)環(huán)境
    

測試接口

@RestController
@RefreshScope
public class ConfigClientController {

    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/getConfigInfo")
    public String getConfigInfo(){
        return configInfo;
    }
}

啟動類

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClient99 {
    public static void main(String[] args) {
        SpringApplication.run(NacosConfigClient99.class,args);
    }
}

管理平臺配置

新建配置文件

打開Nacos管理界面栈顷,選擇 配置管理-->配置列表逆日,點擊列表右上角的 ?的圖標

添加配置-步驟1

nacos規(guī)定了Data ID的設定規(guī)則嵌巷,讓服務能更加方便的去尋找自己的配置,默認的Data ID的規(guī)則是:

${prefix}-${spring.profile.active}.${file-extension}
  • prefix
    默認就是當前服務的服務名稱(spring.application.name)
    也可以通過spring.cloud.necos.config.prefix配置
  • spring.profile.active
    就是我們在application.yml中指定的,當前是開發(fā)環(huán)境還是測試等環(huán)境
    這個可以不配置,如果不配置,那么前?的 - 也會沒有
  • file-extension
    就是當前?件的格式(后綴),?前只?持yml和propertie

上面我們配置的應用名稱是nacos-config-client,環(huán)境配置的是dev,文件格式是 yaml,所以Data ID是nacos-config-client-dev.yaml室抽,注意是yaml搪哪,而不是yml

添加配置-2

添加完成之后我們可以看到配置文件已經創(chuàng)建成功了坪圾。

添加配置-3

配置完成后晓折,我們啟動服務,服務如果啟動成功說明配置正確了兽泄,測試下:

?  ~ curl http://localhost:99/getConfigInfo
Here is dev,version=1.0%                                                                                                                                                 ?  ~ 

修改配置

我們測試下更新配置文件是否會馬上生效漓概,所以我們修改配置文件

修改配置

配置文件可以查看 歷史版本 ,每次修改也會給出對比圖病梢。

確認

不要重啟nacos-config-client 服務胃珍,再次測試接口

?  ~ curl http://localhost:99/getConfigInfo
Here is dev,version=2.0%                                                                                                                                                 ?  ~                                                                                        

我們發(fā)現(xiàn)更新配置無需手動動態(tài)刷新配置梁肿,相比較起springcloud config 和 bus的配合動態(tài)刷新來說,nacos更加的靈活觅彰、方便吩蔑。

數(shù)據(jù)隔離

Nacos作為配置中心的時候,我們看到了可以感覺服務的環(huán)境來選擇不同的配置文件填抬,在Nacos的設計中烛芬,我們也可以通過Namespace、Group來做數(shù)據(jù)的隔離飒责,這里不做贅述赘娄,總之,在微服務這些框架里面宏蛉,Nacos絕對是非常好用的擅憔。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市檐晕,隨后出現(xiàn)的幾起案子暑诸,更是在濱河造成了極大的恐慌,老刑警劉巖辟灰,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件个榕,死亡現(xiàn)場離奇詭異,居然都是意外死亡芥喇,警方通過查閱死者的電腦和手機西采,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來继控,“玉大人械馆,你說我怎么就攤上這事∥渫ǎ” “怎么了霹崎?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長冶忱。 經常有香客問我尾菇,道長,這世上最難降的妖魔是什么囚枪? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任派诬,我火速辦了婚禮,結果婚禮上链沼,老公的妹妹穿的比我還像新娘默赂。我一直安慰自己,他們只是感情好括勺,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布缆八。 她就那樣靜靜地躺著谒臼,像睡著了一般。 火紅的嫁衣襯著肌膚如雪耀里。 梳的紋絲不亂的頭發(fā)上蜈缤,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天,我揣著相機與錄音冯挎,去河邊找鬼底哥。 笑死,一個胖子當著我的面吹牛房官,可吹牛的內容都是我干的趾徽。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼翰守,長吁一口氣:“原來是場噩夢啊……” “哼孵奶!你這毒婦竟也來了?” 一聲冷哼從身側響起蜡峰,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤了袁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后湿颅,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體载绿,經...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年油航,在試婚紗的時候發(fā)現(xiàn)自己被綠了崭庸。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡谊囚,死狀恐怖怕享,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情镰踏,我是刑警寧澤函筋,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站余境,受9級特大地震影響驻呐,放射性物質發(fā)生泄漏灌诅。R本人自食惡果不足惜芳来,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望猜拾。 院中可真熱鬧即舌,春花似錦、人聲如沸挎袜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至紊搪,卻和暖如春蜜葱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背耀石。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工牵囤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人滞伟。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓揭鳞,卻偏偏與公主長得像,于是被迫代替她去往敵國和親梆奈。 傳聞我的和親對象是個殘疾皇子野崇,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354