Nacos & Ribbon & Feign 核心微服务架构图
核心原理如下
微服务系启动时将自己的相关的元数据信息注册到注册中心,同时暴漏对外调用的HTTP接口
服务消费者基于Feign调用服务提供者对外发布的接口,先对调用的本地接口加上@FeignClient注解,Feign会针对加了该注解的接口生成动态代理,服务消费者会针对Feign生成的动态代码方法调用方法时,会在底层生成Http协议格式的请求,类似/stock/deduct?productId=999
Feign最终会调用Ribbon从本地的Nacos注册表的缓存里根据服务名取出服务提供者所在的机器列表,然后进行负载均衡并选择一台几区出来,对选出来的机器IP和端口拼接之前的url ,生成类似调用http接口地址http:/192.168.1222.22:7000/stock/deduct?productId=999,最后基于HttpClient调用请求。
Nacos核心功能
服务注册
Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
服务心跳
在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。
服务健康检查
Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)
服务发现
服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存
服务同步
Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。
源码下载 & 启动
https://nacos.io/zh-cn/docs/system-configurations.html
- nacos源码导入要求maven 3.2.5以上版本
【standalone模式】
运行console模块里的 com.alibaba.nacos.Nacos.java
Nacos.java 启动需要增加启动vm参数,注意nacos.home目录要改成你自己源码对应的distribution模块目录 -Dnacos.standalone=true -Dnacos.home=D:\IdeaProjects\nacos-1.1.4\distribution
启动后访问 http://localhost:8848/nacos/index.html
【cluster模式】
nacos 集群模式需要 需要配置mysql 。
- 先创建一个数据,名字随意
- 执行 distribution/conf 目录下的 nacos-mysql.sql 脚本
- 修改 console\src\main\resources 目录下的 application.properties 文件里的mysql配置
### If use MySQL as datasource: spring.datasource.platform=mysql ### Count of DB: db.num=1 ### Connect URL of DB: db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=root db.password.0=artisan
运行console模块里的 com.alibaba.nacos.Nacos.java , 需要增加启动vm参数端口号和实例运行路径nacos.home(对应的目录需要自己提前创建好),每台server的nacos.home目录里需要创建一个conf文件夹,里面放一个cluster.conf文件,文件里需要把所有集群机器ip和端口写入进去
127.0.0.1:6000 127.0.0.1:6001 127.0.0.1:6002
Nacos服务注册表结构
// Map<namespace, Map<group::serviceName, Service>> private Map<String, Map<String, Service>> serviceMap = new ConcurrentHashMap<>();
源码流程图
呶 ,图都给你画好了,https://www.processon.com/view/link/6201bbaf1e08530f015e6cc5