SpringCloudAlibaba註冊中心與配置中心之利器Nacos實戰與原始碼分析(上)

itxiaoshen發表於2022-04-10

概述

背景

Nacos GitHub原始碼地址 https://github.com/alibaba/nacos ,目前原始碼基於高效能RPC的2.1.0,和基於HTTP RESTFUL的1.4.3版本的兩條分支,因此2.X系列Nacos效能比1.X版本至少提升2倍以上,我們這邊下載研究的是2.1.0版本的原始碼。

Nacos 官網地址 https://nacos.io/zh-cn/docs

Spring-Cloud-Alibaba GitHub原始碼地址 https://github.com/alibaba/spring-cloud-alibaba

前面的《主流微服務一站式解決方案Spring Cloud Alibaba入門看這篇就足夠了-開篇》我們已經簡單介紹Spring Cloud Alibaba一站式解決方案的入門,對Spring Cloud Alibaba有了基本認識,開發人員可以通過 Spring Cloud 程式設計模型輕鬆使用其生態元件來來開發分散式應用服務,而這過程只需新增一些註解和少量配置就可以將 Spring Cloud 應用接入阿里的分散式應用解決方案,最終通過阿里中介軟體來迅速搭建分散式應用系統。此外阿里雲同時還提供了 Spring Cloud Alibaba 企業版 微服務解決方案(包括無侵入服務治理全鏈路灰度,無損上下線,離群例項摘除等,企業級 Nacos 註冊配置中心和企業級雲原生閘道器等眾多產品),分散式功能更加強大完善,有興趣的夥伴可以自行前往瞭解。

Nacos官網提供Nacos2.0.0-ALPHA2 服務發現效能測試報告,其他的如1.0和2.0配置模組壓測報告,1.0服務發現模組的壓測報告等都可以去詳細查閱官網

image-20220406141213397

image-20220406141459886

定義

Nacos 是構建以“服務”為中心的現代應用架構 (例如微服務正規化、雲原生正規化) 的服務基礎設施,致力於發現、配置和管理微服務,可以快速實現動態服務發現、服務配置、服務後設資料及流量管理。簡單來說就是集註冊中心和配置中心於一體,幾乎支援所有市面同型別產品的所有功能,Nacos 支援主流的服務生態包括Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful,可以說是目前國內最主流、最強大、效能最好的註冊中心和配置中心的選型,下面為Nacos與其他同型別產品的對比

image-20220406141029879

關鍵特性

  • 服務發現和服務執行狀況檢查
    • Nacos 支援基於 DNS 和基於 RPC 的服務發現。服務提供者可使用 原生SDK、OpenAPI、或一個獨立的Agent TODO註冊 Service 後,服務消費者可以使用DNS TODO 或HTTP&API查詢和發現服務。
    • Nacos 提供對服務的實時的健康檢查,阻止向不健康的主機或服務例項傳送請求。Nacos 支援傳輸層 (PING 或 TCP)和應用層 (如 HTTP、MySQL、使用者自定義)的健康檢查。 對於複雜的雲環境和網路拓撲環境中(如 VPC、邊緣網路等)服務的健康檢查,Nacos 提供了 agent 上報模式和服務端主動檢測2種健康檢查模式。Nacos 還提供了統一的健康檢查儀表盤,幫助您根據健康狀態管理服務的可用性及流量。
  • 動態配置管理
    • 動態配置服務允許在所有環境中以集中式和動態的方式管理所有服務的配置。當更新配置時應用從配置中心讀取配置並使得配置更改操作更加敏捷與高效。
    • 配置中心化管理讓實現無狀態服務變得更簡單,讓服務按需彈性擴充套件變得更容易。
    • Nacos 提供了一個簡潔易用的UI (控制檯樣例 Demo) 幫助您管理所有的服務和應用的配置。Nacos 還提供包括配置版本跟蹤、金絲雀釋出、一鍵回滾配置以及客戶端配置更新狀態跟蹤在內的一系列開箱即用的配置管理特性,幫助您更安全地在生產環境中管理配置變更和降低配置變更帶來的風險。
  • 動態DNS服務
    • Nacos支援權重路由,讓您更容易地實現中間層負載均衡、更靈活的路由策略、流量控制以及資料中心內網的簡單DNS解析服務。動態DNS服務還能讓您更容易地實現以 DNS 協議為基礎的服務發現,以幫助您消除耦合到廠商私有服務發現 API 上的風險。
    • Nacos 提供了一些簡單的 DNS APIs TODO 幫助您管理服務的關聯域名和可用的 IP:PORT 列表。
  • 服務和後設資料管理
    • Nacos提供從微服務平臺建設的視角管理資料中心的所有服務及後設資料,包括管理服務的描述、生命週期、服務的靜態依賴分析、服務的健康狀態、服務的流量管理、路由及安全策略、服務的 SLA 以及最首要的 metrics 統計資料。
  • 其他特性可以查閱官網及其的路線圖規劃說明。

