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. JAVA控制台输入输出方法总结

    java的控制台输入输出有很多方法,此文分别对其进行介绍. 1.控制台的输入 关于控制台的输入主要介绍三种方法,第一种方法使用BufferedReader获得控制台输入的数据,此方法是传统的输入方法, ...

  2. layer弹窗插件实战用法小结1—— layer.alert()

    http://layer.layui.com 第一节:layer.alert()弹窗的用法 1.解压layer-v2.2.zip压缩包 2.拷贝layer文件夹到实战项目目录 3.注意:layer.j ...

  3. Java 的String类

    String类 1.String对象的初始化 由于String对象特别常用,所以在对String对象进行初始化时,Java提供了一种简化的特殊语法,格式如下: String s = “abc”; s ...

  4. C# 程序集 和 反射

    .Net反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为.Net的反射机 ...

  5. pureMVC简单示例及其原理讲解一(开篇)

    pureMVC是一个MVC框架,皆在最大限度的减少MVC间的耦合性.本人刚刚接触pureMVC时感到一头雾水,不知从何入手,也不知道从何学习.好在本人有耐性且能看懂英文技术文档,面向对象的编程能力也比 ...

  6. MYBATIS 无效的列类型: 1111

    查询的时候竟然也会报错,如果参数是数字,需要加上jdbcType 在xml中加上 t.chart_id = #{chartId,jdbcType=DECIMAL}

  7. Bootstrap入门(十七)组件11:分页与标签

    Bootstrap入门(十七)组件11:分页与标签   1.默认样式的分页 2.分页的大小 3.禁用的分页 4.翻页的效果 5.两端对齐的分页 6. 标签的不同样式 7. 标签的大小   先引入本地的 ...

  8. 支持Angular 2的表格控件

    前端框架一直这最近几年特别火的一个话题,尤其是Angular 2拥有众多的粉丝.在2016年9月份Angular 2正式发布之后,大量的粉丝的开始投入到了Angular 2的怀抱.当然这其中也包括我. ...

  9. 设计模式之单一职责原则(SRP)

    自己之前写过一些关于设计模式的博客,但是大部分都写得比较匆忙.现在正好趁年前有时间,笔者打算好好地整理一下自己这块知识结构.开篇的第一个原则就是设计原则里面最简单的一个原则--单一职责原则. 想必大家 ...

  10. mac下sublime 配置查看源码

    sublime及package control的安装查看之前一篇文章:http://www.cnblogs.com/xdwa/p/5805101.html 安装ctags 安装完毕package co ...