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. 安卓 异步线程更新Ui

    异步跟新UI: 1.handler+Thread(runnable):如果handler和Thread都写在了一个Java文件中,就不说了,如果runnable定义在了一个单独的类文件中,可以通过在构 ...

  2. bzoj1396

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1396 题目大意: 题解:后缀自动机,只出现一次,那么就是right值为1,那么对于一段1-- ...

  3. iOS 程序测试、程序优化、提交前检测

    1. 数据显示如果是数值要考虑到0的情况 2. 数据变化对前一个页面及相关页面的影响,也即数据同步问题.如果是有其它设备改变数据,那数据请求就应该在willappear(视图将要显示事件)进行请求,以 ...

  4. python 模块添加

    python包含子目录中的模块方法比较简单,关键是能够在sys.path里面找到通向模块文件的路径.下面将具体介绍几种常用情况: (1)主程序与模块程序在同一目录下: 如下面程序结构:`-- src  ...

  5. iOS 之 设置横竖屏及ViewWillAppear及视图与导航控制器嵌套时的不同反应

    设置横竖屏不成功,可能跟所在导航控制器有关 视图没有导航控制器时,又有可能不调用ViewWillAppear,这是我遇到的问题.

  6. github 之 下载历史版本

    1.打开github中要下载的项目 2.点击commits 点击上图中标记的地方,进入下图所示: 3. 选择列表中的某个版本 4. Browse Files 5. 下载 点击上图中的 Download ...

  7. apache的工作模式 和 最大连接数设置

    经过测试 效果明显 (1)首选查看apache的工作模式 windows下的查看apache的工作模式命令:httpd -l 如果列出mod_win32.c,则表示是 win32.c 工作方式. 列出 ...

  8. CSS入门介绍

    一.背景 这里将陆续介绍前端CSS中相关知识,先介绍CSS2.1,后续会介绍CSS3的相关属性,通过该系列的文章,希望能给准备转战前端的人员一些帮助,同时也帮助自己梳理知识,文章中如有错误,欢迎指出. ...

  9. js观察者模式与Model

    目的 观察者模式是常见的设计模式,可以被应用到MV*框架的Model上,来实现对数据变化的监听. 基本概念 观察者模式是一种常见的设计模式.被观察者可以被订阅(subscribe),并在状态发生改变时 ...

  10. 解决NetStream.appendBytes直播爆音的问题解决

    研究了一下Adobe家HDS的具体实现 OSMF.利用其中的一个核心方法 flash.net.NetStream.appendBytes()构建了我们自己的HTTP点直播播放框架.但今年年初发现一个问 ...