zoukankan      html  css  js  c++  java
  • 简单理解分布式RPC框架

    简单考虑---动态代理,反射,自定义注解
    1,序列化和反序列化
        在网路中,所有的数据都将会转化为字节进行传输,所以在代码层面,一个RPC框架需要实现特定格式的数据与字节数组之间的相互转化。像java已经提供了默认的序列化方式,但是如果实在高并发的场景下,使用java原生的序列化方式可能遇到瓶颈,于是出现了许多开源高效的序列化框架---fastjson,protobuf
    2,TCP拆包,粘包
        由于TCP只关心字节流,并不知晓上层数据格式。如果客户端应用层一次要发送的数据过大时,TCP会将该数据进行分解传送,因此在服务端需要进行粘包处理(由TCP保证数据的有序性);如果客户端一次要发送的数据量很小时,TCP并不会马上把数据发送出去,而是将其存储在缓冲区,当达到某个阈值时再发送出去,因此在服务端需要进行拆包的工作。
        解决:
    • 发送端给每个数据报添加包首部,首部中至少包含数据包的长度,这样在接收端接收到数据时,通过读取首部的长度信息得到该数据包的有效长度
    • 发送端将每个数据包封装为固定长度(多余用0填充),这样接收端在接收到数据后根据约定好的固定长度读取每个数据包的数据
    • 使用特殊符号将每个数据包区分开来,接收端也是通过该特殊符号的划分数据包的边界。
    3,NIO---netty
    4,服务注册和发现---zookeeper
        实际应用中,RPC服务的提供者往往需要使用集群来保证服务的稳定性和可靠性。因此需要实现一个服务注册中心,服务提供者将当前可用的服务地址信息注册至注册中心,而客户端在进行远程调用时,先通过服务注册中心获取当前可用的服务列表,然后获取具体的服务提供者的地址信息--该阶段可以进行负载均衡,根据地址信息向服务提供者发起调用。客户端可以缓存可用服务列表,当注册中心服务列表发生变更时需要通知客户端。同时,当服务提供者变为不可用时也需要通知注册中心服务不可用。
     
    出处:http://tinylcy.me/2017/07/04/如何实现一个分布式RPC框架/
  • 相关阅读:
    IdentityServer4学习笔记
    常用链接地址
    c++ 多线程(2000个)端口扫描(附源码)
    C++ 定时器Timer在项目中的使用
    [Under the hood]---Matt Pietrek October 1996 MSJ
    [under the hood]Reduce EXE and DLL Size with LIBCTINY.LIB
    TN035: Using Multiple Resource Files and Header Files with Visual C++
    单文件版本的netframework的net core 2.1
    Dependency Walker的替代品Dependencies
    怎么使用gradle给spring 打thinjar(gradle 7)
  • 原文地址:https://www.cnblogs.com/shangdongbin/p/7729465.html
Copyright © 2011-2022 走看看