zl程序教程

您现在的位置是:首页 >  其他

当前栏目

naco源码三--服务注册源码

2023-09-27 14:25:58 时间
一. Nacos Ribbon Feign微服务架构图

1187916-20200722075119532-1963491123.png

架构原理 


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架构图

1187916-20200722080028816-1764000708.png


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服务注册表结构:Map namespace, Map group::serviceName, Service

1187916-20200722081124875-1993172107.png

四. nacos服务注册源码

1187916-20200725082335950-1008037677.png


上面整体是在alibaba客户端实现的源码 我们找到了服务注册请求的url 那么接下来 就要跳转到nacos服务端的源码了 首先我们来看看那nacos服务端源码

1187916-20200726090012215-954360825.png


这是nacos的项目 目前我们接触到了几个包


1. client包 alibaba.nacos调用nacos就是这个包里面的内容

2. console包 nacos服务器页面相关的diamante

3. distribution包 nacos服务打包后的文件就放在了distribution包中

4. example包 nacos服务的代码示例

5. naming包 这个很重要的包 我们之前经常会使用到NamingService获取服务注册发现的信息。 这个包就是服务器注册发现包。

 

下面我们来重点看一下这个包。 

1187916-20200726090403592-1561548476.png

 nacos本身也是使用spring-boot实现 所以项目结构和我们通常使用的spring-boot项目是一样的。


大致看一线 看到有controllers 这个应该是项目首先应该看的。 还有healthcheck健康检查 monitor监控等等。


我们先来看controller 我们现在的目标是服务注册 所以 看controller名字 猜到大概应该看InstanceController。


下面来验证猜测

1187916-20200726093151057-1336365637.png


 看到请求的链接 可以确定 找对地方了。 


根据上面分析的大图 我们知道我们要找的是v1/ns/instance 且请求类型是post 第一个便是

1187916-20200726093346938-1361764509.png


 start/init看源码必看--非常重要


最近在拜读Draveness大佬的一篇文章自动释放池的前世今生 ---- 深入解析 autoreleasepool,看到文中给读者留了一个问题: 我到现在也不是很清楚为什么要根据当前页的不同状态 kill 掉不同 child 的页面。
Katana-CookieAuthenticationMiddleware-源码浅析 准备工作 第一步,建立一个模板项目 本文从CookieAuthenticationMiddleware入手分析,首先我们来看看哪里用到了这个中间件,打开VisualStudio,创建一个Mvc项目,然后身份验证选择个人身份验证。