实现一个简易版RPC
上篇博客主要介绍了dubbo的使用,这篇文章主要深入rpc的核心原理
准备知识:
1 java 网络编程(这里使用的bio)
2 java动态代理
3 反射
=================================
通俗来说rpc就是
客户端持有的是接口(但是没有持有实现),
服务端放的是接口的具体实现以及接口。
客户端把方法和方法的参数 以及其他参数 通过socket发送给服务端,
然后服务端执行相对应的方法,最后再把执行结果返回给客户端。
RPC的架构一般分为三部分:
1)服务提供者,运行在服务器端,提供服务接口定义与服务实现类。
在本项目主要是(ITestService 以及 TestServiceImpl)
2)服务中心,运行在服务器端,负责将本地服务注册成远程服务,管理远程服务,提供给服务消费者使用。
在本项目主要是(IServerCenter以及BioServiceCenter)
3)服务消费者,运行在客户端,通过远程代理对象调用远程服务。
在本项目主要是(RpcProxy 返回代理对象)
核心代码如下:
服务提供者的接口定义
public interface ITestService {
String sayHi(String name);
}
服务提供者的接口实现
public class TestServiceImpl implements ITestService {
public String sayHi(String name) {
return "Hi, " + name;
}
}
服务中心接口抽象
public interface IServerCenter {
public void stop();
/**
* 开启服务
*
* @throws IOException
*/
public void start() throws IOException;
/**
* 服务提供者注册到服务中心上
*
* @param servInterfaceName
* 服务接口名字
* @param servImplClazz
* 具体服务实现class
* @throws IOException
*/
public void register(String servInterfaceName, Class<?> servImplClazz);
}
服务中心接口实现






客户端的远程代理类(主要是生成代理对象,发送请求给服务器 并获取返回结果)

关闭流的代码这里省略了
测试类
public class Test {
public static void main(String[] args) {
final int port = 9999;
new Thread(new Runnable() {
@Override
public void run() {
BioServiceCenter bioServiceCenter = new BioServiceCenter(port);
bioServiceCenter.register(ITestService.class.getName(), TestServiceImpl.class);
try {
bioServiceCenter.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
ITestService iTestService = (ITestService) RpcProxy.getRpcProxyObject(ITestService.class,
new InetSocketAddress("localhost", port));
System.out.println(iTestService.sayHi("nihao "));
}
}
运行结果如下

注意:这个例子只是模拟了核心处理流程,还有以下几个点可以优化
1 bio相对来说性能不如nio ,可以考虑使用netty等高性能网络通信框架
2 使用更加高效的序列化方式,比如Google protobu ,kryo等
3 服务注册与发现 可以使用zookeeper实现,更加稳定
实现一个简易版RPC的更多相关文章
- .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”
FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...
- 依赖注入[5]: 创建一个简易版的DI框架[下篇]
为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在<依赖注入[4]: 创建一个简易版的DI框架[上篇]> ...
- 依赖注入[4]: 创建一个简易版的DI框架[上篇]
本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章(<控制反转>.<基于IoC的设计模式>和< 依赖注入模式>)从纯理论的角度 ...
- .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]
原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...
- 手动实现一个简易版SpringMvc
版权声明:本篇博客大部分代码引用于公众号:java团长,我只是在作者基础上稍微修改一些内容,内容仅供学习与参考 前言:目前mvc框架经过大浪淘沙,由最初的struts1到struts2,到目前的主流框 ...
- 如何实现一个简易版的 Spring - 如何实现 Setter 注入
前言 之前在 上篇 提到过会实现一个简易版的 IoC 和 AOP,今天它终于来了...相信对于使用 Java 开发语言的朋友们都使用过或者听说过 Spring 这个开发框架,绝大部分的企业级开发中都离 ...
- 如何实现一个简易版的 Spring - 如何实现 Constructor 注入
前言 本文是「如何实现一个简易版的 Spring」系列的第二篇,在 第一篇 介绍了如何实现一个基于 XML 的简单 Setter 注入,这篇来看看要如何去实现一个简单的 Constructor 注入功 ...
- 如何实现一个简易版的 Spring - 如何实现 @Component 注解
前言 前面两篇文章(如何实现一个简易版的 Spring - 如何实现 Setter 注入.如何实现一个简易版的 Spring - 如何实现 Constructor 注入)介绍的都是基于 XML 配置文 ...
- 使用 js 和 Beacon API 实现一个简易版的前端埋点监控 npm 包
使用 js 和 Beacon API 实现一个简易版的前端埋点监控 npm 包 前端监控,埋点,数据收集,性能监控 Beacon API https://caniuse.com/beacon 优点,请 ...
随机推荐
- Jmeter5.1.1+python调用python脚本
1.下载jython https://www.jython.org/downloads.html 下载Download Jython 2.7.0 - Standalone Jar : For embe ...
- base编码解码
function b64EncodeUnicode(str) { return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, func ...
- [leetcode]332. Reconstruct Itinerary
Given a list of airline tickets represented by pairs of departure and arrival airports [from, to], r ...
- Java的注解总结
java 1.5开始引入了注解和反射,正确的来说注解是反射的一部分,没有反射,注解无法正常使用,但离开注解,反射依旧可以使用.Java的注解详解和自定义注解: https://blog.csdn.ne ...
- 11Linux_sshd_Apache
1.Linux系统中一切都是文件. 2.配置服务实际上就是在修改配置文件. 3.重启相应服务来加载最新的配置参数. 4.为了保证下次还生效,加入到开机启动项中.
- BitmapData.threshold()方法
import flash.display.Bitmap; import flash.display.BitmapData; import flash.geom.Rectangle; import fl ...
- zabbix添加自定义监控项目
在zabbix里添加一个自定义监控项目,简单做个笔记,怕忘了 首先需要定义 zabbix_agentd.conf 中的 UnsafeUserParameters 修改为 UnsafeUserPara ...
- jsp Servlet 文件上传
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...
- scrapy 之自定义命令运行所有爬虫文件
1.在spider文件夹同级目录创建commands python包 2.在包下创建command.py文件 3.从scrapy.commands包下引入ScrapyCommand 4.创建一个类,继 ...
- PhoenixFD插件流体模拟——UI布局【Dynamics】详解
流体动力学 本文主要讲解Dynamics折叠栏中的内容.原文地址:https://docs.chaosgroup.com/display/PHX3MAX/Liquid+Dynamics 主要内容 Ov ...