精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

亚洲电影在线| 麻豆国产一区| 国产视频一区二区在线观看| 国产精品日韩欧美综合| 国产传媒免费在线观看| 亚洲开心激情| 日韩欧美福利视频| 亚洲日本欧美在线| 亚洲黄色在线观看视频| 国产精品久久久久久久久久妞妞| 亚洲人成在线电影| av中文字幕网址| 51精品在线| 国产清纯美女被跳蛋高潮一区二区久久w | 最新热久久免费视频| 国产精品久久久久久久天堂第1集| 国产精品男女视频| 97久久夜色精品国产| 亚洲精品电影久久久| 手机在线成人免费视频| 国产乱码在线| 国产精品国产自产拍高清av王其| 国产精品一国产精品最新章节| 免费看一级视频| 欧美日韩国产欧| 中文字幕av一区| 制服丝袜第一页在线观看| 国产69精品久久| 午夜精品久久久久久久| 中文字幕不卡每日更新1区2区| 欧美特黄一级视频| 国模一区二区三区白浆| 国产成人一区二区三区小说| 国产精品二区一区二区aⅴ| 成人在线免费观看视频| 亚洲精品在线网站| 亚洲网中文字幕| www成人在线视频| 亚洲成人综合网站| 色撸撸在线观看| 国产精品免费观看| 久久理论电影网| 国产精品免费看一区二区三区| 国产老妇伦国产熟女老妇视频| 久久久人人人| 欧美一区二区三区免费视| 久久机热这里只有精品| 亚洲最新色图| 精品国产一区二区三区久久狼5月| 日韩一级视频在线观看| 欧美人与动xxxxz0oz| 日韩视频一区二区三区| 波多野结衣网页| 日韩黄色三级| 欧美日韩mp4| 国产欧美高清在线| 伊人网在线播放| 五月婷婷综合在线| 加勒比成人在线| xxxx成人| 五月天久久比比资源色| 国产97在线 | 亚洲| 97人澡人人添人人爽欧美| 亚洲综合色网站| 欧美日韩dvd| 尤物yw193can在线观看| 一级精品视频在线观看宜春院 | 黄色的视频在线免费观看| 成人aa视频在线观看| 99re在线观看| 老司机午夜福利视频| 成人性色生活片| yellow视频在线观看一区二区| 精品国产va久久久久久久| 国产一区999| 福利视频一区二区三区| 熟妇高潮一区二区高潮| 久久网这里都是精品| 欧美二区在线| 69xxxx欧美| 亚洲人成网站在线| 成年在线观看视频| 色戒汤唯在线| 欧美在线不卡视频| 中文字幕亚洲影院| 亚洲一区电影| 亚洲欧洲自拍偷拍| 亚洲精品卡一卡二| 国内精品久久久久久久影视蜜臀| 91精品国产777在线观看| 久久久久久少妇| 日本vs亚洲vs韩国一区三区二区 | 国产成人av福利| 精品福利影视| 中文字幕在线免费| 亚洲国产精品一区二区www| 丰满爆乳一区二区三区| 成人久久网站| 精品国产网站在线观看| 国产真实乱人偷精品人妻| 天天影视天天精品| 91国内在线视频| 夜夜躁狠狠躁日日躁av| 风间由美性色一区二区三区| 欧美日韩国产精品一卡| 成人国产免费电影| 色综合久久久久综合| 亚洲第一色av| 在线亚洲a色| 九九久久久久久久久激情| 国产精品第5页| 国产麻豆精品95视频| 久久精品一二三区| 欧美激情办公室videoshd| 婷婷丁香激情综合| 17c国产在线| 久久99高清| 久久久久久91| 一级片在线观看视频| 91蝌蚪porny成人天涯| 波多野结衣与黑人| 成人福利片在线| 亚洲精品久久久一区二区三区 | 成人乱码一区二区三区| 国产精品三级av| 精品人妻一区二区三区四区在线| 成人黄色91| 在线观看91久久久久久| 六月丁香婷婷综合| 成人一区在线观看| 日韩不卡一二区| 黑人一区二区三区| 亚洲欧美国产精品专区久久| 国产精品theporn动漫| 国产裸体歌舞团一区二区| 新呦u视频一区二区| 亚洲人体视频| 日韩精品欧美激情| 日韩伦人妻无码| 国产成人精品三级| 在线观看一区二区三区三州| av有声小说一区二区三区| 日韩成人在线观看| 日韩欧美a级片| 国产69精品久久777的优势| 国产日韩第一页| 亚洲三级在线| 久久精品国产亚洲一区二区| 在线免费观看一区二区| 国产女人aaa级久久久级 | 麻豆成人91精品二区三区| 免费久久99精品国产自| 九色porny丨入口在线| 精品国产凹凸成av人导航| 青娱乐免费在线视频| 国产一区二区三区四| 992tv成人免费观看| 亚洲高清国产拍精品26u| 日韩天堂在线视频| 国产三级午夜理伦三级| 亚洲精品写真福利| 中文字幕久久久久久久| 欧美a级片网站| 99久久国产免费免费| 性爱视频在线播放| 精品99999| 日日噜噜噜噜人人爽亚洲精品| 91麻豆精品视频| 99热成人精品热久久66| 国产欧美日韩在线观看视频| 国产成人av在线| jizz日韩| 91精品国产色综合久久不卡蜜臀 | 亚洲国产综合av| 好吊视频一区二区三区四区| 国产精品香蕉视屏| 性欧美freesex顶级少妇| 亚洲香蕉在线观看| 国产裸体美女永久免费无遮挡| 亚洲欧洲精品一区二区三区不卡| 手机在线视频一区| 欧美日韩精品一本二本三本| 韩国成人动漫在线观看| 成人免费av电影| 久久精品国产亚洲| 三级网站在线看| 一本久久a久久精品亚洲| 国产精品一区二区亚洲| 国产成人免费视频网站| 成年人观看网站| 97视频精品| 国产chinese精品一区二区| 亚洲永久av| zzijzzij亚洲日本成熟少妇| 人妻无码中文字幕| 欧美性受xxxx| 久久无码精品丰满人妻| 国产性做久久久久久| 91热视频在线观看| 欧美专区18| 亚洲爆乳无码精品aaa片蜜桃| 丁香婷婷成人| 国产精品视频在线观看| av在线不卡免费| 日韩一区二区三区国产| 五月婷在线视频| 在线成人免费观看| jizz国产在线观看| 亚洲黄色性网站| 欧美偷拍一区二区三区| 成人精品视频一区二区三区尤物| 韩国中文字幕av| 一区二区三区四区五区在线| 2021狠狠干| 欧美色爱综合| 久久99导航| 亚洲综合影院| 成人久久精品视频| av在线日韩| 97久久久免费福利网址| 成人午夜在线影视| 在线成人中文字幕| 欧美日本韩国一区二区| 欧美大胆人体bbbb| 亚洲怡红院av| 91久久精品网| 青青草成人av| 亚洲一区av在线| 欧美做爰爽爽爽爽爽爽| 中文字幕乱码亚洲精品一区| 亚洲永久无码7777kkk| 成人免费视频一区| 手机看片国产精品| 韩国精品久久久| 手机av在线网| 美女在线一区二区| 九九视频精品在线观看| 老鸭窝亚洲一区二区三区| 国产九色porny| 国产精品v日韩精品v欧美精品网站| 在线不卡日本| 999国产精品永久免费视频app| 日韩av在线电影观看| 一本色道久久综合亚洲精品酒店| 国产呦系列欧美呦日韩呦| 91国内精品白嫩初高生| 成人蜜桃视频| 韩国精品福利一区二区三区| 高清国产在线一区| 91亚洲精品视频在线观看| ts人妖另类在线| 精品无人区一区二区| 国产伦精品一区二区三区视频免费| 亚洲一区二区三区免费| 高清国产在线一区| 另类ts人妖一区二区三区| 久久久com| 少妇精品久久久| 日本精品一区二区三区不卡无字幕| 午夜欧洲一区| 欧美日韩一区在线播放| 欧美日韩第一| 亚洲精品免费在线看| 欧美国产一级| 日本一二三区视频在线| 欧美日韩a区| 国产黄页在线观看| 久久久久久黄| 亚洲久久中文字幕| 国产精品一区不卡| 国产人妖在线观看| 91美女视频网站| 在线免费观看黄色小视频| 国产日产欧美一区| 日本裸体美女视频| 亚洲影视资源网| 六月丁香在线视频| 欧美日免费三级在线| 国产chinasex对白videos麻豆| 日韩视频免费直播| 三级视频网站在线| 伊人伊成久久人综合网小说| 国产三区视频在线观看| 久久久久久亚洲精品不卡| 色在线免费观看| 国产精品免费电影| 久久伦理中文字幕| 精品国产一区二区三区免费 | 国产一级黄色录像片| av不卡免费看| 性猛交ⅹ×××乱大交| 国产91高潮流白浆在线麻豆| 成人免费网站黄| 亚洲色图.com| 中文字幕第15页| 欧美精品亚洲一区二区在线播放| 国产情侣自拍小视频| 日韩精品视频免费| 黄色网页在线观看| 97视频免费看| 青青在线精品| 久久精品国产精品国产精品污| 欧美日韩性在线观看| 国产成人一区二区三区别| 日本不卡一区二区| 亚洲视频在线播放免费| 国产精品久久毛片av大全日韩| 国产做受高潮漫动| 欧美一三区三区四区免费在线看| 日韩porn| 久久免费少妇高潮久久精品99| abab456成人免费网址| 成人一区二区三区四区| 99久久www免费| 久久久久久久久久久免费视频| 国产传媒日韩欧美成人| 五月天精品在线| 高跟丝袜欧美一区| www.久久色| 久久久国产一区二区三区| 国产精品粉嫩| 国产免费高清一区| 午夜久久美女| 亚洲精品www.| 国产日韩精品久久久| 欧美特黄aaaaaa| 欧美大肚乱孕交hd孕妇| 黄色成年人视频在线观看| 国产精品九九九| 偷拍亚洲色图| av免费观看国产| 国产精品白丝jk黑袜喷水| 国产精品18在线| 日本道免费精品一区二区三区| 欧美 日韩 综合| 欧美国产第二页| 日本一区二区三区视频在线看| 亚洲国产精品一区在线观看不卡| 亚洲男女自偷自拍| 91视频啊啊啊| 午夜视频在线观看一区二区三区| 性一交一乱一伧老太| 萌白酱国产一区二区| 亚洲国产91视频| 亚洲一区二区精品在线| 日本aⅴ亚洲精品中文乱码| av黄色在线免费观看| 欧美性猛交视频| 深夜视频在线免费| 欧美亚洲国产成人精品| 久久黄色影视| 欧美色图色综合| 久久久精品中文字幕麻豆发布| 在线观看日本网站| 亚洲色图25p| 日韩成人亚洲| 亚洲一区二区三区午夜| 久久精品国产精品亚洲红杏 | 午夜精品久久一牛影视| 欧美一级在线免费观看| 午夜精品在线视频| 男人的天堂久久| 丰满少妇被猛烈进入高清播放| 久久天堂av综合合色蜜桃网| 午夜久久久久久久久久影院| 国产亚洲欧洲高清| 欧洲亚洲精品| 免费的一级黄色片| a美女胸又www黄视频久久| 亚洲天堂日韩av| 亚洲社区在线观看| 欧美高清免费| 91动漫在线看| 久久这里只有精品6| 久久久久久无码午夜精品直播| 中文字幕精品在线| 精品中文字幕一区二区三区四区| 亚洲乱码日产精品bd在线观看| 国产精品69毛片高清亚洲| 久久视频免费看| 亚洲色图欧美制服丝袜另类第一页 | 亚洲天堂中文字幕| 黄色福利在线观看| 日本午夜在线亚洲.国产| 久久在线视频免费观看| 老熟女高潮一区二区三区| 午夜国产精品一区| 最新国产在线观看| 国产高清精品一区| 日韩专区在线视频| 国产老头老太做爰视频| 亚洲成人激情图| 91九色综合| 免费在线黄网站| 国产欧美一区二区精品婷婷| 国产成人精品毛片| 国产第一区电影| 欧美日韩一区自拍| 国产欧美小视频| 欧美精品一区二区三区在线 |