Nacos动态配置原理浅谈

Nacos动态配置原理浅谈,第1张

1 微服务架构服务治理的概念

2, 基于nacos实现服务注册与发现

3, 使用Rest模板实现RPC调用

4,手写Rpc 客户端负载均衡算法。

SpringCloud 与SpringCloudlibaba的区别

SpringCloud rpc远程调用整合

1,nacos 分布式注册中心,分布式配置中心 SpringCloudEureka+config组合

SpringCloud rpc 远程调用整合。

1,nacos 分布式注册中心,分布式配置中心 SpringCloudEureka+cnfig组合

2,目的为了推广阿里云产品,如果使用了SpringCloudAlibaba 建议最好使用整个体系的产品。

mq,rocketmq

总结:

SpringcloudAlibaba 实际上对我们的SpringCloud 做扩展组件开发 nacos ,setata分布式解决框架, SchedulerX, Alibaba cloud OSS等,目的推广阿里云产品。

服务治理的基本概念:

服务治理的概念:

在rpc远程调用过程中,服务与服务之间依赖关系非常大,服务url地址管理非常复杂,所以,这时候需要对我们的服务的url实现治理,通过服务治理可以实现服务注册与发现,负载均衡,容错等。

服务注册中心的概念:

每次调用该服务如果地址直接写死的话,一旦接口发生变化的情况下,这时候需要重新发布版本才可以改接口调用地址,所以需要一个注册中心统一管理我们的服务注册与发现。

注册中心: 我们的服务注册到我们的注册中心,key为服务名称,value为该服务调用地址,该类型为集合类型。Eureka ,consul,zookeeper,nacos

服务注册: 我们生产者项目启动的时候,会将当前服务自己的信息地址注册到注册中心。

服务发现: 消费者从我们的注册中心上获取生产者调用的地址(集合),在使用负载均衡的策略获取集群中某个地址实现本地rpc远程调用。

微服务调用接口常用名词:

生产者: 提供接口被其他服务调用;

消费者: 调用生产接口实现消费

手动实现服务注册与发现:

1实现服务注册 发送post请求:

' >

Nacos(注册中心)是通过 IP+PORT 的形式调用其他服务。

问题:

Docker 容器使用虚拟 IP,当 Docker 中的服务 A,向 Nacos 注册的时候,Nacos 获取到了 Docker 的内部 IP,导致另外一个服务 B,想通过注册中心调用服务 A,但由于服务 B从 nacos 注册中心获取到的是服务 A 的内部 IP,这样导致了两个处于公网的微服务之间无法互相访问。

当然,配置了上述网络类型后,nacos 是可以拿到宿主机的 IP,但是此时拿到的是宿主机的内网 IP,解决办法如下:

启动 Docker 的时候,用 --network 参数,可以指定网络类型

首先启动Nacos,按照上篇文章的步骤,启动Nacos服务和项目,访问Nacos的web页面。确保项目中的服务都注册到注册中心当中了。在applicationyml同级目录下添加bootstrapyml,在Spring boot项目中bootstrapyml会比applicationyml优先初始化,所以我们需要在bootstrapyml中引入Nacos官方指定的配置文件即可(上篇文章中已经把Nacos作为配置中心的配置写入了applicationyml,现在只需要把它从applicaitonyml中剪切出来即可, 其中的spring:application:name会作为Nacos中新增配置时的Data ID,需要留意 ),再新增属性gorup进行分组测试,如下图

接着打开Nacos的服务的web页面,打开配置管理->配置列表,点击右侧新增按钮,进行新增。

Data ID: bootstrapyml配置文件中spring:application:name对应的名称

Group:指定分组(便于不同环境下的项目配置管理,因为笔者这里属于测试,所以填写的是和上文中的配置文件中group对应的test一致);

描述:针对于该配置的描述;

配置格式:配置文件的格式,要和Data ID中的后缀格式一致(这里笔者用的是yml,那么下面就选择yaml,注意该位置也可以选择properties,但是必须和上面bootstrapyml文件中的file-extension的值相匹配);

配置内容:具体的配置内容(这里笔者将项目中的applicationyml中的配置全部拷贝至其中);

测试启动consumer服务,在applicationyml中为空的时候,项目启动端口还是如Nacos配置中的9011,说明项目依赖Nacos的配置中心成功,其他服务如法炮制即可:

新增一个测试Controller,然后加上@RefreshScope注解,表明该Controller中的配置数据为自动刷新

