Netty实战 -- 使用Netty实现分布式框架Dubbo RPC,从思路到不断优化

Spring Boot 整合Dubbo + Zookeeper 实现分布式 消费者与服务者的业务调用

一、什么是RPC?

============================================================================

RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。

常见的RPC框架有: 比较知名的阿里Dubbo、Google的GRPC、Go的RPCX、Apache的Thrift,SpringCloud

在这里插入图片描述

1.1 RPC基本原理


两个或多个应用程序都分布在不同的服务器上,它们之间的调用都像是本地方法调用一样

示意图

在这里插入图片描述

RPC两个核心模块:序列化和通讯

1.2 RPC执行流程


在RPC中,Client叫做服务消费者,Server叫做服务提供者

RPC调用流程说明

  1. 服务消费方(client),以本地调用方式调用服务

  2. client stub 接收到调用后负责将方法、参数等封装成能够进行网络传输的消息体

  3. client stub 将消息进行编码并发送到服务器

  4. server stub 收到消息后进行解码

  5. server stub 根据解码结果调用本地API

  6. 本地服务 执行并返回结果给 server stub

  7. server stub 将返回结果导入进行编码并发送至消费方

  8. client stub 接收到数据进行解码

  9. 服务消费方得到结果

RPC的目标就是将2~8的步骤封装起来,用户无需关注这些细节,可以像调用本地方法一样即可完成远程服务调用

图解

在这里插入图片描述

二、什么是代理模式?

=============================================================================

代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。

Java中代理模式分为静态代理动态代理模式

2.1 案例实现


中午到了,小明很饿,于是在美团外卖上点了一份烤鸭,过了半个小时,外卖到了,小明下去拿外卖,顺利的吃上了烤鸭~

2.2 静态代理方式


由程序员手动创建代理类或工具对象,从而实现调用服务

Subject类

package com.wanshi.netty.dubborpc.netty;

public interface Subject {

String buy(String msg);

}

SubjectImpl类

package com.wanshi.netty.dubborpc.netty;

public class SubjectImpl implements Subject{

@Override

public String buy(String msg) {

return “买了” + msg;

}

}

ProxySubject类

package com.wanshi.netty.dubborpc.netty;

public class ProxySubject {

private Subject subject;

{

subject = new SubjectImpl();

}

public void buy(String msg) {

System.out.println(“美团外卖,使命必达,跑腿代买!”);

String buy = subject.buy(msg);

System.out.println(buy);

}

}

测试类

public static void main(String[] args) {

ProxySubject subject = new ProxySubject();

subject.buy(“北京烤鸭”);

}

效果

在这里插入图片描述

⛽静态代理的优缺点

缺点: 不利于扩展,调用一次就要创建一次对象,从而造成不必要的内存空间浪费

优点: 可读性好,逻辑简单,清晰明了

2.3 动态代理方式


动态代理又分为:JDK动态代理CGLIB动态代理

在程序运行时,运用反射机制动态创建而成,达到调用服务

使用以上的Subject类和实现类

SubjectInvocationHandler处理器类

package com.wanshi.netty.dubborpc.netty;

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

public class SubjectInvocationHandler implements InvocationHandler {

private Object obj;

public SubjectInvocationHandler(Object obj) {

this.obj = obj;

}

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

Object res = method.invoke(obj, args);

return res;

}

}

ProxyFactry工厂类

package com.wanshi.netty.dubborpc.netty;

import java.lang.reflect.Proxy;

public class ProxyFactry {

public static Subject getInstance() {

SubjectImpl subject = new SubjectImpl();

System.out.println(“美团外卖,使命必达,跑腿代买!”);

SubjectInvocationHandler subjectInvocationHandler = new SubjectInvocationHandler(subject);

Subject proxy = (Subject) Proxy.newProxyInstance(subject.getClass().getClassLoader(),

subject.getClass().getInterfaces(), subjectInvocationHandler);

return proxy;

}

}

测试类

public static void main(String[] args) {

Subject subject = ProxyFactry.getInstance();

String buy = subject.buy(“饮料”);

System.out.println(buy);

}

效果

在这里插入图片描述

⛽动态代理的优缺点

两种动态代理对照表

| | JDK原生动态代理 | CGLIB动态代理 |

| — | — | — |

| 核心原理 | 基于 ”接口实现“方式 | 基于类集成方式 |

| 优点 | Java原生支持的,不需要任何依赖 | 对与代理的目标对象无限制,无需实现接口 |

| 不足之处 | 只能基于接口实现 | 无法处理final方法 |

| 实现方式 | Java原生支持 | 需要引入Jar文件依赖 |

三、Netty实现DubboRPC

====================================================================================

3.1 需求说明


  1. dubbo 底层使用了Netty作为网络通讯框架,要求用Netty实现一个简单的RPC框架

  2. 模仿dubbo,消费者和提供者约定接口和协议,消费者远程调用提供者的服务,提供者返回一个字符串,消费者打印提供者返回的数据,底层使用Netty框架

3.2 剖析需求


  1. 创建接口,定义抽象方法,用于服务消费者与服务提供者之间的约定

  2. 创建一个提供者,该类需要监听消费者的请求,并按照约定返回数据

  3. 创建一个消费者,该类需要 透明的调用自己不存在的方法,内部使用Netty 请求提供者返回数据

在这里插入图片描述

3.3 效果图


在这里插入图片描述

3.4 核心源码


♻️共用接口API

HelloService

package com.wanshi.netty.dubborpc.publicinterface;

/**

  • 公共接口,提供服务

*/

public interface HelloService {

String hello(String msg);

}

♻️服务提供者

ServerBootstrap启动类

package com.wanshi.netty.dubborpc.provider;

import com.wanshi.netty.dubborpc.netty.NettyServer;

/**

  • 服务提供者启动类,监听消费者,并绑定端口8888

*/

public class ServerBootstrap {

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

作为过来人,小编是整理了很多进阶架构视频资料、面试文档以及PDF的学习资料,针对上面一套系统大纲小编也有对应的相关进阶架构视频资料


.(img-nliIm4GT-1711778496369)]
[外链图片转存中…(img-Fkl75Ztg-1711778496369)]
[外链图片转存中…(img-H3vUx8U0-1711778496369)]
[外链图片转存中…(img-NXVi9LRa-1711778496370)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-nfgLpqsf-1711778496371)]

最后

作为过来人,小编是整理了很多进阶架构视频资料、面试文档以及PDF的学习资料,针对上面一套系统大纲小编也有对应的相关进阶架构视频资料

[外链图片转存中…(img-Yp6LgXUp-1711778496371)]
[外链图片转存中…(img-66FegV4A-1711778496372)]

  • 30
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值