模拟一下在SpringCloud中服务和服务之间调用的过程
客户端向服务中心注册,比如Eurka
或nacos
注册中心
服务端向服务中心拉取,负载均衡到一个客户端(根据服务名称到服务中心获取IP
和端口)
根据IP
和端口开始远程调用
服务与服务之间用的协议是什么 FeignClient底层用的是什么协议
在SpringCloud
中主要使用两种,Http
和RPC
Http
:基于请求和响应的协议,例如RestTemplate
和Feign
- 优点:耦合度低,可以使用测试工具
postman
对请求进行测试 - 缺点:速度慢
RPC:remote procedure call
远程过程调用,调用远程函数像调用本地函数一样,开发者无需关心网络传输细节,例如gRPC
和Dubbo
- 优点:使用
socket
通信,双向通信,网络传输速度快,实时性好 - 缺点:耦合度高
redis的哨兵模式
redis
的高可用解决方案,通过sentinel
(哨兵)进程监控redis
情况,sentinel
不断给主节点发送ping
命令,如果主节点没有回复,被该sentinel
判定为主观下线,因为有可能是网络原因,所以不能判断真的宕机,如果超过多个sentinel
判定是主观下线,这就认定为客观下线,那么就会选举slave
作为新的master
,实现自动故障转移和主从切换
CAP的原理
C:consistency
,一致性,节点数据发生变化,其他节点必须在第一时间内获得新数据
A:available
,可用性,任何时刻都需要响应客户端的请求
P:partition tolerance
,分区容错,一定会出现,发生网络故障导致通信失败,接受在其他分区运行,因为其他分区有故障节点数据
BASE理论
CP
:强一致,同时提交、同时回滚
AP
:最终一致,会出现软状态,临时不一致,软状态结束后,数据一致,例如秒杀某个商品的时候,前一秒显示还有库存,等提交订单支付失败,因为高可用,所以页面数据和数据库数据出现暂时不一致,但是服务是一直在,库存没了自然不能支付成功
注意:没有CA
,违背了分布式系统设计的初衷,因为放弃了分区,没部署子节点
数据库主从复制的原理
主库进行修改、增加、删除,从库进行查询,主库把修改的数据记录到二进制文件binary log
,从库I/O
线程把binary log
写到中继日志relay log
,然后由从库SQL
线程解析relay log
日志生成SQL
脚本,最后执行SQL
脚本达到数据一致