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. Valgrind 快速入门

    1. 介绍 Valgrind工具组提供了一套调试与分析错误的工具包,能够帮助你的程序工作的更加准确,更加快速.这些工具之中最有名的是Memcheck.它能够识别很多C或者C++程序中内存相关的错误,这 ...

  2. call的初步理解

    首先说下call的本质是一个函数 模Function.prototype.call = function(context){ // this表示某函数,函数里面的this先被替换成context,然后 ...

  3. RF & Microarray

    REF[24] 随机森林是一个很好适用于微阵列数据的分类算法: 1.即使大多数的预测变量都是噪音,RF仍然具有优秀的性能,因此不需要对基因进行预选择. 2.能够应用于变量数远远大于观测数据量的情况 3 ...

  4. Zepto.js入门介绍

    GitHub Zepto Zepto的一些可选功能是专门针对移动端浏览器的:因为它的最初目标在移动端提供一个精简的类似jquery的js库. Zepto不支持旧版本的Internet Explorer ...

  5. 浅谈JavaWEB入门必备知识之Servlet入门案例详解

    工欲善其事.必先利其器,想要成为JavaWEB高手那么你不知道servlet是一个什么玩意的话,那就肯定没法玩下去,那么servlet究竟是个什么玩意?下面,仅此个人观点并通过一个小小的案例来为大家详 ...

  6. js原生设计模式——2面向对象编程之继承—多继承

    1.单对象克隆 <!DOCTYPE html><html lang="en"><head>    <meta charset=" ...

  7. js原生继承之——原型式继承实例

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  8. [ Android 五种数据存储方式之一 ] —— SharedPreferences存储数据

    SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数. 主要是保存一些常用的配置比如窗口状态,一般在Activity中 重载窗口状态onSaveInstanceS ...

  9. Android应用的基本组件介绍和签名Android应用程序

    一.Android应用的基本组件介绍  Activity和View :Activity只能通过setContentView(View)来显示指定的组件.View组件是所有UI控件.容器控件的基类,Vi ...

  10. WPF dataGrid中的check的改变事件

    关于datagrid信息: <DataGridTemplateColumn Header="备注"> <DataGridTemplateColumn.CellTe ...