微服務(wù)開發(fā)系列 第二篇:Nacos

總概

A、技術(shù)棧
  • 開發(fā)語言:Java 1.8
  • 數(shù)據(jù)庫:MySQL、Redis、MongoDB、Elasticsearch
  • 微服務(wù)框架:Spring Cloud Alibaba
  • 微服務(wù)網(wǎng)關(guān):Spring Cloud Gateway
  • 服務(wù)注冊和配置中心:Nacos
  • 分布式事務(wù):Seata
  • 鏈路追蹤框架:Sleuth
  • 服務(wù)降級與熔斷:Sentinel
  • ORM框架:MyBatis-Plus
  • 分布式任務(wù)調(diào)度平臺:XXL-JOB
  • 消息中間件:RocketMQ
  • 分布式鎖:Redisson
  • 權(quán)限:OAuth2
  • DevOps:Jenkins、Docker、K8S
B、源碼地址

alanchenyan/ac-mall2-cloud

C、本節(jié)實(shí)現(xiàn)目標(biāo)
  • 項(xiàng)目[mall2]各server注冊到Nacos服務(wù),并通過Nacos服務(wù)名訪問接口。
  • 使用Nacos命名空間,創(chuàng)建dev_id/dev_name命名空間用于注冊開發(fā)環(huán)境服務(wù)。
  • 使用Naocs共享配置,將各個(gè)服務(wù)都需要用的配置抽取成common.yml。
  • IDEA配置Active profiles
D、系列
E、版本說明
  • Nacos:2.0.0
  • spring-cloud.version:Hoxton.SR9
  • spring-boot.version:2.3.6.RELEASE
  • alibaba.cloud.version:2.2.3.RELEASE
F、Nacos地址

Nacos官網(wǎng)文檔
Nacos官方GitHub地址
Nacos官方下載地址

G、Nacos部署環(huán)境

Nacos定義為一個(gè)IDC內(nèi)部應(yīng)用組件,并非面向公網(wǎng)環(huán)境的產(chǎn)品,建議在內(nèi)部隔離網(wǎng)絡(luò)環(huán)境中部署,強(qiáng)烈不建議部署在公共網(wǎng)絡(luò)環(huán)境。

H、Nacos支持三種部署模式
  • 單機(jī)模式 - 用于測試和單機(jī)試用。
  • 集群模式 - 用于生產(chǎn)環(huán)境,確保高可用。
  • 多集群模式 - 用于多數(shù)據(jù)中心場景

一、Nacos安裝

可參考:

運(yùn)行成功后訪問:http://localhost:8848/nacos 。默認(rèn)賬號:nacos,密碼:nacos

登錄頁
主頁

二、服務(wù)mall-member接入Nacos

2.1 加nacos依賴

服務(wù)mall-pom服務(wù)加入naocs依賴,mall-pom.xml:

 <!-- 管理子類所有的jar包的版本,這樣的目的是方便去統(tǒng)一升級和維護(hù) -->
<dependencyManagement>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>${alibaba.cloud.version}</version>
   </dependency>

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        <version>${alibaba.cloud.version}</version>
    </dependency>

<!--  其他省略-->
</dependencyManagement>


 <!-- 所有的子工程都會自動加入下面的依賴  -->
<dependencies>
    <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-alibaba-nacos-config</artifactId>
   </dependency>

<!--  其他省略-->
</dependencies>
2.2 yml配置

在mall-member服務(wù)的application-dev.yml配置中加入配置

spring:
  application:
    name: mall-member
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
2.3 重啟mall-member服務(wù)查看nacos服務(wù)列表
mall-member服務(wù)

其他server接入nacos同理。

三、Nacos命名空間

3.1 Nacos如何支持多環(huán)境

在日常使用中常常需要不同的環(huán)境,比如日常,預(yù)發(fā),線上環(huán)境,如果是邏輯隔離可以使用命名空間,Nacos支持命名空間來支持多環(huán)境隔離,可以在Nacos控制臺創(chuàng)建多個(gè)命名空間。如果需要物理隔離,就要部署多套Nacos環(huán)境。

3.2 配置Nacos命名空間

默認(rèn)在Nacos中存在一個(gè)public命名空間,所有配置在沒有指定命名空間時(shí)都在這個(gè)命名空間中獲取配置,在實(shí)際開發(fā)時(shí)可以針對于不能環(huán)境創(chuàng)建不同的namespace空間。

