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

来源:https://www.cnblogs.com/itxiaoshen/archive/2022/04/10/16124596.html
-Advertisement-
Play Games

不斷踩坑並解決問題是每個程式員進階到資深的必要經歷並以此獲得滿足感,而不斷閱讀開源項目源碼和總結思想是每個架構師成長最佳途徑。本篇拉開SpringCloud Alibaba最新版本實戰和原理序幕,以工程實踐的簡單完整實戰示例為主線,步步深入並可為實際項目中帶來啟發 ...


概述

背景

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</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配置中心開始。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 迭代: 啥子是迭代?可以簡單地理解為按順序訪問目標(數組、對象等)中的每一項(其實和遍歷概念沒什麼差別) 上代碼 1 var fruits = ["Apple", "Orange", "Apple", "Mango"]; 2 var a = fruits.indexOf("Apple"); 3 co ...
  • 我們可以很輕鬆的去遍歷一棵樹,無論是廣度優先遍歷還是深度優先遍歷,那麼怎麼在小程式當中渲染一棵樹呢? 先看一下我們深度優先遍歷的代碼 function dfs(tree) { if(!tree) return console.log(tree.value) if (tree.children) { ...
  • 今天是我們最後一天ajax的學習,這次學完總可以去vue了吧,我不信還有什麼攔路石,先不說其他的先看看今天的內容。 1. 首先是同源策略,什麼叫做同源? 如果兩個頁面的協議、功能變數名稱、埠都相同的話,我們將這兩個頁面為同源。 那麼什麼同源策略呢? 是瀏覽器提供的一個安全功能,如果說兩個頁面不同源,那麼A ...
  • 一、基礎使用 1、變數、表達式、class style、子元素和組件 2、if else、三元表達式、邏輯運算符 && || 3、map、key 4、bind this 5、關於event參數,react的event不是原生的,event.nativeEvent才是指向原生event,所有的事件都是 ...
  • 1. 今天的內容其實挺多的,我們慢慢來說。首先第一個是xhr的基本使用,什麼是xhr? XMLHTTPRequest是瀏覽器提供的js對象,可以請求伺服器上的數據資源,包括我們前面一直用的jq裡面的三個請求資源的方法都是基於xhr來封裝的。 那麼首先我們看到xhr的get請求怎麼來實現 首先要創建x ...
  • 1. 今天繼續ajax的一個學習,首先明確一個觀念,介面,什麼是介面,當使用ajax請求數據時,被請求的url就叫做數據介面也就是介面,註意每個介面必須有請求方式,這裡有一個介面的測試工具,postman自稱是全球最快的,反正使用起來沒多大毛病,使用這個軟體的時候有一個註意點就是在post請求的時候 ...
  • 進入ajax了,想要進入vue還有一個前提就是要把ajax給熟悉一下,看一看客戶端與伺服器之間是怎麼一個通信的過程,第一天主要是先瞭解了一下ajax的一些介紹,ajax嘛,在進入之前,肯定是要瞭解一下客戶端與伺服器之間的一個通信過程,其實不管是請求還是發送都遵循的一個原則,即請求、處理、響應,如何來 ...
  • 一、前言 雖說上學期為了助眠看了一點 Java 但是散而不精,看而不敲,所以這學期正式學 Java 並沒有想想中那麼容易... 直觀感受:Java有很多和C/C不一樣的地方,Java太嚴謹了,但是相比C/C來說也更安全(不需要領著指針亂跑).... 前三次PTA題目集的小總結 總體來看,前兩次的題目 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...