SpringCloudAlibaba Nacos注册配置中心实战解析,源码深度剖析(上篇)?

2026-05-19 20:371阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计6617个文字,预计阅读时间需要27分钟。

SpringCloudAlibaba Nacos注册配置中心实战解析,源码深度剖析(上篇)?

不断攀登并解决问题是每个程序员进阶到资深的必要经历,并以此获得充分的满足感。而不断阅读开源项目源码和总结思考则是每个架构师成长的最佳路径。本文将拉开Spring Cloud Alibaba最新版本实战和原理解析的序幕。

不断踩坑并解决问题是每个程序员进阶到资深的必要经历并以此获得满足感,而不断阅读开源项目源码和总结思想是每个架构师成长最佳途径。本篇拉开SpringCloud Alibaba最新版本实战和原理序幕,以工程实践的简单完整实战示例为主线,步步深入并可为实际项目中带来启发 概述 背景

Nacos GitHub源码地址 github.com/alibaba/nacos ,目前源码基于高性能RPC的2.1.0,和基于HTTP RESTFUL的1.4.3版本的两条分支,因此2.X系列Nacos性能比1.X版本至少提升2倍以上,我们这边下载研究的是2.1.0版本的源码。

Nacos 官网地址 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服务发现模块的压测报告等都可以去详细查阅官网

定义

Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施,致力于发现、配置和管理微服务,可以快速实现动态服务发现、服务配置、服务元数据及流量管理。简单来说就是集注册中心和配置中心于一体,几乎支持所有市面同类型产品的所有功能,Nacos 支持主流的服务生态包括Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful,可以说是目前国内最主流、最强大、性能最好的注册中心和配置中心的选型,下面为Nacos与其他同类型产品的对比

关键特性
  • 服务发现和服务运行状况检查
    • 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来做限流、熔断、降级来保证不会出现系统雪崩,因此健康保护阈值这个功能就不太重要了。
