1.序列化与反序列化
涉及到网络通信,就少不了序列化和反序列化。一般用于数据持久化、网络传输等。
1.1 序列化与反序列化介绍
序列化:又称编码,将对象转换成字节数组
反序列化:又称解码,将字节数组转换成对象
2.分布式服务框架协议栈
- 传输层协议:传输层协议用于在网络中传输数据,常见的传输层协议有TCP/UDP。TCP是提供可靠的连接,适用于对数据传输的可靠性要求较高的场景,而UDP协议提供不可靠的连接,适用于对实时性要求高的场景。
- 通信协议:通信协议定义了服务之间的通信规范,常见的通信协议有HTTP、REST、RPC等。HTTP协议是一种基于文本的协议,广泛应用于Web服务中;REST是一种基于HTTP协议的架构风格,提供了一组统一的接口规范;RPC是一种远程过程调用协议,允许客户端调用远程服务的方法。
- 序列化协议:序列化协议用于将数据转换为字节流进行传输,场景的序列化协议有JSON、XML。
- JSON:一种轻量级的数据交换格式,易于阅读和编写。
- XML:一种可扩展的标记语言,广泛应用于数据交互和配置文件。
- 服务发现和注册协议:服务发现和注册协议用于管理分布式系统中的服务,常见的协议有ZooKeeper。而Zookeeper是一个分布式的协调服务,提供了一个高可用的服务注册和发现功能。
- 负载均衡协议:负载均衡协议用于分发请求到多个服务实例,常见的协议有Round Robin和Consistent Hashing。Round Robin是一种简单的负载均衡算法,将请求一次分到每个服务实例;Consistent Hashing是一种根据请求的键值进行分片的负载均衡算法,可以保证在服务实例的增减时尽量保证数据迁移。
3.路由
3.1 透明化路由
透明化路由:指在网络通信中,通过一种机制使得网络路由对于应用程序或网络用户来说是一种透明的,不需要手动配置路由。
在分布式中,服务注册中心用于存储服务提供者地址信息、服务发布相关的属性信息,消费者通过主动查询和被动通知的方式获取服务提供者的地址信息,而消费者也只需要知道当前系统有哪些服务可选,不关心服务在哪,这就是分布式里面的透明化路由。
简单说就是消费者不需要关心服务位置。
这里来介绍一下服务注册中心
服务消费者和服务提供者通过注册中心提供的SDK与服务注册中心进行连接,服务提供者只需要将自己的服务地址和属性列表写到注册中心,然后服务注册中心会将服务列表提供给消费者。并且当服务提供者的服务进行更新后,注册中心同时也会进行更新,并将新的服务列表给消费者。
消费者调用服务提供者时,不需要每次调用都去服务注册中心查询服务提供者地址列表,消费者往往直接从本地缓存的服务提供者路由表中查询地址信息,根据路由策略进行服务选路。
3.2 负载均衡
分布式服务框架中提供几种负载均很策略
- 轮询:按照顺序策略将请求依次分发给每个服务实例,循环往复,适用于服务实例相似的场景。
- 加权轮询:为每个服务实例分配一个权重值,根据权重值决定分发请求的比例,权重值越高,分发的请求越多,适用于服务实例性能差异较大的场景。
- 随机:随机选择一个服务实例来处理请求。适合服务实例性能相似的场景。
- 最少连接:将请求分发给当前连接数量最少的服务实例,以保证各个服务实例负载均衡,适用于长连接的场景,能够更好地处理连接数较大的情况。
- IP哈希:根据请求的源IP地址进行哈希计算,将相同源IP的请求分发到同一个服务实例,适用于需要保持会话一致性的场景,比如需要将同一个用户的请求发送到同一个服务实例。
- 一致性哈希:根据请求的键值进行哈希计算,将哈希结果映射到一个固定的哈希环上,根据环上的位置选择服务实例,一致性哈希能够在服务实例的增加或减少时尽量减少数据迁移。适用于需要保持数据分片一致性的场景。
- 自适应:根据服务实例的负载情况动态调整请求的分发策略,将请求分发给负载较低的服务实例,适用于负载变化较大的场景。
以上就是负载均衡策略,具体使用哪种还是根据自身业务需求进行选择。
3.3 本地路由优选策略
- injvm策略:在本地服务和远程服务中,根据性能、可靠性等角度考虑,优选选择本地服务的服务提供者这就是injvm策略。它只是一个伪协议,不开启端口、也不发起远程服务调用,优选调用JVM内部的服务提供者。当用户配置了injvm路由模式,优选选择本地服务,如果本地找不到,才会发起远程服务调用。
- innative策略:服务消费者和服务提供者可能会被部署到同一台机器上(VM),服务器会优先选择本地的服务提供者,如果找不到才会发起远程服务调用。这里要和injvm有所区别的是,innative模式是在injvm前多了一层,会先在同一台机器里找服务。
innative策略的处理流程如下:
- 首先查看本进程JVM内部是否存在服务提供者,如果有直接发起本地API请求。
- 当JVM内部没有,选择服务提供者IP地址与本机IP地址相同的本地合适的服务提供者进程,通过本地网卡回环调用服务提供者。
- 如果服务器(VM)内部找不到符合条件的服务提供者,则发起远程服务调用
innative策略有点在于是通过本地网卡回环调用服务,所以不需要占用太多的网络带宽。
3.4 分布式服务框架下路由规则
在分布式服务框架下,路由规则用来决定请求应该发送到哪一个服务实例。
- 负载均衡:根据服务实例的负载情况,将请求均匀地分发到不通过的服务实例上。
- 基于权重的路由:给每一个服务实例分配一个权重值,根据权重来决定请求的分发比例,权重可以根据服务的性能、资源占用情况来进行动态调整。
- IP Hash路由:根据客户端的IP地址进行Hash计算,将同一个客户端的请求发送给同一个服务实例,这样就能保证同一个客户端的请求都被发送到同一个服务实例上,从而实现会话保持。
- 服务版本路由:根据请求中指定的服务版本号来决定请求的分发,这样可以实现不同版本的服务共存,并且能够根据需要灵活地切换不同版本。
- 服务容错路由:根据服务实例的健康状况来决定请求的分发,如果某个服务实例出现故障或者负载过高,可以将请求发送给其他健康的服务实例。
- 服务区域路由:根据请求的来源地区或者网络延迟等因素,将请求发送给最近的服务实例,以提高响应速度和用户体验。