注册中心
注册中心主要用来解决在服务端异常、扩容、缩容时如何快速通知客户端。常见的注册中心有Zookeeper、etcd、consul、nacos、eureka等。
- 注册中心主要提供两个基本功能:
- 提供服务地址的存储
- 当存储内容发生变化时,将变化内容推送给客户端
- 完整的服务注册和发现的过程:
- 客户端会与注册中心建立连接,并且告诉注册中心,它对哪一组服务感兴趣;
- 服务端向注册中心注册服务后,注册中心会将最新的服务注册信息通知给客户端;
- 客户端拿到服务端的地址之后就可以向服务端发起调用请求了。
- 注册中心一个很重要的功能是如何管理服务状态,有两种思路:1. 主动探测;2. 心跳模式
- 主动探测;注册中心每隔一段时间探测服务端口是否可用,根据是否可用来判断是否正常。这种方式有两个问题:服务端需要开放统一的端口来判断是否正常;实例多时,会增加探测成本。
- 心跳模式:服务端每隔一段时间就发送心跳请求,来更新注册状态;心跳机制相比主动探测的机制,适用范围更广。
注册中心节点提供一些保护策略,避免节点被过度摘除导致的服务不可用。
分布式Trace
经过服务化拆分之后,服务的可扩展性增强,服务节点增加。一个请求会经过多个RPC服务或者使用多个资源,当请求出现异常或时延过长时,如何快速定位异常及确定请求时延长的节点。此时需要能过分布式Trace来快速定位问题。
- 可以通过 requestId 将多个服务器上的日志串起来,但是仅仅依靠 requestId 很难表达清楚服务之间的调用关系,所以从日志中就无法了解服务之间是谁在调用谁。因此,我们采用 traceId + spanId 这两个数据维度来记录服务之间的调用关系(这里 traceId 就是 requestId),也就是使用 traceId 串起单次请求,用 spanId 记录每一次 RPC 调用。
- 对于分布式trace一般会与到性能问题,也就是因为引入了分布式追踪中间件,导致对于磁盘 I/O 和网络 I/O 的影响。可以通过增加一个开关,方便在线上随时将日志打印关闭;或者增加一个日志采样率的参数,开始设置一个较低的日志采样率,观察系统性能情况再调整到一个合适的数值。