网站运营费用预算,如何刷网站排名,广州王牌seo,icp ip 网站备案Nacos简单介绍
Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集#xff0c;帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以“服务”为中心的现代应用架构 (例…Nacos简单介绍
Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。 接下来主要介绍Nacos作为注册中心的使用和注册部分的源码解析。
Nacos安装
Nacos预装环境
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos还需要为此配置 Maven环境这里就不介绍Maven和Java安装大家自行安装一下。
安装的方式主要有两种:
从GitHub上下载源码安装:
//下载源码的地址
git clone https://github.com/alibaba/nacos.git
cd nacos/
//编译源码
mvn -Prelease-nacos -Dmaven.test.skiptrue clean install -U
ls -al distribution/target/
//进入编译包
cd distribution/target/nacos-server-$version/nacos/bin
2.下载安装包的形式:
tar -xvf nacos-server-$version.tar.gz
cd nacos/bin
启动服务器
启动命令(standalone代表着单机模式运行非集群模式):
sh startup.sh -m standalone
关闭服务器
sh shutdown.sh
单机环境下使用Mysql
在0.7版本之前在单机模式时nacos使用嵌入式数据库实现数据的存储不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力具体的操作步骤
安装数据库版本要求5.6.5初始化mysql数据库数据库初始化文件nacos-mysql.sql修改conf/application.properties文件增加支持mysql数据源配置目前只支持mysql添加mysql数据源的url、用户名和密码。
spring.datasource.platformmysql
db.num1
db.url.0jdbc:mysql://127.0.0.1:3306/nacos?characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrue
db.userroot
db.password123456
对于单机来说我们就是玩个demo是够的但是对于生产来说我们就要考虑高可用的方案了: 对于集群部署的方式如果在虚拟机环境就采用Nagix负载3台虚拟机对于K8S的环境通过Service负载3台Pod的形式搭建高可用环境对于数据库选择来说最好采用主从结构保证数据库的高可用。 整体的部署可能如下 下图就是搭建好以后的整体界面: Nacos使用
1.创建一个Spring Boot空应用
2.编辑pom.xml文件 propertiesspringboot.vetsion2.2.11.RELEASE/springboot.vetsionspring-cloud-versionHoxton.SR9/spring-cloud-versionspring-cloud-alibaba-version2.2.3.RELEASE/spring-cloud-alibaba-version/properties
dependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion${springboot.vetsion}/versiontypepom/typescopeimport/scope/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring-cloud-version}/versiontypepom/typescopeimport/scope/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${spring-cloud-alibaba-version}/versiontypepom/typescopeimport/scope/dependency /dependencies
/dependencyManagement
dependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependency
/dependencies 3.创建应用的启动项目
SpringBootApplication(scanBasePackages {com.springcloud.study})
EnableDiscoveryClient
public class SystemApplication {public static void main(String[] args) {SpringApplication.run(SystemApplication.class, args);}
}
4.配置application.yaml文 server:port: 8081
spring:application:name: system# 数据源配置项datasource:url: jdbc:mysql://127.0.0.1:3306/study_user?useSSLfalseuseUnicodetruecharacterEncodingUTF-8driver-class-name: com.mysql.jdbc.Driverusername: rootpassword: 123456#nacos基础配置cloud:nacos:discovery:server-addr: 10.226.73.115:8886#环境选择#namespace: b7d341fc-df29-45ce-b3cd-4415f66b1ee0 5.启动项目 Nacos注册部分源码分析
客户端通过Rest接口式向Nacos Server注册自己的服务提供自身的元数据比如ip地址、端口等信息。 Nacos Server接收到注册请求后就会把这些元数据信息存储在一个双层的内存Map中。对于注册部分的源码整体上分为两部分:
客户端注册源码
按照Spring Boot Starter的习惯我们首先找到spring-cloud-starter-alibaba-nacos-discovery启动项,如下图所示: 标红部分的NacosServiceRegistryAutoConfiguration是我们注册部分关注的类首先我们看下该类的整体的继承结构: 重点关注AbstractAutoServiceRegistration接口NacosAutoServiceRegistration该Bean的注入就是我们注入开始的: 整体看下该类基本上是对AbstractAutoServiceRegistration继承和实现该类位于spring-cloud-common这个jar下面Spring Cloud Commons模块是为了对微服务中的服务注册与发现、负载均衡、熔断器等功能提供一个抽象层代码这个抽象层与具体的实现无关。这样这些功能具体的实现上可以采用不同的技术去实现并可以做到在使用时灵活的更换。 NacosAutoServiceRegistration内部存在一个EventListener注解EventListener是一种事件驱动编程在spring4.2的时候开始有的可以理解为ApplicationListener接口的扩展方便我们使用可以理解为Spring为我们提供的一个事件监听、订阅的实现内部实现原理是观察者设计模式为的就是业务系统逻辑的解耦,提高可扩展性以及可维护性。事件发布者并不需要考虑谁去监听监听具体的实现内容是什么发布者的工作只是为了发布事件而已。 接下来我们重点看下AbstractAutoServiceRegistration内部start方法 register的具体的实现类是NacosServiceRegistry内部调用NacosNamingService的registerInstance方法该方法内部通过调用NamingProxy的reqApi,通过NacosRestTemplate请求服务端的/instance方法注册到服务端。 至此完成了客户端注册到服务端下图是整体的时序图: 服务端注册部分
服务端注册相对比较复杂一点这块需要将Nacos源码下载一下找到naming模块,InstanceController就是我们调用服务端的接口如下图所示: 接下来重点看下ServiceManager的registerInstance的方法如下图: 首先看下createEmptyService方法该方法目的双肩一个双层的Map对象用于存储注册应用的信息整体的结构Map(namespace, Map(group::serviceName, Service))这里正好对应注册中心介绍时候的张图我们整体在看一下: 初始化的注册表结构以后接下来就是将应用的信息注册添加到注册表中主要分为两步如下图: addIpAddresses就是获取当前注册服务的所有ip,整体的流程如下图: 这里的主要的重点是put方法这里我们全部按照CP的场景去解释AP的场景在未来的章节补充CP的实现类是DistroConsistencyServiceImpl如下图: 通过把需要注册到注册表的服务添加到阻塞队列当中Notifier本质上一个线程然后通过执行run内部的hander方法如下图: 通过调用Service的onChange方法来变更注册表的信息内部主要通过updateIPs完成注册表信息的表更主要也是采用CopyOnWrite的思想如下图: 到此服务端的注入就完成了这个里面整体上有三处亮点: 1.CopyOnWrite的思想的广泛应用; 2.通过阻塞队列实现异步任务提升系统性能并且解决并发写入问题 3.观察者设计的广泛应用