主頁 > 後端開發 > SpringCloudAlibaba注冊中心與配置中心之利器Nacos實戰與原始碼分析(上)

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

2022-04-10 06:30:28 後端開發

概述

背景

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

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/457590.html

標籤:Java

上一篇:生產環境Redis連接,長時間無回應被服務器斷開問題

下一篇:在mongodb中將正則運算式與$in運算子相結合

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more