rpc 分两部份,一个是调用者,另一方是服务提供者

调用者只关心那个服务,传相应参数,返回内容就可以

而提供者根据调用相应服务同参数,工作处理后响应内容即可

根据他们的关系可以用JAVA 接口同实现类 来约束书写完成功能

 @QModel(1)
public interface ITestEnhance {
@QCommond(1)
public void a(double a); @QCommond(2)
public void b(float a); @QCommond(3)
public void c(byte a); @QCommond(4)
public void d(long a); @QCommond(5)
public void e(TestMessageObject obj); @QCommond(6)
public void f(AtomicLong al); @QCommond(7)
public TestMessageObject g(AtomicLong a,long b,TestMessageObject c);
}

接口

 public class TestEnhanceImpl implements ITestEnhance {

     @Override
public void a(double a) {
System.out.println("a接收到 数值 : " + a); } @Override
public void b(float a) {
System.out.println("b接收到 数值 : " + a); } @Override
public void c(byte a) {
System.out.println("c接收到 数值 : " + a);
} @Override
public void d(long a) {
System.out.println("d接收到 数值 : " + a);
} @Override
public void e(TestMessageObject obj) {
if (obj == null) {
return;
}
System.out.println("e接收到 数值 : " + SerialUtil.writeValueAsString(obj)); } @Override
public void f(AtomicLong a) {
System.out.println("f接收到 数值 : " + a.get());
} @Override
public TestMessageObject g(AtomicLong a, long b, TestMessageObject c) {
System.out.println("g接收到 数值 : " + a.get());
System.out.println("g接收到 数值 : " + b);
System.out.println("g接收到 数值 : " + SerialUtil.writeValueAsString(c));
return c;
}
public static void main(String[] args) {
ITestEnhance proxyObject = QRpcFactory.loadProxy(ITestEnhance.class,1L);
QRpcFactory.registerInvokeService(new TestEnhanceImpl()); proxyObject.a(-0.2);
proxyObject.b(0);
proxyObject.c((byte) 0x0);
proxyObject.c((byte) 0x1);
proxyObject.d((byte) 0x1); proxyObject.e(TestMessageObject.of());
proxyObject.f(new AtomicLong(-9)); proxyObject.e(null);
TestMessageObject obj=proxyObject.g(new AtomicLong(-11112), Long.MAX_VALUE, TestMessageObject.of());
SerialUtil.println(obj);
}
}

实现类

 /****
*
* @author solq
*/
public abstract class QRpcFactory {
private final static QRpcEnhanceService enhanceService = QRpcEnhanceService.getFactory(); public static <T> T loadProxy(Class<T> target, QNode... nodes) {
JavassistProxy.getDefault().register(target, enhanceService);
T ret = JavassistProxy.getDefault().transform(target);
IRpcContext ctx = (IRpcContext) ret;
ctx.setContext(RpcContext.of(nodes));
return ret;
} public static <T> T loadProxy(Class<T> target, long... ids) {
JavassistProxy.getDefault().register(target, enhanceService);
T ret = JavassistProxy.getDefault().transform(target);
IRpcContext ctx = (IRpcContext) ret;
ctx.setContext(RpcContext.of(ids));
return ret;
} public static void registerInvokeService(Object target) {
enhanceService.registerInvokeService(target);
}
}

rpc调用同注册工厂

 a接收到 数值 : -0.2
b接收到 数值 : 0.0
c接收到 数值 : 0
c接收到 数值 : 1
d接收到 数值 : 1
e接收到 数值 : {"start":1487901957121}
f接收到 数值 : -9
g接收到 数值 : -11112
g接收到 数值 : 9223372036854775807
g接收到 数值 : {"start":1487901957157}
{"start":1487901957157}

为什么要这样做?其实也可以用最原理的方式socket 或http 或JAVA 本身提供的rpc来做,自己做轮子跟使用轮子创造出来的价值是不能相比

处理做法上面说得很清楚,具体实现细节我在新书里会写出来,欢迎大家关注

