
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 实现微服务的注册与发现等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)