Spring Boot 整合Dubbo + Zookeeper 实现分布式 消费者与服务者的业务调用
============================================================================
RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。
常见的RPC框架有: 比较知名的阿里Dubbo、Google的GRPC、Go的RPCX、Apache的Thrift,SpringCloud
两个或多个应用程序都分布在不同的服务器上,它们之间的调用都像是本地方法调用一样
示意图
RPC两个核心模块:序列化和通讯
在RPC中,Client叫做服务消费者,Server叫做服务提供者
RPC调用流程说明
-
服务消费方(client),以本地调用方式调用服务
-
client stub 接收到调用后负责将方法、参数等封装成能够进行网络传输的消息体
-
client stub 将消息进行编码并发送到服务器
-
server stub 收到消息后进行解码
-
server stub 根据解码结果调用本地API
-
本地服务 执行并返回结果给 server stub
-
server stub 将返回结果导入进行编码并发送至消费方
-
client stub 接收到数据进行解码
-
服务消费方得到结果
RPC的目标就是将2~8的步骤封装起来,用户无需关注这些细节,可以像调用本地方法一样即可完成远程服务调用
图解
=============================================================================
代理模式的定义:代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。
Java中代理模式分为静态代理和动态代理模式
中午到了,小明很饿,于是在美团外卖上点了一份烤鸭,过了半个小时,外卖到了,小明下去拿外卖,顺利的吃上了烤鸭~
由程序员手动创建代理类或工具对象,从而实现调用服务
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(“北京烤鸭”);
}
效果
⛽静态代理的优缺点
缺点: 不利于扩展,调用一次就要创建一次对象,从而造成不必要的内存空间浪费
优点: 可读性好,逻辑简单,清晰明了
动态代理又分为: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文件依赖 |
====================================================================================
-
dubbo 底层使用了Netty作为网络通讯框架,要求用Netty实现一个简单的RPC框架
-
模仿dubbo,消费者和提供者约定接口和协议,消费者远程调用提供者的服务,提供者返回一个字符串,消费者打印提供者返回的数据,底层使用Netty框架
-
创建接口,定义抽象方法,用于服务消费者与服务提供者之间的约定
-
创建一个提供者,该类需要监听消费者的请求,并按照约定返回数据
-
创建一个消费者,该类需要 透明的调用自己不存在的方法,内部使用Netty 请求提供者返回数据
♻️共用接口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开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
最后
作为过来人,小编是整理了很多进阶架构视频资料、面试文档以及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)]