/simple-consul

consul 注册中心简易版

Primary LanguageGo

一个简易版的 consul 服务

做这个事情的目的

  • 学习掌握 SpringCloud 服务的注册发现流程原理,心跳机制,负载均衡
  • go 语言项目练手

SpringCloud 服务注册发现的流程

  • 服务注册到 consul 是通过 HTTP 接口完成
  • SpringCloud 应用启动的时候把自己的服务名,id 通过HTTP注册接口注册到对应的 consul 机器上
  • 注册完之后会调用 consul 的注册列表接口,判断自己作为一个服务是否已经注册成功
  • 当代码里面有用到 feign 调用的时候,要去检查feign调用的提供者是否已经注册,有的话则注册发现流程完成
  • SpringCloud feign 调用的过程
    • 如果feign调用里面使用的是服务名,会根据这个服务名去consul检查是否已经注册了该服务
    • consul 返回该服务名对应的所有的机器ip,端口,是一个列表
    • SpringCloud 把该服务名对应的地址列表保存到本地,并且定期刷新,防止该服务的有些实例的地址更新
    • 每次feign 调用的时候,根据服务名进行调用,底层再把服务名替换成列表里的一个地址
    • 最终是根据ip, 端口进行调用的,并且是客户端的负载均衡逻辑,负载策略包含轮询,权重,最少连接

consul 服务注册发现的逻辑

  • consul 的服务注册发现是通过 HTTP 接口实现的
  • consul 的服务注册是保存在一个 map 里面,key是服务id,value 是一个包含该服务重要信息(地址,端口)结构体
  • SpringCloud 服务定期获取刷新一个服务的信息时,consul 需要返回该服务的地址列表信息
  • consul 保持对已经注册服务的心跳机制,也是通过http接口实现的
    • 定期发起对每个已经注册的服务的全部实例发起请求 http://ip:port/actuator/health
    • 返回 status : up 就是表明该服务正常,如果不是,就是该服务已经挂掉,需要在实例列表里面剔除,俗称下线

consul 挂掉了服务还能正常调用吗?

  • 经过实测是可以正常调用的
  • 因为服务从注册中心把提供者的信息拉取下来后会保存在本地,因此并不是每次调用都去注册中心拿信息
  • 服务能正常访问,但是项目会开始报错,连接不到注册中心,并且会保持重连机制