上篇博客主要介绍了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. python调用GDAL实现几何校正

    引自https://blog.csdn.net/qq_27045589/article/details/81062586 def main(): infile = "F:\\Temp_Dat ...

  2. springboot学习随笔(三):Controller参数映射

    接上章内容,我们看看浏览器参数如何映射到我们的Controller层 我们新建UserController和User实 User.java package com.example.main; impo ...

  3. 基于前台vue,后台是spring boot的压缩图片上传

    本人是刚毕业的新手,最近公司的一个项目,前后端分离,前端Vue,后端使用spring boot.其中有一个需求是需要做前端上传的图片需要压缩才能上传.为此在网上查找资料,并做了简单的实现. 那么一步来 ...

  4. js点击图片放大

    废话不说直接放代码了: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  5. java面试题复习(八)

    71.如何通过反射创建对象? 方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance()  方法2:通过类对象的getConstructor()或 ...

  6. mount命令和自动挂载实例

    前言 介绍mount命令和一个实例. mount命令 作用 作用:挂载linux系统外的文件 命令格式 mount [-hV] mount -a [-fFnrsvw] [-t vfstype] mou ...

  7. SQL表变量和临时表

    一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束, 唯一约束,NULL约束和CHECK约束(外键 ...

  8. [原创] debian 9.3 搭建Jira+Confluence+Bitbucket项目管理工具(三) -- 安装confluence 6.6.1

    [原创] debian 9.3 搭建Jira+Confluence+Bitbucket项目管理工具(三) -- 安装confluence 6.6.1 有了安装Jira的经验, 这次再安装conflue ...

  9. python中类中的@property

    @property考察 Student 类: class Student(object): def __init__(self, name, score): self.name = name self ...

  10. PowerScript语句

    赋值语句 赋值语句可以把一个表达式的结果或者变量和常量的值,赋给一个变量或者对象的属性或成员变量.赋值语句的格式是: variablename = expression 其中variablename代 ...