Gaea源码阅读(四):服务端通讯

转载地址:http://blog.csdn.net/m_vptr/article/details/9163913

在(三)中加载server时,将根据配置建立tcp/http/telnet服务。如demo中这三个服务中enable了tcp和telnet。

 

以tcp服务为例,实现类在gaea.server.tcp.implement中配置

[java]  view plain  copy
  1. <!-- socket server implement class -->  
  2. <property>  
  3. <name>gaea.server.tcp.implement</name>  
  4. <value>com.bj58.spat.gaea.server.core.communication.tcp.SocketServer</value>  
  5. </property>  

//实现类SocketServer

[java]  view plain  copy
  1. /** 
  2.  * start netty server 
  3.  */  
  4. @Override  
  5. public void start() throws Exception {  
  6.     logger.info("loading invoker...");  
  7.     String invoker = Global.getSingleton().getServiceConfig().getString("gaea.proxy.invoker.implement");  
  8.     invokerHandle = (IInvokerHandle) Class.forName(invoker).newInstance();  
  9.     logger.info("initing server...");  
  10.     initSocketServer();  
  11. }  

InvokerHandle提供了同步和异步两种选择,这里配置使用的是异步Handler

[html]  view plain  copy
  1. <!-- proxy invoker-->  
  2. <property>  
  3. <name>gaea.proxy.invoker.implement</name>  
  4. <value>com.bj58.spat.gaea.server.core.proxy.AsyncInvokerHandle</value>  
  5. </property>  

initSocketServer建立SocketChannel,Handler使用SocketHandler

[java]  view plain  copy
  1. bootstrap.setFactory(new NioServerSocketChannelFactory(  
  2.                     Executors.newCachedThreadPool(),  
  3.                     Executors.newCachedThreadPool(),  
  4.                     Global.getSingleton().getServiceConfig().getInt("gaea.server.tcp.workerCount")  
  5.                    )  
  6.                     );  
  7. //使用SocketHandler  
  8. SocketHandler handler = new SocketHandler();  
  9. bootstrap.setPipelineFactory(new SocketPipelineFactory(handler, Global.getSingleton().getServiceConfig().getInt("gaea.server.tcp.frameMaxLength")));  
  10.   
  11. try {  
  12.     InetSocketAddress socketAddress = null;  
  13.     socketAddress = new InetSocketAddress(Global.getSingleton().getServiceConfig().getString("gaea.server.tcp.listenIP"),  
  14.             Global.getSingleton().getServiceConfig().getInt("gaea.server.tcp.listenPort"));  
  15.     Channel channel = bootstrap.bind(socketAddress);  
  16.     allChannels.add(channel);  
  17. h (Exception e) {}  

//SocketHandler处理请求

[java]  view plain  copy
  1. public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {  
  2.         try {  
  3.             logger.debug("message receive");  
  4.             ByteBuffer buffer = ((ChannelBuffer)e.getMessage()).toByteBuffer();  
  5.             byte[] reciveByte = buffer.array();  
  6.             logger.debug("reciveByte.length:" + reciveByte.length);  
  7.               
  8.             byte[] headDelimiter = new byte[0];  
  9.             System.arraycopy(reciveByte, 0, headDelimiter, 00);  
  10.               
  11.             byte[] requestBuffer = new byte[reciveByte.length];  
  12.             System.arraycopy(reciveByte, 0, requestBuffer, 0, (reciveByte.length));  
  13.               
  14.             GaeaContext gaeaContext = new GaeaContext(requestBuffer,  
  15.                     new GaeaChannel(e.getChannel()),   
  16.                     ServerType.TCP,  
  17.                     this);  
  18.               
  19.             SocketServer.invokerHandle.invoke(gaeaContext);  
  20.         } catch(Throwable ex) {  
  21.             byte[] response = ExceptionHelper.createErrorProtocol();  
  22.             e.getChannel().write(response);  
  23.             logger.error("SocketHandler invoke error", ex);  
  24.         }  
  25.     }  

服务器端收到消息后,调用该messageReceived(Netty机制)。在该方法中将转交给invokerHandle.invoke

[java]  view plain  copy
  1. //AsyncInvokerHandler  
  2.     public void invoke(final GaeaContext context) throws Exception {  
  3.         logger.debug("-------------------begin async invoke-------------------");  
  4.         asyncInvoker.run(taskTimeOut, new IAsyncHandler(){  
  5.             @Override  
  6.             public Object run() throws Throwable {  
  7.                 // request filter  
  8.                 for(IFilter f : Global.getSingleton().getGlobalRequestFilterList()) {  
  9.                     if(context.getExecFilter() == ExecFilterType.All || context.getExecFilter() == ExecFilterType.RequestOnly) {  
  10.                         f.filter(context);  
  11.                     }  
  12.                 }  
  13.                   
  14.                 //调用  
  15.                 if(context.isDoInvoke()) {  
  16.                     if(context.getServerType() == ServerType.HTTP){  
  17.                         httpThreadLocal.set(context.getHttpContext());  
  18.                     }  
  19.                     doInvoke(context);  
  20.                 }  
  21.                   
  22.                 // response filter  
  23.                 for(IFilter f : Global.getSingleton().getGlobalResponseFilterList()) {  
  24.                     if(context.getExecFilter() == ExecFilterType.All || context.getExecFilter() == ExecFilterType.ResponseOnly) {  
  25.                         f.filter(context);  
  26.                     }  
  27.                 }  
  28.                 return context;  
  29.             }  

fliter在这里被使用了


doInvoke将使用到(三)中的Proxy工厂类、ProxyStub

[java]  view plain  copy
  1. //根据lookup找到ProxyStub  
  2. IProxyStub localProxy = Global.getSingleton().getProxyFactory().getProxy(request.getLookup());  
  3.   
  4. //invoker real service  
  5. GaeaResponse gaeaResponse = localProxy.invoke(context);  
  6.   
  7.                      //返回应答  
  8. response = createResponse(gaeaResponse);  


至此,Gaea基本流程基本走了一遍。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值