rpc 分两部份,一个是调用者,另一方是服务提供者
调用者只关心那个服务,传相应参数,返回内容就可以
而提供者根据调用相应服务同参数,工作处理后响应内容即可
根据他们的关系可以用JAVA 接口同实现类 来约束书写完成功能
1 @QModel(1) 2 public interface ITestEnhance { 3 @QCommond(1) 4 public void a(double a); 5 6 @QCommond(2) 7 public void b(float a); 8 9 @QCommond(3) 10 public void c(byte a); 11 12 @QCommond(4) 13 public void d(long a); 14 15 @QCommond(5) 16 public void e(TestMessageObject obj); 17 18 @QCommond(6) 19 public void f(AtomicLong al); 20 21 @QCommond(7) 22 public TestMessageObject g(AtomicLong a,long b,TestMessageObject c); 23 }
1 public class TestEnhanceImpl implements ITestEnhance { 2 3 @Override 4 public void a(double a) { 5 System.out.println("a接收到 数值 : " + a); 6 7 } 8 9 @Override 10 public void b(float a) { 11 System.out.println("b接收到 数值 : " + a); 12 13 } 14 15 @Override 16 public void c(byte a) { 17 System.out.println("c接收到 数值 : " + a); 18 } 19 20 @Override 21 public void d(long a) { 22 System.out.println("d接收到 数值 : " + a); 23 } 24 25 @Override 26 public void e(TestMessageObject obj) { 27 if (obj == null) { 28 return; 29 } 30 System.out.println("e接收到 数值 : " + SerialUtil.writeValueAsString(obj)); 31 32 } 33 34 @Override 35 public void f(AtomicLong a) { 36 System.out.println("f接收到 数值 : " + a.get()); 37 } 38 39 @Override 40 public TestMessageObject g(AtomicLong a, long b, TestMessageObject c) { 41 System.out.println("g接收到 数值 : " + a.get()); 42 System.out.println("g接收到 数值 : " + b); 43 System.out.println("g接收到 数值 : " + SerialUtil.writeValueAsString(c)); 44 return c; 45 } 46 public static void main(String[] args) { 47 ITestEnhance proxyObject = QRpcFactory.loadProxy(ITestEnhance.class,1L); 48 QRpcFactory.registerInvokeService(new TestEnhanceImpl()); 49 50 proxyObject.a(-0.2); 51 proxyObject.b(0); 52 proxyObject.c((byte) 0x0); 53 proxyObject.c((byte) 0x1); 54 proxyObject.d((byte) 0x1); 55 56 proxyObject.e(TestMessageObject.of()); 57 proxyObject.f(new AtomicLong(-9)); 58 59 proxyObject.e(null); 60 TestMessageObject obj=proxyObject.g(new AtomicLong(-11112), Long.MAX_VALUE, TestMessageObject.of()); 61 SerialUtil.println(obj); 62 } 63 }
1 /**** 2 * 3 * @author solq 4 */ 5 public abstract class QRpcFactory { 6 private final static QRpcEnhanceService enhanceService = QRpcEnhanceService.getFactory(); 7 8 public static <T> T loadProxy(Class<T> target, QNode... nodes) { 9 JavassistProxy.getDefault().register(target, enhanceService); 10 T ret = JavassistProxy.getDefault().transform(target); 11 IRpcContext ctx = (IRpcContext) ret; 12 ctx.setContext(RpcContext.of(nodes)); 13 return ret; 14 } 15 16 public static <T> T loadProxy(Class<T> target, long... ids) { 17 JavassistProxy.getDefault().register(target, enhanceService); 18 T ret = JavassistProxy.getDefault().transform(target); 19 IRpcContext ctx = (IRpcContext) ret; 20 ctx.setContext(RpcContext.of(ids)); 21 return ret; 22 } 23 24 public static void registerInvokeService(Object target) { 25 enhanceService.registerInvokeService(target); 26 } 27 }
1 a接收到 数值 : -0.2 2 b接收到 数值 : 0.0 3 c接收到 数值 : 0 4 c接收到 数值 : 1 5 d接收到 数值 : 1 6 e接收到 数值 : {"start":1487901957121} 7 f接收到 数值 : -9 8 g接收到 数值 : -11112 9 g接收到 数值 : 9223372036854775807 10 g接收到 数值 : {"start":1487901957157} 11 {"start":1487901957157}
为什么要这样做?其实也可以用最原理的方式socket 或http 或JAVA 本身提供的rpc来做,自己做轮子跟使用轮子创造出来的价值是不能相比
处理做法上面说得很清楚,具体实现细节我在新书里会写出来,欢迎大家关注