透明化路由:消费者只知道当前服务者提供了哪些方法,并不知道服务具体在什么位置,这就是透明化路由
服务提供者将需要发布的服务地址信息和属性列表写入注册中心,消费者根据本地引用的接口名称等信息从注册中心获取服务提供者列表,缓存到本地
消费者可能先于服务者启动服务提供者动态增加或者宕机退出就会导致注册中心发生服务提供者地址变更,注册中心检测到变更之后会主动推送给服务消费者,消费者根据变更列表刷新本地缓存,保证本地服务列表实时的准确性
采用客户端缓存服务提供者的方式不仅可以提升服务性能还能保证系统可靠性,当注册中心全部宕机之后,服务依然可用,只是没办法发布新的服务和老服务下线
负载均衡:
1)随机 在对等集群组网中,随机路由有算法消息分发还是比较均匀的,问题
a.在一个截面上碰撞的概率较高
b.费对等集群组网,或者硬件配置差异较大时,会导致各节点负载不均衡
2)轮询 较慢的服务会堆积请求
实现比较简单就是按照权重遍历服务者列表,到达上限之后重新归零,继续循环
3)服务调用时延,消费者缓存服务提供者的平均时延,然后计算每个服务提供者的平均时延和调用时延,根据差值的大小动态调整权重,是性能好的服务接收较多的消息,实现均衡
4)一致性hash
相同的请求总是发到同一个服务提供者,某一台服务宕机后原本发往该机器的请求,基于虚拟节点平台到其它提供者,不会引起剧烈的变动
本地路由优先策略:
1)injvm模式 injvm是一个伪协议,它不开启端口,也不发起远程调用,优先调用本地jvm内的服务提供者,若用户配置了jvm模式,优先寻找本JVM内的服务提供者
2)innative模式本进程JVM内有没有符合要求的服务提供者->服务提供者IP或本机IP相同的本地和设的服务提供者进程(有、通过本地网卡调用服务提供者)->远程调用
本地网卡回环不会占用网络带宽,延时也比较低
路由规则:
1)ip白名单 consumerip!=127.0.0.2*
2)流量引导,只暴露一部分的服务提供者 providerIP=192.168.1.1*
3)读写分离 method=find*,list*,get*query*=>providerIP=192.168.1.1*
4)前后端分离 app=>web*=>providerIP=192.168.1.1*,app=>java*=>providerIP=192.168.2.1*
5)灰度升级,将app前台应用路由到新的服务器 app=>web*=>providerIP=192.168.1.1*
跨机房部署服务器的时候,要尽量减少服务跨机房调用,可以通过路由分组策略或者是虚拟分组技术来实现