网站建设心得体会800字,高端品牌内衣,推文关键词生成器,软件培训班一、前言
随着微服务架构的兴起#xff0c;服务的规模不断增长#xff0c;对于服务的发现、配置和管理变得越来越复杂。
在这个背景下#xff0c;Nacos应运而生#xff0c;以其强大的功能和灵活性成为云原生领域的瑞士军刀之一。
Nacos是一个由阿里巴巴开源的项目#…一、前言
随着微服务架构的兴起服务的规模不断增长对于服务的发现、配置和管理变得越来越复杂。
在这个背景下Nacos应运而生以其强大的功能和灵活性成为云原生领域的瑞士军刀之一。
Nacos是一个由阿里巴巴开源的项目它提供了服务注册与发现、动态配置管理、服务和配置的实时监听等功能使得开发者可以更加轻松地构建和管理微服务架构。
在Euerka不维护的时候Nacos站出来挑扛起了大旗。不得不说是真的好用完美适配SpringCloud使得微服务更加完善
当然免费版可能会有些问题听说企业收费的是难以想象的好用有得赚就不会停止维护就会越来越好我们一起期待它给我们带来更好的功能
文章比较长还请耐心看完先收藏慢慢看后面有源码部门
话不多说我们一起来深入了解一下吧
二、Nacos发展史
2018年3月首次开源
在2018年3月Nacos首次以开源的形式亮相。作为一个全功能的服务发现和配置管理平台Nacos的目标是帮助开发者构建和管理微服务架构。
2018年8月成为Apache孵化项目
由于其强大的功能和快速的社区发展Nacos于2018年8月进入了Apache软件基金会的孵化阶段成为Apache的孵化项目。
2019年3月成为Apache顶级项目
在经过孵化期的发展和审查后Nacos于2019年3月正式成为Apache顶级项目。这意味着 Nacos 的社区达到了一定的规模和贡献度得到了广泛认可。
2019年4月发布Nacos 1.0.0 GA
同时支持 AP 和 CP 一致性可以大规模地生产环境中使用新版本不仅针对社区的需求和集群的稳定性相应地增加了一些新特性而且还发布了服务发现模块的性能测试报告以及完整的 API 列表和架构设计文档。快速增长期
2021年03月发布Nacos 2.0
对于服务注册和发现使用 gRPC 框架Nacos 2.0 注册性能相、注销实例性能比较 Nacos 1.x 总体提升至少 2 倍Nacos 2.0 查询性能相比较 Nacos 1.x 总体提升至少 3 倍单机多线程甚至提升了 10 倍这一时期基本没有对手
三、Nacos介绍和特性
1. 介绍
Nacos 是 Dynamic Naming and Configuration Service的首字母简称一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
我们看一下Nacos 生态图 2. 核心特性
动态配置服务
动态配置服务让您能够以中心化、外部化和动态化的方式管理所有环境的配置。动态配置消除了配置变更时重新部署应用和服务的需要。配置中心化管理让实现无状态服务更简单也让按需弹性扩展服务更容易。
把Yaml文件放到Nacos上统一管理和切换。
服务发现及管理
动态服务发现对以服务为中心的例如微服务和云原生应用架构方式非常关键。Nacos支持DNS-Based和RPC-BasedDubbo、gRPC模式的服务发现。Nacos也提供实时健康检查以防止将请求发往不健康的主机或服务实例。借助Nacos您可以更容易地为您的服务实现断路器。
2.0以后采用gRPC进行服务的注册
动态DNS服务
通过支持权重路由动态DNS服务能让您轻松实现中间层负载均衡、更灵活的路由策略、流量控制以及简单数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以DNS协议为基础的服务发现以消除耦合到厂商私有服务发现API上的风险。
服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
灰度发布的配置就是元数据的一些参数
四、Nacos安装与配置
1. 下载
我们根据对照表来下载哈 由于我们使用的Springboot版本是3.0之前的所以要引入SpringCloudAlibaba 2021.0.5版本的这个版本的Nacos只能安装2.2.0的。所以我们不能安装最新版的Nacos2.2.3当然你也可以试一下看看是不是向下兼容。
对照表地址 经过对照表我们本次使用的就是
SpringCloud 2021.0.5SpringCloud Alibaba 2021.0.5.0SpringBoot 2.6.13
经过对照表我们本次下载客户端版本为2.2.0。
下载慢的可以使用迅雷本次以Windows为例Linux可以下载上面的想看源码的也可以下载下面的源码
Nacos2.2.0下载 这是绿色软件不需要安装尽量放到没有中文目录下防止不必要的麻烦
2. 启动访问
启动这里有个坑
对于Nacos2.0以上版本默认启动是以集群的方式启动需要你指定成单机启动当然你可以使用集群哈这里就不带大家搭集群了
对于1.X直接双击启动即可
找到bin目录我们在上方输入cmd回车。 由于公司项目启动着nacos咱的nacos改了端口为18848。
输入启动命令
startup.cmd -m standalone启动成功我们可以进行访问了
http://192.168.50.108:18848/nacos/index.html
用户名和密码都是nacos 启动完美结束
3. 修改持久化
我们一般要把Nacos的配置信息进行持久化默认是使用嵌入式数据库Derby数据库。
可以发现nacos的pom里引入了
dependencygroupIdorg.apache.derby/groupIdartifactIdderby/artifactIdversion${derby.version}/version
/dependency这个数据库咱也不熟为了方便查看和管理通常会选择一个外部的数据库。
在nacos0.7版本之后增加了支持MySQL数据源能力。
官方比较推荐使用MySQL来进行持久化的配置文件里已经给我们准备好了配置的东西解开注释修改成自己的MySQL地址就好了
先到conf目录下拿到SQL文件然后再数据库中执行一下就可以了
这里以Navicat为例哈 导入conf下的SQL文件 导入成功
我们开始修改Nacos的配置文件application.properties
解开注释配置自己的数据库用户和密码就行了 一定要重启一下Nacos
五、Nacos配置中心
1. 概念
我们来讲一下Nacos的核心——配置中心功能吧
这个对标的是Spring Cloud Config需要单独引依赖
配置中心是分布式系统中一种用于集中管理和动态配置应用程序配置信息的服务。
在微服务架构中配置管理是一个重要的问题因为不同的服务可能需要不同的配置并且这些配置可能会随时发生变化。配置中心的目标是使配置更加集中、易管理。
2. 核心
命名空间Namespace
命名空间是 Nacos 中的一个重要概念它用于隔离不同环境或应用的配置信息。通过使用命名空间可以在同一个 Nacos 集群中管理多个环境如开发、测试、生产的配置信息从而实现配置的多租户管理。
配置集Data ID
配置集是 Nacos 中用于存储配置信息的基本单元。每个配置集都有一个唯一的标识符称为 Data ID。Data ID 通常由配置的业务模块和应用名组成用于唯一标识一个配置集。对标我们一个个的微服务
分组Group
分组是配置集的另一个维度用于将不同用途或维度的配置集归类到同一个组中。通过分组可以更好地组织和管理配置信息。 3. 优点
动态更新配置信息放到yml文件中防止硬编码在程序里动态更新配置无需重启。 多环境配置不同的配置创建版本并在需要时切换配置版本。这有助于在不同环境例如开发、测试、生产之间轻松管理配置。 集中管理配置中心允许开发者将应用程序的配置信息集中存储在一个地方而不是分散存储在各个微服务中。这样可以更方便地管理和维护配置。 可视化管理一些配置中心提供了可视化的配置管理界面方便用户直观地查看和管理配置信息。 历史配置查看一些配置中心提供了历史配置查看功能可以方便用户查看历史版本的配置信息对于问题追溯和回滚配置是有帮助的。
配置的监听和推送
4. bootstrap.yml
在使用之前需要了解一下bootstrap.ymlproperties
bootstrap 是 Spring Boot 中一个特殊的配置文件用于在应用程序启动时配置一些系统级别的属性通常用于一些在应用程序上下文创建之前就需要加载的配置。
我们把配置文件放到Nacos上你把Nacos的地址再放在application.yml中会加载不到从而拿不到Nacos中的配置文件项目无法启动。所以需要把项目中的application.yml命名为bootstrap.yml。
让程序先去加载bootstrap.yml拿到Nacos信息再从Nacos里拿到配置信息然后就可以加载了连接数据库等等
六、Nacos服务注册和发现
1. 服务的注册
我们在项目中使用Nacos后就会在启动项目成功后在控制台输出
2023-11-16 14:02:08.490 INFO 24660 ---
[ main] c.a.c.n.registry.NacosServiceRegistry :
nacos registry, DEFAULT_GROUP service-message 192.168.50.108:2002 register finished代表我们的服务注册到Nacos上了
我们发现日志打印的类是NacosServiceRegistry所以说这个类就是注册核心类
我们一起看看这个类到底发生了什么 我们打断点开看一下是谁调用的这个方法
这是SpringBoot思想约定大于配置在NacosServiceRegistryAutoConfiguration配置生效后当Spring容器初始化完成后会发送 WebServerInitializedEvent 事件
我们从调用链中发现AbstractAutoServiceRegistration通过实现ApplicationListenerWebServerInitializedEvent 来实现程序的监听从而执行到register方法 AbstractAutoServiceRegistration UML图 我们继续看这个注册方法直接找到核心方法 namingService.registerInstance(serviceId, group, instance); 一直点直到出现三个实现方法让自己选择。
至于源码中怎么选择的我们一起看一下
三个实现会先执行NamingClientProxyDelegate来获取具体使用那种方式类里的方法
private boolean ephemeral true;private NamingClientProxy getExecuteClientProxy(Instance instance) {return instance.isEphemeral() ? grpcClientProxy : httpClientProxy;
}此时在Nacos2.0之前默认注册是采用Http来发送的2.0之后采用了效率更高的gRPC进行发送的
此时我们来到gRpc的代理类中 我们进去就可以看到gRpc的调用具体内部就带大家看了关于gRpc的事情大家可以搜一下是Google开发的 此时我们已经完成一半了请求发送成功了我们开始移步Nacos源码了需要的自行下载哈
Nacos源码下载地址
此时需要找到官网的服务注册地址也就是刚刚我们发送gRpc的地址
curl -X POST http://127.0.0.1:8848/nacos/v1/ns/instance?serviceNamenacos.naming.serviceNameip20.18.7.10port8080找到源码从这里为入口往下走这里就不带大家跟了NamingApp起不来找了很多没有说的大家可以试一下跑个测试就行了。 不能Debug小编这里只能跟到这里给大家提供一个思路
getInstanceOperator().registerInstance(namespaceId, serviceName, instance);
com.alibaba.nacos.naming.core.InstanceOperatorClientImpl#registerInstance中
clientOperationService.registerInstance(service, instance, clientId);
来到这个实现类
com.alibaba.nacos.naming.core.v2.service.impl.EphemeralClientOperationServiceImpl#registerInstance
NotifyCenter.publishEvent(new ClientOperationEvent.ClientRegisterServiceEvent(singleton, clientId));
点击ClientRegisterServiceEvent
来到类com.alibaba.nacos.naming.core.v2.event.client.ClientOperationEvent.ClientRegisterServiceEvent
查看有哪些引用找到这个类他来监听然后继续执行
com.alibaba.nacos.naming.core.v2.index.ClientServiceIndexesManager#onEvent
这个类里
handleClientOperation((ClientOperationEvent) event);
addPublisherIndexes(service, clientId);
NotifyCenter.publishEvent(new ServiceEvent.ServiceChangedEvent(service, true));
这里继续发布另一个事件点击ServiceChangedEvent
来到这个类
com.alibaba.nacos.naming.core.v2.event.service.ServiceEvent.ServiceChangedEvent
查看引用来到这个类方法
com.alibaba.nacos.naming.push.v2.NamingSubscriberServiceV2Impl#onEvent
里面会整上一个延时队列
delayTaskEngine.addTask(service, new PushDelayTask(service, PushConfig.getInstance().getPushTaskDelay()));
delayTaskEngine是我们后面的方向PushDelayTaskExecuteEngine
先去构造方法看发现先调用的父类就先去看父类
NacosDelayTaskExecuteEngine
先要看构造方法
public NacosDelayTaskExecuteEngine(String name, int initCapacity, Logger logger, long processInterval) {super(logger);// 初始化待处理任务tasks new ConcurrentHashMap(initCapacity);// 一个单线程的处理任务线程池processingExecutor ExecutorFactory.newSingleScheduledExecutorService(new NameThreadFactory(name));// 开启线程池放里面添加上面说的taskprocessingExecutor.scheduleWithFixedDelay(new ProcessRunnable(), processInterval, processInterval, TimeUnit.MILLISECONDS);}会执行com.alibaba.nacos.common.task.engine.NacosDelayTaskExecuteEngine#processTasks
这一段主要是通过定义一个延时执行的线程池定时去扫描task缓存执行任务。
可以看看PushDelayTaskExecuteEngine的UML图 从新回到PushDelayTaskExecuteEngine的构造方法
setDefaultTaskProcessor(new PushDelayTaskProcessor(this));
点击PushDelayTaskProcessor
来到这个类com.alibaba.nacos.naming.push.v2.task.PushDelayTaskExecuteEngine.PushDelayTaskProcessor
来到执行的process方法
NamingExecuteTaskDispatcher.getInstance() .dispatchAndExecuteTask(service, new PushExecuteTask(service, executeEngine, pushDelayTask));
点击dispatchAndExecuteTask
看到放里面添加任务
executeEngine.addTask(dispatchTag, task);
来到这个类 NacosExecuteTaskExecuteEngine
构造方法往里看
在给TaskExecuteWorker[]添加元素我们在看这个数组TaskExecuteWorker
然后继续看构造方法realWorker new InnerWorker(this.name);
然后realWorker.start(); 启动
会来到com.alibaba.nacos.common.task.engine.TaskExecuteWorker.InnerWorker#run 来执行任务task.run();
现在一脸懵了一直在解耦没发打断点太难了有大佬懂的NamingApp启动的可以交流一下。
之前看过2.0之前的源码和这个完全不一样懵逼了。
不过思想应该没变注册表本质还是一个Map。
看了之前的笔记是private final MapString, MapString, Service serviceMap new ConcurrentHashMap();
不过现在可能变了后面专门整一期文章看看源码有点跑偏了。还是以实战为主源码我们后面单独看哈
还有就是延迟单线程思想你会发现Nacos的注册是单线程的都会放在阻塞队列里一个个的去执行。 大家不需要担心这个效率会不会慢一般用这个的就算有几百个服务一起注册也是很快的这种发布大家还是可以忍受的。成熟的程序后不会一次注册很多
2. 服务发现
这里就先不写了上面一个注册花了好几天时间。
我们先暂时跳过
后面搞懂了把注册和发现的源码单独写一篇。
有兴趣的可以跟一下
curl -X GET http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceNamenacos.naming.serviceName
这个无疑也是从注册表Map中那信息
七、Nacos实战
自己可以建一个聚合项目然后体会一下这里不就带大家建了
1. 导入依赖
版本的对照上面已经说了大家可以去官网查看
父模块
spring.boot.version2.6.13/spring.boot.version
spring.cloud.dependencies.version2021.0.5/spring.cloud.dependencies.version
spring.cloud.alibaba.version2021.0.5.0/spring.cloud.alibaba.versiondependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring.cloud.dependencies.version}/versiontypepom/typescopeimport/scope
/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion${spring.boot.version}/versiontypepom/typescopeimport/scope
/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${spring.cloud.alibaba.version}/versiontypepom/typescopeimport/scope
/dependency子模块
要有bootstrap的依赖默认2020以上版本把bootstrap禁用了需要自己单独引不然会报错
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId
/dependency
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId
/dependency
dependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId
/dependency
!-- bootstrap 启动器 --
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-bootstrap/artifactId
/dependency结构如下 2. 配置文件
三份除了端口和服务名不一样其余都是相同的
server:port: 2000spring:application:# 应用名称name: service-ordercloud:nacos:discovery:# 服务注册地址server-addr: localhost:18848config:# 配置中心地址server-addr: ${spring.cloud.nacos.discovery.server-addr}username: nacospassword: nacos3. 测试服务注册
启动服务我们看看能否注册到Nacos上 我们发现是没有任何问题的我们后面测试把配置信息放在Nacos上
4. 测试配置中心
在之前我们可以新建命名空间来进行开发、测试、生产环境的配置隔离 我们创建了三个 上面概念时已经讲过了有三种维度实际常用的一般就是前两种分组的话取默认的即可
我们来创建配置 随便新建个配置加点东西方便我们后面访问
这里有个Data Id命名的规范
一般是服务名环境名后缀
例子service-stock-dev.yml 我们三个配置创建完成 把程序里加上这些信息
server:port: 2001spring:profiles:active: devapplication:# 应用名称name: service-stockcloud:nacos:discovery:# 服务注册地址server-addr: localhost:18848config:# 命名空间namespace: 03a31fa6-f665-40f2-9886-20b4c60498c5# 配置中心地址server-addr: ${spring.cloud.nacos.discovery.server-addr}# 指定yml格式的配置 默认propertiesfile-extension: yml# 配置文件prefixprefix: ${spring.application.name}# 共享配置shared-configs:- dataId: ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}group: ${spring.cloud.nacos.config.group}group: DEFAULT_GROUPusername: nacospassword: nacos读取配置类
// 要交给spring容器不然获取不到值
Component
// 配置读取yml文件中前缀
ConfigurationProperties(prefix product)
// 要有get方法不然无法获取值
Data
public class Product {private String name;private BigDecimal price;private String num;
}下面我们写一个测试类来获取Nacos上配置文件的信息 配置文件里的信息 八、总结
经过几天的总结、梳理断断续续的Nacos还是有点东西的源码设计还是耐人寻味
我们来总结一下吧
本篇主要从Nacos的前世今生讲起介绍了核心点。下载安装配置了Nacos进行持久化的修改。
介绍Nacos的两个核心功能服务的注册和发现、配置中心。简单的从服务的注册源码进行查看还是要自己debug看一下核心流程。基本全是发布订阅来解耦单线程阻塞队列来防止并发问题。
最后实战了一下完成的服务的注册和发现并把application.yml的信息放到Nacos上统一管理。
Nacos的市场占用率还是挺高的基本除了老项目还再用Eureka除了自研都是这个了 看到这里了还请动一下您的发财小手关注一下公众号哈谢谢您的关注文章首发看