最近在看Dubbo 服务框架, 通过RPC 实现了输入和输出,并支持与Spring无缝结合。
做的很不错。
其中:ServiceProvider,ServiceConsumer
服务提供者需要输入输出的接口和实现;
服务消费者 只需要接口。
现在看了梁飞的日志,自己理解了一下他的代码,自己敲了一遍,理解了一下。
记录下来。
package com.mjp.rpc.study.rpcframe;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.ServerSocket;
import java.net.Socket;
public class RpcFramework {
/**
* @param service
* @param port
* @return
* @throws Exception
*/
public static Object serverInvoke(final Object service, int port) throws Exception {
if (service == null) {
throw new IllegalArgumentException(" service is null");
}
if (port < 1 || port > 65535) {
throw new IllegalArgumentException(" port is not valid must in 1-65535");
}
ServerSocket server = new ServerSocket(port);
while (true) {
try {
final Socket socket = server.accept();
new Thread(new Runnable() {
@Override
public void run() {
ObjectOutputStream outs = null;
ObjectInputStream input = null;
try {
input = new ObjectInputStream(socket.getInputStream());
String methodName = input.readUTF();
Class<?>[] parameters = (Class<?>[])input.readObject();
Object[] arguments = (Object[])input.readObject();
outs = new ObjectOutputStream(socket.getOutputStream());
Method method = service.getClass().getMethod(methodName, parameters);
Object result = method.invoke(service, arguments);
outs.writeObject(result);
} catch (Exception ex) {
if(outs != null){
try {
outs.writeObject(ex);
} catch (Exception e) {
}
}
}finally{
if(outs != null){
try {
outs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(input != null){
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
socket.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
Thread.sleep(100);
} catch (Exception ex) {
}
}
}
/**
* @param interfaceClass
* @param host
* @param port
* @return
* @throws Exception
*/
public static <T> T refer(final Class<T> interfaceClass ,final String host ,final int port) throws Exception{
if(interfaceClass == null){
throw new IllegalAccessException("interfaceClass is null");
}
if(host == null || host.trim().length() == 0){
throw new IllegalAccessException("host is null");
}
if (port < 1 || port > 65535) {
throw new IllegalArgumentException(" port is not valid must in 1-65535");
}
return (T)Proxy.newProxyInstance(interfaceClass.getClassLoader(),new Class<?>[]{interfaceClass},new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Socket socket = new Socket(host,port);
ObjectOutputStream outs = null;
try{
outs = new ObjectOutputStream(socket.getOutputStream());
outs.writeUTF(method.getName());
outs.writeObject(method.getParameterTypes());
outs.writeObject(args);
ObjectInputStream input = null;
try{
input = new ObjectInputStream(socket.getInputStream());
Object result = input.readObject();
if(result instanceof Throwable){
throw (Throwable)result;
}
return result;
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(input != null){
input.close();
}
}
}catch(Exception ex){
ex.printStackTrace();
}finally{
if(outs != null){
outs.close();
}
}
return null;
}
});
}
}
package com.mjp.rpc.study.rpcframe;
public class RpcProvider {
public static void main(String[] args) throws Exception{
ITestService service = new TestServiceImpl();
RpcFramework.serverInvoke(service, 2000);
}
}
package com.mjp.rpc.study.rpcframe;
public class RpcConsumer {
public static void main(String[] args) throws Exception {
ITestService service = RpcFramework.refer(ITestService.class, "localhost", 2000);
String result = service.helloWorld("mojianpo");
System.out.println(result);
}
}
package com.mjp.rpc.study.rpcframe;
public class RpcConsumer {
public static void main(String[] args) throws Exception {
ITestService service = RpcFramework.refer(ITestService.class, "localhost", 2000);
String result = service.helloWorld("mojianpo");
System.out.println(result);
}
}
----------------------------------
package com.mjp.rpc.study.rpcframe;
public interface ITestService {
public String helloWorld(String name);
}
package com.mjp.rpc.study.rpcframe;
public class TestServiceImpl implements ITestService{
@Override
public String helloWorld(String name) {
return "hello world :" + name;
}
}
相关推荐
总结一下,基于Socket的RPC实现提供了一种基础的远程服务调用方式,但随着系统的复杂性和需求的增长,我们需要引入更先进的技术和工具。通过使用Netty作为底层通信库,我们可以提升通信效率和系统的并发处理能力。而...
RPC(Remote Procedure Call)是一种进程间通信技术,允许在一台计算机上的程序调用另一台计算机上的程序,使得分布式系统能够像调用本地函数一样调用远程服务。在本主题中,我们将深入探讨如何使用C语言实现RPC,并...
RPC的基本结构遵循客户端-服务器(C/S)模型,类似于基于Socket的C/S编程,但它提供了一个更高级别的抽象。在RPC中,客户端发起一个调用,参数通过RPC传输层(可以是TCP或UDP,即TI-RPC)传递到服务器,然后根据预设...
9. **服务调用模型**:常见的服务调用模型有同步和异步两种。同步模型中,客户端发起请求后会阻塞等待响应;异步模型下,客户端发送请求后立即返回,然后通过回调或轮询等方式获取结果。 10. **心跳检测**:保持...
在分布式系统中,RPC(Remote Procedure Call)是一种常见且重要的通信机制,它允许一个程序调用另一个在不同进程中运行的程序,就像调用本地函数一样简单。Dubbo作为阿里巴巴开源的一款高性能、轻量级的RPC框架,...
RPC(Remote Procedure Call)是一种进程间通信(IPC)技术,允许一个程序调用另一个不在同一台计算机上的程序。在Java中实现RPC通信模型,通常涉及客户端、服务端、序列化和网络通信等多个环节。以下是对这个主题的...
RPC框架有多种调用模型,如同步阻塞、异步非阻塞、回调等。在同步阻塞模型中,调用方会等待直到返回结果;异步非阻塞模型中,调用方无需等待,可以继续执行其他任务;回调模型则是在结果准备好后通知调用方。`...
本项目是基于Netty 4.0实现的自定义RPC通信框架,旨在为Java开发者提供一种高效、灵活的远程服务调用解决方案。 首先,我们来深入理解Netty的基本概念。Netty的核心是其NIO(非阻塞I/O)模型,它使用了Reactor模式...
在RPC模型中,客户端(Client)发起一个函数调用请求,这个请求包含了目标函数的名称和参数。RPC框架负责将这个调用转换成网络消息,并通过socket发送到服务器(Server)端。服务器接收到消息后,通过反射机制找到...
开发者可能已经实现了RPC请求的解析、服务调用和响应构造的逻辑,并将其与Kohana的MVC架构整合在一起,以提供高效且可扩展的服务。为了进一步理解这个项目,需要查看源代码并了解具体的实现细节。
总结以上,Java实现的RPC框架综合运用了JDK动态代理、NIO Socket通信、反射、注解、Protostuff序列化以及Zookeeper分布式协调服务,构建了一套高效、灵活的远程调用解决方案。通过理解这些核心技术,开发者可以更好...
在Java中,Socket通信涉及三种不同的模型:BIO(Blocking I/O)、NIO(Non-blocking I/O)和Netty,这些都是实现高并发、高性能网络服务的重要手段。 **1. Socket基础** Socket,通常被称为套接字,是网络通信的...
RPC调用模型通常有同步和异步两种。同步调用中,客户端会等待服务端的响应;异步调用则不等待,而是立即返回,通过回调或者Future对象获取结果。RPCDemo可能只实现了同步调用。 6. **异常处理**: 在RPC调用过程...
RPC(Remote Procedure Call)是一种进程间通信机制,允许程序在分布式环境下调用远程系统上的方法,就像调用本地方法一样简单。在这个Java手写RPC框架的项目中,我们主要关注两个核心部分:`rpc-server`和`rpc-...
RPC调用模型有同步、异步和回调等多种形式。同步调用是最常见的,等待服务器响应后才继续执行;异步调用不阻塞主线程,而是立即返回,通过回调或Future对象获取结果;对于耗时操作,异步调用可以显著提高系统响应...
在RPC模型中,客户端发起请求,服务器端处理请求并返回结果。这个过程对客户端来说是透明的,它无需关心网络传输的细节,只需像调用本地函数那样调用远程服务。 2. **C++实现RPC**: 在C++中,实现RPC通常涉及以下...
在C/C++中实现JSON-RPC可以帮助开发者创建分布式系统,使得服务间的通信变得更加简单。下面我们将深入探讨C/C++中的JSON-RPC相关知识点。 首先,理解JSON-RPC的基本概念非常重要。JSON-RPC允许客户端通过发送一个...
RPC协议通常用于处理远程过程调用,而自定义协议则可以创建更复杂的通信模型。 - 使用Vuser脚本编写Socket通信时,LoadRunner提供了API函数,如`lr_socket()`、`lr_send_string()`、`lr_recv_string()`等,用于创建...