1、SOA核心技术之序列化与反序列化
序列化/反序列化
序列化是将对象转换为字节序列的过程称为对象的序列化,也简称为编码;
反序列化是序列化的逆过程。将字节序列恢复为对象的过程称为对象的反序 列化,也简称为解码;
protobuf,json,Messgaepack(性能好,但是坑多)
通过将对象序列化字节数组,使得通过网络连接的系统之间能够进行对象的传输;
解决远程接口调用JVM之间内存无法共享的问题;
评价化序列化性能优劣的指标:
序列化之后的码流大小;
序列化/反序列化的速度;
资源占用情况,主要是CPU和内存;
protobuf,json,XStream,hession2 压缩等
java默认的序列化:
JDK提供了序列化API,序列化通过输出流ObjectOutputStream 与对象输入流ObjectInputStream来实现,
被序列化的类需要实现 Serializable接口;
Java默认的序列化机制优点: Java语言自带,无需引入第三方依赖、使用门槛低;
Java默认的序列化机制缺点: 只支持Java,不支持跨语言;性能欠佳,序列化后产生的码流过大,对于引用过深的对象序列化容易产
生内存OOM异常;
xml序列化框架:
Xml序列化可读性好,且具有语言无关性,便于调试;
由于使用标签表示数据,导致序列化后码流大,适用于对性能不高,且QPS较低的企业内部 系统之间的数据交换的场景;
常用的xml序列化框架—XStream;
JSON序列化框架:
JSON是一种轻量级的数据交换格式。比xml码流小,可读性也不错。
JSON序列化常用开源工具:Jackson、阿里fastjson、谷歌GSON; Jackson、阿里fastjson比GSON性能要好 。 Jackson、 GSON比fastjson稳定性更好; fastjson优势
在于易用的API及高性能;
Hessian序列化框架:
Hessian是一个支持跨语言传输的二进制序列化协议的框架;
相对于java默认的序列化机制,Hessian具有更好的性能、易用性、且支持不 同的语言;
protobuf序列化框架:
Protobuf是谷歌开源的序列化框架;
Protobuf具有广泛的用户基础,空间开销小、高解析性能是亮点,非常适合 于对性能要求高的RPC调用;
3、SOA核心技术之服务通信框架
网络传输方式
Socket长连接还是短连接
BIO:典型的一请求一应答通信模型。
使用场景:低负载、低并发网络应用可以选择BIO降低编程复杂度。
问题:缺乏弹性伸缩能力
当socket访问量增加后,服务端线程个数和客户端并发访问呈1:1比例增加。 线程是jvm的宝贵资源,线程数膨胀到一定阶段,系统性能急剧下降,发生 线程堆栈溢出、创建线程失败、
进程宕机或僵死,不能对外提供服务。
NIO:利用多线程、IO多路复用技术的通信模型。IO多路复用技术通过把多个IO阻塞复用到同一个select的阻塞上,使系统在单线程情况下可以同时处理多个客户端请求。
使用场景:高负载、高并发的网络应用,使用NIO的非阻塞模式进行开发。
NIO提供了SocketChannel(客户端)、 ServerSocketChannel(服务端)两种不同的套接字通道,都支 持阻塞和非阻塞两种模式。讲解API (configureBlocking方法)。
主要流程:
•Acceptor注册Selector,监听accept事件
•当客户端连接后,触发accept事件
•服务器构建对应的Channel,并在其上注册Selector,监听读写事件
•当发生读写事件后,进行相应的读写处理
Reactor模式---基本模型
改进:采用基于事件驱动的 设计,当有事件触发时,才 会调用处理器进行数据处理
开源socket框架or自研:
一般使用开源socket框架Netty、Mina,无需重复造轮子;
• 原生态NIO存在诸多不足之处:
NIO类库和API繁杂,有一定的使用门槛;
需要精通多线程;
考虑多方面的可用性:半包粘包问题、网络超时、网络闪断、断连重连、通信 对等端宕机等问题;
Netty介绍:
开源NIO框架。使用简单,功能强大。支持多种编解码、多协议;
• 定制能力强,可通过ChannelHandler对通信框架进行灵活扩展;
• 高并发:采用异步非阻塞模式,一个Netty服务端可同时处理上千个客户端请求;
• 安全性:支持HTTPS、SSL等,可以在传输层进行安全控制;
• 成熟、稳定、经历大规模的商业应用考验,质量得到了验证;
Netty线程模型:
Reactor模式基于事件驱动,特别适合处理海量的I/O事件;
Netty同时支持Reactor的单线程、多线程和主从多线程模型;
在不同的应用中通过启动参数的配置来启动不同的线程模型;
Netty粘包、半包
Netty粘包半包问题解决思路
解决粘包半包问题的本质是能区分完成的数据边界,能够按照数据边界完整地接受Netty传输的数据;
socket通信性能差的三种原因:
网络传输方式、线程模型、序列化性能
Netty高性能之道:
步非阻塞通信:Netty的IO线程NioEventLoop聚合多路复用器Selector,可同
时并发处理上千个客户端SocketChannel;
• 高效的IO线程模型:Netty支持Reactor单线程模型、 Reactor多线程模型、主从 Reactor多线程模型;
• 高性能的序列化框架,默认提供google的protobuf;
Netty客户端需要解决三个问题:
选择合适的序列化协议,解决Netty传输过程中的半包、粘包问题;
发挥长连接优势,对Netty的Channel通道进行复用;
Netty是异步框架,客户端发起服务调用后等待获取调用结果;
4、分布式服务框架Dubbo介绍及实践
Dubbo支持的协议
Dubbo的集群容错&负载均衡:
Failover Cluster 失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。
Failfast Cluster 快速失败,只发起一次调用,失败立即报错。通常用于写操作,比如新增记录。
Failsafe Cluster 失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
Failback Cluster 失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster 并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。
Broadcast Cluster 广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
NIO的Reactor模式
主流电商企业的服务化框架
阿里:Dubbo、HSF
京东:基于Dubbo的Hydra、JSF
唯品会:Thrift RPC
蘑菇街:Tesla
当当: Dubbox (基于dubbo的extension )
5、SOA核心技术之服务发布、引用---45m
Soa服务发布通常也称为soa服务端初始化;
Soa服务引用通常也称为soa客户端初始化;
Soa调用过程指从soa客户端发起调用到soa服务端接口响应,并返回对应结 果的完整过程;
基于接口service层,通过具体的协议,对外暴露服务;
向服务注册中心注册服务;同时,对外提供服务调用的client包;
SOA服务端的代码分层一般为Façade、Service、Cache、Dao、Pojo;
6、SOA核心技术之软负载实现--算法、实现原理、实践--45m
随机算法原理:获取服务列表大小范围的随机数,将该随机数作 为列表索引,从服务提供方列表中获取服务提供方。
轮询算法原理:将服务调用请求按照顺序轮流分配到服务提供者 后端服务器上,均衡对待每一台服务提供方的机器。
负载均衡源地址hash算法:
源地址hash算法:根据请求来源的IP的hashcode对服务提供方列表大小取模,得到服务提供方列表索引,进而获取到服务提供方。
一致性哈希算法:待补充
7、SOA核心技术之服务调用(此处加1案例)---50m
同步服务调用:soa要有保护机制,超时时间自我保护
异步调用:
并行调用:
泛化调用:泛化调用通常包含两种模式:泛化引用、泛化实现;
主要用于无API接口及数据模型的场景(服务测试框架)或者减少soa client
jar包之间的耦合(网关平台),参数及返回值中的所有POJO均用Map表示;
阿里dubbo的泛化调用;
8、SOA核心技术之流量控制
池技术限流---线程池重要参数
池技术限流---tomcat连接池重要参数
常见限流算法 : 并发计数器:利用多线程并发计数器,实现限流。
漏斗算法?
令牌桶 第二种,不是立即限流,而是堵塞的方式,稍后处理,是阻塞性质的。
“漏桶算法”能够强行限制数据的传输速率;
“令牌桶算法”在能够限制数据的平均传输数据外,还允许某种程度的突发传输。在“令 牌桶算法”中,只要令牌桶中存在令牌,
那么就允许突发地传输数据直到达到用户配置的 上限,因此它适合于具有突发特性的流量。
Dubbo流量控制解析
• 流量控制的关键类:TpsLimitFilter、DefaultTPSLimiter、TPSLimiter、StatItem;
• Dubbo tps流量控制的整体流程;
• 为什么要用AtomicInteger来计数,而不用int?
• 引申:服务调用方限流ActiveLimitFilter、服务方限流MonitorFilter、TraceFilter
待整理:
泛化调用?
半包、粘包?
网关适配
序列化/反序列化
序列化是将对象转换为字节序列的过程称为对象的序列化,也简称为编码;
反序列化是序列化的逆过程。将字节序列恢复为对象的过程称为对象的反序 列化,也简称为解码;
protobuf,json,Messgaepack(性能好,但是坑多)
通过将对象序列化字节数组,使得通过网络连接的系统之间能够进行对象的传输;
解决远程接口调用JVM之间内存无法共享的问题;
评价化序列化性能优劣的指标:
序列化之后的码流大小;
序列化/反序列化的速度;
资源占用情况,主要是CPU和内存;
protobuf,json,XStream,hession2 压缩等
java默认的序列化:
JDK提供了序列化API,序列化通过输出流ObjectOutputStream 与对象输入流ObjectInputStream来实现,
被序列化的类需要实现 Serializable接口;
Java默认的序列化机制优点: Java语言自带,无需引入第三方依赖、使用门槛低;
Java默认的序列化机制缺点: 只支持Java,不支持跨语言;性能欠佳,序列化后产生的码流过大,对于引用过深的对象序列化容易产
生内存OOM异常;
xml序列化框架:
Xml序列化可读性好,且具有语言无关性,便于调试;
由于使用标签表示数据,导致序列化后码流大,适用于对性能不高,且QPS较低的企业内部 系统之间的数据交换的场景;
常用的xml序列化框架—XStream;
JSON序列化框架:
JSON是一种轻量级的数据交换格式。比xml码流小,可读性也不错。
JSON序列化常用开源工具:Jackson、阿里fastjson、谷歌GSON; Jackson、阿里fastjson比GSON性能要好 。 Jackson、 GSON比fastjson稳定性更好; fastjson优势
在于易用的API及高性能;
Hessian序列化框架:
Hessian是一个支持跨语言传输的二进制序列化协议的框架;
相对于java默认的序列化机制,Hessian具有更好的性能、易用性、且支持不 同的语言;
protobuf序列化框架:
Protobuf是谷歌开源的序列化框架;
Protobuf具有广泛的用户基础,空间开销小、高解析性能是亮点,非常适合 于对性能要求高的RPC调用;
3、SOA核心技术之服务通信框架
网络传输方式
Socket长连接还是短连接
BIO:典型的一请求一应答通信模型。
使用场景:低负载、低并发网络应用可以选择BIO降低编程复杂度。
问题:缺乏弹性伸缩能力
当socket访问量增加后,服务端线程个数和客户端并发访问呈1:1比例增加。 线程是jvm的宝贵资源,线程数膨胀到一定阶段,系统性能急剧下降,发生 线程堆栈溢出、创建线程失败、
进程宕机或僵死,不能对外提供服务。
NIO:利用多线程、IO多路复用技术的通信模型。IO多路复用技术通过把多个IO阻塞复用到同一个select的阻塞上,使系统在单线程情况下可以同时处理多个客户端请求。
使用场景:高负载、高并发的网络应用,使用NIO的非阻塞模式进行开发。
NIO提供了SocketChannel(客户端)、 ServerSocketChannel(服务端)两种不同的套接字通道,都支 持阻塞和非阻塞两种模式。讲解API (configureBlocking方法)。
主要流程:
•Acceptor注册Selector,监听accept事件
•当客户端连接后,触发accept事件
•服务器构建对应的Channel,并在其上注册Selector,监听读写事件
•当发生读写事件后,进行相应的读写处理
Reactor模式---基本模型
改进:采用基于事件驱动的 设计,当有事件触发时,才 会调用处理器进行数据处理
开源socket框架or自研:
一般使用开源socket框架Netty、Mina,无需重复造轮子;
• 原生态NIO存在诸多不足之处:
NIO类库和API繁杂,有一定的使用门槛;
需要精通多线程;
考虑多方面的可用性:半包粘包问题、网络超时、网络闪断、断连重连、通信 对等端宕机等问题;
Netty介绍:
开源NIO框架。使用简单,功能强大。支持多种编解码、多协议;
• 定制能力强,可通过ChannelHandler对通信框架进行灵活扩展;
• 高并发:采用异步非阻塞模式,一个Netty服务端可同时处理上千个客户端请求;
• 安全性:支持HTTPS、SSL等,可以在传输层进行安全控制;
• 成熟、稳定、经历大规模的商业应用考验,质量得到了验证;
Netty线程模型:
Reactor模式基于事件驱动,特别适合处理海量的I/O事件;
Netty同时支持Reactor的单线程、多线程和主从多线程模型;
在不同的应用中通过启动参数的配置来启动不同的线程模型;
Netty粘包、半包
Netty粘包半包问题解决思路
解决粘包半包问题的本质是能区分完成的数据边界,能够按照数据边界完整地接受Netty传输的数据;
socket通信性能差的三种原因:
网络传输方式、线程模型、序列化性能
Netty高性能之道:
步非阻塞通信:Netty的IO线程NioEventLoop聚合多路复用器Selector,可同
时并发处理上千个客户端SocketChannel;
• 高效的IO线程模型:Netty支持Reactor单线程模型、 Reactor多线程模型、主从 Reactor多线程模型;
• 高性能的序列化框架,默认提供google的protobuf;
Netty客户端需要解决三个问题:
选择合适的序列化协议,解决Netty传输过程中的半包、粘包问题;
发挥长连接优势,对Netty的Channel通道进行复用;
Netty是异步框架,客户端发起服务调用后等待获取调用结果;
4、分布式服务框架Dubbo介绍及实践
Dubbo支持的协议
Dubbo的集群容错&负载均衡:
Failover Cluster 失败自动切换,当出现失败,重试其它服务器。通常用于读操作,但重试会带来更长延迟。
Failfast Cluster 快速失败,只发起一次调用,失败立即报错。通常用于写操作,比如新增记录。
Failsafe Cluster 失败安全,出现异常时,直接忽略。通常用于写入审计日志等操作。
Failback Cluster 失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster 并行调用多个服务器,只要一个成功即返回。通常用于实时性要求较高的读操作,但需要浪费更多服务资源。
Broadcast Cluster 广播调用所有提供者,逐个调用,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地资源信息。
NIO的Reactor模式
主流电商企业的服务化框架
阿里:Dubbo、HSF
京东:基于Dubbo的Hydra、JSF
唯品会:Thrift RPC
蘑菇街:Tesla
当当: Dubbox (基于dubbo的extension )
5、SOA核心技术之服务发布、引用---45m
Soa服务发布通常也称为soa服务端初始化;
Soa服务引用通常也称为soa客户端初始化;
Soa调用过程指从soa客户端发起调用到soa服务端接口响应,并返回对应结 果的完整过程;
基于接口service层,通过具体的协议,对外暴露服务;
向服务注册中心注册服务;同时,对外提供服务调用的client包;
SOA服务端的代码分层一般为Façade、Service、Cache、Dao、Pojo;
6、SOA核心技术之软负载实现--算法、实现原理、实践--45m
随机算法原理:获取服务列表大小范围的随机数,将该随机数作 为列表索引,从服务提供方列表中获取服务提供方。
轮询算法原理:将服务调用请求按照顺序轮流分配到服务提供者 后端服务器上,均衡对待每一台服务提供方的机器。
负载均衡源地址hash算法:
源地址hash算法:根据请求来源的IP的hashcode对服务提供方列表大小取模,得到服务提供方列表索引,进而获取到服务提供方。
一致性哈希算法:待补充
7、SOA核心技术之服务调用(此处加1案例)---50m
同步服务调用:soa要有保护机制,超时时间自我保护
异步调用:
并行调用:
泛化调用:泛化调用通常包含两种模式:泛化引用、泛化实现;
主要用于无API接口及数据模型的场景(服务测试框架)或者减少soa client
jar包之间的耦合(网关平台),参数及返回值中的所有POJO均用Map表示;
阿里dubbo的泛化调用;
8、SOA核心技术之流量控制
池技术限流---线程池重要参数
池技术限流---tomcat连接池重要参数
常见限流算法 : 并发计数器:利用多线程并发计数器,实现限流。
漏斗算法?
令牌桶 第二种,不是立即限流,而是堵塞的方式,稍后处理,是阻塞性质的。
“漏桶算法”能够强行限制数据的传输速率;
“令牌桶算法”在能够限制数据的平均传输数据外,还允许某种程度的突发传输。在“令 牌桶算法”中,只要令牌桶中存在令牌,
那么就允许突发地传输数据直到达到用户配置的 上限,因此它适合于具有突发特性的流量。
Dubbo流量控制解析
• 流量控制的关键类:TpsLimitFilter、DefaultTPSLimiter、TPSLimiter、StatItem;
• Dubbo tps流量控制的整体流程;
• 为什么要用AtomicInteger来计数,而不用int?
• 引申:服务调用方限流ActiveLimitFilter、服务方限流MonitorFilter、TraceFilter
待整理:
泛化调用?
半包、粘包?
网关适配