核心概念

  • 名稱空間:用於進行租戶粒度的配置隔離。不同的名稱空間下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用場景之一是不同環境的配置的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等。
  • 配置管理:系統中所有配置的編輯、儲存、分發、變更管理、歷史版本管理、變更審計等所有與配置相關的活動統稱為配置管理。
  • 配置項:一個具體的可配置的引數與其值域,通常以 param-key=param-value 的形式存在。例如我們常配置系統的日誌輸出級別(logLevel=INFO|WARN|ERROR) 就是一個配置項。
  • 配置集:一組相關或者不相關的配置項的集合稱為配置集。在系統中,一個配置檔案通常就是一個配置集,包含了系統各個方面的配置。例如,一個配置集可能包含了資料來源、執行緒池、日誌級別等配置項。配置集 ID 是組織劃分配置的維度之一,Data ID 通常用於組織劃分系統的配置集。
  • 配置分組:Nacos 中的一組配置集,是組織配置的維度之一。通過一個有意義的字串(如 Buy 或 Trade )對配置集進行分組,從而區分 Data ID 相同的配置集。
  • 配置快照:Nacos 的客戶端 SDK 會在本地生成配置的快照。當客戶端無法連線到 Nacos Server 時,可以使用配置快照繼續執行有一定的整體容災保障能力。配置快照類似於快取,會在適當的時機更新但沒有快取過期(expiration)的概念。
  • 服務:通過預定義介面網路訪問的提供給客戶端的軟體功能,其目的是不同的客戶端可以為不同的目的重用(例如通過跨程式的網路呼叫)。服務名則為服務提供的標識,通過該標識可以唯一確定其指代的服務。
  • 服務註冊中心:儲存服務例項和服務負載均衡策略的資料庫。
  • 服務發現:在計算機網路上,(通常使用服務名)對服務下的例項的地址和後設資料進行探測,並以預先定義的介面提供給客戶端進行查詢。
  • 元資訊:Nacos資料(如配置和服務)描述資訊,如服務版本、權重、容災策略、負載均衡策略、鑑權配置、各種自定義標籤 (label),從作用範圍來看,分為服務級別的元資訊、叢集的元資訊及例項的元資訊。
  • 服務分組:不同的服務可以歸類到同一分組。
  • 虛擬叢集:同一個服務下的所有服務例項組成一個預設叢集, 叢集可以被進一步按需求劃分,劃分的單位可以是虛擬叢集。
  • 例項:提供一個或多個服務的具有可訪問網路地址(IP:Port)的程式。
  • 權重:例項級別的配置。權重為浮點數。權重越大,分配給該例項的流量越大。
  • 健康檢查:以指定方式檢查服務下掛載的例項 (Instance) 的健康度,從而確認該例項 (Instance) 是否能提供服務。根據檢查結果,例項 (Instance) 會被判斷為健康或不健康。對服務發起解析請求時,不健康的例項 (Instance) 不會返回給客戶端。
  • 健康保護閾值:為了防止因過多例項 (Instance) 不健康導致流量全部流向健康例項 (Instance) ,繼而造成流量壓力把健康例項 (Instance) 壓垮並形成雪崩效應,應將健康保護閾值定義為一個 0 到 1 之間的浮點數。當域名健康例項數 (Instance) 佔總服務例項數 (Instance) 的比例小於該值時,無論例項 (Instance) 是否健康,都會將這個例項 (Instance) 返回給客戶端。這樣做雖然損失了一部分流量,但是保證了叢集中剩餘健康例項 (Instance) 能正常工作。不過我們在實際專案中通常在微服務閘道器通過使用Sentinel來做限流、熔斷、降級來保證不會出現系統雪崩,因此健康保護閾值這個功能就不太重要了。

