精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java 從零開始手寫 RPC—Reflect 反射實現(xiàn)通用調(diào)用之服務(wù)端

開發(fā) 后端
前面我們的例子是一個固定的出參和入?yún)ⅲ潭ǖ姆椒▽崿F(xiàn)。本節(jié)將實現(xiàn)通用的調(diào)用,讓框架具有更廣泛的實用性。

[[430216]]

前面我們的例子是一個固定的出參和入?yún)ⅲ潭ǖ姆椒▽崿F(xiàn)。

本節(jié)將實現(xiàn)通用的調(diào)用,讓框架具有更廣泛的實用性。

基本思路

所有的方法調(diào)用,基于反射進(jìn)行相關(guān)處理實現(xiàn)。

[[430217]]

服務(wù)端

核心類

  • RpcServer

調(diào)整如下:

  1. serverBootstrap.group(workerGroup, bossGroup) 
  2.     .channel(NioServerSocketChannel.class) 
  3.     // 打印日志 
  4.     .handler(new LoggingHandler(LogLevel.INFO)) 
  5.     .childHandler(new ChannelInitializer<Channel>() { 
  6.         @Override 
  7.         protected void initChannel(Channel ch) throws Exception { 
  8.             ch.pipeline() 
  9.             // 解碼 bytes=>resp 
  10.             .addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.cacheDisabled(null))) 
  11.              // request=>bytes 
  12.              .addLast(new ObjectEncoder()) 
  13.              .addLast(new RpcServerHandler()); 
  14.         } 
  15.     }) 
  16.     // 這個參數(shù)影響的是還沒有被accept 取出的連接 
  17.     .option(ChannelOption.SO_BACKLOG, 128) 
  18.     // 這個參數(shù)只是過一段時間內(nèi)客戶端沒有響應(yīng),服務(wù)端會發(fā)送一個 ack 包,以判斷客戶端是否還活著。 
  19.     .childOption(ChannelOption.SO_KEEPALIVE, true); 

其中 ObjectDecoder 和 ObjectEncoder 都是 netty 內(nèi)置的實現(xiàn)。

RpcServerHandler

  1. package com.github.houbb.rpc.server.handler; 
  2.  
  3.  
  4. import com.github.houbb.log.integration.core.Log; 
  5. import com.github.houbb.log.integration.core.LogFactory; 
  6. import com.github.houbb.rpc.common.rpc.domain.RpcRequest; 
  7. import com.github.houbb.rpc.common.rpc.domain.impl.DefaultRpcResponse; 
  8. import com.github.houbb.rpc.server.service.impl.DefaultServiceFactory; 
  9. import io.netty.channel.ChannelHandlerContext; 
  10. import io.netty.channel.SimpleChannelInboundHandler; 
  11.  
  12.  
  13. /** 
  14.  * @author binbin.hou 
  15.  * @since 0.0.1 
  16.  */ 
  17. public class RpcServerHandler extends SimpleChannelInboundHandler { 
  18.  
  19.  
  20.     private static final Log log = LogFactory.getLog(RpcServerHandler.class); 
  21.  
  22.  
  23.     @Override 
  24.     public void channelActive(ChannelHandlerContext ctx) throws Exception { 
  25.         final String id = ctx.channel().id().asLongText(); 
  26.         log.info("[Server] channel {} connected " + id); 
  27.     } 
  28.  
  29.  
  30.     @Override 
  31.     protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception { 
  32.         final String id = ctx.channel().id().asLongText(); 
  33.         log.info("[Server] channel read start: {}", id); 
  34.  
  35.  
  36.         // 接受客戶端請求 
  37.         RpcRequest rpcRequest = (RpcRequest)msg; 
  38.         log.info("[Server] receive channel {} request: {}", id, rpcRequest); 
  39.  
  40.  
  41.         // 回寫到 client 端 
  42.         DefaultRpcResponse rpcResponse = handleRpcRequest(rpcRequest); 
  43.         ctx.writeAndFlush(rpcResponse); 
  44.         log.info("[Server] channel {} response {}", id, rpcResponse); 
  45.     } 
  46.  
  47.  
  48.     @Override 
  49.     public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { 
  50.         cause.printStackTrace(); 
  51.         ctx.close(); 
  52.     } 
  53.  
  54.  
  55.     /** 
  56.      * 處理請求信息 
  57.      * @param rpcRequest 請求信息 
  58.      * @return 結(jié)果信息 
  59.      * @since 0.0.6 
  60.      */ 
  61.     private DefaultRpcResponse handleRpcRequest(final RpcRequest rpcRequest) { 
  62.         DefaultRpcResponse rpcResponse = new DefaultRpcResponse(); 
  63.         rpcResponse.seqId(rpcRequest.seqId()); 
  64.  
  65.  
  66.         try { 
  67.             // 獲取對應(yīng)的 service 實現(xiàn)類 
  68.             // rpcRequest=>invocationRequest 
  69.             // 執(zhí)行 invoke 
  70.             Object result = DefaultServiceFactory.getInstance() 
  71.                     .invoke(rpcRequest.serviceId(), 
  72.                             rpcRequest.methodName(), 
  73.                             rpcRequest.paramTypeNames(), 
  74.                             rpcRequest.paramValues()); 
  75.             rpcResponse.result(result); 
  76.         } catch (Exception e) { 
  77.             rpcResponse.error(e); 
  78.             log.error("[Server] execute meet ex for request", rpcRequest, e); 
  79.         } 
  80.  
  81.  
  82.         // 構(gòu)建結(jié)果值 
  83.         return rpcResponse; 
  84.     } 
  85.  
  86.  

和以前類似,不過 handleRpcRequest 要稍微麻煩一點。

這里需要根據(jù)發(fā)射,調(diào)用對應(yīng)的方法。

pojo

其中使用的出參、入?yún)崿F(xiàn)如下:

