java分布式应用设计核心技术(1)

前言:

CPA理论说:在分布式系统中数据强一致性和服务高可用只能二选一,所以在BASE理论中提出:服务基本可用,数据允许软状态存在,实现数据最终一致性。

在分布式系统实现阶段,主要对以上方案设计的相关技术进行技术选型,如对RPC框架,消息队列,缓存的选择。我们需要对这些框架的工作原理,优缺点有一个相关的认识。

分布式服务调用RPC框架

RPC (Remote Procedure Call)即远程过程调用,是分布式系统常见的一种通信方法。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。

什么是RPC?

常用的RPC框架有:阿里巴巴Dubbo,新浪网Motan,他俩都是服务治理型框架

Google的gRPC和FaceBook的Thrift。都是跨语言框架。

RPC的核心原理:

java分布式JAVA应用 java分布式有哪些技术_网络

涉及的核心技术:

1.动态代理

我的理解:这里的动态代理就是client和serve分别找一个秘书,告诉秘书自己的请求,让秘书去和另一个秘书联系,秘书去传达信息。实现方法还是靠他们自己,而不是秘书。秘书只负责传达消息。

2.序列化和反序列化

网络传输数据要求二进制字节流。所以需要对java对象进行序列化。

序列化和反序列化需要使用同一种技术,否则会无法解析。

成熟的序列化技术:GOOgle的protobuf和faceBook的Thrift,Hessian2,Kryo,Msgpack等

3.网络传输

可以基于TCP也可以基于Http来实现。

如果是在传输层实现则采用Socket来实现客户端和服务端网络通信模型,并且基于NIO实现非阻塞传输。

如果在网络层实现则采用netty实现。如果是在应用层实现采用基于HTTP2.0的协议

跨语言型:

gRPC和Thrift都是基于C/S架构实现的。gRPC的客户端可以是移动客户端。他是轻量级的框架实现。

1.gRPC的设计与使用

设计层面:主要包括RPC远程方法调用涉及的相关数据的网络传输,序列化和反序列化以及基于接口定义的语言IDL来定义数据结构和服务方法。从而实现跨平台和跨语言的RPC调用。

数据传输:gRPC主要利用HTTP2.0协议相关特性实现服务提供和服务调用之间的方法调用涉及的相关数据传输。

http2.0 多路复用特性(以此达到减少消费者客户端与服务提供者服务端的建立次数,维持场链接来进行数据传授输。)(就是一个连接可以进行多次请求响应的数据传输)。

基于二进制传输数据的特性,和压缩HTTP头部等特性,减少所需传输数据的提及,节省网络带宽,提高传输性能。

采用HTTP协议实现数据公网传输,避免了基于TCP协议和Socket在传输会被防火墙拦截的问题。

2.Thrift的设计和使用

Thrift既是一个RPC框架也是一个数据序列化框架,grpc只是一个RPC框架,数据序列化依赖protobuf框架实现。

网络通信方面,他支持TCP,HTTP,文件通信方式,同时可以选择使用BIO还是NIO,在传输的数据格式方面,支持二进制数据和JSON格式

Thrift支持更加丰富的自定义数据类型,比如:list,set,map还有结构体,枚举。

服务治理型:

Dubbo和Motan更加使用于基于微服务架构的大型分布式系统,都是基于java语言实现的,基于netty长连接实现。都可以做到API零侵入的集成到基于Spring开发的项目中。

java分布式JAVA应用 java分布式有哪些技术_java分布式JAVA应用_02

1.Dubbo

支持多种RPC协议。支持丰富的服务动态发现,服务治理机制,具体包括基于Zookeeper实现服务提供者的服务注册,服务消费者的服务订阅和服务自动发现机制。,服务提供者和消费者都支持并发监控统计与限流等功能。

2Motan

协议只支持自身定义的motan协议。

他没有Dubbo框架丰富,但是性能优于DUbbo.通过Consul来实现服务的注册与发现。

分布式消息队列

应用场景:系统解耦,流量削峰,信息通信。

一般基于高级消息队列协议AMQP。

包括ActiveMQ和RabbitMQ,后者是分布式企业及因公众最常使用的一种分布式消息队列。Kafka支持高拓展性和高吞吐量。

但是他们仨都是专业重量级分布式消息队列实现。

Redis是轻量级消息队列,基于列表数据类型实现的。

可以使用Redis的发布订阅模式实现系统解耦。

AMQP协议实现:RabbiMQ

它使用的是erlang语言。RabbiMQ起源于金融系统。

核心组件:

1.虚拟主机vhost与权限

2.连接Connection与信道Channel

3.服务器实现Broker

broker通常包含Exchanger和Queue两大组件,以及需要实现这两大组件的绑定。

4.生产者

5.消费者

持久化与镜像队列

持久化保证高可靠,镜像队列保证高可用。