这是我参与「第三届青训营 -后端场」笔记创作活动的第4篇笔记
服务注册与服务发现
此图为我们组抖声项目的架构图
蓝色箭头代表服务注册与发现相关的交互,采用etcd作为服务的注册中心,服务间调用需要知道IP、端口等信息。服务注册中心是服务发现的一个关键部分。它是一个包含了服务实例网络位置的数据库。
服务注册中心必须是高可用和最新的。虽然客户端可以缓存从服务注册中心获得的网络位置,但该信息最终会过期,客户端将无法发现服务实例。因此,服务注册中心由使用了复制协议来维护一致性的服务器集群组成。
服务发现的基本步骤
一个服务注册中心,以下基本功能要满足:
- 服务注册:服务主动向服务器提交注册请求
- 服务下线:服务主动向服务器提交下线请求
- 服务获取:调用方从注册中心获取服务信息
- 服务发现:通过名称能查询到服务提供外部访问的 IP 和端口号。比如网关代理服务时能够及时的发现服务中 新增节点、丢弃不可用的服务节点,同时各个服务间也能感知对方的存在。
ETCD
etcd 是使用 Go 语言编写的开源项目,它通过Raft 一致性算法处理日志复制以保证强一致性。
etcd像是专门为集群环境的服务发现和注册而设计,它提供了数据 TTL 失效、数据改变监视、多值、目录监听、分布式锁原子操作等功能,可以方便的跟踪并管理集群节点的状态。
etcd是一个高度一致的key-value存储,本质就是一个key-value存储组件。其应用都是针对键值存储的功能展开,应用场景较多的是服务注册和发现。
以项目中user服务为例
// etcd注册件
etcdReg := etcd.NewRegistry(
registry.Addrs("127.0.0.1:2379"),
)
// 得到一个微服务实例
microService := micro.NewService(
micro.Name("rpcUserService"), // 微服务名字
micro.Address("127.0.0.1:8082"),
micro.Registry(etcdReg), // etcd注册件
)
// 结构命令行参数,初始化
microService.Init()
// 服务注册
_ = services.RegisterUserServiceHandler(microService.Server(), new(logic.UserService))
// 启动微服务
_ = microService.Run()
可以看到user服务注册在8082端口,在网关处只要用user服务的服务名称就可以调用user服务中的方法。
//user
userMicroService := micro.NewService(
micro.Name("userService.client"),
)
// 用户服务调用实例
userService := services.NewUserService("rpcUserService", userMicroService.Client())
例如调用user服务中的Register方法
// 从gin.Key中取出服务实例
userService := c.Keys["userService"].(services.UserService)
userResp, err := userService.Register(context.Background(), &userRegisterReq)