RpcRequest

  1. package com.github.houbb.rpc.common.rpc.domain; 
  2.  
  3.  
  4. import java.util.List; 
  5.  
  6.  
  7. /** 
  8.  * 序列化相關(guān)處理 
  9.  * (1)調(diào)用創(chuàng)建時間-createTime 
  10.  * (2)調(diào)用方式 callType 
  11.  * (3)超時時間 timeOut 
  12.  * 
  13.  * 額外信息: 
  14.  * (1)上下文信息 
  15.  * 
  16.  * @author binbin.hou 
  17.  * @since 0.0.6 
  18.  */ 
  19. public interface RpcRequest extends BaseRpc { 
  20.  
  21.  
  22.     /** 
  23.      * 創(chuàng)建時間 
  24.      * @return 創(chuàng)建時間 
  25.      * @since 0.0.6 
  26.      */ 
  27.     long createTime(); 
  28.  
  29.  
  30.     /** 
  31.      * 服務(wù)唯一標(biāo)識 
  32.      * @return 服務(wù)唯一標(biāo)識 
  33.      * @since 0.0.6 
  34.      */ 
  35.     String serviceId(); 
  36.  
  37.  
  38.     /** 
  39.      * 方法名稱 
  40.      * @return 方法名稱 
  41.      * @since 0.0.6 
  42.      */ 
  43.     String methodName(); 
  44.  
  45.  
  46.     /** 
  47.      * 方法類型名稱列表 
  48.      * @return 名稱列表 
  49.      * @since 0.0.6 
  50.      */ 
  51.     List<String> paramTypeNames(); 
  52.  
  53.  
  54.     // 調(diào)用參數(shù)信息列表 
  55.  
  56.  
  57.     /** 
  58.      * 調(diào)用參數(shù)值 
  59.      * @return 參數(shù)值數(shù)組 
  60.      * @since 0.0.6 
  61.      */ 
  62.     Object[] paramValues(); 
  63.  
  64.  

RpcResponse

  1. package com.github.houbb.rpc.common.rpc.domain; 
  2.  
  3.  
  4. /** 
  5.  * 序列化相關(guān)處理 
  6.  * @author binbin.hou 
  7.  * @since 0.0.6 
  8.  */ 
  9. public interface RpcResponse extends BaseRpc { 
  10.  
  11.  
  12.     /** 
  13.      * 異常信息 
  14.      * @return 異常信息 
  15.      * @since 0.0.6 
  16.      */ 
  17.     Throwable error(); 
  18.  
  19.  
  20.     /** 
  21.      * 請求結(jié)果 
  22.      * @return 請求結(jié)果 
  23.      * @since 0.0.6 
  24.      */ 
  25.     Object result(); 
  26.  
  27.  

BaseRpc

  1. package com.github.houbb.rpc.common.rpc.domain; 
  2.  
  3.  
  4. import java.io.Serializable
  5.  
  6.  
  7. /** 
  8.  * 序列化相關(guān)處理 
  9.  * @author binbin.hou 
  10.  * @since 0.0.6 
  11.  */ 
  12. public interface BaseRpc extends Serializable { 
  13.  
  14.  
  15.     /** 
  16.      * 獲取唯一標(biāo)識號 
  17.      * (1)用來唯一標(biāo)識一次調(diào)用,便于獲取該調(diào)用對應(yīng)的響應(yīng)信息。 
  18.      * @return 唯一標(biāo)識號 
  19.      */ 
  20.     String seqId(); 
  21.  
  22.  
  23.     /** 
  24.      * 設(shè)置唯一標(biāo)識號 
  25.      * @param traceId 唯一標(biāo)識號 
  26.      * @return this 
  27.      */ 
  28.     BaseRpc seqId(final String traceId); 
  29.  
  30.  

ServiceFactory-服務(wù)工廠

為了便于對所有的 service 實現(xiàn)類統(tǒng)一管理,這里定義 service 工廠類。

ServiceFactory

  1. package com.github.houbb.rpc.server.service; 
  2.  
  3.  
  4. import com.github.houbb.rpc.server.config.service.ServiceConfig; 
  5. import com.github.houbb.rpc.server.registry.ServiceRegistry; 
  6.  
  7.  
  8. import java.util.List; 
  9.  
  10.  
  11. /** 
  12.  * 服務(wù)方法類倉庫管理類-接口 
  13.  * 
  14.  * 
  15.  * (1)對外暴露的方法,應(yīng)該盡可能的少。 
  16.  * (2)對于外部的調(diào)用,后期比如 telnet 治理,可以使用比如有哪些服務(wù)列表? 
  17.  * 單個服務(wù)有哪些方法名稱? 
  18.  * 
  19.  * 等等基礎(chǔ)信息的查詢,本期暫時全部隱藏掉。 
  20.  * 
  21.  * (3)前期盡可能的少暴露方法。 
  22.  * @author binbin.hou 
  23.  * @since 0.0.6 
  24.  * @see ServiceRegistry 服務(wù)注冊,將服務(wù)信息放在這個類中,進(jìn)行統(tǒng)一的管理。 
  25.  * @see ServiceMethod 方法信息 
  26.  */ 
  27. public interface ServiceFactory { 
  28.  
  29.  
  30.     /** 
  31.      * 注冊服務(wù)列表信息 
  32.      * @param serviceConfigList 服務(wù)配置列表 
  33.      * @return this 
  34.      * @since 0.0.6 
  35.      */ 
  36.     ServiceFactory registerServices(final List<ServiceConfig> serviceConfigList); 
  37.  
  38.  
  39.     /** 
  40.      * 直接反射調(diào)用 
  41.      * (1)此處對于方法反射,為了提升性能,所有的 class.getFullName() 進(jìn)行拼接然后放進(jìn) key 中。 
  42.      * 
  43.      * @param serviceId 服務(wù)名稱 
  44.      * @param methodName 方法名稱 
  45.      * @param paramTypeNames 參數(shù)類型名稱列表 
  46.      * @param paramValues 參數(shù)值 
  47.      * @return 方法調(diào)用返回值 
  48.      * @since 0.0.6 
  49.      */ 
  50.     Object invoke(final String serviceId, final String methodName, 
  51.                   List<String> paramTypeNames, final Object[] paramValues); 
  52.  
  53.  

DefaultServiceFactory

作為默認(rèn)實現(xiàn),如下:

  1. package com.github.houbb.rpc.server.service.impl; 
  2.  
  3.  
  4. import com.github.houbb.heaven.constant.PunctuationConst; 
  5. import com.github.houbb.heaven.util.common.ArgUtil; 
  6. import com.github.houbb.heaven.util.lang.reflect.ReflectMethodUtil; 
  7. import com.github.houbb.heaven.util.util.CollectionUtil; 
  8. import com.github.houbb.rpc.common.exception.RpcRuntimeException; 
  9. import com.github.houbb.rpc.server.config.service.ServiceConfig; 
  10. import com.github.houbb.rpc.server.service.ServiceFactory; 
  11.  
  12.  
  13. import java.lang.reflect.InvocationTargetException; 
  14. import java.lang.reflect.Method; 
  15. import java.util.HashMap; 
  16. import java.util.List; 
  17. import java.util.Map; 
  18.  
  19.  
  20. /** 
  21.  * 默認(rèn)服務(wù)倉庫實現(xiàn) 
  22.  * @author binbin.hou 
  23.  * @since 0.0.6 
  24.  */ 
  25. public class DefaultServiceFactory implements ServiceFactory { 
  26.  
  27.  
  28.     /** 
  29.      * 服務(wù) map 
  30.      * @since 0.0.6 
  31.      */ 
  32.     private Map<String, Object> serviceMap; 
  33.  
  34.  
  35.     /** 
  36.      * 直接獲取對應(yīng)的 method 信息 
  37.      * (1)key: serviceId:methodName:param1@param2@param3 
  38.      * (2)value: 對應(yīng)的 method 信息 
  39.      */ 
  40.     private Map<String, Method> methodMap; 
  41.  
  42.  
  43.     private static final DefaultServiceFactory INSTANCE = new DefaultServiceFactory(); 
  44.  
  45.  
  46.     private DefaultServiceFactory(){} 
  47.  
  48.  
  49.     public static DefaultServiceFactory getInstance() { 
  50.         return INSTANCE; 
  51.     } 
  52.  
  53.  
  54.     /** 
  55.      * 服務(wù)注冊一般在項目啟動的時候,進(jìn)行處理。 
  56.      * 屬于比較重的操作,而且一個服務(wù)按理說只應(yīng)該初始化一次。 
  57.      * 此處加鎖為了保證線程安全。 
  58.      * @param serviceConfigList 服務(wù)配置列表 
  59.      * @return this 
  60.      */ 
  61.     @Override 
  62.     public synchronized ServiceFactory registerServices(List<ServiceConfig> serviceConfigList) { 
  63.         ArgUtil.notEmpty(serviceConfigList, "serviceConfigList"); 
  64.  
  65.  
  66.         // 集合初始化 
  67.         serviceMap = new HashMap<>(serviceConfigList.size()); 
  68.         // 這里只是預(yù)估,一般為2個服務(wù)。 
  69.         methodMap = new HashMap<>(serviceConfigList.size()*2); 
  70.  
  71.  
  72.         for(ServiceConfig serviceConfig : serviceConfigList) { 
  73.             serviceMap.put(serviceConfig.id(), serviceConfig.reference()); 
  74.         } 
  75.  
  76.  
  77.         // 存放方法名稱 
  78.         for(Map.Entry<String, Object> entry : serviceMap.entrySet()) { 
  79.             String serviceId = entry.getKey(); 
  80.             Object reference = entry.getValue(); 
  81.  
  82.  
  83.             //獲取所有方法列表 
  84.             Method[] methods = reference.getClass().getMethods(); 
  85.             for(Method method : methods) { 
  86.                 String methodName = method.getName(); 
  87.                 if(ReflectMethodUtil.isIgnoreMethod(methodName)) { 
  88.                     continue
  89.                 } 
  90.  
  91.  
  92.                 List<String> paramTypeNames = ReflectMethodUtil.getParamTypeNames(method); 
  93.                 String key = buildMethodKey(serviceId, methodName, paramTypeNames); 
  94.                 methodMap.put(key, method); 
  95.             } 
  96.         } 
  97.  
  98.  
  99.         return this; 
  100.     } 
  101.  
  102.  
  103.  
  104.  
  105.     @Override 
  106.     public Object invoke(String serviceId, String methodName, List<String> paramTypeNames, Object[] paramValues) { 
  107.         //參數(shù)校驗 
  108.         ArgUtil.notEmpty(serviceId, "serviceId"); 
  109.         ArgUtil.notEmpty(methodName, "methodName"); 
  110.  
  111.  
  112.         // 提供 cache,可以根據(jù)前三個值快速定位對應(yīng)的 method 
  113.         // 根據(jù) method 進(jìn)行反射處理。 
  114.         // 對于 paramTypes 進(jìn)行 string 連接處理。 
  115.         final Object reference = serviceMap.get(serviceId); 
  116.         final String methodKey = buildMethodKey(serviceId, methodName, paramTypeNames); 
  117.         final Method method = methodMap.get(methodKey); 
  118.  
  119.  
  120.         try { 
  121.             return method.invoke(reference, paramValues); 
  122.         } catch (IllegalAccessException | InvocationTargetException e) { 
  123.             throw new RpcRuntimeException(e); 
  124.         } 
  125.     } 
  126.  
  127.  
  128.     /** 
  129.      * (1)多個之間才用 : 分隔 
  130.      * (2)參數(shù)之間采用 @ 分隔 
  131.      * @param serviceId 服務(wù)標(biāo)識 
  132.      * @param methodName 方法名稱 
  133.      * @param paramTypeNames 參數(shù)類型名稱 
  134.      * @return 構(gòu)建完整的 key 
  135.      * @since 0.0.6 
  136.      */ 
  137.     private String buildMethodKey(String serviceId, String methodName, List<String> paramTypeNames) { 
  138.         String param = CollectionUtil.join(paramTypeNames, PunctuationConst.AT); 
  139.         return serviceId+PunctuationConst.COLON+methodName+PunctuationConst.COLON 
  140.                 +param; 
  141.     } 
  142.  
  143.  

ServiceRegistry-服務(wù)注冊類

接口

  1. package com.github.houbb.rpc.server.registry; 
  2.  
  3.  
  4. /** 
  5.  * 服務(wù)注冊類 
  6.  * (1)每個應(yīng)用唯一 
  7.  * (2)每個服務(wù)的暴露協(xié)議應(yīng)該保持一致 
  8.  * 暫時不提供單個服務(wù)的特殊處理,后期可以考慮添加 
  9.  * 
  10.  * @author binbin.hou 
  11.  * @since 0.0.6 
  12.  */ 
  13. public interface ServiceRegistry { 
  14.  
  15.  
  16.     /** 
  17.      * 暴露的 rpc 服務(wù)端口信息 
  18.      * @param port 端口信息 
  19.      * @return this 
  20.      * @since 0.0.6 
  21.      */ 
  22.     ServiceRegistry port(final int port); 
  23.  
  24.  
  25.     /** 
  26.      * 注冊服務(wù)實現(xiàn) 
  27.      * @param serviceId 服務(wù)標(biāo)識 
  28.      * @param serviceImpl 服務(wù)實現(xiàn) 
  29.      * @return this 
  30.      * @since 0.0.6 
  31.      */ 
  32.     ServiceRegistry register(final String serviceId, final Object serviceImpl); 
  33.  
  34.  
  35.     /** 
  36.      * 暴露所有服務(wù)信息 
  37.      * (1)啟動服務(wù)端 
  38.      * @return this 
  39.      * @since 0.0.6 
  40.      */ 
  41.     ServiceRegistry expose(); 
  42.  
  43.  

實現(xiàn)

  1. package com.github.houbb.rpc.server.registry.impl; 
  2.  
  3.  
  4. import com.github.houbb.heaven.util.common.ArgUtil; 
  5. import com.github.houbb.rpc.common.config.protocol.ProtocolConfig; 
  6. import com.github.houbb.rpc.server.config.service.DefaultServiceConfig; 
  7. import com.github.houbb.rpc.server.config.service.ServiceConfig; 
  8. import com.github.houbb.rpc.server.core.RpcServer; 
  9. import com.github.houbb.rpc.server.registry.ServiceRegistry; 
  10. import com.github.houbb.rpc.server.service.impl.DefaultServiceFactory; 
  11.  
  12.  
  13. import java.util.ArrayList; 
  14. import java.util.List; 
  15.  
  16.  
  17. /** 
  18.  * 默認(rèn)服務(wù)端注冊類 
  19.  * @author binbin.hou 
  20.  * @since 0.0.6 
  21.  */ 
  22. public class DefaultServiceRegistry implements ServiceRegistry { 
  23.  
  24.  
  25.     /** 
  26.      * 單例信息 
  27.      * @since 0.0.6 
  28.      */ 
  29.     private static final DefaultServiceRegistry INSTANCE = new DefaultServiceRegistry(); 
  30.  
  31.  
  32.     /** 
  33.      * rpc 服務(wù)端端口號 
  34.      * @since 0.0.6 
  35.      */ 
  36.     private int rpcPort; 
  37.  
  38.  
  39.     /** 
  40.      * 協(xié)議配置 
  41.      * (1)默認(rèn)只實現(xiàn) tcp 
  42.      * (2)后期可以拓展實現(xiàn) web-service/http/https 等等。 
  43.      * @since 0.0.6 
  44.      */ 
  45.     private ProtocolConfig protocolConfig; 
  46.  
  47.  
  48.     /** 
  49.      * 服務(wù)配置列表 
  50.      * @since 0.0.6 
  51.      */ 
  52.     private List<ServiceConfig> serviceConfigList; 
  53.  
  54.  
  55.     private DefaultServiceRegistry(){ 
  56.         // 初始化默認(rèn)參數(shù) 
  57.         this.serviceConfigList = new ArrayList<>(); 
  58.         this.rpcPort = 9527; 
  59.     } 
  60.  
  61.  
  62.     public static DefaultServiceRegistry getInstance() { 
  63.         return INSTANCE; 
  64.     } 
  65.  
  66.  
  67.     @Override 
  68.     public ServiceRegistry port(int port) { 
  69.         ArgUtil.positive(port, "port"); 
  70.  
  71.  
  72.         this.rpcPort = port; 
  73.         return this; 
  74.     } 
  75.  
  76.  
  77.     /** 
  78.      * 注冊服務(wù)實現(xiàn) 
  79.      * (1)主要用于后期服務(wù)調(diào)用 
  80.      * (2)如何根據(jù) id 獲取實現(xiàn)?非常簡單,id 是唯一的。 
  81.      * 有就是有,沒有就拋出異常,直接返回。 
  82.      * (3)如果根據(jù) {@link com.github.houbb.rpc.common.rpc.domain.RpcRequest} 獲取對應(yīng)的方法。 
  83.      * 
  84.      * 3.1 根據(jù) serviceId 獲取唯一的實現(xiàn) 
  85.      * 3.2 根據(jù) {@link Class#getMethod(String, Class[])} 方法名稱+參數(shù)類型唯一獲取方法 
  86.      * 3.3 根據(jù) {@link java.lang.reflect.Method#invoke(Object, Object...)} 執(zhí)行方法 
  87.      * 
  88.      * @param serviceId 服務(wù)標(biāo)識 
  89.      * @param serviceImpl 服務(wù)實現(xiàn) 
  90.      * @return this 
  91.      * @since 0.0.6 
  92.      */ 
  93.     @Override 
  94.     @SuppressWarnings("unchecked"
  95.     public synchronized DefaultServiceRegistry register(final String serviceId, final Object serviceImpl) { 
  96.         ArgUtil.notEmpty(serviceId, "serviceId"); 
  97.         ArgUtil.notNull(serviceImpl, "serviceImpl"); 
  98.  
  99.  
  100.         // 構(gòu)建對應(yīng)的其他信息 
  101.         ServiceConfig serviceConfig = new DefaultServiceConfig(); 
  102.         serviceConfig.id(serviceId).reference(serviceImpl); 
  103.         serviceConfigList.add(serviceConfig); 
  104.  
  105.  
  106.         return this; 
  107.     } 
  108.  
  109.  
  110.     @Override 
  111.     public ServiceRegistry expose() { 
  112.         // 注冊所有服務(wù)信息 
  113.         DefaultServiceFactory.getInstance() 
  114.                 .registerServices(serviceConfigList); 
  115.  
  116.  
  117.         // 暴露 netty server 信息 
  118.         new RpcServer(rpcPort).start(); 
  119.         return this; 
  120.     } 
  121.  
  122.  

ServiceConfig 是一些服務(wù)的配置信息,接口定義如下:

  1. package com.github.houbb.rpc.server.config.service; 
  2.  
  3.  
  4. /** 
  5.  * 單個服務(wù)配置類 
  6.  * 
  7.  * 簡化用戶使用: 
  8.  * 在用戶使用的時候,這個類應(yīng)該是不可見的。 
  9.  * 直接提供對應(yīng)的服務(wù)注冊類即可。 
  10.  * 
  11.  * 后續(xù)拓展 
  12.  * (1)版本信息 
  13.  * (2)服務(wù)端超時時間 
  14.  * 
  15.  * @author binbin.hou 
  16.  * @since 0.0.6 
  17.  * @param <T> 實現(xiàn)類泛型 
  18.  */ 
  19. public interface ServiceConfig<T> { 
  20.  
  21.  
  22.     /** 
  23.      * 獲取唯一標(biāo)識 
  24.      * @return 獲取唯一標(biāo)識 
  25.      * @since 0.0.6 
  26.      */ 
  27.     String id(); 
  28.  
  29.  
  30.     /** 
  31.      * 設(shè)置唯一標(biāo)識 
  32.      * @param id 標(biāo)識信息 
  33.      * @return this 
  34.      * @since 0.0.6 
  35.      */ 
  36.     ServiceConfig<T> id(String id); 
  37.  
  38.  
  39.     /** 
  40.      * 獲取引用實體實現(xiàn) 
  41.      * @return 實體實現(xiàn) 
  42.      * @since 0.0.6 
  43.      */ 
  44.     T reference(); 
  45.  
  46.  
  47.     /** 
  48.      * 設(shè)置引用實體實現(xiàn) 
  49.      * @param reference 引用實現(xiàn) 
  50.      * @return this 
  51.      * @since 0.0.6 
  52.      */ 
  53.     ServiceConfig<T> reference(T reference); 
  54.  
  55.  

測試

maven 引入

引入服務(wù)端的對應(yīng) maven 包:

  1. <dependency> 
  2.     <groupId>com.github.houbb</groupId> 
  3.     <artifactId>rpc-server</artifactId> 
  4.     <version>0.0.6</version> 
  5. </dependency> 

服務(wù)端啟動

  1. // 啟動服務(wù) 
  2. DefaultServiceRegistry.getInstance() 
  3.         .register(ServiceIdConst.CALC, new CalculatorServiceImpl()) 
  4.         .expose(); 

這里注冊了一個計算服務(wù),并且設(shè)置對應(yīng)的實現(xiàn)。

和以前實現(xiàn)類似,此處不再贅述。

啟動日志:

  1. [DEBUG] [2021-10-05 13:39:42.638] [main] [c.g.h.l.i.c.LogFactory.setImplementation] - Logging initialized using 'class com.github.houbb.log.integration.adaptors.stdout.StdOutExImpl' adapter. 
  2. [INFO] [2021-10-05 13:39:42.645] [Thread-0] [c.g.h.r.s.c.RpcServer.run] - RPC 服務(wù)開始啟動服務(wù)端 
  3. 十月 05, 2021 1:39:43 下午 io.netty.handler.logging.LoggingHandler channelRegistered 
  4. 信息: [id: 0xec4dc74f] REGISTERED 
  5. 十月 05, 2021 1:39:43 下午 io.netty.handler.logging.LoggingHandler bind 
  6. 信息: [id: 0xec4dc74f] BIND: 0.0.0.0/0.0.0.0:9527 
  7. 十月 05, 2021 1:39:43 下午 io.netty.handler.logging.LoggingHandler channelActive 
  8. 信息: [id: 0xec4dc74f, L:/0:0:0:0:0:0:0:0:9527] ACTIVE 
  9. [INFO] [2021-10-05 13:39:43.893] [Thread-0] [c.g.h.r.s.c.RpcServer.run] - RPC 服務(wù)端啟動完成,監(jiān)聽【9527】端口 

ps: 寫到這里忽然發(fā)現(xiàn)忘記添加對應(yīng)的 register 日志了,這里可以添加對應(yīng)的 registerListener 拓展。

 

責(zé)任編輯:姜華 來源: 今日頭條
相關(guān)推薦

2021-10-27 08:10:15

Java 客戶端 Java 基礎(chǔ)

2021-10-19 08:58:48

Java 語言 Java 基礎(chǔ)

2021-10-14 08:39:17

Java Netty Java 基礎(chǔ)

2021-10-13 08:21:52

Java websocket Java 基礎(chǔ)

2021-10-20 08:05:18

Java 序列化 Java 基礎(chǔ)

2021-10-29 08:07:30

Java timeout Java 基礎(chǔ)

2019-09-23 19:30:27

reduxreact.js前端

2015-11-17 16:11:07

Code Review

2018-04-18 07:01:59

Docker容器虛擬機

2019-01-18 12:39:45

云計算PaaS公有云

2024-12-06 17:02:26

2020-07-02 15:32:23

Kubernetes容器架構(gòu)

2024-01-02 12:17:44

Go傳統(tǒng)遠(yuǎn)程

2018-09-14 17:16:22

云計算軟件計算機網(wǎng)絡(luò)

2010-05-26 17:35:08

配置Xcode SVN

2024-05-15 14:29:45

2023-02-20 09:55:00

微服務(wù)框架單體架構(gòu)

2017-09-13 14:01:51

數(shù)據(jù)庫MongoDB數(shù)據(jù)庫即服務(wù)

2021-03-16 11:30:33

2015-05-06 09:36:05

Java語言從零開始學(xué)習(xí)
點贊
收藏

51CTO技術(shù)棧公眾號

五月天中文字幕在线| 国产精品久久久久久久久借妻| 欧美xxxx18性欧美| 亚洲视频专区在线| 日本精品久久久久久久久久| 亚洲欧洲国产综合| 蜜臂av日日欢夜夜爽一区| 久久久精品在线| 中文字幕乱视频| 亚洲一区二区三区高清视频| 欧美一级二级三级九九九| 在线观看成人动漫| 高清不卡亚洲| 青青草91久久久久久久久| 一区二区三区精品在线观看| 久久99导航| 一级做a爱片性色毛片| 激情综合网址| 中文字幕在线看视频国产欧美在线看完整 | 日韩一区网站| 一本大道av一区二区在线播放| ijzzijzzij亚洲大全| 婷婷亚洲一区二区三区| 国产一区在线观看视频| 亲爱的老师9免费观看全集电视剧| 亚洲欧美精品aaaaaa片| 九九综合久久| 亚洲国产99精品国自产| 亚洲午夜精品一区| 欧美舌奴丨vk视频| 午夜伊人狠狠久久| 欧美一级免费在线观看| 毛片免费在线播放| 在线免费看毛片| 国产成人精品777777| 亚洲区小说区| 亚洲成色www8888| 三区视频在线观看| 日本美女久久| 在线区一区二视频| 国产黄页在线观看| 美女91在线| 亚洲免费毛片网站| 亚洲永久激情精品| 成人在线免费电影| 国产亚洲精品资源在线26u| 好看的日韩精品视频在线| 精品人妻一区二区三区换脸明星| 麻豆91在线播放| 国产精品免费视频久久久| 99久久久久久久久| 亚洲欧美日本日韩| 91高潮精品免费porn| 日本一区二区不卡在线| 国产成人精品一区二区三区视频| 亚洲精品77777| 色欲久久久天天天综合网| 免费xxxx性欧美18vr| 国产ts一区二区| 免费看毛片网站| 老妇喷水一区二区三区| 日韩美女免费线视频| 国产一级一级国产| 日韩国产欧美在线播放| 国产精品美女主播| 91av国产精品| 国产一区二区在线视频| 成人做爰www免费看视频网站| 国产又爽又黄又嫩又猛又粗| 韩国欧美一区二区| 999精品视频一区二区三区| 国产黄频在线观看| 99久久国产综合精品色伊| 精品蜜桃一区二区三区| 久久99久久| 中文字幕久久午夜不卡| 一级全黄肉体裸体全过程| 羞羞网站在线看| 亚洲成a人片在线观看中文| 欧洲黄色一级视频| 97欧美成人| 欧美一区二区在线免费播放| 在线免费看黄色片| 亚洲男人天堂网址| 三区四区不卡| 欧美男插女视频| 日本网站在线播放| 日韩精品一二三区| 国产免费久久精品| 日韩成人xxxx| 97人妻人人揉人人躁人人| 日韩理论在线| 欧美国产视频一区二区| 免费看日批视频| 韩国av一区二区三区四区| 国产99视频精品免费视频36| 欧洲亚洲精品视频| 亚洲欧美一区二区三区孕妇| 久操网在线观看| 欧美高清免费| 亚洲国产精品网站| 国产日韩精品中文字无码| 午夜久久99| 日本精品久久中文字幕佐佐木| 国产又粗又猛视频| 久久综合久久综合久久综合| 97超碰免费观看| 不卡av播放| 日韩午夜av一区| 国产精品20p| 伊人久久亚洲影院| 国产精品视频999| 少妇高潮一区二区三区69| 国产精品美女久久久久久| 免费国产a级片| 玖玖玖电影综合影院| 亚洲欧洲一区二区三区在线观看 | 日本一区二区成人| 福利在线一区二区| 日韩黄色三级在线观看| 日韩电影中文字幕在线| 国产精品视频一区二区三| 天堂成人免费av电影一区| 动漫精品视频| 国产在线观看a视频| 欧美视频在线免费看| 韩国三级在线播放| 91视频精品| 国产精品国产三级国产aⅴ浪潮| 亚洲国产剧情在线观看| 亚洲欧洲www| 亚欧在线免费观看| 日日狠狠久久偷偷综合色| 国产精品videossex| 啊v视频在线| 国产成人综合自拍| 亚洲国产一区二区三区在线播 | 亚洲free嫩bbb| 欧美人体大胆444www| 亚洲一区二区综合| 国产探花一区二区三区| 91精品综合久久久久久久久久久| 国产精品r级在线| 亚洲三级黄色片| 亚洲成人在线观看视频| 性一交一黄一片| 中文字幕日韩欧美精品高清在线| 国产精品久久一区| а天堂8中文最新版在线官网| 色综合一区二区三区| 泷泽萝拉在线播放| 久久久久久黄| 日本不卡二区| 怡红院成人在线| 亚洲人成电影网站色| 日韩三级一区二区| 久久久精品影视| 成人性生生活性生交12| 成人3d动漫在线观看| 国产精品久久久久久av下载红粉 | 国产精品美女久久福利网站| 黄色三级视频片| 日韩成人影院| 91精品综合视频| 伊人手机在线| 亚洲国产精品高清久久久| 中文字幕亚洲精品在线| 久久综合九色综合97婷婷女人 | 女人被男人躁得好爽免费视频| 日本伊人久久| 久久久亚洲福利精品午夜| 日本人妻熟妇久久久久久| 欧美日韩免费一区| 在线观看国产精品一区| 久久精品国产精品青草| 8x8x华人在线| 亚洲第一福利专区| 国产精品久久久久久网站| 在线免费观看黄| 日韩欧美一级片| 青青操免费在线视频| 中文字幕第一区二区| 欧美激情第四页| 香蕉成人久久| 亚洲 欧洲 日韩| 国产一区二区三区亚洲| 国产精品88a∨| 秋霞在线午夜| 一区二区三区黄色| 性做久久久久久久| 色婷婷综合久久久| 欧美成人精品欧美一级私黄| 99riav久久精品riav| 色婷婷狠狠18| 亚洲精品影视| 中国人体摄影一区二区三区| 欧美成人午夜77777| 国产精品久久综合av爱欲tv| 污视频网站在线免费| 亚洲免费小视频| 精品国产99久久久久久宅男i| 精品久久久中文| 天海翼在线视频| 国产亚洲欧美中文| 白嫩情侣偷拍呻吟刺激| 美女一区二区三区在线观看| 国产97在线 | 亚洲| 婷婷久久一区| 欧洲在线视频一区| 超碰97久久国产精品牛牛| 国产精品视频一区国模私拍| 高潮在线视频| 久久国产精品电影| 第一福利在线| 日韩毛片在线观看| 亚洲国产av一区二区| 欧美日韩在线播| 免费黄色av片| 调教+趴+乳夹+国产+精品| 麻豆精品一区二区三区视频| 中文字幕不卡的av| 波多野结衣办公室33分钟| 国产99久久久久| 国产女同无遮挡互慰高潮91| 蜜桃av一区| 天天夜碰日日摸日日澡性色av| 亚洲啊v在线观看| 亚洲激情一区二区| 国内精品久久久久久99蜜桃| 黄色99视频| 久久国产精品色av免费看| 北条麻妃高清一区| 国产aa精品| 96sao精品视频在线观看| 国产91在线播放精品| 国产成人精品综合| 黄色污网站在线观看| 色综合视频网站| a级影片在线| 久久色免费在线视频| 欧美被日视频| 精品国产一区二区三区久久久| 91九色在线porn| 爽爽爽爽爽爽爽成人免费观看| av电影在线观看| 日日骚av一区| 黄页视频在线播放| 久久久av一区| 91在线中文| 欧美激情啊啊啊| 麻豆蜜桃在线| 国内成人精品一区| 欧美激情网站| 91大神福利视频在线| 成人影院入口| 国产精品91在线观看| 成人在线视频观看| 国产日产欧美a一级在线| 自拍偷拍欧美日韩| 91视频99| 老司机精品视频在线播放| 久久av二区| 成人免费电影网址| 在线成人性视频| 亚洲综合色站| 激情五月婷婷六月| 国产一区91| 国产一区二区在线免费播放| 久久成人av少妇免费| 亚洲成人av免费观看| 北岛玲一区二区三区四区| 人妻丰满熟妇av无码久久洗澡| 久久久久国产精品人| 超碰人人人人人人人| 亚洲人成在线观看一区二区| 久久精品欧美一区二区| 福利微拍一区二区| 一本到在线视频| 精品日韩一区二区三区| 一起草在线视频| 95精品视频在线| 蜜臀久久99精品久久久久久| 国产精品二三区| 激情综合网五月婷婷| 日韩欧美在线观看视频| 国产精品久久欧美久久一区| 亚洲成人网在线观看| 成人精品一区二区三区校园激情| 久久偷看各类女兵18女厕嘘嘘| √8天堂资源地址中文在线| 国产精欧美一区二区三区| 美女国产精品久久久| 乱一区二区三区在线播放| 国产精品x453.com| 自慰无码一区二区三区| 久色婷婷小香蕉久久| 第四色在线视频| 国产精品国产三级国产三级人妇| 日韩av在线电影| 在线播放亚洲一区| 日韩电影在线观看完整版| 操人视频在线观看欧美| 国产日韩另类视频一区| 97久久人人超碰caoprom欧美| 米奇777超碰欧美日韩亚洲| 欧美成人自拍视频| 国产妇女馒头高清泬20p多| 日韩一级在线视频| 美女呻吟一区| 欧美日韩国产影院| 精品日本一区二区| 污视频网址在线观看| 午夜视频在线观看网站| 奇米影视一区二区三区小说| 中文字幕日韩有码| 黄色www网站| 中文字幕在线观看1| 久久精品福利| 亚洲成人av一区| 日本午夜精品一区二区| 国产乱人伦丫前精品视频| 图片区小说区区亚洲五月| 亚洲国产专区校园欧美| 手机精品视频在线| 日本一区二区三级电影在线观看 | www.av网站| 中文字幕久热精品在线视频| 免费观看欧美大片| 国产一区免费| 亚洲天堂激情| 不卡的一区二区| 亚洲精品欧美激情| 国产精品无码专区av免费播放| 一区二区三区无码高清视频| 日韩大尺度黄色| 欧美自拍资源在线| 国产精品五区| 亚洲综合自拍网| 亚洲成av人片一区二区梦乃 | 亚洲欧美中文字幕在线一区| aa级大片免费在线观看| 成人免费视频网站| 国产精品分类| 美女伦理水蜜桃4| 亚洲综合激情另类小说区| 国产99视频在线| 欧美日韩国产成人在线| 亚洲一区二区三区免费| 男人添女人下部视频免费| 高清国产一区二区三区| 一区二区三区免费高清视频| 精品日产卡一卡二卡麻豆| 中文av资源在线| 国产经品一区二区| 亚洲国产一区二区三区a毛片| 国模私拍在线观看| 精品国产精品三级精品av网址| 偷拍自拍在线视频| 日韩av电影在线播放| 精品久久中文| www.超碰97.com| 尤物在线观看一区| 韩国av免费在线| 2019精品视频| 精品久久影视| 奇米777在线视频| 亚洲综合色在线| 性插视频在线观看| 国产精品都在这里| 香蕉国产精品| 四虎成人免费视频| 色综合久久综合中文综合网| av在线二区| 亚洲永久免费观看| 国产视频亚洲| 萌白酱视频在线| 亚洲精品一区二区三区在线观看| 成人福利视频| 自拍亚洲欧美老师丝袜| 国产91丝袜在线18| 久久亚洲精品石原莉奈 | 任我爽在线视频| 欧美精品一区二区三区蜜桃| 欧美xx视频| 做爰高潮hd色即是空| 丁香另类激情小说| 天天爽夜夜爽人人爽| 久久夜色精品国产亚洲aⅴ| 国产精品欧美大片| 久久99爱视频| 亚洲h动漫在线| 最新97超碰在线| 国产日韩一区欧美| 久久国产综合精品| 精品成人久久久| 久久久99免费视频| 丝袜久久网站| 日本中文字幕有码| 欧美在线free| 麻豆视频在线看|