【分布式版本控制系统】分布式 + RPC

分布式

什么是分布式系统?
【分布式版本控制系统】分布式 + RPC_第1张图片
随着互联网的发展,往会展应用规模不断扩大,常规的垂直用应用架构已经无法应对;
我们需要把单个功能分散在分布式系统中的小模块中,这是很复杂的;
如何管理这些分布式系统?
一个治理系统是很必要的;
比如Dubbo,能用分布式思想来管理结构应用。


架构发展

【分布式版本控制系统】分布式 + RPC_第2张图片

1.ORM 单一应用架构
对象关系映射 Object Relational Mapping
特点:ALL IN ONE
【分布式版本控制系统】分布式 + RPC_第3张图片

2.MVC
特点:Vertical Application 垂直架构

【分布式版本控制系统】分布式 + RPC_第4张图片

3.RPC
【分布式版本控制系统】分布式 + RPC_第5张图片

4.SOA
【分布式版本控制系统】分布式 + RPC_第6张图片


RPC

什么是RPC?
Remote Procedure Call
远程过程调用,就是像调用本地方法一样调用远程方法。
RPC是分布式框架中各个服务器之间调用的方法:

常见RPC框架结构图:

【分布式版本控制系统】分布式 + RPC_第7张图片
RPC两个核心模块:
通讯;
序列化;
——————————————
市面上流行的RPC框架:
dubbo
gRPC:谷歌
Thrift:Facebook
HSF(High Speed Service Framework):阿里巴巴

——————————————

如果B就在A的服务器中,A调用B的方法时:

A

hello(){
   String msg = B.hi(new User("张三"));
   System.out.println(msg);
}

B

String hi(user){
   return "你好:" + user.getName();
}

——————————————

RPC是指远程过程调用,也就是说两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数/方法,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义和传达调用的数据。

至于为什么使用RPC?答主也提到,无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如不同系统间的通讯,甚至不同组织间的通讯。

这里再说一下关于Netty,Netty框架不局限于RPC,更多的是作为一种网络协议的实现框架,比如HTTP,由于RPC需要高效的网络通信,就可以选择Netty作为基础。除了网络通信,RPC还需要有高效的序列化框架,以及一种寻址方式,如果是带会话(状态)的RPC调用,还需要有会话的状态保持的功能。

好了,让我们再来整理一下,什么是RPC?
RPC(远程过程调用)一般用来实现部署在不同机器上的系统之间的方法调用,使得程序能够像访问本地系统资源一样,通过网络传输去访问远端系统资源。一般来说,RPC框架实现的架构原理都是类似的。

可以这样说,
客户端调用:负责发起RPC调用,为调用方用户提供使用API。
服务端响应:主要是服务端业务逻辑实现。
序列化/反序列化:负责对RPC调用通过网络传输的内容进行序列化与反序列化,不同的RPC框架有不同的实现机制。一般分为文本(XML、JSON)与二进制(Java原生的、Hessian、protobuf、Thrift、Avro、Kryo、MessagePack),需要注意的是,不同的序列化方式在可读性、码流大小、支持的数据类型及性能等方面都存在较大差异,我们可以根据需要自行选择。
Stub:我们看成代理对象,它会屏蔽RPC调用过程中的复杂的网络处理逻辑,使其透明简单,且能够保持与本地调用一样的代码风格。
通信传输:即RPC的底层通信传输模块,一般通过Socket在客户端与服务端之间传递请求与应答消息。
——————————————

RPC和分布式的区别?

RPC实现了服务消费调用方Client与服务提供实现方Server之间的点对点调用流程,即包括了stub、通信、数据的序列化/反序列化。且Client与Server一般采用直连的调用方式。
而分布式服务框架,除了包括RPC的特性,还包括多台Server提供服务的负载均衡、策略及实现,服务的注册、发布与引入,以及服务的高可用策略、服务治理等等。

单点登录

单点登录:一处登录多处使用;
前提:分布式系统上使用(普通Java Web项目也可以用,但没必要)

比如:jd.com
我在搜索页面登录了,URL为:search.jd.com/…
搜索页面点击商品进入详情页面,同样也是登录状态,但URL为:item.jd.com/…
检索项目和索引项目,很典型的分布式中的两个项目,他们都实现了登录同步;

【分布式版本控制系统】分布式 + RPC_第8张图片
若要求用现实生活中的例子描述单点登录?
参观动物园流程;
检票员 = 认证中心模块;

  1. 我带着大家进入动物园,则会被检票员拦截【看我们是否有门票】,若无,则要去【售票处买票】
    登录 = 买票;
  2. 我去买了票,【带着大家一起进动物园】,检票员检查是否【有票】
    Token = 票
  3. 我们手中有票就可以任意参观动物园的每处;

jd.com采用单点登录,是将Token放入Cookie中的;
如果我们将浏览器的Cookie禁用,则在jd.com会登录失败,无论如何也登录不了。

购物车实现过程

  1. 购物车和用户的关系:
    一个用户必须对应一个购物车【一个用户不管买多少商品,都会存在属于自己的购物车】;
    单点登录一定要在购物车之前;
  2. 跟购物车有关的操作有哪些?
    a). 添加购物车:
    未登录(保存在Redis或Cookie都可;jd.com存在Redis,用UUID标识;自己开发可在Cookie);
    已登录(Redis缓存中,保证读写速度快;为保证数据安全,还要保存在MySQL中,防止Redis宕机,第一次添加时,要先添加到MySQL,再到Redis);
    Redis中:用Hash hset(key,filed,value)
    Key:user:userId:cart
    Hset(key,skuId,value);
    b). 展示购物车:
    未登录:直接从Cookie中取得数据展示即可;
    已登录:用户一旦登录,必须显示数据库【Redis】+Cookie中的购物车;
    若Cookie中有三条记录;Redis中有五条记录;真正展示时应该是八条记录;

消息队列:分布式系统中如何处理高并发?

背景:分布式系统中如何处理高并发?

在高并发环境下,来不及同步处理用户发送的请求,则会导致请求发生阻塞;
比如:大量insert update之类的请求同时到达数据库 MySQL,直接导致无数的行锁表锁,甚至会导致请求堆积过多。从而引发too many connections错误,使用消息队列可以解决【异步通信】。

  1. 异步
    【分布式版本控制系统】分布式 + RPC_第9张图片
    异步无需关心缓存是否更新成功,只需要发送消息队列;
    发送消息队列后,缓存中间件会发送消息 - 更新缓存,

  2. 并行
    【分布式版本控制系统】分布式 + RPC_第10张图片

  3. 排队
    高并发情况下,很多人同时访问数据库,消息队列可以采用排队的方式一一进入数据库;
    而不像上列同时进入并无排队处理;
    若排队了,则不会发生 too many connections 连接问题;
    【分布式版本控制系统】分布式 + RPC_第11张图片
    消息队列在电商中的使用场景:(同步)
    支付完成后,让订单系统直接通知库存,我们不需要关注后续操作;
    于是订单与库存之间达到了异步解耦;
    【分布式版本控制系统】分布式 + RPC_第12张图片
    消息队列的弊端:
    消息的不确定性:延迟队列 + 延迟技术 来解决即可;
    比如支付系统付款后通知了订单模块,但到底有没有支付成功呢?
    我们可以做延迟队列,让订单主动去付款模块查询是否支付成功。

推荐使用ActiveMQ,因其环境都是JAVA(大数据就合适使用Kafka)。

你可能感兴趣的:(分布式版本控制系统)