架构设计---技术栈02(待完善)

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




待整理:
  泛化调用?
  半包、粘包?
  网关适配


  

猜你喜欢

转载自blog.csdn.net/qq_15001229/article/details/79682611