上篇博客主要介绍了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的更多相关文章

  1. .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

    FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...

  2. 依赖注入[5]: 创建一个简易版的DI框架[下篇]

    为了让读者朋友们能够对.NET Core DI框架的实现原理具有一个深刻而认识,我们采用与之类似的设计构架了一个名为Cat的DI框架.在<依赖注入[4]: 创建一个简易版的DI框架[上篇]> ...

  3. 依赖注入[4]: 创建一个简易版的DI框架[上篇]

    本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章(<控制反转>.<基于IoC的设计模式>和< 依赖注入模式>)从纯理论的角度 ...

  4. .NET CORE学习笔记系列(2)——依赖注入[4]: 创建一个简易版的DI框架[上篇]

    原文https://www.cnblogs.com/artech/p/net-core-di-04.html 本系列文章旨在剖析.NET Core的依赖注入框架的实现原理,到目前为止我们通过三篇文章从 ...

  5. 手动实现一个简易版SpringMvc

    版权声明:本篇博客大部分代码引用于公众号:java团长,我只是在作者基础上稍微修改一些内容,内容仅供学习与参考 前言:目前mvc框架经过大浪淘沙,由最初的struts1到struts2,到目前的主流框 ...

  6. 如何实现一个简易版的 Spring - 如何实现 Setter 注入

    前言 之前在 上篇 提到过会实现一个简易版的 IoC 和 AOP,今天它终于来了...相信对于使用 Java 开发语言的朋友们都使用过或者听说过 Spring 这个开发框架,绝大部分的企业级开发中都离 ...

  7. 如何实现一个简易版的 Spring - 如何实现 Constructor 注入

    前言 本文是「如何实现一个简易版的 Spring」系列的第二篇,在 第一篇 介绍了如何实现一个基于 XML 的简单 Setter 注入,这篇来看看要如何去实现一个简单的 Constructor 注入功 ...

  8. 如何实现一个简易版的 Spring - 如何实现 @Component 注解

    前言 前面两篇文章(如何实现一个简易版的 Spring - 如何实现 Setter 注入.如何实现一个简易版的 Spring - 如何实现 Constructor 注入)介绍的都是基于 XML 配置文 ...

  9. 使用 js 和 Beacon API 实现一个简易版的前端埋点监控 npm 包

    使用 js 和 Beacon API 实现一个简易版的前端埋点监控 npm 包 前端监控,埋点,数据收集,性能监控 Beacon API https://caniuse.com/beacon 优点,请 ...

随机推荐

  1. Django整理1

    基本结构 │ db.sqlite3 ----------sqlie3数据库 │ manage.py │ ├─logres │ │ admin.py 后台,可以用很少量的代码就拥有一个强大的后台. │ ...

  2. Android APK反编译(二)

    参考:APK反编译 工具介绍 apktool 作用:资源文件获取,可以提取出图片文件和布局文件进行使用查看 dex2jar 作用:将apk反编译成java源码(classes.dex转化成jar文件) ...

  3. [Nginx]Nginx的一些概念

    Nginx 关注:一.性能  1)高并发下资源不浪费在处理进程切换休眠等,保持高的吞吐量  2)高并发下如何保持平均时延低  3)提高网络效率,例如长连接代替短链接,高压缩算法提高信息量,使用缓存减少 ...

  4. MTK6261之Catcher工具的Database Path

    在Catcher使用使用的时候我们常用要选择Database Path 设置数据库的路径,编译自动生成的文件: 设置路径选项: (一般是在对应工程文件的路径 \tst\database_classb) ...

  5. ToroiseSVN和VisualSVN-server的配置使用, 外网访问SVN 版本库

    https://www.cnblogs.com/Leo_wl/p/3475167.html

  6. WPF 学习笔记

    依赖属性(Dependency Property) 相比较于普通属性,依赖属性有以下特点: 变化通知(change notification) 节省内存 使用某种带优先级决定策略(resolution ...

  7. MemoryStream说明

    MemoryStream 是内存流,为系统内存提供读写操作,由于 MemoryStream 是通过无符号字节数组组成的,可以说 MemoryStream 的性能可以算比较出色,所以它担当起了一些其他流 ...

  8. 吴裕雄 python 机器学习——线性回归模型

    import numpy as np from sklearn import datasets,linear_model from sklearn.model_selection import tra ...

  9. java课程之团队开发冲刺1.4

    一.总结昨天进度 1.昨天任务全部完成 二.遇到的问题 1.对数据库的使用陌生 2.使用sqlite有些困难 3.对如何解决查询课程问题暂时没有找到好的解决方案 三.今日任务 1.由于周一的课程比较紧 ...

  10. SVN添加用户

    1. 找到svn安装路径  /svn/repositories/ (如果不知道,可以搜索 :find / -name svn或者是ps -ef | grep svn) 2.进入该目录的conf,其中包 ...