架构

  • 服务提供方 (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大场景。
逻辑架构

  • 服务管理:实现服务CRUD,域名CRUD,服务健康状态检查,服务权重管理等功能。
  • 配置管理:实现配置CRUD,版本管理,灰度管理,监听管理,推送轨迹,聚合数据等功能。
  • 元数据管理:提供元数据CURD 和打标能力。
  • 插件机制:实现三个模块可分可合能力,实现扩展点SPI机制。
  • 事件机制:实现异步化事件通知,sdk数据变化异步通知等逻辑。
  • 一致性协议:解决不同数据,不同一致性要求情况下,不同一致性机制。
  • 存储模块:解决数据持久化、非持久化存储,解决数据分片问题。
  • 缓存机制:容灾目录,本地缓存,server缓存机制。容灾目录使用需要工具。
  • 启动模式:按照单机模式,配置模式,服务模式,dns模式,或者all模式,启动不同的程序+UI。
  • Metrics:暴露标准metrics数据,方便与三方监控系统打通。
  • OpenAPI:暴露标准Rest风格HTTP接口,简单易用,方便多语言集成。
  • Console:易用控制台,做服务管理、配置管理等操作。
  • 其他详细查看官网。
领域模型
  • 数据模型

Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。命名空间 》组 》Service/DataId.

  • 服务领域模型

如果有鉴权和配置加密的需求官方也提供相关插件支持。

部署与配置 部署

官方提供多种部署方式,包括下载二进制文件部署、基于Docker和K8S部署,我们这里选择Docker-Compose方式部署

  • 克隆项目

    git clone --depth 1 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

  • 部署完成后通过暴露的8848访问Nacos的Web控制台地址192.168.50.95:8848/nacos,默认用户名密码为nacos/nacos

配置

创建命名空间simple_ecommerce(简单电商网站),提交后默认生成命名空间ID为a2b1a5b7-d0bc-48e8-ab65-04695e61db01

创建用户itxs,密码为itxs123

用户itxs绑定CONFIG_MANAGER(配置管理员角色)

为角色CONFIG_MANAGER添加命名空间资源和可读写的操作权限

实战 基本介绍

Nacos官方基于Java技术栈提供多种开发使用的方式,包括基于原生Java、Spring整合、SpringBoot整合、Spring Cloud整合、Dubbo整合等。我们本篇主要是以Spring Cloud Alibaba整合代码开发方式来做示例为主。基于Spring Cloud Alibaba使用方式如果用于生产环境,建议使用对应的官网版本说明,详细可以查看Spring Cloud Alibaba Wiki

组件版本关系:每个 Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本(经过验证,自行搭配各组件版本不保证可用)如下表所示(最新版本用*标记):

下表为按时间顺序发布的 Spring Cloud Alibaba 以及对应的适配 Spring Cloud 和 Spring Boot 版本关系(由于 Spring Cloud 版本命名有调整,所以对应的 Spring Cloud Alibaba 版本号也做了对应变化)

我们这里不是生产环境,用于开发测试学习的话可以选择最新也即是向下兼容的思想,因此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="maven.apache.org/POM/4.0.0" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="maven.apache.org/POM/4.0.0 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="maven.apache.org/POM/4.0.0" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="maven.apache.org/POM/4.0.0 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="maven.apache.org/POM/4.0.0" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="maven.apache.org/POM/4.0.0 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="maven.apache.org/POM/4.0.0" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="maven.apache.org/POM/4.0.0 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,至此大体工程框架雏形已具备

计划是每个微服务本地bootstrap.yml里只需配置Nacos配置中心的地址,其他配置项全部放在配置中心里管理,因此我们先从Nacos配置中心开始。

SpringCloudAlibaba Nacos注册配置中心实战解析,源码深度剖析(上篇)?

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

本文共计6617个文字,预计阅读时间需要27分钟。

SpringCloudAlibaba Nacos注册配置中心实战解析,源码深度剖析(上篇)?

不断攀登并解决问题是每个程序员进阶到资深的必要经历,并以此获得充分的满足感。而不断阅读开源项目源码和总结思考则是每个架构师成长的最佳路径。本文将拉开Spring Cloud Alibaba最新版本实战和原理解析的序幕。

不断踩坑并解决问题是每个程序员进阶到资深的必要经历并以此获得满足感,而不断阅读开源项目源码和总结思想是每个架构师成长最佳途径。本篇拉开SpringCloud Alibaba最新版本实战和原理序幕,以工程实践的简单完整实战示例为主线,步步深入并可为实际项目中带来启发 概述 背景

Nacos GitHub源码地址 github.com/alibaba/nacos ,目前源码基于高性能RPC的2.1.0,和基于HTTP RESTFUL的1.4.3版本的两条分支,因此2.X系列Nacos性能比1.X版本至少提升2倍以上,我们这边下载研究的是2.1.0版本的源码。

Nacos 官网地址 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服务发现模块的压测报告等都可以去详细查阅官网

定义

Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施,致力于发现、配置和管理微服务,可以快速实现动态服务发现、服务配置、服务元数据及流量管理。简单来说就是集注册中心和配置中心于一体,几乎支持所有市面同类型产品的所有功能,Nacos 支持主流的服务生态包括Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful,可以说是目前国内最主流、最强大、性能最好的注册中心和配置中心的选型,下面为Nacos与其他同类型产品的对比

关键特性
  • 服务发现和服务运行状况检查
    • 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来做限流、熔断、降级来保证不会出现系统雪崩,因此健康保护阈值这个功能就不太重要了。
架构

  • 服务提供方 (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大场景。
逻辑架构

  • 服务管理:实现服务CRUD,域名CRUD,服务健康状态检查,服务权重管理等功能。
  • 配置管理:实现配置CRUD,版本管理,灰度管理,监听管理,推送轨迹,聚合数据等功能。
  • 元数据管理:提供元数据CURD 和打标能力。
  • 插件机制:实现三个模块可分可合能力,实现扩展点SPI机制。
  • 事件机制:实现异步化事件通知,sdk数据变化异步通知等逻辑。
  • 一致性协议:解决不同数据,不同一致性要求情况下,不同一致性机制。
  • 存储模块:解决数据持久化、非持久化存储,解决数据分片问题。
  • 缓存机制:容灾目录,本地缓存,server缓存机制。容灾目录使用需要工具。
  • 启动模式:按照单机模式,配置模式,服务模式,dns模式,或者all模式,启动不同的程序+UI。
  • Metrics:暴露标准metrics数据,方便与三方监控系统打通。
  • OpenAPI:暴露标准Rest风格HTTP接口,简单易用,方便多语言集成。
  • Console:易用控制台,做服务管理、配置管理等操作。
  • 其他详细查看官网。
领域模型
  • 数据模型

Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。命名空间 》组 》Service/DataId.

  • 服务领域模型

如果有鉴权和配置加密的需求官方也提供相关插件支持。

部署与配置 部署

官方提供多种部署方式,包括下载二进制文件部署、基于Docker和K8S部署,我们这里选择Docker-Compose方式部署

  • 克隆项目

    git clone --depth 1 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

  • 部署完成后通过暴露的8848访问Nacos的Web控制台地址192.168.50.95:8848/nacos,默认用户名密码为nacos/nacos

配置

创建命名空间simple_ecommerce(简单电商网站),提交后默认生成命名空间ID为a2b1a5b7-d0bc-48e8-ab65-04695e61db01

创建用户itxs,密码为itxs123

用户itxs绑定CONFIG_MANAGER(配置管理员角色)

为角色CONFIG_MANAGER添加命名空间资源和可读写的操作权限

实战 基本介绍

Nacos官方基于Java技术栈提供多种开发使用的方式,包括基于原生Java、Spring整合、SpringBoot整合、Spring Cloud整合、Dubbo整合等。我们本篇主要是以Spring Cloud Alibaba整合代码开发方式来做示例为主。基于Spring Cloud Alibaba使用方式如果用于生产环境,建议使用对应的官网版本说明,详细可以查看Spring Cloud Alibaba Wiki

组件版本关系:每个 Spring Cloud Alibaba 版本及其自身所适配的各组件对应版本(经过验证,自行搭配各组件版本不保证可用)如下表所示(最新版本用*标记):

下表为按时间顺序发布的 Spring Cloud Alibaba 以及对应的适配 Spring Cloud 和 Spring Boot 版本关系(由于 Spring Cloud 版本命名有调整,所以对应的 Spring Cloud Alibaba 版本号也做了对应变化)

我们这里不是生产环境,用于开发测试学习的话可以选择最新也即是向下兼容的思想,因此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="maven.apache.org/POM/4.0.0" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="maven.apache.org/POM/4.0.0 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="maven.apache.org/POM/4.0.0" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="maven.apache.org/POM/4.0.0 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="maven.apache.org/POM/4.0.0" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="maven.apache.org/POM/4.0.0 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="maven.apache.org/POM/4.0.0" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="maven.apache.org/POM/4.0.0 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,至此大体工程框架雏形已具备

计划是每个微服务本地bootstrap.yml里只需配置Nacos配置中心的地址,其他配置项全部放在配置中心里管理,因此我们先从Nacos配置中心开始。

SpringCloudAlibaba Nacos注册配置中心实战解析,源码深度剖析(上篇)?

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