[编织消息框架][rpc]使用篇的更多相关文章

  1. [编织消息框架][netty源码分析]2 eventLoop

    eventLoop从命名上看是专门处理事件 事件系统主要由线程池同队列技术组成,有以下几个优点 1.任务出队有序执行,不会出现错乱,当然前提执行线程池只有一个 2.解偶系统复杂度,这是个经典的生产者/ ...

  2. [编织消息框架][JAVA核心技术]动态代理应用12-总结

    动态代理这篇比较长,是框架组成的重要基础 回顾下学到的应用技术 1.异常应用 2.annotation技术 3.数值与逻辑分享 4.jdk.cglib.javassist等动态代理技术 5.懒处理.预 ...

  3. [编织消息框架][传输协议]sctp

    OSI(Open System Interconnect),即开放式系统互联. 一般都叫OSI参考模型,是ISO(国际标准化组织)组织在1985年研究的网络互联模型. 该体系结构标准定义了网络互连的七 ...

  4. [编织消息框架][JAVA核心技术]动态代理应用4

    基础部份: 接下来讲编译JAVA时,生成自定义class 我们用 javax.annotation.processing.AbstractProcessor 来处理 public abstract c ...

  5. [编织消息框架][JAVA核心技术]动态代理应用1

    前面几篇介绍,终于到了应用阶段啦,我们来做一个RPC来加强学过的知识 做基础核心时先确定解决什么问题,提供什么服务,同将来扩展等 rpc 分两部份,一个是调用者,另一方是服务提供者 调用者只关心那个服 ...

  6. [编织消息框架][JAVA核心技术]数值与逻辑分离

    为什么要分离? 业务需求是不停地变,如果把条件写进代码里,当用户需求变时要改代码发版本更新才能生效,这过程无疑是漫长的 就算是在开发期,不停的变开发者精力耗光在沟通,小修改上,无法专注逻辑部分 分离的 ...

  7. [编织消息框架][JAVA核心技术]动态代理应用4-annotationProcessor

    基础部份: 接下来讲编译JAVA时,生成自定义class 我们用 javax.annotation.processing.AbstractProcessor 来处理 public abstract c ...

  8. [编织消息框架][网络IO模型]BIO

    既然跟网络内容有关就不得不学习网络IO模型,时代在进步,技术也在进步,采取使用那种网络IO模型就已经确定应用程序规模 阻塞IO(blocking IO) 在linux中,默认情况下所有的socket都 ...

  9. [编织消息框架][消息服务]jmx

    JMX(Java Management Extensions,即Java管理扩展)是一个为应用程序.设备.系统等植入管理功能的框架,使用的是RMI技术. 比较经典的应用jdk bin目录下 jcons ...

随机推荐

  1. UVa 341 - Non-Stop Travel

    题目大意:给一个地区的地图,上面有若干路口,每个路口因为红灯的缘故要耽误一些时间,给出起点和终点,找出最短路径使得耽误时间最短. 单源最短路问题,Dijkstra算法.同时还要打印路径. #inclu ...

  2. 写了一个复杂的sql语句

    $sp_sql = "select sp_ProductNo, sp_ProductName,sp_Standard,sp_Unit,sum(sp_Amount) as amount fro ...

  3. 10.TCP连接的建立与终止

      1.建立连接协议 (1)请求端发送一个SYN段指明客户打算连接的服务器的端口,移机初始序号ISN.这个SYN段为报文段1. (2)服务器发回包含服务器的初始序号的SYN报文段作为应答.同时,将确认 ...

  4. iOS 之 assign、retain、copy、nonatomic

    1. assign 1.1. 普通赋值 一般用于基本类型 1.2. 常见委托设计模式 防止循环引用 2. retain 保留计数,获取了对象的所有权.引用计数在原有基础上加1. 3. copy 同re ...

  5. 3. 托管对象模型的迁移(Core Data 应用程序实践指南)

    本章介绍如何添加模型版本及模型映射,演示几种迁移技术,供在升级模型时使用. 3.1. 修改托管对象模型 3.2. 添加模型版本 3.3. 轻量级迁移方式 3.4. 默认的迁移方式 3.5. 通过迁移管 ...

  6. easyUI panel组件

    easyUI panel组件: 属性的使用: <!DOCTYPE html> <html lang="en"> <head> <meta ...

  7. 干货!手把手教你如何使用第三方通讯服务实现LayIM Socket组件开发。

    前言 之前写了一系列的文章,是关于使用ASP.NET SignalR技术实现LayIM的功能对接,有兴趣的同学移步:http://www.cnblogs.com/panzi/p/5767095.htm ...

  8. Microsoft Office 2016 简体中文 Vol 版镜像下载(Pro Plus、Visio、Project 下载)

    在使用上,零售版和批量授权版并没有区别,只是授权方式方面的区别,相对而言,VOL 版的更容易激活一些,其他并没有什么区别了. 有需要的可以在下面下载:(以下均是 VL 版) 版本:Office 201 ...

  9. Mac下安装cscope和ctags

    Mac下默认没有cscope和ctags,太不爽了,还好可以自己编译一个放进来 一.下载地址 cscope: http://downloads.sourceforge.net/project/csco ...

  10. 关于flash擦除的方法

    一般的Flash,只允许写时将1变成0,而不允许0变成1:仅当擦除时将0变成1.所以写全0xff是没什么意义的 以前对flash只能进行一次写很困惑,这句话解释了原因. norflash就是 对bit ...