SpringCloudAlibaba注冊中心與配置中心之利器Nacos實戰與源碼分析(上)


概述

背景

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源碼地址

前面的《主流微服務一站式解決方案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-service</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>
        <caffeine.version>3.0.6</caffeine.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>
<!--                <exclusions>
                    <exclusion>
                        <groupId>org.springframework.boot</groupId>
                        <artifactId>spring-boot-autoconfigure</artifactId>
                    </exclusion>
                </exclusions>-->
                <version>${mybatis-plus.version}</version>
            </dependency>

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

            <dependency>
                <groupId>com.github.ben-manes.caffeine</groupId>
                <artifactId>caffeine</artifactId>
                <version>${caffeine.version}</version>
            </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>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-loadbalancer</artifactId>
        </dependency>
        <dependency>
            <groupId>com.github.ben-manes.caffeine</groupId>
            <artifactId>caffeine</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-service</artifactId>
    <packaging>jar</packaging>
    <version>1.0</version>
    <name>ecom-storage-service</name>
    <description>a simple electronic commerce platform demo tutorial for storage service</description>

    <dependencies>
        <dependency>
            <groupId>cn.itxs</groupId>
            <artifactId>ecom-commons</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 指定該Main Class為全局的唯一入口 -->
                    <mainClass>cn.itxs.ecom.storage.StorageServiceApplication</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配置中心開始。

**本人博客網站 **IT小神 www.itxiaoshen.com


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM