网站怎么做才能让更多平台展现,红色大气网站,简述酒店类网站开发的策略,成功营销案例一、RPC简介最近看hadoop底层通信#xff0c;都是通过RPC实现的。RPC(Remote Procedure Call Protocol)远程调用#xff1a; 远程过程调用是一种常用的分布式网络通信协议,它允许运行于 一台计算机的程序调用另一台计算机的子程序#xff0c;同时将网络的通信细节隐藏起来都是通过RPC实现的。RPC(Remote Procedure Call Protocol)远程调用 远程过程调用是一种常用的分布式网络通信协议,它允许运行于 一台计算机的程序调用另一台计算机的子程序同时将网络的通信细节隐藏起来 使得用户无须额外地为这个交互作用编程。分布式系统之间的通信大都通过RPC实现二、RPC请求过程client发起服务调用请求client stub代理程序将调用的方法参数按照一定格式封装通过服务方的地址发起网络请求消息通过网络发送到服务端server stub接收到消息进行解包反射调用本地对应的服务本地服务执行将结果返回给server stub,然后server stub会将结果消息打包返回到客户端client stub接收消息解码得到最终结果.三、RPC框架架构要写一个RPC框架需要哪些组成部分序列化方式。序列化主要作用是将结构化对象转为字节流以便于通过网络进行传输或写入持久存储。远程代理对象一般使用jdk动态代理或者cglib代理服务暴露 设置注册中心Zookeeper网络通信基于事件驱动的Reactor模式四、RPC框架示例服务提供者运行在服务器端提供服务接口定义与服务实现类服务发布者运行在服务器端负责将本地服务发布成远程服务管理远程服务提供给服务消费者使用服务消费者运行在客户端通过远程代理对象调用远程服务服务端代码服务接口//计算学生年龄和的接口public interface CalculateService { String cal(Student sta, Student stb);}public class CalculateServiceImpl implements CalculateService { Override public String cal(Student sta, Student stb) { return 学生年龄之和 (sta.getAge() stb.getAge()); }}服务发布public class PublishUtilI { //服务接口集合 private static List serviceList; private static ThreadPoolExecutor executor new ThreadPoolExecutor(5,10,10, TimeUnit.SECONDS, new LinkedBlockingQueue(10)); public static void publish(int port,Object... services) throws IOException { serviceList Arrays.asList(services); ServerSocket server new ServerSocket(port); Socket client; while (true) { //阻塞等待请求 client server.accept(); //使用线程池处理请求 executor.submit(new ServerHandler(client, serviceList)); } }}反射调用服务读取客户端发送的服务名判断服务是否发布如果发布反射调用服务端对应服务返回结果给客户端public class ServerHandler implements Runnable { private Socket client null; private List serviceList null; public ServerHandler(Socket client, List service) { this.client client; this.serviceList service; } Override public void run() { try ( ObjectInputStream input new ObjectInputStream(client.getInputStream()); ObjectOutputStream output new ObjectOutputStream(client.getOutputStream()) ) { // 读取客户端要访问那个service Class serviceClass (Class) input.readObject(); // 找到该服务类 Object obj findService(serviceClass); if (obj null) { output.writeObject(serviceClass.getName() 服务未发现); } else { //利用反射调用该方法返回结果 String methodName input.readUTF(); //读取UTF编码的String字符串 //读取参数类型 Class[] parameterTypes (Class[]) input.readObject(); //读取参数 Object[] arguments (Object[]) input.readObject(); Method method obj.getClass().getMethod(methodName, parameterTypes); //反射执行方法 Object result method.invoke(obj, arguments); output.writeObject(result); } } catch (Exception e) { e.printStackTrace(); } } private Object findService(Class serviceClass) { for (Object obj : serviceList) { boolean isFather serviceClass.isAssignableFrom(obj.getClass()); if (isFather) { return obj; } } return null; }}客户端代码public class Client { public static void main(String[] args) { CallProxyHandler handler new CallProxyHandler(127.0.0.1