架構

image-20220406153413886

  • 服務提供方 (Service Provider):是指提供可複用和可呼叫服務的應用方。
  • 服務消費方 (Service Consumer):是指會發起對某個服務呼叫的應用方。
  • 名字服務 (Naming Service):提供分散式系統中所有物件(Object)、實體(Entity)的“名字”到關聯的後設資料之間的對映管理服務,例如 ServiceName -> Endpoints Info, Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List, 服務發現和 DNS 就是名字服務的2大場景。

邏輯架構

image-20220406161245281

  • 服務管理:實現服務CRUD,域名CRUD,服務健康狀態檢查,服務權重管理等功能。
  • 配置管理:實現配置CRUD,版本管理,灰度管理,監聽管理,推送軌跡,聚合資料等功能。
  • 後設資料管理:提供後設資料CURD 和打標能力。
  • 外掛機制:實現三個模組可分可合能力,實現擴充套件點SPI機制。
  • 事件機制:實現非同步化事件通知,sdk資料變化非同步通知等邏輯。
  • 一致性協議:解決不同資料,不同一致性要求情況下,不同一致性機制。
  • 儲存模組:解決資料持久化、非持久化儲存,解決資料分片問題。
  • 快取機制:容災目錄,本地快取,server快取機制。容災目錄使用需要工具。
  • 啟動模式:按照單機模式,配置模式,服務模式,dns模式,或者all模式,啟動不同的程式+UI。
  • Metrics:暴露標準metrics資料,方便與三方監控系統打通。
  • OpenAPI:暴露標準Rest風格HTTP介面,簡單易用,方便多語言整合。
  • Console:易用控制檯,做服務管理、配置管理等操作。
  • 其他詳細檢視官網。

領域模型

  • 資料模型

Nacos 資料模型 Key 由三元組唯一確定, Namespace預設是空串,公共名稱空間(public),分組預設是 DEFAULT_GROUP。名稱空間 》組 》Service/DataId.

  • 服務領域模型

image-20220406165644247

如果有鑑權和配置加密的需求官方也提供相關外掛支援。

部署與配置

部署

官方提供多種部署方式,包括下載二進位制檔案部署、基於Docker和K8S部署,我們這裡選擇Docker-Compose方式部署

  • 克隆專案

    git clone --depth 1 https://github.com/nacos-group/nacos-docker.git
    cd nacos-docker
    #目前版本為2.0.4,可以編輯vi example/.env進行修改
    NACOS_VERSION=v2.0.4
    
  • Standalone Mysql

    # Using mysql 5.7 也可以選擇 mysql 8 
    docker-compose -f example/standalone-mysql-5.7.yaml up -d
    

image-20220407104359945

  • 部署完成後通過暴露的8848訪問Nacos的Web控制檯地址http://192.168.50.95:8848/nacos,預設使用者名稱密碼為nacos/nacos

image-20220407104540074

配置

建立名稱空間simple_ecommerce(簡單電商網站),提交後預設生成名稱空間ID為a2b1a5b7-d0bc-48e8-ab65-04695e61db01

image-20220410012134866

建立使用者itxs,密碼為itxs123

image-20220410011630672

使用者itxs繫結CONFIG_MANAGER(配置管理員角色)

image-20220410011802763

為角色CONFIG_MANAGER新增名稱空間資源和可讀寫的操作許可權

image-20220410012613725

實戰

基本介紹

Nacos官方基於Java技術棧提供多種開發使用的方式,包括基於原生Java、Spring整合、SpringBoot整合、Spring Cloud整合、Dubbo整合等。我們本篇主要是以Spring Cloud Alibaba整合程式碼開發方式來做示例為主。基於Spring Cloud Alibaba使用方式如果用於生產環境,建議使用對應的官網版本說明,詳細可以檢視Spring Cloud Alibaba Wiki

元件版本關係:每個 Spring Cloud Alibaba 版本及其自身所適配的各元件對應版本(經過驗證,自行搭配各元件版本不保證可用)如下表所示(最新版本用*標記):

