naco源码三--服务注册源码
一. Nacos&Ribbon&Feign微服务架构图
架构原理
1. 微服务系统在启动时将自己注册到服务注册中心,同时对外发布 Http 接口供其它系统调用(一般都是基于Spring MVC)
2、服务消费者基于 Feign 调用服务提供者对外发布的接口,先对调用的本地接口加上注解@FeignClient,Feign会针对 加了该注解的接口生成动态代理,服务消费者会针对 Feign 生成的动态代理去调用方法时,在底层会生成Http协议格式的请求,类似 /stock/deduct?productId=100
3、Feign 最终会调用Ribbon从本地的Nacos注册表的缓存里根据服务名取出服务提供在机器的列表,然后进行负载均衡 并选择一台机器出来,对选出来的机器IP和端口拼接之前生成的url请求,生成类似调用http接口地址 http://192.168.0.60:9000/stock/deduct?productId=100,最后基于HTTPClient调用请求
二. nacos架构图
Nacos核心功能点
-
服务注册
Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。
Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
-
服务心跳
在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认 5s发送一次心跳。
-
服务同步
Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。
-
服务发现
服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,
同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存
-
服务健康检查
Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的 healthy属性置为false(客户端服务发现时不会发现),
如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送 心跳则会重新注册)
三. Nacos核心功能源码架构图
四. nacos服务注册源码
上面整体是在alibaba客户端实现的源码, 我们找到了服务注册请求的url, 那么接下来, 就要跳转到nacos服务端的源码了, 首先我们来看看那nacos服务端源码
这是nacos的项目, 目前我们接触到了几个包
1. client包: alibaba.nacos调用nacos就是这个包里面的内容
2. console包:nacos服务器页面相关的diamante
3. distribution包:nacos服务打包后的文件就放在了distribution包中
4. example包:nacos服务的代码示例
5. naming包:这个很重要的包,我们之前经常会使用到NamingService获取服务注册发现的信息。 这个包就是服务器注册发现包。
下面我们来重点看一下这个包。
nacos本身也是使用spring-boot实现,所以项目结构和我们通常使用的spring-boot项目是一样的。
大致看一线, 看到有controllers,这个应该是项目首先应该看的。 还有healthcheck健康检查,monitor监控等等。
我们先来看controller, 我们现在的目标是服务注册,所以,看controller名字,猜到大概应该看InstanceController。
下面来验证猜测
看到请求的链接, 可以确定,找对地方了。
根据上面分析的大图, 我们知道我们要找的是v1/ns/instance,且请求类型是post,第一个便是
start/init看源码必看--非常重要 记得看