5

RPC在Java中的实现

 2 years ago
source link: https://laboo.top/2019/05/15/rpc/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

RPC在Java中的实现

Posted on

2019-05-15 Edited on 2021-12-15 In 技术分享

RPC是一种远程过程调用, 它是一种通过网络从远程计算机程序上请求服务, 而不需要了解底层网络技术的协议

RPC可以把远程服务像本地服务一样调用, 以Java中为例, 客户端与服务端一般共用一个核心包, 核心包中包含了需要调用服务的接口

在服务端实现这些接口, 客户端通过Socket等方式连接服务端, 发生调用的信息(方法名, 参数等)

服务端接收后执行相应动作, 最后通过网络返回计算结果, 一次RPC调用就完成了

下面是Java中的简单实现

public interface TestService {
String print(String s);
}

一个简单的打印服务, 不包含实现

在客户端代码中自始至终没有编写服务的实现, 只有一个接口, 但是又可以得到服务的实例,

要做到这点需要用到Java中的动态代理Proxy.newProxyInstance

import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.net.InetSocketAddress;
import java.net.Socket;

public class Consumer {

public static void main(String[] as) {

TestService service = (TestService) Proxy.newProxyInstance(TestService.class.getClassLoader(), new Class<?>[]{TestService.class}, (Object proxy, Method method, Object[] args) -> {
try(Socket socket = new Socket()){
socket.connect(new InetSocketAddress(12306));
ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());
os.writeUTF(method.getName());
os.writeObject(method.getParameterTypes());
os.writeObject(args);
return new ObjectInputStream(socket.getInputStream()).readObject();
}catch (Exception e){
return null;
}
});
System.out.println(service.print("abc"));
}
}

通过对象流把参数等信息发送给服务端

一般服务端是预先实例化服务, 以完整类名为Key把服务存进集合供调用, 或者依赖现成的Springboot等框架管理服务, 下面是服务端的实现

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;

public class Producer {

public static void main(String[] args) {

TestService service = new TestServiceImpl();

try (ServerSocket serverSocket = new ServerSocket()){
serverSocket.bind(new InetSocketAddress(12306));

try(Socket accept = serverSocket.accept()){
ObjectInputStream is = new ObjectInputStream(accept.getInputStream());
String methodName = is.readUTF();
Class<?>[] parameterTypes = (Class<?>[]) is.readObject();
Object[] arguments = (Object[]) is.readObject();
Object result = TestService.class.getMethod(methodName,parameterTypes).invoke(service,arguments);
new ObjectOutputStream(accept.getOutputStream()).writeObject(result);
}
} catch (Exception e) {
e.printStackTrace();
}

}
}

服务端编写服务实例代码

public class TestServiceImpl implements TestService{

@Override
public String print(String s) {
return "**"+s+"**";
}
}

至此可以看到客户端调用的

System.out.println(service.print("abc"));
**abc**

就好像调用了本地服务一样


Recommend

  • 38
    • 微信 mp.weixin.qq.com 6 years ago
    • Cache

    简单聊下RPC实现

  • 20
    • 微信 mp.weixin.qq.com 5 years ago
    • Cache

    使用 RabbitMQ 实现 RPC

  • 76
    • segmentfault.com 5 years ago
    • Cache

    Go 实现简易 RPC 框架

    本文旨在讲述 RPC 框架设计中的几个核心问题及其解决方法,并基于 Golang 反射技术,构建了一个简易的 RPC 框架。 项目地址: Tiny-RPC RPC ...

  • 35
    • studygolang.com 4 years ago
    • Cache

    golang实现RPC调用

    RPC远程调用 RPC通信过程 调用者(客户端Client)以本地调用的方式发起调用

  • 11
    • www.rowkey.cn 3 years ago
    • Cache

    Java工程师应该知道的RPC

    Java工程师应该知道的RPC Feb 17th, 2020 Posted by 飒然Hang in java RPC, Remote Procedure Call,故名思议就是远程过程调...

  • 8

    Returning a Java Object List in RabbitMQ RPC In this post we will build on returning Java Objects in RabbitMQ RPC by returning an Object List. What w...

  • 7

    In this post I'm going to demonstrate using RabbitMQ RPC with the Bootique RabbitMQ Module. You can find RabbitMQ RPC examples elsewhere like in the RabbitMQ Java Examp...

  • 6

    解决的问题RPC 主要是为了解决的两个问题:解决分布式系统中,服务之间的调用问题。远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。这一节我们来学习下如何基于 websocket 实现最简单的 r...

  • 7

    Communicating with Solana RPC using Java Apr 20, 2023 Solana is one of the most popular blockchains with increasing adoption. However, when it comes to developmen...

  • 3
    • www.cnblogs.com 11 months ago
    • Cache

    java实现朴素rpc - 余充数

    java实现朴素rpc posted @ 2023-10-14 11:59  余充数  阅读(6...

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK