Java 简单的rpc 一
一,简单rpc 是基于Java socket 编程
ServerSocket serverSocket = new ServerSocket(9999);
System.out.println("服务开启");
while(true) {
//开启一个服务监听
Socket socket = serverSocket.accept();
System.out.println(socket.getInetAddress()+"-connected");
InputStream in = socket.getInputStream();
byte[] buf = new byte[1024];
in.read(buf);
//拿到序列化得数据
byte[] formatDate = formatData(buf); OutputStream out = socket.getOutputStream();
out.write(formatDate);
socket.close();
}
通过NetModel类保证从客户端传入的参数 包括 类的名称 方法名称 参数类型 参数
package org.Simple.API; import java.io.Serializable;
import java.util.Arrays; public class NetModel implements Serializable{ private static final long serialVersionUID = 1L; private String className; private String method; private Object[] args ; private String[] types; public String getClassName() {
return className;
} public void setClassName(String className) {
this.className = className;
} public String getMethod() {
return method;
} public void setMethod(String method) {
this.method = method;
} public Object[] getArgs() {
return args;
} public void setArgs(Object[] args) {
this.args = args;
} public String[] getTypes() {
return types;
} public void setTypes(String[] types) {
this.types = types;
} @Override
public String toString() {
return "NetModel [className=" + className + ", method=" + method + ", args=" + Arrays.toString(args)
+ ", types=" + Arrays.toString(types) + "]";
}
}
通过Java 反射 调用方法生成结果 在通过 serversocket 返回给客户端
try {
			 //将收到的byte数组反序列化为NetModel类型,然后通过反射调用HelloServiceImpl实现类的方法
            NetModel netModel = (NetModel)SerializeUtils.deSerialize(bs);
            //包点类名称
            String className = netModel.getClassName();
            //参数类型
            String[] types = netModel.getTypes();
            //参数
            Object[] args = netModel.getArgs();
            /*这里简单通过Map来做接口映射到实现类,从map中取
            Map<String, String> map = new HashMap<String,String>();
            map.put("org.Simple.API.HelloService", "org.Simple.S.HelloServiceImpl");
            Class<?> clazz = Class.forName(map.get(className));
            */
            //也可以把这个键值放到配置文件下,通过配置文件读取
            Class<?> clazz = Class.forName(getPropertyValue(className));
            Class<?> [] typeClazzs = null;
            if(types!=null) {
                typeClazzs = new Class[types.length];
                for (int i = 0; i < typeClazzs.length; i++) {
                    typeClazzs[i] = Class.forName(types[i]);
                }
            }
            Method method = clazz.getMethod(netModel.getMethod(),typeClazzs);
            //方法调用 参数
            Object object = method.invoke(clazz.newInstance(), args);
            byte[] byteArray = SerializeUtils.serialize(object);
            return byteArray;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
Java 简单的rpc 一的更多相关文章
- Java简单的RPC实现(一)
		
RPC使用java最基本的,传输层使用Socket,序列化使用Serializable,java 动态代理模式,但是未实现消息注册等相关信息 大道至简 server端 package com.rpc. ...
 - Java 简单的RPC 实现
		
借用了网上某大神的例子.... 目录结构是这样的... RpcFramework 主要是两个方法.一个是暴露服务,一个为引用服务.暴露服务的主要作用是声明一个接口的实现类.可以通过socket 远程调 ...
 - 分布式架构的基石.简单的 RPC 框架实现(JAVA)
		
前言 RPC 的全称是 Remote Procedure Call,它是一种进程间通信方式.允许像调用本地服务一样调用远程服务. 学习来源:<分布式系统架构:原理与实践> - 李林锋 1. ...
 - Java实现简单的RPC框架(美团面试)
		
一.RPC简介 RPC,全称为Remote Procedure Call,即远程过程调用,它是一个计算机通信协议.它允许像调用本地服务一样调用远程服务.它可以有不同的实现方式.如RMI(远程方法调用) ...
 - Java使用Netty实现简单的RPC
		
造一个轮子,实现RPC调用 在写了一个Netty实现通信的简单例子后,萌发了自己实现RPC调用的想法,于是就开始进行了Netty-Rpc的工作,实现了一个简单的RPC调用工程. 如果也有兴趣动手造轮子 ...
 - 最简单的RPC框架实现
		
通过java原生的序列化,Socket通信,动态代理和反射机制,实现一个简单的RPC框架,由三部分组成: 1.服务提供者,运行再服务端,负责提供服务接口定义和服务实现类 2.服务发布者,运行再RPC服 ...
 - Java自带RPC实现,RMI框架入门
		
Java自带RPC实现,RMI框架入门 首先RMI(Remote Method Invocation)是Java特有的一种RPC实现,它能够使部署在不同主机上的Java对象进行通信与方法调用,它是一种 ...
 - 面试题思考:Java RMI与RPC,JMS的比较
		
RPC:(Remote Procedure Call) 被设计为在应用程序间通信的平台中立的方式,它不理会操作系统之间以及语言之间的差异. 支持多语言 RMI:(Remote Method Invo ...
 - 如何实现一个简单的RPC
		
在如何给老婆解释什么是RPC中,我们讨论了RPC的实现思路. 那么这一次,就让我们通过代码来实现一个简单的RPC吧! RPC的实现原理 正如上一讲所说,RPC主要是为了解决的两个问题: 解决分布式系统 ...
 
随机推荐
- 项目出现小红叉,类名上带有 Implicit错误
			
Implicit super constructor Object() is undefined for default constructor. Must define an explicit co ...
 - The op amp module
 - 面向对象数据库(Object Oriented Databases)
			
前面说几句费话.如今正在从事面向对象数据库在国内的推广工作,假设有兴趣能够与我联系. 假设有不论什么问题能够私信我,也能够到我们站点上 面向对象数据库交流社区 来向我提问,我一定以最快的速度解答. 想 ...
 - Kubernetes基础:编排调度的那些Controllers
			
0. 概述 Kubernetes提供了很多Controller资源来管理.调度Pod,包括Replication Controller.ReplicaSet.Deployments.StatefulS ...
 - java线程安全之并发Queue
			
关闭 原 java线程安全之并发Queue(十三) 2017年11月19日 23:40:23 小彬彬~ 阅读数:12092更多 所属专栏: 线程安全 版权声明:本文为博主原创文章,未经博主允许不 ...
 - 你真的会用Gson吗?Gson使用指南(2)
			
注:此系列基于Gson 2.4. 上一篇文章 你真的会用Gson吗?Gson使用指南(1) 我们了解了Gson的基础用法,这次我们继续深入了解Gson的使用方法. 本次的主要内容: Gson的流式反序 ...
 - C++11 多线程编程 使用lambda创建std::thread  (生产/消费者模式)
			
要写个tcp server / client的博客,想着先写个c++11多线程程序.方便后面写博客使用. 目前c++11中写多线程已经很方便了,不用再像之前的pthread_create,c++11中 ...
 - nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use) 解决办法
			
遇到这个问题,是因为某个服务正在使用80端口; 解决步骤: 1.使用netstat命令查看80端口被哪个服务占用了 netstat -ant | grep 80 1 2.关闭80端口 /etc/ini ...
 - 对span设置鼠标光标样式
			
<html> <body> <p>请把鼠标移动到单词上,可以看到鼠标指针发生变化:</p> <span style="cursor:au ...
 - More than the maximum number of request parameters
			
前些时间,我们的的一个管理系统出现了点问题,原本运行的好好的功能,业务方突然讲不行了,那个应用已经运行了好多年了,并且对应的代码最近谁也没改动过,好奇怪的问题,为了解决此问题,我们查看了日志,发现请求 ...