编辑Nacos中的配置文件consumer新增相关参数type: test,访问Controller,返回test。效果如下图:

将Nacos中consumeryml文件的type: test修改为type: prod,在不重启项目的情况下重新访问对应的controller,效果如下图:

因为Dubbo是属于各个服务之间都要公用的依赖,所以将其引入cloud-common当中,详细的版本可以去 mvnrepository 搜索合适自己项目的

引入依赖后需要编写消费者服务中的配置文件,将Dubbo服务注册至Nacos,新增如下内容,其中subscribed-services指的是生产者服务,prot:-1指的是端口随机,registry:address:指的是Dubbo对应的注册中心那这里就应该设置为Nacos

接下来新增接口服务,项目类型为Maven项目,在项目中新增一个接口。并在cloud-provider(生产者)和cloud-consumer(消费者)pomxml文件中都引入该模块

在生产者实际服务中实现该接口对应的方法

在服务消费者的Controller中引入该Service,并在该Service上加入@Reference注解,注意在引入jar包的时候选择带有Dubbo的,不要使用Jdk原生的

编写消费者服务中测试Dubbo调用的接口,进行测试,测试结果如下图:

Nacos服务注册表结构:Map<namespace, Map<group::serviceName, Service>>

举例说明:

1 查看springfactories文件中帮我们自动装配的类

2查看自动装配的类

3NacosAutoServiceRegistration里的调用链路

--

添加到队列里

调用链路

为Cluster类的成员变量

run()方法什么时候触发

可以看到,使用了@PostConstruct注解将notifier提交到了一个线程池里面

我们可以看到队列大小为10241024

同时并发注册的情况应该很小,此外为写内存 *** 作,所以从队列中获取内容进行消费应该也是很快的

我们来看nacos是怎么处理的

回到

使用到了写时复制,即 读写分离 的思想

那会不会出现多个实例同时写,然后出现覆盖的问题

写时复制会不会占用很多内存空间

Service

我们可以看到 'service --> cluster --> instance' model, in which service stores a list of clusters, which contain a list of instances

一个sercie可能部署了一个集群,一个集群可能会有多个实例

Cluster

就包含了我们在updateIps()方法内最终更新的persistentInstances 和ephemeralInstances

addBeatInfo()方法

即客户端最终使用>

前置文章:

一、Spring Cloud-Erueka服务注册&发现

二、Spring Cloud-Nacos服务注册&发现

tips:Ctrl + F定位到所需内容快速阅读吧。

①常规项目:项目启动→读取applicationyml配置文件→创建Spring IOC容器→加载Bean;

②Nacos配置中心项目:项目启动→读取Nacos配置中心文件→读取applicationyml配置文件→创建Spring IOC容器→加载Bean;

注意 :此处的问题是Nacos server-addr相关配置在applicationyml中,所以引入bootstrapyml配置,来提前加载Nacos配置中心所需配置。

③Nacos配置中心项目:项目启动→读取bootstrapyml配置文件→读取Nacos配置中心文件→读取applicationyml配置文件→创建Spring IOC容器→加载Bean;

注意 :SpringCloud2020及以后的版本默认不启用 bootstrap 配置,我们需要在pom里面显式地引入,以开启bootstrapyml配置文件读取的支持。

user服务读取配置中心配置三要素:

①spring-application-name:应用名称-userservice;

②spring-profiles-active:配置文件环境-dev(代表开发环境develop);

③file-extension:文件扩展名-yaml;

配置中心处,配置文件完整名称:userservice-devyaml

①配置管理→配置列表→➕

②编写userservice-devyaml配置文件

①@Value注解注入配置属性

②方法内读取配置

在对应的@Value注解使用的类上使用@RefreshScope注解

编写Config类:prefix = "pattern" + [field] dateformat,与配置文件patterndateformat 对应即可。

配置优先级 :[spring-application-name][spring-profiles-active][file-extension]>[spring-application-name][file-extension]>本地配置;

即:服务名-环境类型yaml>服务名yaml>本地配置。

如果配置不同,则合并,相同则优先级高的覆盖优先级低的。

另外:extension-configs的加载后于shared-configs。

以上即为Nacos配置管理的基础内容,感谢阅读。

以上就是关于Nacos动态配置原理浅谈全部的内容,包括:Nacos动态配置原理浅谈、Nacos服务发现、71 nacos 实现微服务的注册与发现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9607413.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存