作者:微信小助手
发布时间:2021-06-23T13:38:24
Netty 是一个致力于创建高性能网络应用程序的成熟的 IO 框架。
相比较与直接使用底层的 Java IO API,你不需要先成为网络专家就可以基于 Netty 去构建复杂的网络应用。
业界常见的涉及到网络通信的相关中间件大部分基于 Netty 实现网络层。
启动服务端(服务提供者)并发布服务到注册中心。
启动客户端(服务消费者)并去注册中心订阅感兴趣的服务。
客户端收到注册中心推送的服务地址列表。
调用者发起调用,Proxy从服务地址列表中选择一个地址并将请求信息 <group,providerName,version>,methodName,args[] 等信息序列化为字节数组并通过网络发送到该地址上。
服务端收到收到并反序列化请求信息,根据 <group,providerName,version> 从本地服务字典里查找到对应providerObject,再根据 <methodName,args[]> 通过反射调用指定方法,并将方法返回值序列化为字节数组返回给客户端。
客户端收到响应信息再反序列化为 Java 对象后由 Proxy 返回给方法调用者。
1)metadata: <group,providerName,version>
2)methodName
反序列化时 ClassLoader.loadClass() 潜在锁竞争。
协议体码流大小。
泛化调用多了参数类型。
Java方法静态分派规则参考JLS <Java语言规范> $15.12.2.5 Choosing the Most Specific Method 章节。
集群容错 —> 负载均衡 —> 网络
jdk proxy/javassist/cglib/asm/bytebuddy
注意拦截toString,equals,hashCode等方法避免远程调用。
先往上翻再看看“远程调用客户端图解”
再往下翻翻看看 Failover 如何处理更好
思考下如何拿到 future?
消息派发器
FutureGroup
Object $invoke(String methodName,Object... args)
parameterTypes[]
java.util.ServiceLoader
META-INF/services/com.xxx.Xxx