注意:默認(rèn)空間不能刪除。

3.2.1 新增命名空間
新增命名空間g
創(chuàng)建命名空間

【命名空間ID】如果在新增時(shí)沒有填寫的話,則Nacos服務(wù)端會自動隨機(jī)產(chǎn)生一個(gè)命名空間ID。 每個(gè)命名空間都有一個(gè)唯一ID,這個(gè)ID是讀取配置時(shí)指定空間的唯一標(biāo)識。點(diǎn)擊【確定】以后,在命名空間列表處會新增一行記錄。

建議:正式項(xiàng)目中,建議將【命名空間ID】和【命名空間名】設(shè)置成相同,即都設(shè)置成dev。此處只是為了比較清晰的說明在yml配置文件中ID和名字的區(qū)別,才設(shè)置了不同的名字。

記錄
3.2.2 yml配置

在mall-member服務(wù)的application-dev.yml配置中加入配置

spring:
  application:
    name: mall-member
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
      discovery:
        namespace: dev_id
補(bǔ)充說明NO.1

有些文章會配置nacos用戶名和密碼,即如下所示:

spring:
  application:
    name: mall-member
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        username: nacos
        password: abc123
      discovery:
        namespace: dev_id

其實(shí)這個(gè)用戶名和密碼是個(gè)Naocs的Dashboard登錄用的,服務(wù)注冊這里不需要配置,當(dāng)然配置了也不會報(bào)錯(cuò)。

3.2.3 重啟mall-member服務(wù)查看nacos服務(wù)列表

在dev_name命名空間下,顯示了mall-member服務(wù)。

dev_name命名空間服務(wù)列表

四、修改Nacos登錄密碼和登錄名稱

一般安裝Nacos后登錄密碼默認(rèn)都是nacos/nacos,但是在正式的生成環(huán)境這樣肯定是不安全的。

4.1 Nacos單機(jī)默認(rèn)內(nèi)嵌的數(shù)據(jù)庫

Nacos單機(jī)模式默認(rèn)使用內(nèi)嵌的數(shù)據(jù)庫作為存儲引擎,所以我們無法直接去修改數(shù)據(jù),因此我們可以通過Nacos的Dashboard來修改密碼。

修改密碼
修改密碼
4.2 MySQL修改密碼
4.2.1 查看Nacos源碼加密方式

Nacos底層源碼是BCryptPasswordEncoder加密器加密,我們這里使用該加密器就可以。

package com.alibaba.nacos.console.utils;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

public class PasswordEncoderUtil {
    public static void main(String[] args) {
        System.out.println(new BCryptPasswordEncoder().encode("nacos"));
    }

    public static Boolean matches(String raw, String encoded) {
        return new BCryptPasswordEncoder().matches(raw, encoded);
    }

    public static String encode(String raw) {
        return new BCryptPasswordEncoder().encode(raw);
    }
}

使用 BCryptPasswordEncoder加密器加密
導(dǎo)入Security的依賴

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

加密得到密文

public class UserServerApplication {
    public static void main(String[] args) {
        System.out.println(new BCryptPasswordEncoder().encode("nacosDev"));
    }
}
密文
4.2.2 構(gòu)造用戶,修改密碼

復(fù)制到nacos的user表中password字段中,我這里構(gòu)造了用戶名:nacosDev,密碼也是使用的nacosDev加密的密文。

修改密碼

使用設(shè)置的用戶密碼登錄


登錄

五、Nacos共享配置

日常開發(fā)中,多個(gè)模塊可能會有很多共用的配置,比如數(shù)據(jù)庫連接信息,Redis 連接信息,RabbitMQ 連接信息,監(jiān)控配置等等。那么此時(shí),我們就希望可以加載多個(gè)配置,多個(gè)項(xiàng)目共享同一個(gè)配置之類等功能,Nacos Config 也確實(shí)支持。

5.1 新建common.yml

