家纯 阿里技术
文章插图
一 什么是 Netty? 能做什么?
- Netty 是一个致力于创建高性能网络应用程序的成熟的 IO 框架 。
- 相比较与直接使用底层的 JAVA IO API , 你不需要先成为网络专家就可以基于 Netty 去构建复杂的网络应用 。
- 业界常见的涉及到网络通信的相关中间件大部分基于 Netty 实现网络层 。
二 设计一个分布式服务框架
1 Architecture
文章插图
2 远程调用的流程
- 启动服务端(服务提供者)并发布服务到注册中心 。
- 启动客户端(服务消费者)并去注册中心订阅感兴趣的服务 。
- 客户端收到注册中心推送的服务地址列表 。
- 调用者发起调用 , Proxy从服务地址列表中选择一个地址并将请求信息 <group , providerName , version> , methodName , args[] 等信息序列化为字节数组并通过网络发送到该地址上 。
- 服务端收到收到并反序列化请求信息 , 根据 <group , providerName , version> 从本地服务字典里查找到对应providerObject , 再根据 <methodName , args[]> 通过反射调用指定方法 , 并将方法返回值序列化为字节数组返回给客户端 。
- 客户端收到响应信息再反序列化为 Java 对象后由 Proxy 返回给方法调用者 。
以上流程对方法调用者是透明的 , 一切看起来就像本地调用一样 。
3 远程调用客户端图解
文章插图
重要概念:RPC三元组 <ID , Request , Response> 。
PS: 若是 netty4.x 的线程模型 , IO Thread(worker) —> Map<InvokeId , Future> 代替全局 Map 能更好的避免线程竞争 。
4 远程调用服务端图解
文章插图
【如何用Netty写一个高性能的分布式服务框架?】
5 远程调用传输层图解
文章插图
6 设计传输层协议栈
协议头
文章插图
协议体
1)metadata: <group , providerName , version>
2)methodName
3)parameterTypes[] 真的需要吗?
(a)有什么问题?
- 反序列化时 ClassLoader.loadClass() 潜在锁竞争 。
- 协议体码流大小 。
- 泛化调用多了参数类型 。
(b)能解决吗?
- Java方法静态分派规则参考JLS <Java语言规范> $15.12.2.5 Choosing the Most Specific Method 章节 。
(c)args[]
(d)其他:traceId , AppName…
三 一些Features&好的实践&压榨性能
1 创建客户端代理对象
1)Proxy 做什么?
- 集群容错 —> 负载均衡 —> 网络
2)有哪些创建 Proxy 的方式?
- jdk proxy/javassist/cglib/asm/bytebuddy
3)要注意的:
- 注意拦截toString , equals , hashCode等方法避免远程调用 。
4)推荐的(bytebuddy):
文章插图
2 优雅的同步/异步调用
- 先往上翻再看看“远程调用客户端图解”
- 再往下翻翻看看 Failover 如何处理更好
- 思考下如何拿到 future?
3 单播/组播
推荐阅读
- 床上有蚂蚁如何彻底清除 床上有小蚂蚁怎么清除
- Oracle如何创建只读用户
- API攻击原理,以及如何识别和预防
- 如何辨别网购衣服的质量
- 普洱茶烟50块钱的,什么是普洱茶普洱茶的简介
- 华熙生物|500斤胖猴仔偷吃泡面被抓,满脸委屈如同小媳妇,网友:活该胖死
- 小花飞燕草和大花飞燕草,飞燕草花期和花语
- 翡翠|夏天佩戴翡翠,如果不想影响美观,注意以下这三点!
- 如何解决宏碁台式电脑没有声音
- 晚上吃茴香如同吃砒霜,晚上吃姜等于吃砒霜吗