RPC框架--实现一个非常简单的RPC调用

java启动tomcat服务器,作为服务器的提供者

在这个项目中rpc服务端在tomcat服务器中启动,下面是RPC类的启动函数,初始化了一个tomcat配置,启动服务器

public class HttpServer {

public void start(String hostname, Integer port) {

//读取用户的配置 server.name = netty

Tomcat tomcat = new Tomcat();

Server server = tomcat.getServer();

Service service = (Service) server.findService("Tomcat");

Connector connector = new Connector();

connector.setPort(port);

Engine engine = new StandardEngine();

engine.setDefaultHost(hostname);

Host host = new StandardHost();

host.setName(hostname);

String contextPath = "";

Context context = new StandardContext();

context.setPath(contextPath);

context.addLifecycleListener(new Tomcat.FixContextListener());

host.addChild(context);

engine.addChild(host);

service.setContainer(engine);

service.addConnector(connector);

tomcat.addServlet(contextPath, "dispatcher", new DispatcherServlet());

context.addServletMappingDecoded("/*", "dispatcher");

try {

tomcat.start();

tomcat.getServer().await();

} catch (LifecycleException e) {

e.printStackTrace();

}

};

}

provider处理RPC请求

在启动的tomcat服务器中添加一个handler服务,handler根据需要调用哪个方法,结合方法参数进行调用返回处理结果

但是这种处理方式过于简单粗暴了,我们每次添加服务时都需要provider去手动配置。因此,在这里我们需要实现一个服务注册中心,当provider服务启动时,他会自动把服务信息添加到注册中心,这样就无需手动地去配置,在项目中,我们一开始用一个本地的Map去实现注册信息的存储

在provider启动时自动进行服务地注册和发现,用户通过invocation,传入服务、方法名、参数调用

动态代理优化消费者服务调用

动态代理实现是消费者程序传入类名通过动态代理拿到服务对象,然后传入方法名调用

在动态代理基础上,我们还要实现服务的注册与发现

服务注册与服务发现:

用map保存注册的服务信息,map的key是提供的服务名称,value是URL的列表我们一开始的实现方法是在服务端保存一个Map用来保存已经注册的服务和它对应的接口,然后consumer从map中拿。但上面的实现有很大的问题,provider和consumer是两个不同的进程,注册时服务实例信息只存入了provider的map中,而consumer进程的map是空的。因此,具体实现时,需要借助中间件存储服务实例信息map类实现

provider进程在开启时将服务实例注册到map中

consumer进程通过动态代理拿到url信息

要解决上面的问题,我们需要借助redis、zookeeper等中间件实现服务注册中心。以redis为例,每次调用服务时,我们都需要去redis中查询服务信息,rpc服务比较耗时。因此,我们需要在客户端借助本地缓存保存服务信息。但我们会发现,如果服务端存在一些节点挂了或者新增节点等需要更新map的URL信息的话,会出现缓存过期的情况。在这里,我们采用本地文件的方式做了个简易实现

负载均衡实现:

原来的服务中心,一个方法只对应于一个一个URL存储,修改注册和发现的存储格式,但现在我们将一个方法对应的URL保存成数组,实现一个LoadBalancer类,当一个URL出问题时,去尝试访问其他没访问过的URL

我们可以在动态代理功能内加入下面代码,实现服务重试和容错

实现服务的mock功能

相关推荐
今年下半年2 小时前
记录一次IBMS物联网项目的架构设计及技术栈应用
物联网·websocket·网络协议·tcp/ip·微服务·udp·kafka
XUEYUAN52126 天前
ASN 自治系统号风控:平台如何通过 IP 所属自治域批量识别代理流量
python·网络协议·http·网络安全·socks5
CHENKONG_CK6 天前
破解制鞋打磨痛点:RFID赋能去毛刺工序自动化升级
网络·单片机·嵌入式硬件·网络协议·tcp/ip
z落落6 天前
C#UDP+串口服务端+UDP 客户端(含 CRC16 校验)
网络·网络协议·udp
曼巴UE56 天前
UE5 客户端 需要的网络同步概念总结(3 )-事件同步 RPC 以及三种调用方式
网络·c++·网络协议·学习·rpc·ue5
开开心心就好6 天前
安卓手写文字生成工具,多种纸张一直免费
网络·网络协议·tcp/ip·leetcode·智能手机·电脑·模拟退火算法
代码小学僧7 天前
从 0 到 1,记录我的第一个出海 SaaS 独立开发项目
前端·rpc·音视频开发
K成长日志7 天前
DALI协议-Part209-颜色控制
物联网·网络协议·iot·智能照明·智能建筑·dali
IPdodo_8 天前
跨境 API 调用不稳定怎么办:出口、超时重试与链路监控的实践
网络·python·网络协议
那年窗外下的雪.8 天前
AIDC 学习日志|第 27 天|EVPN 多归属收敛时间线与 Leaf2 接管验证
网络协议·学习·http·tcpdump