image-20220406182151738

下表為按時間順序釋出的 Spring Cloud Alibaba 以及對應的適配 Spring Cloud 和 Spring Boot 版本關係(由於 Spring Cloud 版本命名有調整,所以對應的 Spring Cloud Alibaba 版本號也做了對應變化)

image-20220406182020363

我們這裡不是生產環境,用於開發測試學習的話可以選擇最新也即是向下相容的思想,因此Nacos還是使用上面的2.0.4,踩坑了再來解決還能更深刻理解原理。

簡單電商示例專案框架搭建

目錄規劃

  • ecom-doc:詳細文件目錄
  • ecom-scripts:指令碼儲存目錄,例如MySQL、Hive資料庫指令碼等。
  • ecom-bom:bom模組,控制整體版本;依賴包版本管理,管理所有第三方jar包版本,比如mysql-connector-java的版本,其他模組不需要配置版本,到時修改版本可以統一管理,而Spring Cloud Alibaba 版本由主Pom控制。
  • ecom-commons:公共服務模組,也可先再拆細子專案,如領域實體entity、Service、Mapper等。
  • ecom-component: 自定義元件,包含自定義的spring boot starter,暫時預留。
  • ecom-mbg:程式碼自動生成工具,使用mybatis-plus-generator。
  • ecom-gateway:電商網站閘道器服務模組。
  • ecom-storage:電商網站庫存服務模組。
  • ecom-account:電商網站使用者服務模組。
  • ecom-order:電商網站訂單服務模組。
  • ecom-kubernetes-helm: kubernetes-helm編排指令碼目錄
  • ecom-kubernetes: kubernetes原生編排指令碼目錄
  • ecom-docker:docker compose編排指令碼目錄

示例資料庫

本示例採用MySQL資料庫,以docker方式部署MySQL 8.0.28版本

CREATE DATABASE IF NOT EXISTS storage
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_chinese_ci;

DROP TABLE IF EXISTS `storage_tbl`;
CREATE TABLE `storage_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `commodity_code` varchar(255) DEFAULT NULL,
  `count` int(11) DEFAULT 0,
  PRIMARY KEY (`id`),
  UNIQUE KEY (`commodity_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE DATABASE IF NOT EXISTS order
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_chinese_ci;
DROP TABLE IF EXISTS `order_tbl`;

CREATE TABLE `order_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(255) DEFAULT NULL,
  `commodity_code` varchar(255) DEFAULT NULL,
  `count` int(11) DEFAULT 0,
  `money` int(11) DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE DATABASE IF NOT EXISTS account
DEFAULT CHARACTER SET utf8
DEFAULT COLLATE utf8_chinese_ci;
DROP TABLE IF EXISTS `account_tbl`;

CREATE TABLE `account_tbl` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` varchar(255) DEFAULT NULL,
  `money` int(11) DEFAULT 0,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Maven專案主框架搭建

建立工程主Pom檔案,目前在主工程業務服務模組先只增加庫存微服務,後續再逐步增加其他微服務