登錄Naocs平臺,在命名空間dev_name下新建common.yml配置文件,將公共的配置抽取出來放到該配置中,如下:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.100.51:3306/ac_db?serverTimezone=Asia/Shanghai&useUnicode=true&tinyInt1isBit=false&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
    username: ac_u
    password: ac_PWD_123

    #hikari數(shù)據(jù)庫連接池
    hikari:
      pool-name: YH_HikariCP
      minimum-idle: 10 #最小空閑連接數(shù)量
      idle-timeout: 600000 #空閑連接存活最大時(shí)間,默認(rèn)600000(10分鐘)
      maximum-pool-size: 100 #連接池最大連接數(shù),默認(rèn)是10
      auto-commit: true  #此屬性控制從池返回的連接的默認(rèn)自動提交行為,默認(rèn)值:true
      max-lifetime: 1800000 #此屬性控制池中連接的最長生命周期,值0表示無限生命周期,默認(rèn)1800000即30分鐘
      connection-timeout: 30000 #數(shù)據(jù)庫連接超時(shí)時(shí)間,默認(rèn)30秒,即30000
      connection-test-query: SELECT 1

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
common.yml配置文件
5.2 配置文件將application改成bootstrap

application.yml作用域在于當(dāng)前應(yīng)用有效,bootstrap.yml系統(tǒng)級別的配置有效(一般采用遠(yuǎn)程配置的時(shí)候才會用到)。

因此,將項(xiàng)目中原來的application.yml、application-dev.yml對應(yīng)改成bootstrap.yml、bootstrap-dev.yml 。

5.3 修改mall-member服務(wù)配置

bootstrap-dev.yml

server:
  port: 8080

spring:
  application:
    name: mall-member

  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: dev_id
        file-extension: yml
        shared-configs:
          - data-id: common.yml
            group: DEFAULT_GROUP
            refresh: true
      discovery:
        namespace: dev_id

swagger:
  enabled: true
  title: 用戶服務(wù)
  basePackage: com.ac.member.controller
  version: 1.0
  description: 用戶服務(wù)相關(guān)接口

bootstrap.yml

spring:
  profiles:
    active: dev

mall-product等其他服務(wù)配置同理。

mall-member
5.4 重啟服務(wù)查看Nacos服務(wù)列表
image.png
六、IDEA配置Active profiles

各個(gè)環(huán)境的配置文件(比如切換開發(fā)和測試),我們之前都是通過bootstrap.yml配置來切換的,如下:

spring:
  profiles:
    active: dev

一般在項(xiàng)目開發(fā)中,團(tuán)隊(duì)里的每個(gè)成員一般都會自己建立一套獨(dú)立的命名空間,以免影響他人,如果每個(gè)人都來修改bootstrap.yml里的配置項(xiàng),代碼容易產(chǎn)生沖突,因此spring.profiles.active我們可以從bootstrap.yml中移除掉,在IDEA里進(jìn)行配置。

配置
配置Active profiles

重啟服務(wù),配置文件走的是dev環(huán)境。

六、Nacos配置MySQL數(shù)據(jù)庫

參考官網(wǎng):Nacos部署手冊

6.1 前言

在 0.7 版本之前,在單機(jī)模式時(shí) nacos 使用嵌入式數(shù)據(jù)庫實(shí)現(xiàn)數(shù)據(jù)的存儲,不方便觀察數(shù)據(jù)存儲的基本情況。0.7 版本后增加了支持 mysql 數(shù)據(jù)源能力。

6.2 Nacos配置MySQL

nacos 支持配置多個(gè)數(shù)據(jù)庫,通過 db.num 和 db.url.index的配置來控制。nacos 配置 mysql 數(shù)據(jù)庫只需如下三點(diǎn)即可完成:

  • 安裝數(shù)據(jù)庫,版本要求:5.6.5+
  • 初始化mysql數(shù)據(jù)庫,數(shù)據(jù)庫初始化文件:nacos-mysql.sql
  • 修改conf/application.properties文件,增加支持mysql數(shù)據(jù)源配置(目前只支持mysql),添加mysql數(shù)據(jù)源的url、用戶名和密碼。
#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://192.168.100.51:3306/ac_db?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=ac_u
db.password.0=ac_PWD_123
導(dǎo)入sql
導(dǎo)入sql成功
修改配置文件
6.3 驗(yàn)證

動Nacos 后,打開Nacos 管理界面,在命名空間模塊,創(chuàng)建一個(gè)開發(fā)環(huán)境配置的命名空間dev_name ,如下圖所示:

新建命名空間

此時(shí)再查看我們的數(shù)據(jù)庫表tenant_info中已有創(chuàng)建的dev_name記錄了,如下圖所示:

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

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

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