实现一个简易版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 优点,请 ...
随机推荐
- python调用GDAL实现几何校正
引自https://blog.csdn.net/qq_27045589/article/details/81062586 def main(): infile = "F:\\Temp_Dat ...
- springboot学习随笔(三):Controller参数映射
接上章内容,我们看看浏览器参数如何映射到我们的Controller层 我们新建UserController和User实 User.java package com.example.main; impo ...
- 基于前台vue,后台是spring boot的压缩图片上传
本人是刚毕业的新手,最近公司的一个项目,前后端分离,前端Vue,后端使用spring boot.其中有一个需求是需要做前端上传的图片需要压缩才能上传.为此在网上查找资料,并做了简单的实现. 那么一步来 ...
- js点击图片放大
废话不说直接放代码了: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...
- java面试题复习(八)
71.如何通过反射创建对象? 方法1:通过类对象调用newInstance()方法,例如:String.class.newInstance() 方法2:通过类对象的getConstructor()或 ...
- mount命令和自动挂载实例
前言 介绍mount命令和一个实例. mount命令 作用 作用:挂载linux系统外的文件 命令格式 mount [-hV] mount -a [-fFnrsvw] [-t vfstype] mou ...
- SQL表变量和临时表
一.表变量 表变量在SQL Server 2000中首次被引入.表变量的具体定义包括列定义,列名,数据类型和约束.而在表变量中可以使用的约束包括主键约束, 唯一约束,NULL约束和CHECK约束(外键 ...
- [原创] debian 9.3 搭建Jira+Confluence+Bitbucket项目管理工具(三) -- 安装confluence 6.6.1
[原创] debian 9.3 搭建Jira+Confluence+Bitbucket项目管理工具(三) -- 安装confluence 6.6.1 有了安装Jira的经验, 这次再安装conflue ...
- python中类中的@property
@property考察 Student 类: class Student(object): def __init__(self, name, score): self.name = name self ...
- PowerScript语句
赋值语句 赋值语句可以把一个表达式的结果或者变量和常量的值,赋给一个变量或者对象的属性或成员变量.赋值语句的格式是: variablename = expression 其中variablename代 ...