<?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>cn.itxs</groupId>
  <artifactId>simple_ecommerce</artifactId>
  <version>1.0</version>
  <modules>
    <module>ecom_bom</module>
    <module>ecom_commons</module>
    <module>ecom_storage</module>
  </modules>
  <name>simple_ecommerce</name>
  <packaging>pom</packaging>
  <description>a simple electronic commerce platform demo tutorial</description>

  <properties>
    <java.verson>1.8</java.verson>
    <encoding>UTF-8</encoding>
    <spring-boot.version>2.6.4</spring-boot.version>
    <spring.cloud.verison>2021.0.1</spring.cloud.verison>
    <spring.cloud.alibaba.verison>2021.0.1.0</spring.cloud.alibaba.verison>
    <ecom.bom.version>1.0</ecom.bom.version>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>

  <dependencyManagement>
    <dependencies>
      <!--統一專案整體第三方依賴版本-->
      <dependency>
        <groupId>cn.itxs</groupId>
        <artifactId>ecom_bom</artifactId>
        <version>${ecom.bom.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <!--統一版本spring-boot、spring-cloud、spring.cloud.alibaba-->
      <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>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>${spring.cloud.verison}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>${spring.cloud.alibaba.verison}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>
</project>

管理第三方依賴Bom的Pom檔案

<?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>cn.itxs</groupId>
    <artifactId>ecom_bom</artifactId>
    <name>ecom_bom</name>
    <packaging>pom</packaging>
    <version>1.0</version>
    <description>manage third-party package versions</description>

    <properties>
        <ecom.commons.version>1.0</ecom.commons.version>
        <seata-spring-boot.version>1.4.2</seata-spring-boot.version>
        <mysql.version>8.0.28</mysql.version>
        <druid.version>1.2.8</druid.version>
        <mybatis-plus.version>3.5.1</mybatis-plus.version>
        <lombok.version>1.18.22</lombok.version>
        <hutool-all.verison>5.7.22</hutool-all.verison>
        <apm-toolkit-trace.version>8.7.0</apm-toolkit-trace.version>
        <jetcache.redis.version>2.6.2</jetcache.redis.version>
        <fastjson.version>1.2.80</fastjson.version>
        <mybatis-plus-generator.version>3.5.2</mybatis-plus-generator.version>
        <velocity.version>2.3</velocity.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!--ecom-commons 版本-->
            <dependency>
                <groupId>cn.itxs</groupId>
                <artifactId>ecom_commons</artifactId>
                <version>${ecom.commons.version}</version>
            </dependency>
            <dependency>
                <groupId>io.seata</groupId>
                <artifactId>seata-spring-boot-starter</artifactId>
                <version>${seata-spring-boot.version}</version>
            </dependency>
            <!--database-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${mysql.version}</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid-spring-boot-starter</artifactId>
                <version>${druid.version}</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus.version}</version>
            </dependency>

            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
                <scope>provided</scope>
            </dependency>

            <dependency>
                <groupId>cn.hutool</groupId>
                <artifactId>hutool-all</artifactId>
                <version>${hutool-all.verison}</version>
            </dependency>

            <dependency>
                <groupId>org.apache.skywalking</groupId>
                <artifactId>apm-toolkit-trace</artifactId>
                <version>${apm-toolkit-trace.version}</version>
            </dependency>

            <dependency>
                <groupId>com.alicp.jetcache</groupId>
                <artifactId>jetcache-starter-redis</artifactId>
                <version>${jetcache.redis.version}</version>
            </dependency>

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson.version}</version>
            </dependency>

            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
                <version>${mybatis-plus-generator.version}</version>
            </dependency>

            <dependency>
                <groupId>org.apache.velocity</groupId>
                <artifactId>velocity-engine-core</artifactId>
                <version>${velocity.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

公共commons模組的Pom檔案,包含Spring Cloud Alibaba常見元件的客戶端依賴而不僅僅是本篇的Nacos客戶端,後續如增加再逐步補充

<?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>simple_ecommerce</artifactId>
        <groupId>cn.itxs</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ecom_commons</artifactId>
    <name>ecom_commons</name>
    <packaging>jar</packaging>
    <description>a commons module</description>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-tomcat</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

        <!--undertow 效能比tomcat稍高-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-undertow</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</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.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-dubbo</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>

    </dependencies>
</project>

建立庫存微服務模組,其Pom檔案內容如下

<?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>simple_ecommerce</artifactId>
        <groupId>cn.itxs</groupId>
        <version>1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>ecom_storage</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>
    <name>ecom_storage</name>
    <description>a simple electronic commerce platform demo tutorial for storage service</description>

    <dependencies>
        <dependency>
            <groupId>cn.itxs</groupId>
            <artifactId>ecom_commons</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 指定該Main Class為全域性的唯一入口 -->
                    <mainClass>com.aotain.cu.underly.infra.xx1.Xx1ServiceApplication</mainClass>
                    <layout>ZIP</layout>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal><!--可以把依賴的包都打包到生成的Jar包中-->
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

並建立庫存微服務SpringBoot啟動類和bootstrap.yml,至此大體工程框架雛形已具備

image-20220410014627788

計劃是每個微服務本地bootstrap.yml裡只需配置Nacos配置中心的地址,其他配置項全部放在配置中心裡管理,因此我們先從Nacos配置中心開始。

相關文章