![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Nacos
文章平均质量分 76
vinylon1022
这个作者很懒,什么都没留下…
展开
-
Nacos源码分析二十四、Raft选举过程(2)
MasterElection 投票前面我们看到了MasterElection用于选举的任务,我们再看一下run方法:@Overridepublic void run() { try { // ready状态 if (!peers.isReady()) { return; } //获取本地结点 RaftPeer local = peers.local(); // 任期-500原创 2021-01-12 16:33:36 · 450 阅读 · 0 评论 -
Nacos源码分析二十三、Raft选举过程(1)
关于raft的原理就不多介绍了,有兴趣的百度吧。这里提供一个小动画,蛮形象的,加深理解吧。我们知道raft节点的状态只有leader、follower、candidate三种。各状态流转如下:然后我们讲几个概念:majority 大多数term任期 – 任期是不断增加的election选举然后有两个超时时间election timeout – 选举超时时间heatbeat timeout – 心跳超时时间下面我们看一下nacos启动时做了什么吧。我们思考一下既然要看启动做了什么,原创 2021-01-12 11:41:56 · 817 阅读 · 0 评论 -
Nacos源码分析二十二、数据一致性同步-CP
然后是RaftConsistencyServiceImpl CP强制一致性实现。同样是put方法:@Overridepublic void put(String key, Record value) throws NacosException { try { raftCore.signalPublish(key, value); } catch (Exception e) { Loggers.RAFT.error("Raft put failed.",原创 2021-01-11 15:02:02 · 777 阅读 · 0 评论 -
Nacos源码分析二十一、数据一致性同步-AP
先讨论DistroConsistencyServiceImpl AP最终一致性的实现。我们知道当添加实例时会调用到put方法:@Overridepublic void put(String key, Record value) throws NacosException { onPut(key, value); // 一致性协议的同步数据。这里同步数据是异步任务执行的,也就是说先返回客户端put成功再同步,弱一致性。 AP模型 distroProtocol.sync(new D原创 2021-01-11 14:47:18 · 1164 阅读 · 1 评论 -
Nacos源码分析二十、数据一致性同步总览
之前在讨论服务端实例注册时已经看到了部分数据一致性同步的相关内容。 以下两篇把这个课题单独拿出来讨论一下。Nacos内部使用AP、CP两种一致性方案,如果实例是临时的,则是AP,如果是永久的,则是CP。一致性服务接口是ConsistencyService,我们看一下它的类图:其中左半部分是AP,右半部分是CP。中间的DelegateConsistencyServiceImpl是一个代理类,通过它来确定是使用AP还是CP:@DependsOn("ProtocolManager")@Service(原创 2021-01-11 14:31:04 · 483 阅读 · 0 评论 -
Nacos源码分析十九、服务端处理查询实例列表
前面分析客户端服务发现时,已经知道是调用NacosNamingService的getAllInstances方法查询实例列表,跟进去是NamingProxy的queryList方法:public String queryList(String serviceName, String clusters, int udpPort, boolean healthyOnly) throws NacosException { final Map<String, String&原创 2021-01-11 13:39:32 · 799 阅读 · 0 评论 -
Nacos源码分析十八、服务端的心跳处理
上篇在服务注册时我们注意到,每个Service实例化时会创建一个心跳检测任务ClientBeatCheckTask:@Overridepublic void run() { try { if (!getDistroMapper().responsible(service.getName())) { return; } if (!getSwitchDomain().isHealthCheckEnabled()原创 2021-01-11 13:28:16 · 494 阅读 · 0 评论 -
Nacos源码分析十七、服务端实例注册分析
本篇讨论nacos服务端对于实例注册的处理流程。先回想一下客户端如何发起注册请求的,代码在NacosNamingService的registerService方法:@Overridepublic void registerInstance(String serviceName, String groupName, Instance instance) throws NacosException { if (instance.isEphemeral()) { BeatInfo原创 2021-01-11 11:29:12 · 638 阅读 · 0 评论 -
Nacos源码分析十六、服务端配置新增修改和删除
Nacos服务端对于配置的新增修改和删除这部分,相对比较简单。代码还是在ConfigController里,publishConfig方法提供新增和修改,deleteConfig方法提供删除操作publicConfig@PostMapping@Secured(action = ActionTypes.WRITE, parser = ConfigResourceParser.class)public Boolean publishConfig(HttpServletRequest request,原创 2021-01-08 15:45:00 · 989 阅读 · 0 评论 -
Nacos源码分析十五、服务端处理配置监听
还记得NacosConfigService里的那个长轮询监听配置变更么?ClientWorker类里的LongPollingRunnable内部类。我们看一下它的run方法里的这句:List<String> changedGroupKeys = checkUpdateDataIds(cacheDatas, inInitializingCacheList);这个方法就是调用服务端的/v1/cs/configs/listener接口,以监听可能出现变更的配置数据。往里跟一下代码:List&l原创 2021-01-08 15:21:54 · 696 阅读 · 0 评论 -
Nacos源码分析十四、服务端处理获取配置请求
Nacos客户端的学习已经基本告一段落。从本篇开始我们把关注点放在服务端。我们知道nacos服务端主要功能就是提供配置中心的功能和命名服务。接下来我们还是按这两部分讨论。首先是配置中心。我们先看一下服务端如何处理客户端发起的获取配置的请求,相应接口是在com.alibaba.nacos.config.server.controller.ConfigController中定义,我们看一下getConfig方法:@GetMapping@Secured(action = ActionTypes.READ,原创 2021-01-08 11:52:11 · 492 阅读 · 0 评论 -
Nacos源码分析十三、客户端服务发现
前面分析了NacosNamingService的基本工作内容,下面我们结合dubbo看一下服务发现部分内容。先看一下dubbo中RegistryProtocol的refer方法:public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException { ... return doRefer(cluster, registry, type, url);}private <原创 2021-01-08 09:46:23 · 327 阅读 · 0 评论 -
Nacos源码分析十二、NacosNamingService
上篇说到Nacos对于服务注册和发现的支持是通过NamingService接口来实现的,对应的实现类是NacosNamingService,本篇详细介绍这个类。先上一个结构图简单看一下这个类的结构,有个大体的了解:看一下初始化代码:private void init(Properties properties) throws NacosException { ValidatorUtils.checkInitParam(properties); this.namespace = Ini原创 2021-01-07 17:39:53 · 988 阅读 · 0 评论 -
Nacos源码分析十一、客户端服务注册
前面部分主要是分析了nacos作为配置中心时,客户端的相关逻辑,主要包括:configService的初始化,对数据的监听结合spring-cloud实现动态配置更新。关于nacos服务端的存储结构后面再统一分析。本篇分析nacos作为注册中心时客户端如何进行服务注册。我们以dubbo+nacos为例。首先添加依赖:<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId原创 2021-01-07 13:49:12 · 595 阅读 · 0 评论 -
Nacos源码分析十、配置动态刷新(3)
前文提到RefreshScope中维护了一个map缓存,缓存的内容是包装原bean的BeanLifecycleWrapper,这个包装类具备销毁能力。当新的配置更新通知来后,我们只要能找到RefreshScope去销毁了对应的bean,那么再次使用时cglib的proxy就会重新去获取target类实例,然后重新实例化。回到NacosContextRefresher类,看一下注册监听的代码:private void registerNacosListener(final String groupKey,原创 2021-01-07 09:26:58 · 1017 阅读 · 2 评论 -
Nacos源码分析九、配置动态刷新(2)
前文分析了@RefreshScope注解和RefreshScope类相关内容,我们了解到此时被@RefreshScope注解的类所对应的代理类类型已经换成了LockedScopedProxyFactoryBean,本篇主要分析这个类的作用。首先看一下这个类的类图:从这个图上可以看到FactoryBean。 这是一个工厂bean,也就是说容器中getBean得到的对象是通过它的getObject方法得到的。BeanFactoryAware。 beanFactory注入,需要关注一下setBeanF原创 2021-01-06 17:47:18 · 398 阅读 · 0 评论 -
Nacos源码分析八、配置动态刷新(1)
回顾一下前面分析的内容,NacosConfigAutoConfiguration定义了NacosContextRefresher监听器,监听ApplicationReadyEvent事件,当触发事件后会往nacos的configService中注册配置监听,Nacos在收到配置变更时会向applicationContext发布RefreshEvent事件。下面我们分析触发这个事件的后续操作。首先我们定义一下测试代码:@RestController@RequestMapping("/refreshCon原创 2021-01-06 16:56:41 · 823 阅读 · 0 评论 -
Nacos源码分析七、NacosConfigAutoConfiguration配置类
Nacos除了Bootstrap的自动配置类,同时也配置了SpringBoot的自动配置:org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.alibaba.cloud.nacos.NacosConfigAutoConfiguration,\com.alibaba.cloud.nacos.endpoint.NacosConfigEndpointAutoConfigurationNacosConfigEndpoint原创 2021-01-06 08:55:10 · 1479 阅读 · 0 评论 -
Nacos源码分析六、NacosConfigBootstrapConfiguration配置类
前文在分析BootStrapApplicationListener时得到当引入nacos时,会加载NacosConfigBootstrapConfiguration配置类:@Configuration(proxyBeanMethods = false)@ConditionalOnProperty(name = "spring.cloud.nacos.config.enabled", matchIfMissing = true)public class NacosConfigBootstrapConfi原创 2021-01-05 17:23:57 · 3937 阅读 · 0 评论 -
Nacos源码分析五、BootstrapApplicationListener运行原理(2)
接着上篇,我们看BootstrapImportSelectorConfiguration配置类:@Configuration(proxyBeanMethods = false)@Import(BootstrapImportSelector.class)public class BootstrapImportSelectorConfiguration {}Import了一个Selector:@Overridepublic String[] selectImports(AnnotationMe原创 2021-01-05 16:33:58 · 579 阅读 · 0 评论 -
Nacos源码分析四、BootstrapApplicationListener运行原理(1)
要理解nacos的配置变更如何更新到应用的配置上,这部分的内容属于SpringCloud部分的,要全部串起来,需要了解spring-cloud-context和spring-cloud-alibaba-nacos-config相关的内容。一下学习过程spring-cloud-alibaba-nacos-config版本为2.2.1.RELEASE,对应spring-cloud-context版本为2.2.2.RELEASE我们先看BootStrapApplicationListener怎么来的吧首先sp原创 2021-01-05 15:39:27 · 788 阅读 · 2 评论 -
Nacos源码分析三、配置中心(2)
从NacosConfigService的构造方法里this.worker = new ClientWorker(this.agent, this.configFilterChainManager, properties);这行代码开始,看下ClientWorker的初始化做了什么:public ClientWorker(final HttpAgent agent, final ConfigFilterChainManager configFilterChainManager, fin原创 2021-01-05 13:37:27 · 539 阅读 · 1 评论 -
Nacos源码分析二、配置中心(1)
首先nacos服务端分为集群部署和单机部署两种模式,我们以单机部署为例。具体部署方式参考官方文档。链接这里默认启动本地单机模式服务端。我们以com.alibaba.nacos.example.ConfigExample这个测试类进行分析。public static void main(String[] args) throws NacosException, InterruptedException { String serverAddr = "localhost"; String原创 2021-01-05 13:36:40 · 1294 阅读 · 0 评论 -
Nacos源码分析一、前言
今天开始进入nacos的学习。nacos是spring-cloud-alibaba下的一个组件,致力于配置中心和注册中心。服务(Service)是Nacos世界的一等公民。既然知道了nacos的作用,那么我们需要学习哪方面的内容呢?大概整理了一下,后面的学习过程也是按照这些内容一步步进行。作为配置中心如何实现配置数据的远程管理; 当配置发生变更时如何同步到应用服务。–这部分是spring-cloud-alibaba内容。作为注册中心,需要实现注册中心相关功能provider端如何以nacos作原创 2021-01-05 13:35:35 · 1023 阅读 · 0 评论