From 92e00752f910497e902e3462887f70861530f2c2 Mon Sep 17 00:00:00 2001 From: Fez <2478375355@qq.com> Date: Tue, 10 Dec 2024 22:31:22 +0800 Subject: [PATCH 1/2] =?UTF-8?q?1.=E9=9B=86=E6=88=90Spring=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E6=B3=A8=E8=A7=A3=E6=9D=A5=E9=85=8D=E7=BD=AE=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=202.=E8=B0=83=E7=94=A8=E6=96=B9=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E6=9C=8D=E5=8A=A1=E7=9A=84=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E5=85=B7=E4=BD=93=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- {version5/.idea => .idea}/.gitignore | 0 .idea/RPC-Java-F.iml | 9 + .idea/compiler.xml | 35 +++ .idea/encodings.xml | 29 ++ .idea/jarRepositories.xml | 35 +++ .idea/misc.xml | 29 ++ .idea/modules.xml | 8 + .idea/vcs.xml | 6 + consumer/.gitattributes | 2 + consumer/.gitignore | 33 +++ .../.mvn/wrapper/maven-wrapper.properties | 19 ++ consumer/mvnw | 259 ++++++++++++++++++ consumer/mvnw.cmd | 149 ++++++++++ consumer/pom.xml | 95 +++++++ .../example/consumer/ConsumerApplication.java | 17 ++ .../web/controller/testController.java | 44 +++ .../src/main/resources/application.properties | 3 + provider/.gitattributes | 2 + provider/.gitignore | 33 +++ .../.mvn/wrapper/maven-wrapper.properties | 19 ++ provider/mvnw | 259 ++++++++++++++++++ provider/mvnw.cmd | 149 ++++++++++ provider/pom.xml | 74 +++++ .../example/provider/ProviderApplication.java | 15 + .../web/service/impl/UserServiceImpl1.java | 31 +++ .../web/service/impl/UserServiceImpl2.java | 32 +++ .../src/main/resources/application.properties | 3 + {version1 => publicInterface}/pom.xml | 48 ++-- .../java/com/publicInterface/dto}/User.java | 4 +- .../publicInterface}/service/UserService.java | 5 +- .../dto/User$UserBuilder.class | Bin 0 -> 1680 bytes .../com/publicInterface/dto/User.class | Bin 0 -> 2984 bytes .../publicInterface/service/UserService.class | Bin 0 -> 288 bytes .../target/maven-archiver/pom.properties | 5 + .../compile/default-compile/createdFiles.lst | 3 + .../compile/default-compile/inputFiles.lst | 2 + .../target/publicInterface-1.0-SNAPSHOT.jar | Bin 0 -> 4834 bytes .../src/main/java/part1/Client/IOClient.java | 36 --- .../main/java/part1/Client/TestClient.java | 25 -- .../java/part1/Client/proxy/ClientProxy.java | 40 --- .../main/java/part1/Server/TestServer.java | 25 -- .../Server/provider/ServiceProvider.java | 34 --- .../java/part1/Server/server/RpcServer.java | 12 - .../server/impl/SimpleRPCRPCServer.java | 40 --- .../server/impl/ThreadPoolRPCRPCServer.java | 58 ---- .../part1/Server/server/work/WorkThread.java | 58 ---- .../java/part1/common/Message/RpcRequest.java | 25 -- .../part1/common/Message/RpcResponse.java | 30 -- .../src/main/java/part1/common/pojo/User.java | 25 -- .../common/service/Impl/UserServiceImpl.java | 32 --- .../part1/common/service/UserService.java | 16 -- .../src/main/java/part2/Client/IOClient.java | 36 --- .../main/java/part2/Client/TestClient.java | 26 -- .../netty/handler/NettyClientHandler.java | 28 -- .../NettyClientInitializer.java | 43 --- .../java/part2/Client/proxy/ClientProxy.java | 53 ---- .../part2/Client/rpcClient/RpcClient.java | 15 - .../Client/rpcClient/impl/NettyRpcClient.java | 62 ----- .../rpcClient/impl/SimpleSocketRpcCilent.java | 41 --- .../main/java/part2/Server/TestServer.java | 26 -- .../netty/handler/NettyRPCServerHandler.java | 52 ---- .../NettyServerInitializer.java | 46 ---- .../Server/provider/ServiceProvider.java | 32 --- .../java/part2/Server/server/RpcServer.java | 11 - .../Server/server/impl/NettyRPCRPCServer.java | 49 ---- .../server/impl/SimpleRPCRPCServer.java | 39 --- .../server/impl/ThreadPoolRPCRPCServer.java | 58 ---- .../part2/Server/server/work/WorkThread.java | 58 ---- .../java/part2/common/Message/RpcRequest.java | 25 -- .../part2/common/Message/RpcResponse.java | 29 -- .../src/main/java/part2/common/pojo/User.java | 25 -- .../common/service/Impl/UserServiceImpl.java | 32 --- .../main/java/part3/Client/TestClient.java | 29 -- .../netty/handler/NettyClientHandler.java | 27 -- .../NettyClientInitializer.java | 42 --- .../java/part3/Client/proxy/ClientProxy.java | 43 --- .../part3/Client/rpcClient/RpcClient.java | 15 - .../Client/rpcClient/impl/NettyRpcClient.java | 68 ----- .../rpcClient/impl/SimpleSocketRpcCilent.java | 41 --- .../Client/serviceCenter/ServiceCenter.java | 14 - .../Client/serviceCenter/ZKServiceCenter.java | 59 ---- .../main/java/part3/Server/TestServer.java | 28 -- .../netty/handler/NettyRPCServerHandler.java | 51 ---- .../NettyServerInitializer.java | 46 ---- .../Server/provider/ServiceProvider.java | 47 ---- .../java/part3/Server/server/RpcServer.java | 11 - .../Server/server/impl/NettyRPCRPCServer.java | 48 ---- .../server/impl/SimpleRPCRPCServer.java | 39 --- .../part3/Server/server/work/WorkThread.java | 58 ---- .../serviceRegister/ServiceRegister.java | 15 - .../impl/ZKServiceRegister.java | 62 ----- .../java/part3/common/Message/RpcRequest.java | 25 -- .../part3/common/Message/RpcResponse.java | 29 -- .../common/service/Impl/UserServiceImpl.java | 32 --- .../part3/common/service/UserService.java | 16 -- version1/target/classes/log4j.properties | 8 - .../classes/part1/Client/IOClient.class | Bin 1487 -> 0 bytes .../classes/part1/Client/TestClient.class | Bin 2082 -> 0 bytes .../part1/Client/proxy/ClientProxy.class | Bin 2537 -> 0 bytes .../classes/part1/Server/TestServer.class | Bin 969 -> 0 bytes .../Server/provider/ServiceProvider.class | Bin 1474 -> 0 bytes .../part1/Server/server/RpcServer.class | Bin 163 -> 0 bytes .../server/impl/SimpleRPCRPCServer.class | Bin 1396 -> 0 bytes .../server/impl/ThreadPoolRPCRPCServer.class | Bin 2536 -> 0 bytes .../part1/Server/server/work/WorkThread.class | Bin 3143 -> 0 bytes .../RpcRequest$RpcRequestBuilder.class | Bin 1979 -> 0 bytes .../part1/common/Message/RpcRequest.class | Bin 3426 -> 0 bytes .../RpcResponse$RpcResponseBuilder.class | Bin 1588 -> 0 bytes .../part1/common/Message/RpcResponse.class | Bin 3094 -> 0 bytes .../part1/common/pojo/User$UserBuilder.class | Bin 1467 -> 0 bytes .../classes/part1/common/pojo/User.class | Bin 2753 -> 0 bytes .../common/service/Impl/UserServiceImpl.class | Bin 1965 -> 0 bytes .../part1/common/service/UserService.class | Bin 269 -> 0 bytes .../classes/part2/Client/IOClient.class | Bin 1487 -> 0 bytes .../classes/part2/Client/TestClient.class | Bin 2084 -> 0 bytes .../netty/handler/NettyClientHandler.class | Bin 1901 -> 0 bytes .../NettyClientInitializer$1.class | Bin 1102 -> 0 bytes .../NettyClientInitializer.class | Bin 1876 -> 0 bytes .../part2/Client/proxy/ClientProxy.class | Bin 2956 -> 0 bytes .../part2/Client/rpcClient/RpcClient.class | Bin 216 -> 0 bytes .../rpcClient/impl/NettyRpcClient.class | Bin 2804 -> 0 bytes .../impl/SimpleSocketRpcCilent.class | Bin 1648 -> 0 bytes .../classes/part2/Server/TestServer.class | Bin 968 -> 0 bytes .../netty/handler/NettyRPCServerHandler.class | Bin 3318 -> 0 bytes .../NettyServerInitializer$1.class | Bin 1102 -> 0 bytes .../NettyServerInitializer.class | Bin 2026 -> 0 bytes .../Server/provider/ServiceProvider.class | Bin 1474 -> 0 bytes .../part2/Server/server/RpcServer.class | Bin 163 -> 0 bytes .../server/impl/NettyRPCRPCServer.class | Bin 2316 -> 0 bytes .../server/impl/SimpleRPCRPCServer.class | Bin 1396 -> 0 bytes .../server/impl/ThreadPoolRPCRPCServer.class | Bin 2536 -> 0 bytes .../part2/Server/server/work/WorkThread.class | Bin 3143 -> 0 bytes .../RpcRequest$RpcRequestBuilder.class | Bin 1979 -> 0 bytes .../part2/common/Message/RpcRequest.class | Bin 3426 -> 0 bytes .../RpcResponse$RpcResponseBuilder.class | Bin 1588 -> 0 bytes .../part2/common/Message/RpcResponse.class | Bin 3094 -> 0 bytes .../part2/common/pojo/User$UserBuilder.class | Bin 1467 -> 0 bytes .../classes/part2/common/pojo/User.class | Bin 2753 -> 0 bytes .../common/service/Impl/UserServiceImpl.class | Bin 1965 -> 0 bytes .../part2/common/service/UserService.class | Bin 269 -> 0 bytes .../classes/part3/Client/TestClient.class | Bin 2032 -> 0 bytes .../netty/handler/NettyClientHandler.class | Bin 1901 -> 0 bytes .../NettyClientInitializer$1.class | Bin 1102 -> 0 bytes .../NettyClientInitializer.class | Bin 1876 -> 0 bytes .../part3/Client/proxy/ClientProxy.class | Bin 2536 -> 0 bytes .../part3/Client/rpcClient/RpcClient.class | Bin 216 -> 0 bytes .../rpcClient/impl/NettyRpcClient.class | Bin 3308 -> 0 bytes .../impl/SimpleSocketRpcCilent.class | Bin 1648 -> 0 bytes .../Client/serviceCenter/ServiceCenter.class | Bin 212 -> 0 bytes .../serviceCenter/ZKServiceCenter.class | Bin 3281 -> 0 bytes .../classes/part3/Server/TestServer.class | Bin 1018 -> 0 bytes .../netty/handler/NettyRPCServerHandler.class | Bin 3318 -> 0 bytes .../NettyServerInitializer$1.class | Bin 1102 -> 0 bytes .../NettyServerInitializer.class | Bin 2026 -> 0 bytes .../Server/provider/ServiceProvider.class | Bin 1951 -> 0 bytes .../part3/Server/server/RpcServer.class | Bin 163 -> 0 bytes .../server/impl/NettyRPCRPCServer.class | Bin 2316 -> 0 bytes .../server/impl/SimpleRPCRPCServer.class | Bin 1396 -> 0 bytes .../part3/Server/server/work/WorkThread.class | Bin 3143 -> 0 bytes .../serviceRegister/ServiceRegister.class | Bin 211 -> 0 bytes .../impl/ZKServiceRegister.class | Bin 3883 -> 0 bytes .../RpcRequest$RpcRequestBuilder.class | Bin 1979 -> 0 bytes .../part3/common/Message/RpcRequest.class | Bin 3426 -> 0 bytes .../RpcResponse$RpcResponseBuilder.class | Bin 1588 -> 0 bytes .../part3/common/Message/RpcResponse.class | Bin 3094 -> 0 bytes .../part3/common/pojo/User$UserBuilder.class | Bin 1467 -> 0 bytes .../classes/part3/common/pojo/User.class | Bin 2753 -> 0 bytes .../common/service/Impl/UserServiceImpl.class | Bin 1965 -> 0 bytes .../part3/common/service/UserService.class | Bin 269 -> 0 bytes version2/pom.xml | 54 ---- .../main/java/part1/Client/TestClient.java | 28 -- .../netty/handler/NettyClientHandler.java | 27 -- .../NettyClientInitializer.java | 31 --- .../java/part1/Client/proxy/ClientProxy.java | 42 --- .../part1/Client/rpcClient/RpcClient.java | 15 - .../Client/rpcClient/impl/NettyRpcClient.java | 68 ----- .../rpcClient/impl/SimpleSocketRpcCilent.java | 41 --- .../Client/serviceCenter/ServiceCenter.java | 14 - .../Client/serviceCenter/ZKServiceCenter.java | 59 ---- .../main/java/part1/Server/TestServer.java | 26 -- .../netty/handler/NettyRPCServerHandler.java | 51 ---- .../NettyServerInitializer.java | 35 --- .../Server/provider/ServiceProvider.java | 47 ---- .../java/part1/Server/server/RpcServer.java | 11 - .../Server/server/impl/NettyRPCRPCServer.java | 48 ---- .../server/impl/SimpleRPCRPCServer.java | 39 --- .../part1/Server/server/work/WorkThread.java | 58 ---- .../serviceRegister/ServiceRegister.java | 15 - .../impl/ZKServiceRegister.java | 62 ----- .../part1/common/Message/MessageType.java | 17 -- .../java/part1/common/Message/RpcRequest.java | 29 -- .../part1/common/Message/RpcResponse.java | 35 --- .../src/main/java/part1/common/pojo/User.java | 25 -- .../common/serializer/myCode/MyDecoder.java | 42 --- .../common/serializer/myCode/MyEncoder.java | 41 --- .../mySerializer/JsonSerializer.java | 65 ----- .../mySerializer/ObjectSerializer.java | 54 ---- .../serializer/mySerializer/Serializer.java | 29 -- .../common/service/Impl/UserServiceImpl.java | 32 --- .../part1/common/service/UserService.java | 16 -- .../main/java/part2/Client/TestClient.java | 28 -- .../java/part2/Client/cache/serviceCache.java | 54 ---- .../netty/handler/NettyClientHandler.java | 27 -- .../NettyClientInitializer.java | 26 -- .../java/part2/Client/proxy/ClientProxy.java | 42 --- .../part2/Client/rpcClient/RpcClient.java | 15 - .../Client/rpcClient/impl/NettyRpcClient.java | 68 ----- .../rpcClient/impl/SimpleSocketRpcCilent.java | 41 --- .../Client/serviceCenter/ServiceCenter.java | 14 - .../Client/serviceCenter/ZKServiceCenter.java | 75 ----- .../serviceCenter/ZkWatcher/watchZK.java | 87 ------ .../main/java/part2/Server/TestServer.java | 27 -- .../netty/handler/NettyRPCServerHandler.java | 51 ---- .../NettyServerInitializer.java | 30 -- .../Server/provider/ServiceProvider.java | 47 ---- .../java/part2/Server/server/RpcServer.java | 11 - .../Server/server/impl/NettyRPCRPCServer.java | 48 ---- .../server/impl/SimpleRPCRPCServer.java | 39 --- .../part2/Server/server/work/WorkThread.java | 58 ---- .../serviceRegister/ServiceRegister.java | 15 - .../impl/ZKServiceRegister.java | 62 ----- .../part2/common/Message/MessageType.java | 17 -- .../java/part2/common/Message/RpcRequest.java | 29 -- .../part2/common/Message/RpcResponse.java | 35 --- .../src/main/java/part2/common/pojo/User.java | 25 -- .../common/serializer/myCode/MyDecoder.java | 41 --- .../common/serializer/myCode/MyEncoder.java | 41 --- .../mySerializer/JsonSerializer.java | 65 ----- .../mySerializer/ObjectSerializer.java | 54 ---- .../serializer/mySerializer/Serializer.java | 29 -- .../common/service/Impl/UserServiceImpl.java | 32 --- .../part2/common/service/UserService.java | 16 -- version2/src/main/resources/log4j.properties | 8 - version3/pom.xml | 58 ---- .../main/java/part1/Client/TestClient.java | 28 -- .../java/part1/Client/cache/serviceCache.java | 57 ---- .../netty/handler/NettyClientHandler.java | 27 -- .../NettyClientInitializer.java | 26 -- .../java/part1/Client/proxy/ClientProxy.java | 42 --- .../part1/Client/rpcClient/RpcClient.java | 15 - .../Client/rpcClient/impl/NettyRpcClient.java | 68 ----- .../rpcClient/impl/SimpleSocketRpcCilent.java | 41 --- .../Client/serviceCenter/ServiceCenter.java | 14 - .../Client/serviceCenter/ZKServiceCenter.java | 76 ----- .../serviceCenter/ZkWatcher/watchZK.java | 87 ------ .../serviceCenter/balance/LoadBalance.java | 15 - .../balance/impl/ConsistencyHashBalance.java | 119 -------- .../balance/impl/RandomLoadBalance.java | 24 -- .../balance/impl/RoundLoadBalance.java | 24 -- .../main/java/part1/Server/TestServer.java | 27 -- .../netty/handler/NettyRPCServerHandler.java | 51 ---- .../NettyServerInitializer.java | 30 -- .../Server/provider/ServiceProvider.java | 47 ---- .../java/part1/Server/server/RpcServer.java | 11 - .../Server/server/impl/NettyRPCRPCServer.java | 48 ---- .../server/impl/SimpleRPCRPCServer.java | 39 --- .../part1/Server/server/work/WorkThread.java | 58 ---- .../serviceRegister/ServiceRegister.java | 15 - .../impl/ZKServiceRegister.java | 62 ----- .../part1/common/Message/MessageType.java | 17 -- .../java/part1/common/Message/RpcRequest.java | 29 -- .../part1/common/Message/RpcResponse.java | 35 --- .../src/main/java/part1/common/pojo/User.java | 25 -- .../common/serializer/myCode/MyDecoder.java | 41 --- .../common/serializer/myCode/MyEncoder.java | 41 --- .../mySerializer/JsonSerializer.java | 65 ----- .../mySerializer/ObjectSerializer.java | 54 ---- .../serializer/mySerializer/Serializer.java | 29 -- .../common/service/Impl/UserServiceImpl.java | 32 --- .../part1/common/service/UserService.java | 16 -- .../main/java/part2/Client/TestClient.java | 28 -- .../java/part2/Client/cache/serviceCache.java | 54 ---- .../netty/handler/NettyClientHandler.java | 27 -- .../NettyClientInitializer.java | 26 -- .../java/part2/Client/proxy/ClientProxy.java | 55 ---- .../java/part2/Client/retry/guavaRetry.java | 43 --- .../part2/Client/rpcClient/RpcClient.java | 15 - .../Client/rpcClient/impl/NettyRpcClient.java | 68 ----- .../rpcClient/impl/SimpleSocketRpcCilent.java | 41 --- .../Client/serviceCenter/ServiceCenter.java | 16 -- .../Client/serviceCenter/ZKServiceCenter.java | 93 ------- .../serviceCenter/ZkWatcher/watchZK.java | 88 ------ .../serviceCenter/balance/LoadBalance.java | 15 - .../balance/impl/ConsistencyHashBalance.java | 119 -------- .../balance/impl/RandomLoadBalance.java | 24 -- .../balance/impl/RoundLoadBalance.java | 24 -- .../main/java/part2/Server/TestServer.java | 27 -- .../netty/handler/NettyRPCServerHandler.java | 51 ---- .../NettyServerInitializer.java | 30 -- .../Server/provider/ServiceProvider.java | 47 ---- .../java/part2/Server/server/RpcServer.java | 11 - .../Server/server/impl/NettyRPCRPCServer.java | 48 ---- .../server/impl/SimpleRPCRPCServer.java | 39 --- .../part2/Server/server/work/WorkThread.java | 58 ---- .../serviceRegister/ServiceRegister.java | 15 - .../impl/ZKServiceRegister.java | 68 ----- .../part2/common/Message/MessageType.java | 17 -- .../java/part2/common/Message/RpcRequest.java | 29 -- .../part2/common/Message/RpcResponse.java | 35 --- .../src/main/java/part2/common/pojo/User.java | 25 -- .../common/serializer/myCode/MyDecoder.java | 41 --- .../common/serializer/myCode/MyEncoder.java | 41 --- .../mySerializer/JsonSerializer.java | 65 ----- .../mySerializer/ObjectSerializer.java | 54 ---- .../serializer/mySerializer/Serializer.java | 29 -- .../common/service/Impl/UserServiceImpl.java | 32 --- .../part2/common/service/UserService.java | 16 -- version3/src/main/resources/log4j.properties | 8 - version4/pom.xml | 29 ++ .../main/java/part1/Client/TestClient.java | 49 ++-- .../java/part1/Client/cache/serviceCache.java | 2 +- .../NettyClientInitializer.java | 3 +- .../java/part1/Client/proxy/ClientProxy.java | 28 +- .../Client/rpcClient/impl/NettyRpcClient.java | 8 +- .../Client/serviceCenter/ServiceCenter.java | 6 +- .../Client/serviceCenter/ZKServiceCenter.java | 40 ++- .../serviceCenter/ZkWatcher/watchZK.java | 9 +- .../main/java/part1/Server/TestServer.java | 22 +- .../Server/integration/EnableConsumer.java | 21 ++ .../Server/integration/EnableProvider.java | 17 ++ .../part1/Server/integration/References.java | 31 +++ .../part1/Server/integration/RpcService.java | 50 ++++ .../configuration/ConsumerPostProcessor.java | 91 ++++++ .../configuration/ProviderPostProcessor.java | 78 ++++++ .../netty/handler/NettyRPCServerHandler.java | 33 ++- .../Server/provider/ServiceProvider.java | 18 +- .../Server/server/impl/NettyRPCRPCServer.java | 2 + .../serviceRegister/ServiceRegister.java | 7 +- .../impl/ZKServiceRegister.java | 14 +- .../java/part1/common/Message/RpcRequest.java | 3 + .../src/main/java/part1/common/pojo/User.java | 25 -- .../common/service/Impl/UserServiceImpl.java | 32 --- .../part1/common/service/UserService.java | 16 -- .../target/classes}/log4j.properties | 0 version5/.idea/compiler.xml | 21 -- version5/.idea/encodings.xml | 20 -- .../inspectionProfiles/Project_Default.xml | 8 - version5/.idea/jarRepositories.xml | 20 -- version5/.idea/misc.xml | 19 -- version5/.idea/uiDesigner.xml | 124 --------- version5/.idea/vcs.xml | 4 - version5/krpc-api/pom.xml | 20 -- .../src/main/java/com/kama/pojo/User.java | 26 -- .../java/com/kama/service/UserService.java | 19 -- .../com/kama/pojo/User$UserBuilder.class | Bin 1701 -> 0 bytes .../target/classes/com/kama/pojo/User.class | Bin 3013 -> 0 bytes .../com/kama/service/UserService.class | Bin 257 -> 0 bytes .../krpc-api/target/krpc-api-1.0-SNAPSHOT.jar | Bin 4476 -> 0 bytes .../target/maven-archiver/pom.properties | 5 - .../compile/default-compile/createdFiles.lst | 3 - .../compile/default-compile/inputFiles.lst | 2 - version5/krpc-common/pom.xml | 32 --- .../common/exception/SerializeException.java | 17 -- .../main/java/common/message/MessageType.java | 13 - .../main/java/common/message/RpcRequest.java | 31 --- .../main/java/common/message/RpcResponse.java | 37 --- .../common/serializer/mycoder/MyDecoder.java | 58 ---- .../common/serializer/mycoder/MyEncoder.java | 50 ---- .../myserializer/HessianSerializer.java | 52 ---- .../myserializer/JsonSerializer.java | 78 ------ .../myserializer/KryoSerializer.java | 81 ------ .../myserializer/ObjectSerializer.java | 60 ---- .../myserializer/ProtostuffSerializer.java | 83 ------ .../serializer/myserializer/Serializer.java | 35 --- .../src/main/java/common/spi/SpiLoader.java | 111 -------- .../src/main/java/common/util/ConfigUtil.java | 48 ---- .../common/exception/SerializeException.class | Bin 561 -> 0 bytes .../classes/common/message/MessageType.class | Bin 1196 -> 0 bytes .../RpcRequest$RpcRequestBuilder.class | Bin 2248 -> 0 bytes .../classes/common/message/RpcRequest.class | Bin 3779 -> 0 bytes .../RpcResponse$RpcResponseBuilder.class | Bin 2153 -> 0 bytes .../classes/common/message/RpcResponse.class | Bin 4218 -> 0 bytes .../common/serializer/mycoder/MyDecoder.class | Bin 3033 -> 0 bytes .../common/serializer/mycoder/MyEncoder.class | Bin 2549 -> 0 bytes .../myserializer/HessianSerializer.class | Bin 2191 -> 0 bytes .../myserializer/JsonSerializer.class | Bin 2794 -> 0 bytes .../myserializer/KryoSerializer.class | Bin 3569 -> 0 bytes .../myserializer/ObjectSerializer.class | Bin 1942 -> 0 bytes .../myserializer/ProtostuffSerializer.class | Bin 3186 -> 0 bytes .../serializer/myserializer/Serializer.class | Bin 1296 -> 0 bytes .../target/classes/common/spi/SpiLoader.class | Bin 5133 -> 0 bytes .../classes/common/util/ConfigUtil.class | Bin 2372 -> 0 bytes version5/krpc-consumer/pom.xml | 49 ---- .../java/com/kama/consumer/ConsumerTest.java | 66 ----- .../com/kama/consumer/ConsumerTestConfig.java | 20 -- .../src/main/resources/application.properties | 7 - .../target/classes/application.properties | 7 - .../com/kama/consumer/ConsumerTest.class | Bin 3941 -> 0 bytes .../kama/consumer/ConsumerTestConfig.class | Bin 781 -> 0 bytes .../target/krpc-consumer-1.0-SNAPSHOT.jar | Bin 3110 -> 0 bytes .../target/maven-archiver/pom.properties | 5 - .../compile/default-compile/createdFiles.lst | 2 - .../compile/default-compile/inputFiles.lst | 2 - version5/krpc-core/pom.xml | 114 -------- .../main/java/com/kama/KRpcApplication.java | 48 ---- .../com/kama/client/cache/ServiceCache.java | 75 ----- .../client/circuitbreaker/CircuitBreaker.java | 109 -------- .../CircuitBreakerProvider.java | 28 -- .../kama/client/netty/NettyClientHandler.java | 34 --- .../client/netty/NettyClientInitializer.java | 40 --- .../com/kama/client/proxy/ClientProxy.java | 92 ------- .../com/kama/client/retry/GuavaRetry.java | 48 ---- .../com/kama/client/rpcclient/RpcClient.java | 17 -- .../client/rpcclient/impl/NettyRpcClient.java | 103 ------- .../rpcclient/impl/SimpleSocketRpcClient.java | 57 ---- .../client/servicecenter/ServiceCenter.java | 20 -- .../client/servicecenter/ZKServiceCenter.java | 113 -------- .../servicecenter/ZKWatcher/watchZK.java | 98 ------- .../servicecenter/balance/LoadBalance.java | 20 -- .../balance/impl/ConsistencyHashBalance.java | 152 ---------- .../balance/impl/RandomLoadBalance.java | 48 ---- .../balance/impl/RoundLoadBalance.java | 52 ---- .../main/java/com/kama/config/KRpcConfig.java | 37 --- .../java/com/kama/config/RpcConstant.java | 20 -- .../server/netty/NettyRpcServerHandler.java | 71 ----- .../server/netty/NettyServerInitializer.java | 33 --- .../kama/server/provider/ServiceProvider.java | 60 ---- .../com/kama/server/ratelimit/RateLimit.java | 15 - .../impl/TokenBucketRateLimitImpl.java | 60 ---- .../ratelimit/provider/RateLimitProvider.java | 34 --- .../com/kama/server/server/RpcServer.java | 16 -- .../server/server/impl/NettyRpcServer.java | 81 ------ .../server/server/impl/SimpleRpcServer.java | 70 ----- .../kama/server/server/work/WorkThread.java | 61 ----- .../serviceRegister/ServiceRegister.java | 16 -- .../impl/ZKServiceRegister.java | 74 ----- .../balance/ConsistencyHashBalanceTest.java | 100 ------- .../test/balance/RandomLoadBalanceTest.java | 76 ----- .../test/balance/RoundLoadBalanceTest.java | 93 ------- .../serializer/HessianSerializerTest.java | 52 ---- .../test/serializer/KryoSerializerTest.java | 89 ------ .../serializer/ProtostuffSerializerTest.java | 89 ------ ....common.serializer.myserializer.Serializer | 5 - ....common.serializer.myserializer.Serializer | 5 - .../classes/com/kama/KRpcApplication.class | Bin 1617 -> 0 bytes .../com/kama/client/cache/ServiceCache.class | Bin 3168 -> 0 bytes .../circuitbreaker/CircuitBreaker$1.class | Bin 889 -> 0 bytes .../circuitbreaker/CircuitBreaker.class | Bin 3249 -> 0 bytes .../CircuitBreakerProvider.class | Bin 2116 -> 0 bytes .../circuitbreaker/CircuitBreakerState.class | Bin 1229 -> 0 bytes .../client/netty/NettyClientHandler.class | Bin 2135 -> 0 bytes .../client/netty/NettyClientInitializer.class | Bin 2184 -> 0 bytes .../com/kama/client/proxy/ClientProxy.class | Bin 4534 -> 0 bytes .../com/kama/client/retry/GuavaRetry$1.class | Bin 1343 -> 0 bytes .../com/kama/client/retry/GuavaRetry.class | Bin 4250 -> 0 bytes .../com/kama/client/rpcclient/RpcClient.class | Bin 207 -> 0 bytes .../rpcclient/impl/NettyRpcClient.class | Bin 4718 -> 0 bytes .../impl/SimpleSocketRpcClient.class | Bin 2938 -> 0 bytes .../client/servicecenter/ServiceCenter.class | Bin 260 -> 0 bytes .../servicecenter/ZKServiceCenter.class | Bin 5446 -> 0 bytes .../servicecenter/ZKWatcher/watchZK$1.class | Bin 3154 -> 0 bytes .../servicecenter/ZKWatcher/watchZK.class | Bin 2426 -> 0 bytes .../servicecenter/balance/LoadBalance.class | Bin 337 -> 0 bytes .../balance/impl/ConsistencyHashBalance.class | Bin 5355 -> 0 bytes .../balance/impl/RandomLoadBalance.class | Bin 2176 -> 0 bytes .../balance/impl/RoundLoadBalance.class | Bin 2805 -> 0 bytes .../config/KRpcConfig$KRpcConfigBuilder.class | Bin 2349 -> 0 bytes .../classes/com/kama/config/KRpcConfig.class | Bin 3648 -> 0 bytes .../classes/com/kama/config/RpcConstant.class | Bin 255 -> 0 bytes .../server/netty/NettyRpcServerHandler.class | Bin 4906 -> 0 bytes .../server/netty/NettyServerInitializer.class | Bin 1682 -> 0 bytes .../server/provider/ServiceProvider.class | Bin 2307 -> 0 bytes .../com/kama/server/ratelimit/RateLimit.class | Bin 150 -> 0 bytes .../impl/TokenBucketRateLimitImpl.class | Bin 1290 -> 0 bytes .../provider/RateLimitProvider.class | Bin 2264 -> 0 bytes .../com/kama/server/server/RpcServer.class | Bin 166 -> 0 bytes .../server/server/impl/NettyRpcServer.class | Bin 3723 -> 0 bytes .../server/server/impl/SimpleRpcServer.class | Bin 2608 -> 0 bytes .../kama/server/server/work/WorkThread.class | Bin 2959 -> 0 bytes .../serviceRegister/ServiceRegister.class | Bin 215 -> 0 bytes .../impl/ZKServiceRegister.class | Bin 4674 -> 0 bytes .../balance/ConsistencyHashBalanceTest.class | Bin 4410 -> 0 bytes .../test/balance/RandomLoadBalanceTest.class | Bin 2086 -> 0 bytes .../test/balance/RoundLoadBalanceTest.class | Bin 2529 -> 0 bytes .../serializer/HessianSerializerTest.class | Bin 1784 -> 0 bytes .../test/serializer/KryoSerializerTest.class | Bin 3493 -> 0 bytes .../serializer/ProtostuffSerializerTest.class | Bin 3525 -> 0 bytes .../target/krpc-core-1.0-SNAPSHOT.jar | Bin 78697 -> 0 bytes .../target/maven-archiver/pom.properties | 5 - .../compile/default-compile/createdFiles.lst | 55 ---- .../compile/default-compile/inputFiles.lst | 54 ---- version5/krpc-provider/pom.xml | 52 ---- .../java/com/kama/provider/ProviderTest.java | 35 --- .../kama/provider/impl/UserServiceImpl.java | 41 --- .../src/main/resources/application.properties | 7 - .../classes/META-INF/application.properties | 0 .../target/classes/application.properties | 7 - .../com/kama/provider/ProviderTest.class | Bin 1479 -> 0 bytes .../kama/provider/impl/UserServiceImpl.class | Bin 1930 -> 0 bytes .../target/krpc-provider-1.0-SNAPSHOT.jar | Bin 5129 -> 0 bytes .../target/maven-archiver/pom.properties | 5 - .../compile/default-compile/createdFiles.lst | 3 - .../compile/default-compile/inputFiles.lst | 3 - version5/pom.xml | 97 ------- 494 files changed, 1904 insertions(+), 11733 deletions(-) rename {version5/.idea => .idea}/.gitignore (100%) create mode 100644 .idea/RPC-Java-F.iml create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml create mode 100644 consumer/.gitattributes create mode 100644 consumer/.gitignore create mode 100644 consumer/.mvn/wrapper/maven-wrapper.properties create mode 100644 consumer/mvnw create mode 100644 consumer/mvnw.cmd create mode 100644 consumer/pom.xml create mode 100644 consumer/src/main/java/com/example/consumer/ConsumerApplication.java create mode 100644 consumer/src/main/java/com/example/consumer/web/controller/testController.java create mode 100644 consumer/src/main/resources/application.properties create mode 100644 provider/.gitattributes create mode 100644 provider/.gitignore create mode 100644 provider/.mvn/wrapper/maven-wrapper.properties create mode 100644 provider/mvnw create mode 100644 provider/mvnw.cmd create mode 100644 provider/pom.xml create mode 100644 provider/src/main/java/com/example/provider/ProviderApplication.java create mode 100644 provider/src/main/java/com/example/provider/web/service/impl/UserServiceImpl1.java create mode 100644 provider/src/main/java/com/example/provider/web/service/impl/UserServiceImpl2.java create mode 100644 provider/src/main/resources/application.properties rename {version1 => publicInterface}/pom.xml (50%) rename {version1/src/main/java/part3/common/pojo => publicInterface/src/main/java/com/publicInterface/dto}/User.java (90%) rename {version1/src/main/java/part2/common => publicInterface/src/main/java/com/publicInterface}/service/UserService.java (76%) create mode 100644 publicInterface/target/classes/com/publicInterface/dto/User$UserBuilder.class create mode 100644 publicInterface/target/classes/com/publicInterface/dto/User.class create mode 100644 publicInterface/target/classes/com/publicInterface/service/UserService.class create mode 100644 publicInterface/target/maven-archiver/pom.properties create mode 100644 publicInterface/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 publicInterface/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 publicInterface/target/publicInterface-1.0-SNAPSHOT.jar delete mode 100644 version1/src/main/java/part1/Client/IOClient.java delete mode 100644 version1/src/main/java/part1/Client/TestClient.java delete mode 100644 version1/src/main/java/part1/Client/proxy/ClientProxy.java delete mode 100644 version1/src/main/java/part1/Server/TestServer.java delete mode 100644 version1/src/main/java/part1/Server/provider/ServiceProvider.java delete mode 100644 version1/src/main/java/part1/Server/server/RpcServer.java delete mode 100644 version1/src/main/java/part1/Server/server/impl/SimpleRPCRPCServer.java delete mode 100644 version1/src/main/java/part1/Server/server/impl/ThreadPoolRPCRPCServer.java delete mode 100644 version1/src/main/java/part1/Server/server/work/WorkThread.java delete mode 100644 version1/src/main/java/part1/common/Message/RpcRequest.java delete mode 100644 version1/src/main/java/part1/common/Message/RpcResponse.java delete mode 100644 version1/src/main/java/part1/common/pojo/User.java delete mode 100644 version1/src/main/java/part1/common/service/Impl/UserServiceImpl.java delete mode 100644 version1/src/main/java/part1/common/service/UserService.java delete mode 100644 version1/src/main/java/part2/Client/IOClient.java delete mode 100644 version1/src/main/java/part2/Client/TestClient.java delete mode 100644 version1/src/main/java/part2/Client/netty/handler/NettyClientHandler.java delete mode 100644 version1/src/main/java/part2/Client/netty/nettyInitializer/NettyClientInitializer.java delete mode 100644 version1/src/main/java/part2/Client/proxy/ClientProxy.java delete mode 100644 version1/src/main/java/part2/Client/rpcClient/RpcClient.java delete mode 100644 version1/src/main/java/part2/Client/rpcClient/impl/NettyRpcClient.java delete mode 100644 version1/src/main/java/part2/Client/rpcClient/impl/SimpleSocketRpcCilent.java delete mode 100644 version1/src/main/java/part2/Server/TestServer.java delete mode 100644 version1/src/main/java/part2/Server/netty/handler/NettyRPCServerHandler.java delete mode 100644 version1/src/main/java/part2/Server/netty/nettyInitializer/NettyServerInitializer.java delete mode 100644 version1/src/main/java/part2/Server/provider/ServiceProvider.java delete mode 100644 version1/src/main/java/part2/Server/server/RpcServer.java delete mode 100644 version1/src/main/java/part2/Server/server/impl/NettyRPCRPCServer.java delete mode 100644 version1/src/main/java/part2/Server/server/impl/SimpleRPCRPCServer.java delete mode 100644 version1/src/main/java/part2/Server/server/impl/ThreadPoolRPCRPCServer.java delete mode 100644 version1/src/main/java/part2/Server/server/work/WorkThread.java delete mode 100644 version1/src/main/java/part2/common/Message/RpcRequest.java delete mode 100644 version1/src/main/java/part2/common/Message/RpcResponse.java delete mode 100644 version1/src/main/java/part2/common/pojo/User.java delete mode 100644 version1/src/main/java/part2/common/service/Impl/UserServiceImpl.java delete mode 100644 version1/src/main/java/part3/Client/TestClient.java delete mode 100644 version1/src/main/java/part3/Client/netty/handler/NettyClientHandler.java delete mode 100644 version1/src/main/java/part3/Client/netty/nettyInitializer/NettyClientInitializer.java delete mode 100644 version1/src/main/java/part3/Client/proxy/ClientProxy.java delete mode 100644 version1/src/main/java/part3/Client/rpcClient/RpcClient.java delete mode 100644 version1/src/main/java/part3/Client/rpcClient/impl/NettyRpcClient.java delete mode 100644 version1/src/main/java/part3/Client/rpcClient/impl/SimpleSocketRpcCilent.java delete mode 100644 version1/src/main/java/part3/Client/serviceCenter/ServiceCenter.java delete mode 100644 version1/src/main/java/part3/Client/serviceCenter/ZKServiceCenter.java delete mode 100644 version1/src/main/java/part3/Server/TestServer.java delete mode 100644 version1/src/main/java/part3/Server/netty/handler/NettyRPCServerHandler.java delete mode 100644 version1/src/main/java/part3/Server/netty/nettyInitializer/NettyServerInitializer.java delete mode 100644 version1/src/main/java/part3/Server/provider/ServiceProvider.java delete mode 100644 version1/src/main/java/part3/Server/server/RpcServer.java delete mode 100644 version1/src/main/java/part3/Server/server/impl/NettyRPCRPCServer.java delete mode 100644 version1/src/main/java/part3/Server/server/impl/SimpleRPCRPCServer.java delete mode 100644 version1/src/main/java/part3/Server/server/work/WorkThread.java delete mode 100644 version1/src/main/java/part3/Server/serviceRegister/ServiceRegister.java delete mode 100644 version1/src/main/java/part3/Server/serviceRegister/impl/ZKServiceRegister.java delete mode 100644 version1/src/main/java/part3/common/Message/RpcRequest.java delete mode 100644 version1/src/main/java/part3/common/Message/RpcResponse.java delete mode 100644 version1/src/main/java/part3/common/service/Impl/UserServiceImpl.java delete mode 100644 version1/src/main/java/part3/common/service/UserService.java delete mode 100644 version1/target/classes/log4j.properties delete mode 100644 version1/target/classes/part1/Client/IOClient.class delete mode 100644 version1/target/classes/part1/Client/TestClient.class delete mode 100644 version1/target/classes/part1/Client/proxy/ClientProxy.class delete mode 100644 version1/target/classes/part1/Server/TestServer.class delete mode 100644 version1/target/classes/part1/Server/provider/ServiceProvider.class delete mode 100644 version1/target/classes/part1/Server/server/RpcServer.class delete mode 100644 version1/target/classes/part1/Server/server/impl/SimpleRPCRPCServer.class delete mode 100644 version1/target/classes/part1/Server/server/impl/ThreadPoolRPCRPCServer.class delete mode 100644 version1/target/classes/part1/Server/server/work/WorkThread.class delete mode 100644 version1/target/classes/part1/common/Message/RpcRequest$RpcRequestBuilder.class delete mode 100644 version1/target/classes/part1/common/Message/RpcRequest.class delete mode 100644 version1/target/classes/part1/common/Message/RpcResponse$RpcResponseBuilder.class delete mode 100644 version1/target/classes/part1/common/Message/RpcResponse.class delete mode 100644 version1/target/classes/part1/common/pojo/User$UserBuilder.class delete mode 100644 version1/target/classes/part1/common/pojo/User.class delete mode 100644 version1/target/classes/part1/common/service/Impl/UserServiceImpl.class delete mode 100644 version1/target/classes/part1/common/service/UserService.class delete mode 100644 version1/target/classes/part2/Client/IOClient.class delete mode 100644 version1/target/classes/part2/Client/TestClient.class delete mode 100644 version1/target/classes/part2/Client/netty/handler/NettyClientHandler.class delete mode 100644 version1/target/classes/part2/Client/netty/nettyInitializer/NettyClientInitializer$1.class delete mode 100644 version1/target/classes/part2/Client/netty/nettyInitializer/NettyClientInitializer.class delete mode 100644 version1/target/classes/part2/Client/proxy/ClientProxy.class delete mode 100644 version1/target/classes/part2/Client/rpcClient/RpcClient.class delete mode 100644 version1/target/classes/part2/Client/rpcClient/impl/NettyRpcClient.class delete mode 100644 version1/target/classes/part2/Client/rpcClient/impl/SimpleSocketRpcCilent.class delete mode 100644 version1/target/classes/part2/Server/TestServer.class delete mode 100644 version1/target/classes/part2/Server/netty/handler/NettyRPCServerHandler.class delete mode 100644 version1/target/classes/part2/Server/netty/nettyInitializer/NettyServerInitializer$1.class delete mode 100644 version1/target/classes/part2/Server/netty/nettyInitializer/NettyServerInitializer.class delete mode 100644 version1/target/classes/part2/Server/provider/ServiceProvider.class delete mode 100644 version1/target/classes/part2/Server/server/RpcServer.class delete mode 100644 version1/target/classes/part2/Server/server/impl/NettyRPCRPCServer.class delete mode 100644 version1/target/classes/part2/Server/server/impl/SimpleRPCRPCServer.class delete mode 100644 version1/target/classes/part2/Server/server/impl/ThreadPoolRPCRPCServer.class delete mode 100644 version1/target/classes/part2/Server/server/work/WorkThread.class delete mode 100644 version1/target/classes/part2/common/Message/RpcRequest$RpcRequestBuilder.class delete mode 100644 version1/target/classes/part2/common/Message/RpcRequest.class delete mode 100644 version1/target/classes/part2/common/Message/RpcResponse$RpcResponseBuilder.class delete mode 100644 version1/target/classes/part2/common/Message/RpcResponse.class delete mode 100644 version1/target/classes/part2/common/pojo/User$UserBuilder.class delete mode 100644 version1/target/classes/part2/common/pojo/User.class delete mode 100644 version1/target/classes/part2/common/service/Impl/UserServiceImpl.class delete mode 100644 version1/target/classes/part2/common/service/UserService.class delete mode 100644 version1/target/classes/part3/Client/TestClient.class delete mode 100644 version1/target/classes/part3/Client/netty/handler/NettyClientHandler.class delete mode 100644 version1/target/classes/part3/Client/netty/nettyInitializer/NettyClientInitializer$1.class delete mode 100644 version1/target/classes/part3/Client/netty/nettyInitializer/NettyClientInitializer.class delete mode 100644 version1/target/classes/part3/Client/proxy/ClientProxy.class delete mode 100644 version1/target/classes/part3/Client/rpcClient/RpcClient.class delete mode 100644 version1/target/classes/part3/Client/rpcClient/impl/NettyRpcClient.class delete mode 100644 version1/target/classes/part3/Client/rpcClient/impl/SimpleSocketRpcCilent.class delete mode 100644 version1/target/classes/part3/Client/serviceCenter/ServiceCenter.class delete mode 100644 version1/target/classes/part3/Client/serviceCenter/ZKServiceCenter.class delete mode 100644 version1/target/classes/part3/Server/TestServer.class delete mode 100644 version1/target/classes/part3/Server/netty/handler/NettyRPCServerHandler.class delete mode 100644 version1/target/classes/part3/Server/netty/nettyInitializer/NettyServerInitializer$1.class delete mode 100644 version1/target/classes/part3/Server/netty/nettyInitializer/NettyServerInitializer.class delete mode 100644 version1/target/classes/part3/Server/provider/ServiceProvider.class delete mode 100644 version1/target/classes/part3/Server/server/RpcServer.class delete mode 100644 version1/target/classes/part3/Server/server/impl/NettyRPCRPCServer.class delete mode 100644 version1/target/classes/part3/Server/server/impl/SimpleRPCRPCServer.class delete mode 100644 version1/target/classes/part3/Server/server/work/WorkThread.class delete mode 100644 version1/target/classes/part3/Server/serviceRegister/ServiceRegister.class delete mode 100644 version1/target/classes/part3/Server/serviceRegister/impl/ZKServiceRegister.class delete mode 100644 version1/target/classes/part3/common/Message/RpcRequest$RpcRequestBuilder.class delete mode 100644 version1/target/classes/part3/common/Message/RpcRequest.class delete mode 100644 version1/target/classes/part3/common/Message/RpcResponse$RpcResponseBuilder.class delete mode 100644 version1/target/classes/part3/common/Message/RpcResponse.class delete mode 100644 version1/target/classes/part3/common/pojo/User$UserBuilder.class delete mode 100644 version1/target/classes/part3/common/pojo/User.class delete mode 100644 version1/target/classes/part3/common/service/Impl/UserServiceImpl.class delete mode 100644 version1/target/classes/part3/common/service/UserService.class delete mode 100644 version2/pom.xml delete mode 100644 version2/src/main/java/part1/Client/TestClient.java delete mode 100644 version2/src/main/java/part1/Client/netty/handler/NettyClientHandler.java delete mode 100644 version2/src/main/java/part1/Client/netty/nettyInitializer/NettyClientInitializer.java delete mode 100644 version2/src/main/java/part1/Client/proxy/ClientProxy.java delete mode 100644 version2/src/main/java/part1/Client/rpcClient/RpcClient.java delete mode 100644 version2/src/main/java/part1/Client/rpcClient/impl/NettyRpcClient.java delete mode 100644 version2/src/main/java/part1/Client/rpcClient/impl/SimpleSocketRpcCilent.java delete mode 100644 version2/src/main/java/part1/Client/serviceCenter/ServiceCenter.java delete mode 100644 version2/src/main/java/part1/Client/serviceCenter/ZKServiceCenter.java delete mode 100644 version2/src/main/java/part1/Server/TestServer.java delete mode 100644 version2/src/main/java/part1/Server/netty/handler/NettyRPCServerHandler.java delete mode 100644 version2/src/main/java/part1/Server/netty/nettyInitializer/NettyServerInitializer.java delete mode 100644 version2/src/main/java/part1/Server/provider/ServiceProvider.java delete mode 100644 version2/src/main/java/part1/Server/server/RpcServer.java delete mode 100644 version2/src/main/java/part1/Server/server/impl/NettyRPCRPCServer.java delete mode 100644 version2/src/main/java/part1/Server/server/impl/SimpleRPCRPCServer.java delete mode 100644 version2/src/main/java/part1/Server/server/work/WorkThread.java delete mode 100644 version2/src/main/java/part1/Server/serviceRegister/ServiceRegister.java delete mode 100644 version2/src/main/java/part1/Server/serviceRegister/impl/ZKServiceRegister.java delete mode 100644 version2/src/main/java/part1/common/Message/MessageType.java delete mode 100644 version2/src/main/java/part1/common/Message/RpcRequest.java delete mode 100644 version2/src/main/java/part1/common/Message/RpcResponse.java delete mode 100644 version2/src/main/java/part1/common/pojo/User.java delete mode 100644 version2/src/main/java/part1/common/serializer/myCode/MyDecoder.java delete mode 100644 version2/src/main/java/part1/common/serializer/myCode/MyEncoder.java delete mode 100644 version2/src/main/java/part1/common/serializer/mySerializer/JsonSerializer.java delete mode 100644 version2/src/main/java/part1/common/serializer/mySerializer/ObjectSerializer.java delete mode 100644 version2/src/main/java/part1/common/serializer/mySerializer/Serializer.java delete mode 100644 version2/src/main/java/part1/common/service/Impl/UserServiceImpl.java delete mode 100644 version2/src/main/java/part1/common/service/UserService.java delete mode 100644 version2/src/main/java/part2/Client/TestClient.java delete mode 100644 version2/src/main/java/part2/Client/cache/serviceCache.java delete mode 100644 version2/src/main/java/part2/Client/netty/handler/NettyClientHandler.java delete mode 100644 version2/src/main/java/part2/Client/netty/nettyInitializer/NettyClientInitializer.java delete mode 100644 version2/src/main/java/part2/Client/proxy/ClientProxy.java delete mode 100644 version2/src/main/java/part2/Client/rpcClient/RpcClient.java delete mode 100644 version2/src/main/java/part2/Client/rpcClient/impl/NettyRpcClient.java delete mode 100644 version2/src/main/java/part2/Client/rpcClient/impl/SimpleSocketRpcCilent.java delete mode 100644 version2/src/main/java/part2/Client/serviceCenter/ServiceCenter.java delete mode 100644 version2/src/main/java/part2/Client/serviceCenter/ZKServiceCenter.java delete mode 100644 version2/src/main/java/part2/Client/serviceCenter/ZkWatcher/watchZK.java delete mode 100644 version2/src/main/java/part2/Server/TestServer.java delete mode 100644 version2/src/main/java/part2/Server/netty/handler/NettyRPCServerHandler.java delete mode 100644 version2/src/main/java/part2/Server/netty/nettyInitializer/NettyServerInitializer.java delete mode 100644 version2/src/main/java/part2/Server/provider/ServiceProvider.java delete mode 100644 version2/src/main/java/part2/Server/server/RpcServer.java delete mode 100644 version2/src/main/java/part2/Server/server/impl/NettyRPCRPCServer.java delete mode 100644 version2/src/main/java/part2/Server/server/impl/SimpleRPCRPCServer.java delete mode 100644 version2/src/main/java/part2/Server/server/work/WorkThread.java delete mode 100644 version2/src/main/java/part2/Server/serviceRegister/ServiceRegister.java delete mode 100644 version2/src/main/java/part2/Server/serviceRegister/impl/ZKServiceRegister.java delete mode 100644 version2/src/main/java/part2/common/Message/MessageType.java delete mode 100644 version2/src/main/java/part2/common/Message/RpcRequest.java delete mode 100644 version2/src/main/java/part2/common/Message/RpcResponse.java delete mode 100644 version2/src/main/java/part2/common/pojo/User.java delete mode 100644 version2/src/main/java/part2/common/serializer/myCode/MyDecoder.java delete mode 100644 version2/src/main/java/part2/common/serializer/myCode/MyEncoder.java delete mode 100644 version2/src/main/java/part2/common/serializer/mySerializer/JsonSerializer.java delete mode 100644 version2/src/main/java/part2/common/serializer/mySerializer/ObjectSerializer.java delete mode 100644 version2/src/main/java/part2/common/serializer/mySerializer/Serializer.java delete mode 100644 version2/src/main/java/part2/common/service/Impl/UserServiceImpl.java delete mode 100644 version2/src/main/java/part2/common/service/UserService.java delete mode 100644 version2/src/main/resources/log4j.properties delete mode 100644 version3/pom.xml delete mode 100644 version3/src/main/java/part1/Client/TestClient.java delete mode 100644 version3/src/main/java/part1/Client/cache/serviceCache.java delete mode 100644 version3/src/main/java/part1/Client/netty/handler/NettyClientHandler.java delete mode 100644 version3/src/main/java/part1/Client/netty/nettyInitializer/NettyClientInitializer.java delete mode 100644 version3/src/main/java/part1/Client/proxy/ClientProxy.java delete mode 100644 version3/src/main/java/part1/Client/rpcClient/RpcClient.java delete mode 100644 version3/src/main/java/part1/Client/rpcClient/impl/NettyRpcClient.java delete mode 100644 version3/src/main/java/part1/Client/rpcClient/impl/SimpleSocketRpcCilent.java delete mode 100644 version3/src/main/java/part1/Client/serviceCenter/ServiceCenter.java delete mode 100644 version3/src/main/java/part1/Client/serviceCenter/ZKServiceCenter.java delete mode 100644 version3/src/main/java/part1/Client/serviceCenter/ZkWatcher/watchZK.java delete mode 100644 version3/src/main/java/part1/Client/serviceCenter/balance/LoadBalance.java delete mode 100644 version3/src/main/java/part1/Client/serviceCenter/balance/impl/ConsistencyHashBalance.java delete mode 100644 version3/src/main/java/part1/Client/serviceCenter/balance/impl/RandomLoadBalance.java delete mode 100644 version3/src/main/java/part1/Client/serviceCenter/balance/impl/RoundLoadBalance.java delete mode 100644 version3/src/main/java/part1/Server/TestServer.java delete mode 100644 version3/src/main/java/part1/Server/netty/handler/NettyRPCServerHandler.java delete mode 100644 version3/src/main/java/part1/Server/netty/nettyInitializer/NettyServerInitializer.java delete mode 100644 version3/src/main/java/part1/Server/provider/ServiceProvider.java delete mode 100644 version3/src/main/java/part1/Server/server/RpcServer.java delete mode 100644 version3/src/main/java/part1/Server/server/impl/NettyRPCRPCServer.java delete mode 100644 version3/src/main/java/part1/Server/server/impl/SimpleRPCRPCServer.java delete mode 100644 version3/src/main/java/part1/Server/server/work/WorkThread.java delete mode 100644 version3/src/main/java/part1/Server/serviceRegister/ServiceRegister.java delete mode 100644 version3/src/main/java/part1/Server/serviceRegister/impl/ZKServiceRegister.java delete mode 100644 version3/src/main/java/part1/common/Message/MessageType.java delete mode 100644 version3/src/main/java/part1/common/Message/RpcRequest.java delete mode 100644 version3/src/main/java/part1/common/Message/RpcResponse.java delete mode 100644 version3/src/main/java/part1/common/pojo/User.java delete mode 100644 version3/src/main/java/part1/common/serializer/myCode/MyDecoder.java delete mode 100644 version3/src/main/java/part1/common/serializer/myCode/MyEncoder.java delete mode 100644 version3/src/main/java/part1/common/serializer/mySerializer/JsonSerializer.java delete mode 100644 version3/src/main/java/part1/common/serializer/mySerializer/ObjectSerializer.java delete mode 100644 version3/src/main/java/part1/common/serializer/mySerializer/Serializer.java delete mode 100644 version3/src/main/java/part1/common/service/Impl/UserServiceImpl.java delete mode 100644 version3/src/main/java/part1/common/service/UserService.java delete mode 100644 version3/src/main/java/part2/Client/TestClient.java delete mode 100644 version3/src/main/java/part2/Client/cache/serviceCache.java delete mode 100644 version3/src/main/java/part2/Client/netty/handler/NettyClientHandler.java delete mode 100644 version3/src/main/java/part2/Client/netty/nettyInitializer/NettyClientInitializer.java delete mode 100644 version3/src/main/java/part2/Client/proxy/ClientProxy.java delete mode 100644 version3/src/main/java/part2/Client/retry/guavaRetry.java delete mode 100644 version3/src/main/java/part2/Client/rpcClient/RpcClient.java delete mode 100644 version3/src/main/java/part2/Client/rpcClient/impl/NettyRpcClient.java delete mode 100644 version3/src/main/java/part2/Client/rpcClient/impl/SimpleSocketRpcCilent.java delete mode 100644 version3/src/main/java/part2/Client/serviceCenter/ServiceCenter.java delete mode 100644 version3/src/main/java/part2/Client/serviceCenter/ZKServiceCenter.java delete mode 100644 version3/src/main/java/part2/Client/serviceCenter/ZkWatcher/watchZK.java delete mode 100644 version3/src/main/java/part2/Client/serviceCenter/balance/LoadBalance.java delete mode 100644 version3/src/main/java/part2/Client/serviceCenter/balance/impl/ConsistencyHashBalance.java delete mode 100644 version3/src/main/java/part2/Client/serviceCenter/balance/impl/RandomLoadBalance.java delete mode 100644 version3/src/main/java/part2/Client/serviceCenter/balance/impl/RoundLoadBalance.java delete mode 100644 version3/src/main/java/part2/Server/TestServer.java delete mode 100644 version3/src/main/java/part2/Server/netty/handler/NettyRPCServerHandler.java delete mode 100644 version3/src/main/java/part2/Server/netty/nettyInitializer/NettyServerInitializer.java delete mode 100644 version3/src/main/java/part2/Server/provider/ServiceProvider.java delete mode 100644 version3/src/main/java/part2/Server/server/RpcServer.java delete mode 100644 version3/src/main/java/part2/Server/server/impl/NettyRPCRPCServer.java delete mode 100644 version3/src/main/java/part2/Server/server/impl/SimpleRPCRPCServer.java delete mode 100644 version3/src/main/java/part2/Server/server/work/WorkThread.java delete mode 100644 version3/src/main/java/part2/Server/serviceRegister/ServiceRegister.java delete mode 100644 version3/src/main/java/part2/Server/serviceRegister/impl/ZKServiceRegister.java delete mode 100644 version3/src/main/java/part2/common/Message/MessageType.java delete mode 100644 version3/src/main/java/part2/common/Message/RpcRequest.java delete mode 100644 version3/src/main/java/part2/common/Message/RpcResponse.java delete mode 100644 version3/src/main/java/part2/common/pojo/User.java delete mode 100644 version3/src/main/java/part2/common/serializer/myCode/MyDecoder.java delete mode 100644 version3/src/main/java/part2/common/serializer/myCode/MyEncoder.java delete mode 100644 version3/src/main/java/part2/common/serializer/mySerializer/JsonSerializer.java delete mode 100644 version3/src/main/java/part2/common/serializer/mySerializer/ObjectSerializer.java delete mode 100644 version3/src/main/java/part2/common/serializer/mySerializer/Serializer.java delete mode 100644 version3/src/main/java/part2/common/service/Impl/UserServiceImpl.java delete mode 100644 version3/src/main/java/part2/common/service/UserService.java delete mode 100644 version3/src/main/resources/log4j.properties create mode 100644 version4/src/main/java/part1/Server/integration/EnableConsumer.java create mode 100644 version4/src/main/java/part1/Server/integration/EnableProvider.java create mode 100644 version4/src/main/java/part1/Server/integration/References.java create mode 100644 version4/src/main/java/part1/Server/integration/RpcService.java create mode 100644 version4/src/main/java/part1/Server/integration/configuration/ConsumerPostProcessor.java create mode 100644 version4/src/main/java/part1/Server/integration/configuration/ProviderPostProcessor.java delete mode 100644 version4/src/main/java/part1/common/pojo/User.java delete mode 100644 version4/src/main/java/part1/common/service/Impl/UserServiceImpl.java delete mode 100644 version4/src/main/java/part1/common/service/UserService.java rename {version1/src/main/resources => version4/target/classes}/log4j.properties (100%) delete mode 100644 version5/.idea/compiler.xml delete mode 100644 version5/.idea/encodings.xml delete mode 100644 version5/.idea/inspectionProfiles/Project_Default.xml delete mode 100644 version5/.idea/jarRepositories.xml delete mode 100644 version5/.idea/misc.xml delete mode 100644 version5/.idea/uiDesigner.xml delete mode 100644 version5/.idea/vcs.xml delete mode 100644 version5/krpc-api/pom.xml delete mode 100644 version5/krpc-api/src/main/java/com/kama/pojo/User.java delete mode 100644 version5/krpc-api/src/main/java/com/kama/service/UserService.java delete mode 100644 version5/krpc-api/target/classes/com/kama/pojo/User$UserBuilder.class delete mode 100644 version5/krpc-api/target/classes/com/kama/pojo/User.class delete mode 100644 version5/krpc-api/target/classes/com/kama/service/UserService.class delete mode 100644 version5/krpc-api/target/krpc-api-1.0-SNAPSHOT.jar delete mode 100644 version5/krpc-api/target/maven-archiver/pom.properties delete mode 100644 version5/krpc-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 version5/krpc-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 version5/krpc-common/pom.xml delete mode 100644 version5/krpc-common/src/main/java/common/exception/SerializeException.java delete mode 100644 version5/krpc-common/src/main/java/common/message/MessageType.java delete mode 100644 version5/krpc-common/src/main/java/common/message/RpcRequest.java delete mode 100644 version5/krpc-common/src/main/java/common/message/RpcResponse.java delete mode 100644 version5/krpc-common/src/main/java/common/serializer/mycoder/MyDecoder.java delete mode 100644 version5/krpc-common/src/main/java/common/serializer/mycoder/MyEncoder.java delete mode 100644 version5/krpc-common/src/main/java/common/serializer/myserializer/HessianSerializer.java delete mode 100644 version5/krpc-common/src/main/java/common/serializer/myserializer/JsonSerializer.java delete mode 100644 version5/krpc-common/src/main/java/common/serializer/myserializer/KryoSerializer.java delete mode 100644 version5/krpc-common/src/main/java/common/serializer/myserializer/ObjectSerializer.java delete mode 100644 version5/krpc-common/src/main/java/common/serializer/myserializer/ProtostuffSerializer.java delete mode 100644 version5/krpc-common/src/main/java/common/serializer/myserializer/Serializer.java delete mode 100644 version5/krpc-common/src/main/java/common/spi/SpiLoader.java delete mode 100644 version5/krpc-common/src/main/java/common/util/ConfigUtil.java delete mode 100644 version5/krpc-common/target/classes/common/exception/SerializeException.class delete mode 100644 version5/krpc-common/target/classes/common/message/MessageType.class delete mode 100644 version5/krpc-common/target/classes/common/message/RpcRequest$RpcRequestBuilder.class delete mode 100644 version5/krpc-common/target/classes/common/message/RpcRequest.class delete mode 100644 version5/krpc-common/target/classes/common/message/RpcResponse$RpcResponseBuilder.class delete mode 100644 version5/krpc-common/target/classes/common/message/RpcResponse.class delete mode 100644 version5/krpc-common/target/classes/common/serializer/mycoder/MyDecoder.class delete mode 100644 version5/krpc-common/target/classes/common/serializer/mycoder/MyEncoder.class delete mode 100644 version5/krpc-common/target/classes/common/serializer/myserializer/HessianSerializer.class delete mode 100644 version5/krpc-common/target/classes/common/serializer/myserializer/JsonSerializer.class delete mode 100644 version5/krpc-common/target/classes/common/serializer/myserializer/KryoSerializer.class delete mode 100644 version5/krpc-common/target/classes/common/serializer/myserializer/ObjectSerializer.class delete mode 100644 version5/krpc-common/target/classes/common/serializer/myserializer/ProtostuffSerializer.class delete mode 100644 version5/krpc-common/target/classes/common/serializer/myserializer/Serializer.class delete mode 100644 version5/krpc-common/target/classes/common/spi/SpiLoader.class delete mode 100644 version5/krpc-common/target/classes/common/util/ConfigUtil.class delete mode 100644 version5/krpc-consumer/pom.xml delete mode 100644 version5/krpc-consumer/src/main/java/com/kama/consumer/ConsumerTest.java delete mode 100644 version5/krpc-consumer/src/main/java/com/kama/consumer/ConsumerTestConfig.java delete mode 100644 version5/krpc-consumer/src/main/resources/application.properties delete mode 100644 version5/krpc-consumer/target/classes/application.properties delete mode 100644 version5/krpc-consumer/target/classes/com/kama/consumer/ConsumerTest.class delete mode 100644 version5/krpc-consumer/target/classes/com/kama/consumer/ConsumerTestConfig.class delete mode 100644 version5/krpc-consumer/target/krpc-consumer-1.0-SNAPSHOT.jar delete mode 100644 version5/krpc-consumer/target/maven-archiver/pom.properties delete mode 100644 version5/krpc-consumer/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 version5/krpc-consumer/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 version5/krpc-core/pom.xml delete mode 100644 version5/krpc-core/src/main/java/com/kama/KRpcApplication.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/cache/ServiceCache.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/circuitbreaker/CircuitBreaker.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/circuitbreaker/CircuitBreakerProvider.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/netty/NettyClientHandler.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/netty/NettyClientInitializer.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/proxy/ClientProxy.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/retry/GuavaRetry.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/rpcclient/RpcClient.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/rpcclient/impl/NettyRpcClient.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/rpcclient/impl/SimpleSocketRpcClient.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/servicecenter/ServiceCenter.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/servicecenter/ZKServiceCenter.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/servicecenter/ZKWatcher/watchZK.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/servicecenter/balance/LoadBalance.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/servicecenter/balance/impl/ConsistencyHashBalance.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/servicecenter/balance/impl/RandomLoadBalance.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/client/servicecenter/balance/impl/RoundLoadBalance.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/config/KRpcConfig.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/config/RpcConstant.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/server/netty/NettyRpcServerHandler.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/server/netty/NettyServerInitializer.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/server/provider/ServiceProvider.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/server/ratelimit/RateLimit.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/server/ratelimit/impl/TokenBucketRateLimitImpl.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/server/ratelimit/provider/RateLimitProvider.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/server/server/RpcServer.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/server/server/impl/NettyRpcServer.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/server/server/impl/SimpleRpcServer.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/server/server/work/WorkThread.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/server/serviceRegister/ServiceRegister.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/server/serviceRegister/impl/ZKServiceRegister.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/test/balance/ConsistencyHashBalanceTest.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/test/balance/RandomLoadBalanceTest.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/test/balance/RoundLoadBalanceTest.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/test/serializer/HessianSerializerTest.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/test/serializer/KryoSerializerTest.java delete mode 100644 version5/krpc-core/src/main/java/com/kama/test/serializer/ProtostuffSerializerTest.java delete mode 100644 version5/krpc-core/src/main/resources/META-INF/serializer/com.kama.common.serializer.myserializer.Serializer delete mode 100644 version5/krpc-core/target/classes/META-INF/serializer/com.kama.common.serializer.myserializer.Serializer delete mode 100644 version5/krpc-core/target/classes/com/kama/KRpcApplication.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/cache/ServiceCache.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/circuitbreaker/CircuitBreaker$1.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/circuitbreaker/CircuitBreaker.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/circuitbreaker/CircuitBreakerProvider.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/circuitbreaker/CircuitBreakerState.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/netty/NettyClientHandler.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/netty/NettyClientInitializer.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/proxy/ClientProxy.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/retry/GuavaRetry$1.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/retry/GuavaRetry.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/rpcclient/RpcClient.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/rpcclient/impl/NettyRpcClient.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/rpcclient/impl/SimpleSocketRpcClient.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/servicecenter/ServiceCenter.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/servicecenter/ZKServiceCenter.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/servicecenter/ZKWatcher/watchZK$1.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/servicecenter/ZKWatcher/watchZK.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/servicecenter/balance/LoadBalance.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/servicecenter/balance/impl/ConsistencyHashBalance.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/servicecenter/balance/impl/RandomLoadBalance.class delete mode 100644 version5/krpc-core/target/classes/com/kama/client/servicecenter/balance/impl/RoundLoadBalance.class delete mode 100644 version5/krpc-core/target/classes/com/kama/config/KRpcConfig$KRpcConfigBuilder.class delete mode 100644 version5/krpc-core/target/classes/com/kama/config/KRpcConfig.class delete mode 100644 version5/krpc-core/target/classes/com/kama/config/RpcConstant.class delete mode 100644 version5/krpc-core/target/classes/com/kama/server/netty/NettyRpcServerHandler.class delete mode 100644 version5/krpc-core/target/classes/com/kama/server/netty/NettyServerInitializer.class delete mode 100644 version5/krpc-core/target/classes/com/kama/server/provider/ServiceProvider.class delete mode 100644 version5/krpc-core/target/classes/com/kama/server/ratelimit/RateLimit.class delete mode 100644 version5/krpc-core/target/classes/com/kama/server/ratelimit/impl/TokenBucketRateLimitImpl.class delete mode 100644 version5/krpc-core/target/classes/com/kama/server/ratelimit/provider/RateLimitProvider.class delete mode 100644 version5/krpc-core/target/classes/com/kama/server/server/RpcServer.class delete mode 100644 version5/krpc-core/target/classes/com/kama/server/server/impl/NettyRpcServer.class delete mode 100644 version5/krpc-core/target/classes/com/kama/server/server/impl/SimpleRpcServer.class delete mode 100644 version5/krpc-core/target/classes/com/kama/server/server/work/WorkThread.class delete mode 100644 version5/krpc-core/target/classes/com/kama/server/serviceRegister/ServiceRegister.class delete mode 100644 version5/krpc-core/target/classes/com/kama/server/serviceRegister/impl/ZKServiceRegister.class delete mode 100644 version5/krpc-core/target/classes/com/kama/test/balance/ConsistencyHashBalanceTest.class delete mode 100644 version5/krpc-core/target/classes/com/kama/test/balance/RandomLoadBalanceTest.class delete mode 100644 version5/krpc-core/target/classes/com/kama/test/balance/RoundLoadBalanceTest.class delete mode 100644 version5/krpc-core/target/classes/com/kama/test/serializer/HessianSerializerTest.class delete mode 100644 version5/krpc-core/target/classes/com/kama/test/serializer/KryoSerializerTest.class delete mode 100644 version5/krpc-core/target/classes/com/kama/test/serializer/ProtostuffSerializerTest.class delete mode 100644 version5/krpc-core/target/krpc-core-1.0-SNAPSHOT.jar delete mode 100644 version5/krpc-core/target/maven-archiver/pom.properties delete mode 100644 version5/krpc-core/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 version5/krpc-core/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 version5/krpc-provider/pom.xml delete mode 100644 version5/krpc-provider/src/main/java/com/kama/provider/ProviderTest.java delete mode 100644 version5/krpc-provider/src/main/java/com/kama/provider/impl/UserServiceImpl.java delete mode 100644 version5/krpc-provider/src/main/resources/application.properties delete mode 100644 version5/krpc-provider/target/classes/META-INF/application.properties delete mode 100644 version5/krpc-provider/target/classes/application.properties delete mode 100644 version5/krpc-provider/target/classes/com/kama/provider/ProviderTest.class delete mode 100644 version5/krpc-provider/target/classes/com/kama/provider/impl/UserServiceImpl.class delete mode 100644 version5/krpc-provider/target/krpc-provider-1.0-SNAPSHOT.jar delete mode 100644 version5/krpc-provider/target/maven-archiver/pom.properties delete mode 100644 version5/krpc-provider/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 version5/krpc-provider/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst delete mode 100644 version5/pom.xml diff --git a/version5/.idea/.gitignore b/.idea/.gitignore similarity index 100% rename from version5/.idea/.gitignore rename to .idea/.gitignore diff --git a/.idea/RPC-Java-F.iml b/.idea/RPC-Java-F.iml new file mode 100644 index 0000000..d6ebd48 --- /dev/null +++ b/.idea/RPC-Java-F.iml @@ -0,0 +1,9 @@ + + + + + + + + + \ No newline at end of file diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..12548f5 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..0cc3557 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..6f31448 --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..cfdc549 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..89ab409 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/consumer/.gitattributes b/consumer/.gitattributes new file mode 100644 index 0000000..3b41682 --- /dev/null +++ b/consumer/.gitattributes @@ -0,0 +1,2 @@ +/mvnw text eol=lf +*.cmd text eol=crlf diff --git a/consumer/.gitignore b/consumer/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/consumer/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/consumer/.mvn/wrapper/maven-wrapper.properties b/consumer/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..d58dfb7 --- /dev/null +++ b/consumer/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/consumer/mvnw b/consumer/mvnw new file mode 100644 index 0000000..19529dd --- /dev/null +++ b/consumer/mvnw @@ -0,0 +1,259 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/consumer/mvnw.cmd b/consumer/mvnw.cmd new file mode 100644 index 0000000..249bdf3 --- /dev/null +++ b/consumer/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/consumer/pom.xml b/consumer/pom.xml new file mode 100644 index 0000000..47ad3d7 --- /dev/null +++ b/consumer/pom.xml @@ -0,0 +1,95 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.RELEASE + + + com.example + consumer + 0.0.1-SNAPSHOT + consumer + consumer + + + + + + + + + + + + + + + 8 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.example + publicInterface + 1.0-SNAPSHOT + + + + org.example + version4 + 1.0-SNAPSHOT + compile + + + org.springframework.boot + spring-boot-starter-actuator + + + org.projectlombok + lombok + provided + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 8 + 8 + + + + + + diff --git a/consumer/src/main/java/com/example/consumer/ConsumerApplication.java b/consumer/src/main/java/com/example/consumer/ConsumerApplication.java new file mode 100644 index 0000000..b4a0459 --- /dev/null +++ b/consumer/src/main/java/com/example/consumer/ConsumerApplication.java @@ -0,0 +1,17 @@ +package com.example.consumer; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.ComponentScan; +import part1.Server.integration.EnableConsumer; + +@SpringBootApplication +@EnableConsumer +//@ComponentScan(basePackages = {"com.example.consumer.web.controller"}) +public class ConsumerApplication { + + public static void main(String[] args) { + SpringApplication.run(ConsumerApplication.class, args); + } + +} diff --git a/consumer/src/main/java/com/example/consumer/web/controller/testController.java b/consumer/src/main/java/com/example/consumer/web/controller/testController.java new file mode 100644 index 0000000..d64e1c0 --- /dev/null +++ b/consumer/src/main/java/com/example/consumer/web/controller/testController.java @@ -0,0 +1,44 @@ +package com.example.consumer.web.controller; + +import com.publicInterface.dto.User; +import com.publicInterface.service.UserService; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import part1.Server.integration.References; + +/** + * @Author: yty + * @Description: TODO + * @DateTime: 2024/11/08 15:53 + **/ +@RestController +@RequestMapping("/api/consumer/test") +public class testController { + + Logger log = LoggerFactory.getLogger(testController.class); + + @References(version = "1.2") + private UserService userService2; + + @References(version = "1.1") + private UserService userService1; + + @GetMapping(value = "/test1") + public User page1() { + User user = userService1.getUserByUserId(1); + log.info(user.toString()); + return user; + } + + @GetMapping(value = "/test2") + public User page2() { + User user = userService2.getUserByUserId(2); + log.info(user.toString()); + return user; + } +} diff --git a/consumer/src/main/resources/application.properties b/consumer/src/main/resources/application.properties new file mode 100644 index 0000000..d11eead --- /dev/null +++ b/consumer/src/main/resources/application.properties @@ -0,0 +1,3 @@ +spring.application.name=consumer +server.port=9091 +spring.web.resources.static-locations=[] diff --git a/provider/.gitattributes b/provider/.gitattributes new file mode 100644 index 0000000..3b41682 --- /dev/null +++ b/provider/.gitattributes @@ -0,0 +1,2 @@ +/mvnw text eol=lf +*.cmd text eol=crlf diff --git a/provider/.gitignore b/provider/.gitignore new file mode 100644 index 0000000..549e00a --- /dev/null +++ b/provider/.gitignore @@ -0,0 +1,33 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/**/target/ +!**/src/test/**/target/ + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ +!**/src/main/**/build/ +!**/src/test/**/build/ + +### VS Code ### +.vscode/ diff --git a/provider/.mvn/wrapper/maven-wrapper.properties b/provider/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..d58dfb7 --- /dev/null +++ b/provider/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +wrapperVersion=3.3.2 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip diff --git a/provider/mvnw b/provider/mvnw new file mode 100644 index 0000000..19529dd --- /dev/null +++ b/provider/mvnw @@ -0,0 +1,259 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.2 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/provider/mvnw.cmd b/provider/mvnw.cmd new file mode 100644 index 0000000..249bdf3 --- /dev/null +++ b/provider/mvnw.cmd @@ -0,0 +1,149 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.2 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' +$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain" +if ($env:MAVEN_USER_HOME) { + $MAVEN_HOME_PARENT = "$env:MAVEN_USER_HOME/wrapper/dists/$distributionUrlNameMain" +} +$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/provider/pom.xml b/provider/pom.xml new file mode 100644 index 0000000..2c7ba04 --- /dev/null +++ b/provider/pom.xml @@ -0,0 +1,74 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.RELEASE + + + com.example + provider + 0.0.1-SNAPSHOT + provider + provider + + + + + + + + + + + + + + + 8 + + + + org.springframework.boot + spring-boot-starter-web + + + + org.projectlombok + lombok + true + + + org.example + publicInterface + 1.0-SNAPSHOT + compile + + + org.example + version4 + 1.0-SNAPSHOT + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 8 + 8 + + + + + + diff --git a/provider/src/main/java/com/example/provider/ProviderApplication.java b/provider/src/main/java/com/example/provider/ProviderApplication.java new file mode 100644 index 0000000..c2d5a69 --- /dev/null +++ b/provider/src/main/java/com/example/provider/ProviderApplication.java @@ -0,0 +1,15 @@ +package com.example.provider; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import part1.Server.integration.EnableProvider; + +@SpringBootApplication +@EnableProvider +public class ProviderApplication { + + public static void main(String[] args) { + SpringApplication.run(ProviderApplication.class, args); + } + +} diff --git a/provider/src/main/java/com/example/provider/web/service/impl/UserServiceImpl1.java b/provider/src/main/java/com/example/provider/web/service/impl/UserServiceImpl1.java new file mode 100644 index 0000000..74a7c87 --- /dev/null +++ b/provider/src/main/java/com/example/provider/web/service/impl/UserServiceImpl1.java @@ -0,0 +1,31 @@ +package com.example.provider.web.service.impl; + +import com.publicInterface.service.UserService; +import com.publicInterface.dto.User; +import part1.Server.integration.RpcService; +import java.util.Random; +import java.util.UUID; + +/** + * @Author: yty + * @Description: TODO + * @DateTime: 2024/11/08 15:05 + **/ +@RpcService(version = "1.1") +public class UserServiceImpl1 implements UserService { + @Override + public User getUserByUserId(Integer id) { + System.out.println("实现方法1.1:客户端查询了"+id+"的用户"); + // 模拟从数据库中取用户的行为 + Random random = new Random(); + return User.builder().userName(UUID.randomUUID().toString()) + .id(id) + .sex(random.nextBoolean()).build(); + } + + @Override + public Integer insertUserId(User user) { + System.out.println("实现方法1.1:插入数据成功"+user.getUserName()); + return user.getId(); + } +} \ No newline at end of file diff --git a/provider/src/main/java/com/example/provider/web/service/impl/UserServiceImpl2.java b/provider/src/main/java/com/example/provider/web/service/impl/UserServiceImpl2.java new file mode 100644 index 0000000..4fcbdb0 --- /dev/null +++ b/provider/src/main/java/com/example/provider/web/service/impl/UserServiceImpl2.java @@ -0,0 +1,32 @@ +package com.example.provider.web.service.impl; + +import com.publicInterface.dto.User; +import com.publicInterface.service.UserService; +import part1.Server.integration.RpcService; + +import java.util.Random; +import java.util.UUID; + +/** + * @Author: yty + * @Description: TODO + * @DateTime: 2024/11/08 15:05 + **/ +@RpcService(version = "1.2") +public class UserServiceImpl2 implements UserService { + @Override + public User getUserByUserId(Integer id) { + System.out.println("实现方法1.2:客户端查询了"+id+"的用户"); + // 模拟从数据库中取用户的行为 + Random random = new Random(); + return User.builder().userName(UUID.randomUUID().toString()) + .id(id) + .sex(random.nextBoolean()).build(); + } + + @Override + public Integer insertUserId(User user) { + System.out.println("实现方法1.2:插入数据成功"+user.getUserName()); + return user.getId(); + } +} \ No newline at end of file diff --git a/provider/src/main/resources/application.properties b/provider/src/main/resources/application.properties new file mode 100644 index 0000000..1b4fe40 --- /dev/null +++ b/provider/src/main/resources/application.properties @@ -0,0 +1,3 @@ +spring.application.name=provider +server.port=9090 + diff --git a/version1/pom.xml b/publicInterface/pom.xml similarity index 50% rename from version1/pom.xml rename to publicInterface/pom.xml index 0761b8b..e443676 100644 --- a/version1/pom.xml +++ b/publicInterface/pom.xml @@ -5,8 +5,9 @@ 4.0.0 org.example - version1 + publicInterface 1.0-SNAPSHOT + 8 8 @@ -14,36 +15,29 @@ - org.projectlombok - lombok - 1.18.30 + org.example + version4 + 1.0-SNAPSHOT compile - org.slf4j - slf4j-log4j12 - 1.7.25 - - - org.apache.logging.log4j - log4j-1.2-api - 2.8.2 - - - - io.netty - netty-all - 4.1.51.Final + org.projectlombok + lombok + 1.18.34 compile - - - org.apache.curator - curator-recipes - 5.1.0 - - - - + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 8 + 8 + + + + \ No newline at end of file diff --git a/version1/src/main/java/part3/common/pojo/User.java b/publicInterface/src/main/java/com/publicInterface/dto/User.java similarity index 90% rename from version1/src/main/java/part3/common/pojo/User.java rename to publicInterface/src/main/java/com/publicInterface/dto/User.java index 46a0a87..09bf50a 100644 --- a/version1/src/main/java/part3/common/pojo/User.java +++ b/publicInterface/src/main/java/com/publicInterface/dto/User.java @@ -1,4 +1,5 @@ -package part3.common.pojo; +package com.publicInterface.dto; + import lombok.AllArgsConstructor; import lombok.Builder; @@ -8,7 +9,6 @@ import java.io.Serializable; /** - * @author wxx * @version 1.0 * @create 2024/1/28 17:50 */ diff --git a/version1/src/main/java/part2/common/service/UserService.java b/publicInterface/src/main/java/com/publicInterface/service/UserService.java similarity index 76% rename from version1/src/main/java/part2/common/service/UserService.java rename to publicInterface/src/main/java/com/publicInterface/service/UserService.java index b6817fe..cce6637 100644 --- a/version1/src/main/java/part2/common/service/UserService.java +++ b/publicInterface/src/main/java/com/publicInterface/service/UserService.java @@ -1,10 +1,9 @@ -package part2.common.service; +package com.publicInterface.service; -import part2.common.pojo.User; +import com.publicInterface.dto.User; /** - * @author wxx * @version 1.0 * @create 2024/1/28 16:27 */ diff --git a/publicInterface/target/classes/com/publicInterface/dto/User$UserBuilder.class b/publicInterface/target/classes/com/publicInterface/dto/User$UserBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..dfbd4a0f3a0b1b1fd2ada745216668bd0f74a82f GIT binary patch literal 1680 zcmb7EZBG+H5Pr6A*Ot>lsi1;d6tyjd^QFEP3PPeGX)qBb;fu+&U2*ZcN3M6opQQ;x zB8fl1A7z~7u5hJI10TAxJ2U&t?DNd^@4w%F093G&#u&;ejAC9b3u-YmJW3;u#~Plb zp`o0_Q)Me^d6vZUBwi%(Qk`CDc&(wz5D_hg@%pa0ZyJ^z3Va*x!tITyn>Bd5f+jy$*La%r;l?Gt5ob5psv((GLIK zTW;01EpAGRB^HGgZjF)(#Vv-|n%yFpOkGI6;k6sw`DjuP3fOL%)|TlAbq<^{_p6|$ zMm|yfRZmzg?l9=uvBl_ZDY@CSfZ(3>3lJp+-SMBp>EBFu2MJ4g;4)p zPKuX7sD%*%1}+8A(?XZ0OCiJ?iVB8&VfZzroNN0%GUOBwSS#{?#IT*nQD>0wl>D~k-1=Zl;QmpefZ2~rTPB^^tssb!gTF6X^q(w1m) z%6XbA+OVRI0*VZUVdcY0GmM^f@xHOkn=V5&tXx<7eo8`~Q*~%?6XxC?m&E#f80K^U z&dT|&;L#*OPrlzvwO@&DK4$2PAEW<*C?bk|kZ^QLkiAAWqQvO)kv8Xi3Cbk_DSw)F z21Oa!c`-Mp92W=xb4>jSZ z1W=Sb;2n(KF-v)>yB^T!g+cp?U^Jxn2Z6>e4BF2m!vj1FKx_0btSHMJBfecaAO;Q) zrC;m_iNRd>wB`oVN+TWMekQAME632bkC4o!4v|*)hZxD~{ys`3d&S?!l>aL250M#G aw=$q^6r~f@=6Xb)Azzw$7^N5Hk@^qkKV0Mh literal 0 HcmV?d00001 diff --git a/publicInterface/target/classes/com/publicInterface/dto/User.class b/publicInterface/target/classes/com/publicInterface/dto/User.class new file mode 100644 index 0000000000000000000000000000000000000000..756bf336a8e1ff94b6c26094e706a1accc481805 GIT binary patch literal 2984 zcma)8ZF3V<6n-|@x1?Jrp)W)#R;`*QEm5qBDXqK+7;OvE76lR6rc1k!?$%_3jQ@c@ z;17^5e9#$NW@N_EFF50G67e~^n`RR$z%cioJ@>iKJ@+~1p7gJOe*F!=H0lPHvQV&` zfsPd!F3a$RfiJV1ugGvUixGS!)-@Tvme1=3zR98=%O-BfY|F4}qGn>vgd<-!1-EQq z-N1%|zLloaINfsVYfeLfRrNflai(rJn@&?f%3V`%aQ>Ek$1c}xZ@pag0%zT6%qTEh z+_z|NItp?Lz*5j~y>+gqo6gzj+H6FNs-u0Zt*5<0yShiQ|^c=p_@&b3$sd{(Zrc2i;&+`L2aD9*0 z$j#UN%~k()`Mks1*@3f0E^XZjs=VG1L)hzrxp}{4*Du=*SB{9!QG*Sagh!qkG|Br& zE}=&P4R#%|E0IpnlBm=jLPsa98HG4p*dxM;%RGjF&M`wtSbU10bfUs@x_H{hgb3%` zmR;w?x+pHJ-g0We%*0g%ir<~)c!?_d!G;u$A;OGHxtO6RGDBxr2${$m+Wn!swJXoQ zXszSuUkdEn?FD-)RGlTyVkL3S_RdP2G&k(#MpO&w!bFu}T)b3WILkO`>kX&bss}8= zFbH)#3Shj$Zw7uO55Xr~&kg1XE{G5_NeSD--wyEdR_$P_8^g>L=O?#yRSof&F+Rw%-g_sBOHn%ymI%#b1z?ZK=ezAxzL? zMF130;#W5jv$6+~+DkP2Tq5Rp4Z{wYqsKQxf(Tk;Rq<`+Y+d#-P93kSn ziCiML(sRpWcy}*O^+h=)b-kR^cyBLG?L|4I40<{FS|U#6IOhy+e6Lje5t{m-^au1G zprs#_euus=S=@mUe$p@(CplEqsXx(|S0CfReOOa@bqAR?B3sc2$yW5dCK&xOa`(}n z*YbJ-)K@VG>Z_P}LqKK>GV*2{q&{Fk=|p)&DYzB|x|@P~IF1i_wISR^g(W8i>0*Yy zG%+=tprztG&S938#z%Y-bF_5S`651|WuU<{o}^{s6wfTdGR(iR&%o&?7&dT*|4roy z4n<}rX?A5^l};3ANkWop(nLzRN%Em2i%HwPiN^S4TlbS;4~r<3qnvdztqjbZP-nwb zj1J6fFcIcJ={}699auNSpRK5}kXPdsQ_>SH^;NWRiJ1vEnRzW-8r@s$x#+++#568Z z$WIuehKs1uN+FBS@F~Miv#}hbEn?5H9nI6yLOH*K{*(@taw-ZXgrYnpyz`wB#}KqO zpp8+xT`^2gz&glYFTp)JvUx{3;yP#PVbhP$&+fM`w|@r%BIgbcI(va{kJ zq`iZo-Ubt8GHQ9#u}t0h_U+(QAx-WiBQ>v zk}W$W@|*d5(qH-h*Z0nK&UxpW=ef`Oyz`vre(nQ>;1iGmaO1}L7_+}8|C~s%SA9)m zRj`hMmKgLOGZH`y){OEYRk%C$=Wy&n|Ern4s)3G{rjfCzzSf$4SEn8XEZR#60fV}` zURS}y`=us6dW-0Gw~Ii)Y9z$d`KCz>!i~KCbr@YKA6?%}(0%$?y)JMpst$7lMhAfz zHLArEMt3k5lQl#;7Nf{o1Dpa{sVRl(t%L?S&x)*5OzOu{qU!wX00+wh0HTgWL4aMJ zy{G%n0DiZ?1%R{gx?<-Bx7YFTb@Xs3r%L~$u-3g3RA3BM z1;^BbBQ{{=5xMBg>C&lD3CnE`L-BHtGWmwVD;3hJ+Po`xfr3-a58DeM_{x6WgFfH7 z)0Qx!${``UM9|h!X)UNOSGZYF*KD)wGH0CJDHi{v$WR#V%^H#UDIHqFME{f)pWV%- zMhO1N$S607*te&@$=0%$$u6X?zKC3Imsx2j4IE^UsR5s@{1Ej{w@zuRpj4h>uzuz51P??aoW8ZMvLtsJHqBl9F*RBp1^P%M^h=U9yL6zBxkmGL~{wzjhZ&0Y{{2i=os zNf~8$PVugQR(RA;-Je5lBRh1IANlr?z{b_rOl!}yU0go%3|P*-pH==j7uyT zxwBHnO-|#6I`4fiBj^HMA%b>6vc7oTk9d#7S^3!7E)W{4IA!f0ra%_{cTsdK`IQ(v}JN;S~k-HSX8 zRwG#u*0&W{&fYQ8wGE}1c;d1-3NPSBMoAW35rmfcpp zD>?g^>6CFT8|-w6@@lQ%T;*ICaPd(-EMTa#I4pP-qLyf6S&I5geCOC zhnDzFhjXkStE|GQ*vzUeUF&L0s?uGZUU7BiB&V>xH#Z%4>iS(a&ERnvV`}JPosz(3 ze{-27gO6dFwNm({suy2Io;02fuup2rCU;_dT0d(cks-@LlgUGzA&Yk^*!E2|Dys3_ zS%SDt_TC)rf@~9~V&w=?!x)Z2xhxL!hxL>4txJkdBG0zy<6*m>F-n+C3GSxt21of| zib>ewLlfYq!g3w-lOK}jM0I<~W$Vx^bUsPLnv5yXlUltb#XX>PTiY+2uN!*a$xxIN zIqh~Q)PXM+r4%{wRoBmEO)2P%O7FgUz?krD7F2*h71aC2uku>DUkdIdZRbls=Me-f zZ#0t6=1e3$bR{M~aXl)PwPoGP^p3iHz<{gF{99CpIp2$jGp(VttK~yeL@9`lMlL-T zfA;H?PeO%A6UBx+CZq!GCM>5Z1G|PKj46_!vR+g(e0nWaOA3COwKI#YPw-f4QFZEI zlXMq48N>CY!YD;pJ{%t+2x)K0xHe>->Q-Lq(rb@c;ApPRO&=akft(Zs&UGplei0S} zx-`wSPU)uy(Mf}V+|dL^=kTSUFOcdGB(Q14OpfI)@vO^eChV=Zq05xiCb?#5`u{F&0-566HHhj&Mlz;BuuGHi4o?q00FQ` z6*@7(0N~O&l`7seh8pM&Wrww$Hgl--DJ>1{dlI8CiZ%Q|ITE8_6FpH&HXkAm$|hs0 zlZnHe@jB&vElKf-dbbvXE0(3`QAJ-F`|o7)B4a|-EI}vza-t1k>mO;sRo>q`DLzgM zyx#+8oe@~#9*Ea|4dSyJz%)tB(K&F~$Q4cZXJzM@-ES$)>XXyH8CH!Mqe?&u=1gam zS_0`7Ef$sHrwG2adELA#L?-FhbqlN`aRtMx-%5ySQ-G5xP8wb0)Q?aXn>2bOEnOU2 zq}_)|r@kRBy=%SD=k-abRR&WKVi^zQ=%&2ZHj9Vx(LojJC zT2V8Xnc?ItlTNbRd|F-N>Jz~i4o)74WI4_;!0cqC?FfdE5IuM+k>_UjM^a1msu(XJ z_S@VRiQyeqB*0jho?S%L4rYf;G*9=^3AjZIW7q;u{}v1>cptso!o6(qW($pJ&l5|eb| zCDEy-5wvl))liKJ?PMcrOylsH-pd{pt$qAl(pfYe4MucdVfTdn;~XwosAy6Z@8KQv zJ^RHJ-6IUDz!p(XJOBWEOffy^HgGM2(SGN#Usr?TB&fnvs5SRE!*Zj?)Zim(XXVN1 z=;+9&@NAe#37(6PM_;H~2Aq2Nh?N{1Yt*%~^JH&k<;f`CJ@HkEbsB1Z=6U;Om!O)f z8MG;DmNdu;!6^{ku&z%lhzwb&bOVx+R9BrP{~|%N#MRcG#ujry>vMU+v(V)>pqkfR zb3Rn!ZN1b>%Z(+Sd}1Q{sk?J-V^Lq5^uHQCGbBqH;-O}HkFZb!irRQ^WFbfzHYEIi z#{PTf3dF|#vvYN~^>g(2r7b(!=Cb~7?CI?+>gaFl?&bDt7kJcB_}?9mYbQwnp4b-E ziJGB^72Doj#I|>m{|(5?(_Pfx-R-`y#LYf&rcvPy<$naFw!#{vIkLB&+MJIHO!kG=l8XgA-tpH8)T>$uc zzT^{rV-RnL^LcH$q)G^M1VZwUv^qHTHIOD$hLOj z)V8Skn-ex)Ij)#w>sHp&xLDGE3}xB=gd+0DJ{$SILiWB3a%cw9$GQd-+#Z%0Aih^J zD07YH{kU_A6YP0;GpFIkUP*+F1$d^v0dJ@A%Jc2bneEQGtqh7n_F?-y+^WRg=%iGh-(c2g9=tJ3|O4iIttp*h z6u;C^zxtglWFuJ0Mx~OOF*QVd5Fg(;PKe~RFQ?}H#1f+uWkc6!=eh<%tG_b^48|k| zTUc%XkjC7nhp^mMdNVZnF8EC(#_Z(}cgwP@mrqcqBV&yV8kC_Byc6{J$7@tZpBXbMdsmBj|x$o%-kP1 zkI&fYpGD{K2sqifKX3>v*dqTYgnbcuJPJ;R9-=^xK{=p_!#()3EIq)=4~;nn>3ETP z6#J+aIK)O^xBIwQaYVMyU`O$e(%~Uq1NPmT getProxy(Class clazz){ - Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this); - return (T)o; - } -} diff --git a/version1/src/main/java/part1/Server/TestServer.java b/version1/src/main/java/part1/Server/TestServer.java deleted file mode 100644 index 682b912..0000000 --- a/version1/src/main/java/part1/Server/TestServer.java +++ /dev/null @@ -1,25 +0,0 @@ -package part1.Server; - - -import part1.Server.server.RpcServer; -import part1.common.service.Impl.UserServiceImpl; -import part1.common.service.UserService; -import part1.Server.server.impl.SimpleRPCRPCServer; -import part1.Server.provider.ServiceProvider; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/11 19:39 - */ -public class TestServer { - public static void main(String[] args) { - UserService userService=new UserServiceImpl(); - - ServiceProvider serviceProvider=new ServiceProvider(); - serviceProvider.provideServiceInterface(userService); - - RpcServer rpcServer=new SimpleRPCRPCServer(serviceProvider); - rpcServer.start(9999); - } -} diff --git a/version1/src/main/java/part1/Server/provider/ServiceProvider.java b/version1/src/main/java/part1/Server/provider/ServiceProvider.java deleted file mode 100644 index 8864448..0000000 --- a/version1/src/main/java/part1/Server/provider/ServiceProvider.java +++ /dev/null @@ -1,34 +0,0 @@ -package part1.Server.provider; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/16 17:35 - */ -//本地服务存放器 -public class ServiceProvider { - //集合中存放服务的实例 - private Map interfaceProvider; - - public ServiceProvider(){ - this.interfaceProvider=new HashMap<>(); - } - //本地注册服务 - - public void provideServiceInterface(Object service){ - String serviceName=service.getClass().getName(); - Class[] interfaceName=service.getClass().getInterfaces(); - - for (Class clazz:interfaceName){ - interfaceProvider.put(clazz.getName(),service); - } - - } - //获取服务实例 - public Object getService(String interfaceName){ - return interfaceProvider.get(interfaceName); - } -} diff --git a/version1/src/main/java/part1/Server/server/RpcServer.java b/version1/src/main/java/part1/Server/server/RpcServer.java deleted file mode 100644 index 76df981..0000000 --- a/version1/src/main/java/part1/Server/server/RpcServer.java +++ /dev/null @@ -1,12 +0,0 @@ -package part1.Server.server; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/12 11:26 - */ -public interface RpcServer { - //开启监听 - void start(int port); - void stop(); -} diff --git a/version1/src/main/java/part1/Server/server/impl/SimpleRPCRPCServer.java b/version1/src/main/java/part1/Server/server/impl/SimpleRPCRPCServer.java deleted file mode 100644 index 09afdff..0000000 --- a/version1/src/main/java/part1/Server/server/impl/SimpleRPCRPCServer.java +++ /dev/null @@ -1,40 +0,0 @@ -package part1.Server.server.impl; - - -import lombok.AllArgsConstructor; -import part1.Server.server.RpcServer; -import part1.Server.server.work.WorkThread; -import part1.Server.provider.ServiceProvider; - -import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/12 11:37 - */ -@AllArgsConstructor -public class SimpleRPCRPCServer implements RpcServer { - private ServiceProvider serviceProvide; - @Override - public void start(int port) { - try { - ServerSocket serverSocket=new ServerSocket(port); - System.out.println("服务器启动了"); - while (true) { - //如果没有连接,会堵塞在这里 - Socket socket = serverSocket.accept(); - //有连接,创建一个新的线程执行处理 - new Thread(new WorkThread(socket,serviceProvide)).start(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void stop() { - } -} diff --git a/version1/src/main/java/part1/Server/server/impl/ThreadPoolRPCRPCServer.java b/version1/src/main/java/part1/Server/server/impl/ThreadPoolRPCRPCServer.java deleted file mode 100644 index 0d32e1f..0000000 --- a/version1/src/main/java/part1/Server/server/impl/ThreadPoolRPCRPCServer.java +++ /dev/null @@ -1,58 +0,0 @@ -package part1.Server.server.impl; - - -import part1.Server.server.RpcServer; -import part1.Server.server.work.WorkThread; -import part1.Server.provider.ServiceProvider; - -import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/19 15:30 - */ -public class ThreadPoolRPCRPCServer implements RpcServer { - private final ThreadPoolExecutor threadPool; - private ServiceProvider serviceProvider; - - public ThreadPoolRPCRPCServer(ServiceProvider serviceProvider){ - threadPool=new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), - 1000,60, TimeUnit.SECONDS,new ArrayBlockingQueue<>(100)); - this.serviceProvider= serviceProvider; - } - public ThreadPoolRPCRPCServer(ServiceProvider serviceProvider, int corePoolSize, - int maximumPoolSize, - long keepAliveTime, - TimeUnit unit, - BlockingQueue workQueue){ - - threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); - this.serviceProvider = serviceProvider; - } - - @Override - public void start(int port) { - System.out.println("服务端启动了"); - try { - ServerSocket serverSocket=new ServerSocket(); - while (true){ - Socket socket= serverSocket.accept(); - threadPool.execute(new WorkThread(socket,serviceProvider)); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void stop() { - - } -} diff --git a/version1/src/main/java/part1/Server/server/work/WorkThread.java b/version1/src/main/java/part1/Server/server/work/WorkThread.java deleted file mode 100644 index 064b9c2..0000000 --- a/version1/src/main/java/part1/Server/server/work/WorkThread.java +++ /dev/null @@ -1,58 +0,0 @@ -package part1.Server.server.work; - - -import lombok.AllArgsConstructor; -import part1.Server.provider.ServiceProvider; -import part1.common.Message.RpcRequest; -import part1.common.Message.RpcResponse; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/14 17:39 - */ -@AllArgsConstructor -public class WorkThread implements Runnable{ - private Socket socket; - private ServiceProvider serviceProvide; - @Override - public void run() { - try { - ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois=new ObjectInputStream(socket.getInputStream()); - //读取客户端传过来的request - RpcRequest rpcRequest = (RpcRequest) ois.readObject(); - //反射调用服务方法获取返回值 - RpcResponse rpcResponse=getResponse(rpcRequest); - //向客户端写入response - oos.writeObject(rpcResponse); - oos.flush(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - } - private RpcResponse getResponse(RpcRequest rpcRequest){ - //得到服务名 - String interfaceName=rpcRequest.getInterfaceName(); - //得到服务端相应服务实现类 - Object service = serviceProvide.getService(interfaceName); - //反射调用方法 - Method method=null; - try { - method= service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); - Object invoke=method.invoke(service,rpcRequest.getParams()); - return RpcResponse.sussess(invoke); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - System.out.println("方法执行错误"); - return RpcResponse.fail(); - } - } -} diff --git a/version1/src/main/java/part1/common/Message/RpcRequest.java b/version1/src/main/java/part1/common/Message/RpcRequest.java deleted file mode 100644 index 0d8f171..0000000 --- a/version1/src/main/java/part1/common/Message/RpcRequest.java +++ /dev/null @@ -1,25 +0,0 @@ -package part1.common.Message; - -import lombok.Builder; -import lombok.Data; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/1 18:30 - * 定义发送的消息格式 - */ -@Data -@Builder -public class RpcRequest implements Serializable { - //服务类名,客户端只知道接口 - private String interfaceName; - //调用的方法名 - private String methodName; - //参数列表 - private Object[] params; - //参数类型 - private Class[] paramsType; -} diff --git a/version1/src/main/java/part1/common/Message/RpcResponse.java b/version1/src/main/java/part1/common/Message/RpcResponse.java deleted file mode 100644 index 906ee1c..0000000 --- a/version1/src/main/java/part1/common/Message/RpcResponse.java +++ /dev/null @@ -1,30 +0,0 @@ -package part1.common.Message; - -import lombok.Builder; -import lombok.Data; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/1 19:18 - */ -@Data -@Builder -public class RpcResponse implements Serializable { - //状态信息 - private int code; - private String message; - //具体数据 - private Object data; - //构造成功信息 - public static RpcResponse sussess(Object data){ - return RpcResponse.builder().code(200).data(data).build(); - } - //构造失败信息 - public static RpcResponse fail(){ - return RpcResponse.builder().code(500).message("服务器发生错误").build(); - } -} - diff --git a/version1/src/main/java/part1/common/pojo/User.java b/version1/src/main/java/part1/common/pojo/User.java deleted file mode 100644 index d7cef8c..0000000 --- a/version1/src/main/java/part1/common/pojo/User.java +++ /dev/null @@ -1,25 +0,0 @@ -package part1.common.pojo; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 17:50 - */ -@Builder -@Data -@NoArgsConstructor -@AllArgsConstructor -public class User implements Serializable { - // 客户端和服务端共有的 - private Integer id; - private String userName; - private Boolean sex; -} - diff --git a/version1/src/main/java/part1/common/service/Impl/UserServiceImpl.java b/version1/src/main/java/part1/common/service/Impl/UserServiceImpl.java deleted file mode 100644 index 373243b..0000000 --- a/version1/src/main/java/part1/common/service/Impl/UserServiceImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package part1.common.service.Impl; - - -import part1.common.pojo.User; -import part1.common.service.UserService; - -import java.util.Random; -import java.util.UUID; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 16:28 - */ -public class UserServiceImpl implements UserService { - @Override - public User getUserByUserId(Integer id) { - System.out.println("客户端查询了"+id+"的用户"); - // 模拟从数据库中取用户的行为 - Random random = new Random(); - User user = User.builder().userName(UUID.randomUUID().toString()) - .id(id) - .sex(random.nextBoolean()).build(); - return user; - } - - @Override - public Integer insertUserId(User user) { - System.out.println("插入数据成功"+user.getUserName()); - return user.getId(); - } -} \ No newline at end of file diff --git a/version1/src/main/java/part1/common/service/UserService.java b/version1/src/main/java/part1/common/service/UserService.java deleted file mode 100644 index 0e539bd..0000000 --- a/version1/src/main/java/part1/common/service/UserService.java +++ /dev/null @@ -1,16 +0,0 @@ -package part1.common.service; - - -import part1.common.pojo.User; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 16:27 - */ -public interface UserService { - // 客户端通过这个接口调用服务端的实现类 - User getUserByUserId(Integer id); - //新增一个功能 - Integer insertUserId(User user); -} diff --git a/version1/src/main/java/part2/Client/IOClient.java b/version1/src/main/java/part2/Client/IOClient.java deleted file mode 100644 index 066736a..0000000 --- a/version1/src/main/java/part2/Client/IOClient.java +++ /dev/null @@ -1,36 +0,0 @@ -package part2.Client; - - - -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/4 18:31 - */ -public class IOClient { - //这里负责底层与服务端的通信,发送request,返回response - public static RpcResponse sendRequest(String host, int port, RpcRequest request){ - try { - Socket socket=new Socket(host, port); - ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois=new ObjectInputStream(socket.getInputStream()); - - oos.writeObject(request); - oos.flush(); - - RpcResponse response=(RpcResponse) ois.readObject(); - return response; - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/version1/src/main/java/part2/Client/TestClient.java b/version1/src/main/java/part2/Client/TestClient.java deleted file mode 100644 index 3ce5d38..0000000 --- a/version1/src/main/java/part2/Client/TestClient.java +++ /dev/null @@ -1,26 +0,0 @@ -package part2.Client; - - -import part2.Client.proxy.ClientProxy; -import part2.common.pojo.User; -import part2.common.service.UserService; - - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/6 18:39 - */ -public class TestClient { - public static void main(String[] args) { - ClientProxy clientProxy=new ClientProxy("127.0.0.1",9999,0); - UserService proxy=clientProxy.getProxy(UserService.class); - - User user = proxy.getUserByUserId(1); - System.out.println("从服务端得到的user="+user.toString()); - - User u=User.builder().id(100).userName("wxx").sex(true).build(); - Integer id = proxy.insertUserId(u); - System.out.println("向服务端插入user的id"+id); - } -} diff --git a/version1/src/main/java/part2/Client/netty/handler/NettyClientHandler.java b/version1/src/main/java/part2/Client/netty/handler/NettyClientHandler.java deleted file mode 100644 index 12d5693..0000000 --- a/version1/src/main/java/part2/Client/netty/handler/NettyClientHandler.java +++ /dev/null @@ -1,28 +0,0 @@ -package part2.Client.netty.handler; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.util.AttributeKey; -import part2.common.Message.RpcResponse; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 17:29 - */ -public class NettyClientHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, RpcResponse response) throws Exception { - // 接收到response, 给channel设计别名,让sendRequest里读取response - AttributeKey key = AttributeKey.valueOf("RPCResponse"); - ctx.channel().attr(key).set(response); - ctx.channel().close(); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - //异常处理 - cause.printStackTrace(); - ctx.close(); - } -} diff --git a/version1/src/main/java/part2/Client/netty/nettyInitializer/NettyClientInitializer.java b/version1/src/main/java/part2/Client/netty/nettyInitializer/NettyClientInitializer.java deleted file mode 100644 index 5bec33d..0000000 --- a/version1/src/main/java/part2/Client/netty/nettyInitializer/NettyClientInitializer.java +++ /dev/null @@ -1,43 +0,0 @@ -package part2.Client.netty.nettyInitializer; - - -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.handler.codec.LengthFieldPrepender; -import io.netty.handler.codec.serialization.ClassResolver; -import io.netty.handler.codec.serialization.ObjectDecoder; -import io.netty.handler.codec.serialization.ObjectEncoder; -import part2.Client.netty.handler.NettyClientHandler; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 17:26 - */ -public class NettyClientInitializer extends ChannelInitializer { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ChannelPipeline pipeline = ch.pipeline(); - //消息格式 【长度】【消息体】,解决沾包问题 - pipeline.addLast( - new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,0,4,0,4)); - //计算当前待发送消息的长度,写入到前4个字节中 - pipeline.addLast(new LengthFieldPrepender(4)); - //编码器 - //使用Java序列化方式,netty的自带的解码编码支持传输这种结构 - pipeline.addLast(new ObjectEncoder()); - //解码器 - //使用了Netty中的ObjectDecoder,它用于将字节流解码为 Java 对象。 - //在ObjectDecoder的构造函数中传入了一个ClassResolver 对象,用于解析类名并加载相应的类。 - pipeline.addLast(new ObjectDecoder(new ClassResolver() { - @Override - public Class resolve(String className) throws ClassNotFoundException { - return Class.forName(className); - } - })); - - pipeline.addLast(new NettyClientHandler()); - } -} diff --git a/version1/src/main/java/part2/Client/proxy/ClientProxy.java b/version1/src/main/java/part2/Client/proxy/ClientProxy.java deleted file mode 100644 index a6b5a4e..0000000 --- a/version1/src/main/java/part2/Client/proxy/ClientProxy.java +++ /dev/null @@ -1,53 +0,0 @@ -package part2.Client.proxy; - - -import lombok.AllArgsConstructor; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; -import part2.Client.IOClient; -import part2.Client.rpcClient.RpcClient; -import part2.Client.rpcClient.impl.NettyRpcClient; -import part2.Client.rpcClient.impl.SimpleSocketRpcCilent; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/6 16:49 - */ -public class ClientProxy implements InvocationHandler { - //传入参数service接口的class对象,反射封装成一个request - - private RpcClient rpcClient; - public ClientProxy(String host,int port,int choose){ - switch (choose){ - case 0: - rpcClient=new NettyRpcClient(host,port); - break; - case 1: - rpcClient=new SimpleSocketRpcCilent(host,port); - } - } - public ClientProxy(String host,int port){ - rpcClient=new NettyRpcClient(host,port); - } - //jdk动态代理,每一次代理对象调用方法,都会经过此方法增强(反射获取request对象,socket发送到服务端) - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - //构建request - RpcRequest request=RpcRequest.builder() - .interfaceName(method.getDeclaringClass().getName()) - .methodName(method.getName()) - .params(args).paramsType(method.getParameterTypes()).build(); - //数据传输 - RpcResponse response= rpcClient.sendRequest(request); - return response.getData(); - } - public T getProxy(Class clazz){ - Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this); - return (T)o; - } -} diff --git a/version1/src/main/java/part2/Client/rpcClient/RpcClient.java b/version1/src/main/java/part2/Client/rpcClient/RpcClient.java deleted file mode 100644 index 21690b1..0000000 --- a/version1/src/main/java/part2/Client/rpcClient/RpcClient.java +++ /dev/null @@ -1,15 +0,0 @@ -package part2.Client.rpcClient; - -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 18:55 - */ -public interface RpcClient { - - //定义底层通信的方法 - RpcResponse sendRequest(RpcRequest request); -} diff --git a/version1/src/main/java/part2/Client/rpcClient/impl/NettyRpcClient.java b/version1/src/main/java/part2/Client/rpcClient/impl/NettyRpcClient.java deleted file mode 100644 index b3dab27..0000000 --- a/version1/src/main/java/part2/Client/rpcClient/impl/NettyRpcClient.java +++ /dev/null @@ -1,62 +0,0 @@ -package part2.Client.rpcClient.impl; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.util.AttributeKey; -import part2.Client.netty.nettyInitializer.NettyClientInitializer; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; -import part2.Client.rpcClient.RpcClient; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 19:40 - */ -public class NettyRpcClient implements RpcClient { - private String host; - private int port; - private static final Bootstrap bootstrap; - private static final EventLoopGroup eventLoopGroup; - public NettyRpcClient(String host,int port){ - this.host=host; - this.port=port; - } - //netty客户端初始化 - static { - eventLoopGroup = new NioEventLoopGroup(); - bootstrap = new Bootstrap(); - bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) - //NettyClientInitializer这里 配置netty对消息的处理机制 - .handler(new NettyClientInitializer()); - } - @Override - public RpcResponse sendRequest(RpcRequest request) { - try { - //创建一个channelFuture对象,代表这一个操作事件,sync方法表示堵塞直到connect完成 - ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); - //channel表示一个连接的单位,类似socket - Channel channel = channelFuture.channel(); - // 发送数据 - channel.writeAndFlush(request); - //sync()堵塞获取结果 - channel.closeFuture().sync(); - // 阻塞的获得结果,通过给channel设计别名,获取特定名字下的channel中的内容(这个在hanlder中设置) - // AttributeKey是,线程隔离的,不会由线程安全问题。 - // 当前场景下选择堵塞获取结果 - // 其它场景也可以选择添加监听器的方式来异步获取结果 channelFuture.addListener... - AttributeKey key = AttributeKey.valueOf("RPCResponse"); - RpcResponse response = channel.attr(key).get(); - - System.out.println(response); - return response; - } catch (InterruptedException e) { - e.printStackTrace(); - } - return null; - } -} diff --git a/version1/src/main/java/part2/Client/rpcClient/impl/SimpleSocketRpcCilent.java b/version1/src/main/java/part2/Client/rpcClient/impl/SimpleSocketRpcCilent.java deleted file mode 100644 index 7e9f09c..0000000 --- a/version1/src/main/java/part2/Client/rpcClient/impl/SimpleSocketRpcCilent.java +++ /dev/null @@ -1,41 +0,0 @@ -package part2.Client.rpcClient.impl; - -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; -import part2.Client.rpcClient.RpcClient; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 18:58 - */ -public class SimpleSocketRpcCilent implements RpcClient { - private String host; - private int port; - public SimpleSocketRpcCilent(String host,int port){ - this.host=host; - this.port=port; - } - @Override - public RpcResponse sendRequest(RpcRequest request) { - try { - Socket socket=new Socket(host, port); - ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois=new ObjectInputStream(socket.getInputStream()); - - oos.writeObject(request); - oos.flush(); - - RpcResponse response=(RpcResponse) ois.readObject(); - return response; - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/version1/src/main/java/part2/Server/TestServer.java b/version1/src/main/java/part2/Server/TestServer.java deleted file mode 100644 index a055f3e..0000000 --- a/version1/src/main/java/part2/Server/TestServer.java +++ /dev/null @@ -1,26 +0,0 @@ -package part2.Server; - - -import part2.Server.server.impl.NettyRPCRPCServer; -import part2.common.service.Impl.UserServiceImpl; -import part2.common.service.UserService; -import part2.Server.provider.ServiceProvider; -import part2.Server.server.RpcServer; -import part2.Server.server.impl.SimpleRPCRPCServer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/11 19:39 - */ -public class TestServer { - public static void main(String[] args) { - UserService userService=new UserServiceImpl(); - - ServiceProvider serviceProvider=new ServiceProvider(); - serviceProvider.provideServiceInterface(userService); - - RpcServer rpcServer=new NettyRPCRPCServer(serviceProvider); - rpcServer.start(9999); - } -} diff --git a/version1/src/main/java/part2/Server/netty/handler/NettyRPCServerHandler.java b/version1/src/main/java/part2/Server/netty/handler/NettyRPCServerHandler.java deleted file mode 100644 index 14948cc..0000000 --- a/version1/src/main/java/part2/Server/netty/handler/NettyRPCServerHandler.java +++ /dev/null @@ -1,52 +0,0 @@ -package part2.Server.netty.handler; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import lombok.AllArgsConstructor; -import part2.Server.provider.ServiceProvider; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 16:40 - * 因为是服务器端,我们知道接受到请求格式是RPCRequest - * Object类型也行,强制转型就行 - */ -@AllArgsConstructor -public class NettyRPCServerHandler extends SimpleChannelInboundHandler { - private ServiceProvider serviceProvider; - @Override - protected void channelRead0(ChannelHandlerContext ctx, RpcRequest request) throws Exception { - //接收request,读取并调用服务 - RpcResponse response = getResponse(request); - ctx.writeAndFlush(response); - ctx.close(); - } - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } - private RpcResponse getResponse(RpcRequest rpcRequest){ - //得到服务名 - String interfaceName=rpcRequest.getInterfaceName(); - //得到服务端相应服务实现类 - Object service = serviceProvider.getService(interfaceName); - //反射调用方法 - Method method=null; - try { - method= service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); - Object invoke=method.invoke(service,rpcRequest.getParams()); - return RpcResponse.sussess(invoke); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - System.out.println("方法执行错误"); - return RpcResponse.fail(); - } - } -} diff --git a/version1/src/main/java/part2/Server/netty/nettyInitializer/NettyServerInitializer.java b/version1/src/main/java/part2/Server/netty/nettyInitializer/NettyServerInitializer.java deleted file mode 100644 index 254b04c..0000000 --- a/version1/src/main/java/part2/Server/netty/nettyInitializer/NettyServerInitializer.java +++ /dev/null @@ -1,46 +0,0 @@ -package part2.Server.netty.nettyInitializer; - - -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.handler.codec.LengthFieldPrepender; -import io.netty.handler.codec.serialization.ClassResolver; -import io.netty.handler.codec.serialization.ObjectDecoder; -import io.netty.handler.codec.serialization.ObjectEncoder; -import lombok.AllArgsConstructor; -import part2.Server.netty.handler.NettyRPCServerHandler; -import part2.Server.provider.ServiceProvider; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 16:15 - */ -@AllArgsConstructor -public class NettyServerInitializer extends ChannelInitializer { - private ServiceProvider serviceProvider; - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ChannelPipeline pipeline = ch.pipeline(); - //消息格式 【长度】【消息体】,解决沾包问题 - pipeline.addLast( - new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,0,4,0,4)); - //计算当前待发送消息的长度,写入到前4个字节中 - pipeline.addLast(new LengthFieldPrepender(4)); - - //使用Java序列化方式,netty的自带的解码编码支持传输这种结构 - pipeline.addLast(new ObjectEncoder()); - //使用了Netty中的ObjectDecoder,它用于将字节流解码为 Java 对象。 - //在ObjectDecoder的构造函数中传入了一个ClassResolver 对象,用于解析类名并加载相应的类。 - pipeline.addLast(new ObjectDecoder(new ClassResolver() { - @Override - public Class resolve(String className) throws ClassNotFoundException { - return Class.forName(className); - } - })); - - pipeline.addLast(new NettyRPCServerHandler(serviceProvider)); - } -} diff --git a/version1/src/main/java/part2/Server/provider/ServiceProvider.java b/version1/src/main/java/part2/Server/provider/ServiceProvider.java deleted file mode 100644 index 5cee41f..0000000 --- a/version1/src/main/java/part2/Server/provider/ServiceProvider.java +++ /dev/null @@ -1,32 +0,0 @@ -package part2.Server.provider; - -import java.util.HashMap; -import java.util.Map; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/16 17:35 - */ -public class ServiceProvider { - private Map interfaceProvider; - - public ServiceProvider(){ - this.interfaceProvider=new HashMap<>(); - } - - public void provideServiceInterface(Object service){ - String serviceName=service.getClass().getName(); - Class[] interfaceName=service.getClass().getInterfaces(); - - for (Class clazz:interfaceName){ - interfaceProvider.put(clazz.getName(),service); - } - - } - - public Object getService(String interfaceName){ - return interfaceProvider.get(interfaceName); - } - -} diff --git a/version1/src/main/java/part2/Server/server/RpcServer.java b/version1/src/main/java/part2/Server/server/RpcServer.java deleted file mode 100644 index 6abbf2a..0000000 --- a/version1/src/main/java/part2/Server/server/RpcServer.java +++ /dev/null @@ -1,11 +0,0 @@ -package part2.Server.server; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/12 11:26 - */ -public interface RpcServer { - void start(int port); - void stop(); -} diff --git a/version1/src/main/java/part2/Server/server/impl/NettyRPCRPCServer.java b/version1/src/main/java/part2/Server/server/impl/NettyRPCRPCServer.java deleted file mode 100644 index 97632a6..0000000 --- a/version1/src/main/java/part2/Server/server/impl/NettyRPCRPCServer.java +++ /dev/null @@ -1,49 +0,0 @@ -package part2.Server.server.impl; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import lombok.AllArgsConstructor; -import part2.Server.netty.nettyInitializer.NettyServerInitializer; -import part2.Server.provider.ServiceProvider; -import part2.Server.server.RpcServer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 14:01 - */ -@AllArgsConstructor -public class NettyRPCRPCServer implements RpcServer { - private ServiceProvider serviceProvider; - @Override - public void start(int port) { - // netty 服务线程组boss负责建立连接, work负责具体的请求 - NioEventLoopGroup bossGroup = new NioEventLoopGroup(); - NioEventLoopGroup workGroup = new NioEventLoopGroup(); - System.out.println("netty服务端启动了"); - try { - //启动netty服务器 - ServerBootstrap serverBootstrap = new ServerBootstrap(); - //初始化 - serverBootstrap.group(bossGroup,workGroup).channel(NioServerSocketChannel.class) - //NettyClientInitializer这里 配置netty对消息的处理机制 - .childHandler(new NettyServerInitializer(serviceProvider)); - //同步堵塞 - ChannelFuture channelFuture=serverBootstrap.bind(port).sync(); - //死循环监听 - channelFuture.channel().closeFuture().sync(); - }catch (InterruptedException e){ - e.printStackTrace(); - }finally { - bossGroup.shutdownGracefully(); - workGroup.shutdownGracefully(); - } - } - - @Override - public void stop() { - - } -} diff --git a/version1/src/main/java/part2/Server/server/impl/SimpleRPCRPCServer.java b/version1/src/main/java/part2/Server/server/impl/SimpleRPCRPCServer.java deleted file mode 100644 index 8033bab..0000000 --- a/version1/src/main/java/part2/Server/server/impl/SimpleRPCRPCServer.java +++ /dev/null @@ -1,39 +0,0 @@ -package part2.Server.server.impl; - - -import lombok.AllArgsConstructor; -import part2.Server.provider.ServiceProvider; -import part2.Server.server.RpcServer; -import part2.Server.server.work.WorkThread; - -import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/12 11:37 - */ -@AllArgsConstructor -public class SimpleRPCRPCServer implements RpcServer { - private ServiceProvider serviceProvide; - @Override - public void start(int port) { - try { - ServerSocket serverSocket=new ServerSocket(port); - System.out.println("服务器启动了"); - while (true) { - Socket socket = serverSocket.accept(); - new Thread(new WorkThread(socket,serviceProvide)).start(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void stop() { - - } -} diff --git a/version1/src/main/java/part2/Server/server/impl/ThreadPoolRPCRPCServer.java b/version1/src/main/java/part2/Server/server/impl/ThreadPoolRPCRPCServer.java deleted file mode 100644 index 834c9a5..0000000 --- a/version1/src/main/java/part2/Server/server/impl/ThreadPoolRPCRPCServer.java +++ /dev/null @@ -1,58 +0,0 @@ -package part2.Server.server.impl; - - -import part2.Server.provider.ServiceProvider; -import part2.Server.server.RpcServer; -import part2.Server.server.work.WorkThread; - -import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.BlockingQueue; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/19 15:30 - */ -public class ThreadPoolRPCRPCServer implements RpcServer { - private final ThreadPoolExecutor threadPool; - private ServiceProvider serviceProvider; - - public ThreadPoolRPCRPCServer(ServiceProvider serviceProvider){ - threadPool=new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), - 1000,60, TimeUnit.SECONDS,new ArrayBlockingQueue<>(100)); - this.serviceProvider= serviceProvider; - } - public ThreadPoolRPCRPCServer(ServiceProvider serviceProvider, int corePoolSize, - int maximumPoolSize, - long keepAliveTime, - TimeUnit unit, - BlockingQueue workQueue){ - - threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); - this.serviceProvider = serviceProvider; - } - - @Override - public void start(int port) { - System.out.println("服务端启动了"); - try { - ServerSocket serverSocket=new ServerSocket(); - while (true){ - Socket socket= serverSocket.accept(); - threadPool.execute(new WorkThread(socket,serviceProvider)); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void stop() { - - } -} diff --git a/version1/src/main/java/part2/Server/server/work/WorkThread.java b/version1/src/main/java/part2/Server/server/work/WorkThread.java deleted file mode 100644 index a3985bf..0000000 --- a/version1/src/main/java/part2/Server/server/work/WorkThread.java +++ /dev/null @@ -1,58 +0,0 @@ -package part2.Server.server.work; - - -import lombok.AllArgsConstructor; -import part2.Server.provider.ServiceProvider; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/14 17:39 - */ -@AllArgsConstructor -public class WorkThread implements Runnable{ - private Socket socket; - private ServiceProvider serviceProvide; - @Override - public void run() { - try { - ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois=new ObjectInputStream(socket.getInputStream()); - //读取客户端传过来的request - RpcRequest rpcRequest = (RpcRequest) ois.readObject(); - //反射调用服务方法获取返回值 - RpcResponse rpcResponse=getResponse(rpcRequest); - //向客户端写入response - oos.writeObject(rpcResponse); - oos.flush(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - } - private RpcResponse getResponse(RpcRequest rpcRequest){ - //得到服务名 - String interfaceName=rpcRequest.getInterfaceName(); - //得到服务端相应服务实现类 - Object service = serviceProvide.getService(interfaceName); - //反射调用方法 - Method method=null; - try { - method= service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); - Object invoke=method.invoke(service,rpcRequest.getParams()); - return RpcResponse.sussess(invoke); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - System.out.println("方法执行错误"); - return RpcResponse.fail(); - } - } -} diff --git a/version1/src/main/java/part2/common/Message/RpcRequest.java b/version1/src/main/java/part2/common/Message/RpcRequest.java deleted file mode 100644 index f6f398d..0000000 --- a/version1/src/main/java/part2/common/Message/RpcRequest.java +++ /dev/null @@ -1,25 +0,0 @@ -package part2.common.Message; - -import lombok.Builder; -import lombok.Data; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/1 18:30 - * 定义发送的消息格式 - */ -@Data -@Builder -public class RpcRequest implements Serializable { - //服务类名,客户端只知道接口 - private String interfaceName; - //调用的方法名 - private String methodName; - //参数列表 - private Object[] params; - //参数类型 - private Class[] paramsType; -} diff --git a/version1/src/main/java/part2/common/Message/RpcResponse.java b/version1/src/main/java/part2/common/Message/RpcResponse.java deleted file mode 100644 index a681df8..0000000 --- a/version1/src/main/java/part2/common/Message/RpcResponse.java +++ /dev/null @@ -1,29 +0,0 @@ -package part2.common.Message; - -import lombok.Builder; -import lombok.Data; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/1 19:18 - */ -@Data -@Builder -public class RpcResponse implements Serializable { - //状态信息 - private int code; - private String message; - //具体数据 - private Object data; - - public static RpcResponse sussess(Object data){ - return RpcResponse.builder().code(200).data(data).build(); - } - public static RpcResponse fail(){ - return RpcResponse.builder().code(500).message("服务器发生错误").build(); - } -} - diff --git a/version1/src/main/java/part2/common/pojo/User.java b/version1/src/main/java/part2/common/pojo/User.java deleted file mode 100644 index bf999d7..0000000 --- a/version1/src/main/java/part2/common/pojo/User.java +++ /dev/null @@ -1,25 +0,0 @@ -package part2.common.pojo; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 17:50 - */ -@Builder -@Data -@NoArgsConstructor -@AllArgsConstructor -public class User implements Serializable { - // 客户端和服务端共有的 - private Integer id; - private String userName; - private Boolean sex; -} - diff --git a/version1/src/main/java/part2/common/service/Impl/UserServiceImpl.java b/version1/src/main/java/part2/common/service/Impl/UserServiceImpl.java deleted file mode 100644 index 37e6262..0000000 --- a/version1/src/main/java/part2/common/service/Impl/UserServiceImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package part2.common.service.Impl; - - -import part2.common.pojo.User; -import part2.common.service.UserService; - -import java.util.Random; -import java.util.UUID; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 16:28 - */ -public class UserServiceImpl implements UserService { - @Override - public User getUserByUserId(Integer id) { - System.out.println("客户端查询了"+id+"的用户"); - // 模拟从数据库中取用户的行为 - Random random = new Random(); - User user = User.builder().userName(UUID.randomUUID().toString()) - .id(id) - .sex(random.nextBoolean()).build(); - return user; - } - - @Override - public Integer insertUserId(User user) { - System.out.println("插入数据成功"+user.getUserName()); - return user.getId(); - } -} \ No newline at end of file diff --git a/version1/src/main/java/part3/Client/TestClient.java b/version1/src/main/java/part3/Client/TestClient.java deleted file mode 100644 index 5408350..0000000 --- a/version1/src/main/java/part3/Client/TestClient.java +++ /dev/null @@ -1,29 +0,0 @@ -package part3.Client; - - -import lombok.extern.slf4j.Slf4j; -import part3.common.pojo.User; -import part3.common.service.UserService; -import part3.Client.proxy.ClientProxy; - - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/6 18:39 - */ - -public class TestClient { - public static void main(String[] args) { - ClientProxy clientProxy=new ClientProxy(); - //ClientProxy clientProxy=new part2.Client.proxy.ClientProxy("127.0.0.1",9999,0); - UserService proxy=clientProxy.getProxy(UserService.class); - - User user = proxy.getUserByUserId(1); - System.out.println("从服务端得到的user="+user.toString()); - - User u=User.builder().id(100).userName("wxx").sex(true).build(); - Integer id = proxy.insertUserId(u); - System.out.println("向服务端插入user的id"+id); - } -} diff --git a/version1/src/main/java/part3/Client/netty/handler/NettyClientHandler.java b/version1/src/main/java/part3/Client/netty/handler/NettyClientHandler.java deleted file mode 100644 index 28f173e..0000000 --- a/version1/src/main/java/part3/Client/netty/handler/NettyClientHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -package part3.Client.netty.handler; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.util.AttributeKey; -import part3.common.Message.RpcResponse; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 17:29 - */ -public class NettyClientHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, RpcResponse response) throws Exception { - // 接收到response, 给channel设计别名,让sendRequest里读取response - AttributeKey key = AttributeKey.valueOf("RPCResponse"); - ctx.channel().attr(key).set(response); - ctx.channel().close(); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } -} diff --git a/version1/src/main/java/part3/Client/netty/nettyInitializer/NettyClientInitializer.java b/version1/src/main/java/part3/Client/netty/nettyInitializer/NettyClientInitializer.java deleted file mode 100644 index bca4a4c..0000000 --- a/version1/src/main/java/part3/Client/netty/nettyInitializer/NettyClientInitializer.java +++ /dev/null @@ -1,42 +0,0 @@ -package part3.Client.netty.nettyInitializer; - - -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.handler.codec.LengthFieldPrepender; -import io.netty.handler.codec.serialization.ClassResolver; -import io.netty.handler.codec.serialization.ObjectDecoder; -import io.netty.handler.codec.serialization.ObjectEncoder; -import part3.Client.netty.handler.NettyClientHandler; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 17:26 - */ -public class NettyClientInitializer extends ChannelInitializer { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ChannelPipeline pipeline = ch.pipeline(); - //消息格式 【长度】【消息体】,解决沾包问题 - pipeline.addLast( - new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,0,4,0,4)); - //计算当前待发送消息的长度,写入到前4个字节中 - pipeline.addLast(new LengthFieldPrepender(4)); - - //使用Java序列化方式,netty的自带的解码编码支持传输这种结构 - pipeline.addLast(new ObjectEncoder()); - //使用了Netty中的ObjectDecoder,它用于将字节流解码为 Java 对象。 - //在ObjectDecoder的构造函数中传入了一个ClassResolver 对象,用于解析类名并加载相应的类。 - pipeline.addLast(new ObjectDecoder(new ClassResolver() { - @Override - public Class resolve(String className) throws ClassNotFoundException { - return Class.forName(className); - } - })); - - pipeline.addLast(new NettyClientHandler()); - } -} diff --git a/version1/src/main/java/part3/Client/proxy/ClientProxy.java b/version1/src/main/java/part3/Client/proxy/ClientProxy.java deleted file mode 100644 index 8cb957e..0000000 --- a/version1/src/main/java/part3/Client/proxy/ClientProxy.java +++ /dev/null @@ -1,43 +0,0 @@ -package part3.Client.proxy; - - -import part3.common.Message.RpcRequest; -import part3.common.Message.RpcResponse; -import part3.Client.rpcClient.RpcClient; -import part3.Client.rpcClient.impl.NettyRpcClient; -import part3.Client.rpcClient.impl.SimpleSocketRpcCilent; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/6 16:49 - */ -public class ClientProxy implements InvocationHandler { - //传入参数service接口的class对象,反射封装成一个request - - private RpcClient rpcClient; - public ClientProxy(){ - rpcClient=new NettyRpcClient(); - } - - //jdk动态代理,每一次代理对象调用方法,都会经过此方法增强(反射获取request对象,socket发送到服务端) - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - //构建request - RpcRequest request=RpcRequest.builder() - .interfaceName(method.getDeclaringClass().getName()) - .methodName(method.getName()) - .params(args).paramsType(method.getParameterTypes()).build(); - //数据传输 - RpcResponse response= rpcClient.sendRequest(request); - return response.getData(); - } - public T getProxy(Class clazz){ - Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this); - return (T)o; - } -} diff --git a/version1/src/main/java/part3/Client/rpcClient/RpcClient.java b/version1/src/main/java/part3/Client/rpcClient/RpcClient.java deleted file mode 100644 index 44b702b..0000000 --- a/version1/src/main/java/part3/Client/rpcClient/RpcClient.java +++ /dev/null @@ -1,15 +0,0 @@ -package part3.Client.rpcClient; - -import part3.common.Message.RpcRequest; -import part3.common.Message.RpcResponse; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 18:55 - */ -public interface RpcClient { - - //定义底层通信的方法 - RpcResponse sendRequest(RpcRequest request); -} diff --git a/version1/src/main/java/part3/Client/rpcClient/impl/NettyRpcClient.java b/version1/src/main/java/part3/Client/rpcClient/impl/NettyRpcClient.java deleted file mode 100644 index a4fc493..0000000 --- a/version1/src/main/java/part3/Client/rpcClient/impl/NettyRpcClient.java +++ /dev/null @@ -1,68 +0,0 @@ -package part3.Client.rpcClient.impl; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.util.AttributeKey; -import part3.Client.serviceCenter.ServiceCenter; -import part3.Client.serviceCenter.ZKServiceCenter; -import part3.common.Message.RpcRequest; -import part3.common.Message.RpcResponse; -import part3.Client.netty.nettyInitializer.NettyClientInitializer; -import part3.Client.rpcClient.RpcClient; - -import java.net.InetSocketAddress; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 19:40 - */ -public class NettyRpcClient implements RpcClient { - - private static final Bootstrap bootstrap; - private static final EventLoopGroup eventLoopGroup; - - private ServiceCenter serviceCenter; - public NettyRpcClient(){ - this.serviceCenter=new ZKServiceCenter(); - } - - //netty客户端初始化 - static { - eventLoopGroup = new NioEventLoopGroup(); - bootstrap = new Bootstrap(); - bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) - .handler(new NettyClientInitializer()); - } - @Override - public RpcResponse sendRequest(RpcRequest request) { - //从注册中心获取host,post - InetSocketAddress address = serviceCenter.serviceDiscovery(request.getInterfaceName()); - String host = address.getHostName(); - int port = address.getPort(); - try { - ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); - Channel channel = channelFuture.channel(); - // 发送数据 - channel.writeAndFlush(request); - //sync()堵塞获取结果 - channel.closeFuture().sync(); - // 阻塞的获得结果,通过给channel设计别名,获取特定名字下的channel中的内容(这个在hanlder中设置) - // AttributeKey是,线程隔离的,不会由线程安全问题。 - // 当前场景下选择堵塞获取结果 - // 其它场景也可以选择添加监听器的方式来异步获取结果 channelFuture.addListener... - AttributeKey key = AttributeKey.valueOf("RPCResponse"); - RpcResponse response = channel.attr(key).get(); - - System.out.println(response); - return response; - } catch (InterruptedException e) { - e.printStackTrace(); - } - return null; - } -} diff --git a/version1/src/main/java/part3/Client/rpcClient/impl/SimpleSocketRpcCilent.java b/version1/src/main/java/part3/Client/rpcClient/impl/SimpleSocketRpcCilent.java deleted file mode 100644 index b2f6af3..0000000 --- a/version1/src/main/java/part3/Client/rpcClient/impl/SimpleSocketRpcCilent.java +++ /dev/null @@ -1,41 +0,0 @@ -package part3.Client.rpcClient.impl; - -import part3.common.Message.RpcRequest; -import part3.common.Message.RpcResponse; -import part3.Client.rpcClient.RpcClient; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 18:58 - */ -public class SimpleSocketRpcCilent implements RpcClient { - private String host; - private int port; - public SimpleSocketRpcCilent(String host,int port){ - this.host=host; - this.port=port; - } - @Override - public RpcResponse sendRequest(RpcRequest request) { - try { - Socket socket=new Socket(host, port); - ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois=new ObjectInputStream(socket.getInputStream()); - - oos.writeObject(request); - oos.flush(); - - RpcResponse response=(RpcResponse) ois.readObject(); - return response; - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/version1/src/main/java/part3/Client/serviceCenter/ServiceCenter.java b/version1/src/main/java/part3/Client/serviceCenter/ServiceCenter.java deleted file mode 100644 index 1b2c02e..0000000 --- a/version1/src/main/java/part3/Client/serviceCenter/ServiceCenter.java +++ /dev/null @@ -1,14 +0,0 @@ -package part3.Client.serviceCenter; - -import java.net.InetSocketAddress; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 21:42 - */ -//服务中心接口 -public interface ServiceCenter { - // 查询:根据服务名查找地址 - InetSocketAddress serviceDiscovery(String serviceName); -} diff --git a/version1/src/main/java/part3/Client/serviceCenter/ZKServiceCenter.java b/version1/src/main/java/part3/Client/serviceCenter/ZKServiceCenter.java deleted file mode 100644 index a23ff1c..0000000 --- a/version1/src/main/java/part3/Client/serviceCenter/ZKServiceCenter.java +++ /dev/null @@ -1,59 +0,0 @@ -package part3.Client.serviceCenter; - -import org.apache.curator.RetryPolicy; -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.retry.ExponentialBackoffRetry; - -import java.net.InetSocketAddress; -import java.util.List; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 21:41 - */ -public class ZKServiceCenter implements ServiceCenter{ - // curator 提供的zookeeper客户端 - private CuratorFramework client; - //zookeeper根路径节点 - private static final String ROOT_PATH = "MyRPC"; - - //负责zookeeper客户端的初始化,并与zookeeper服务端进行连接 - public ZKServiceCenter(){ - // 指数时间重试 - RetryPolicy policy = new ExponentialBackoffRetry(1000, 3); - // zookeeper的地址固定,不管是服务提供者还是,消费者都要与之建立连接 - // sessionTimeoutMs 与 zoo.cfg中的tickTime 有关系, - // zk还会根据minSessionTimeout与maxSessionTimeout两个参数重新调整最后的超时值。默认分别为tickTime 的2倍和20倍 - // 使用心跳监听状态 - this.client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181") - .sessionTimeoutMs(40000).retryPolicy(policy).namespace(ROOT_PATH).build(); - this.client.start(); - System.out.println("zookeeper 连接成功"); - } - //根据服务名(接口名)返回地址 - @Override - public InetSocketAddress serviceDiscovery(String serviceName) { - try { - List strings = client.getChildren().forPath("/" + serviceName); - // 这里默认用的第一个,后面加负载均衡 - String string = strings.get(0); - return parseAddress(string); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - // 地址 -> XXX.XXX.XXX.XXX:port 字符串 - private String getServiceAddress(InetSocketAddress serverAddress) { - return serverAddress.getHostName() + - ":" + - serverAddress.getPort(); - } - // 字符串解析为地址 - private InetSocketAddress parseAddress(String address) { - String[] result = address.split(":"); - return new InetSocketAddress(result[0], Integer.parseInt(result[1])); - } -} diff --git a/version1/src/main/java/part3/Server/TestServer.java b/version1/src/main/java/part3/Server/TestServer.java deleted file mode 100644 index 28f7ffd..0000000 --- a/version1/src/main/java/part3/Server/TestServer.java +++ /dev/null @@ -1,28 +0,0 @@ -package part3.Server; - - -import lombok.extern.slf4j.Slf4j; -import part3.Server.server.impl.NettyRPCRPCServer; -import part3.common.service.Impl.UserServiceImpl; -import part3.common.service.UserService; -import part3.Server.provider.ServiceProvider; -import part3.Server.server.RpcServer; -import part3.Server.server.impl.SimpleRPCRPCServer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/11 19:39 - */ - -public class TestServer { - public static void main(String[] args) { - UserService userService=new UserServiceImpl(); - - ServiceProvider serviceProvider=new ServiceProvider("127.0.0.1",9999); - serviceProvider.provideServiceInterface(userService); - - RpcServer rpcServer=new NettyRPCRPCServer(serviceProvider); - rpcServer.start(9999); - } -} diff --git a/version1/src/main/java/part3/Server/netty/handler/NettyRPCServerHandler.java b/version1/src/main/java/part3/Server/netty/handler/NettyRPCServerHandler.java deleted file mode 100644 index aea757f..0000000 --- a/version1/src/main/java/part3/Server/netty/handler/NettyRPCServerHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -package part3.Server.netty.handler; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import lombok.AllArgsConstructor; -import part3.Server.provider.ServiceProvider; -import part3.common.Message.RpcRequest; -import part3.common.Message.RpcResponse; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 16:40 - * 因为是服务器端,我们知道接受到请求格式是RPCRequest - * Object类型也行,强制转型就行 - */ -@AllArgsConstructor -public class NettyRPCServerHandler extends SimpleChannelInboundHandler { - private ServiceProvider serviceProvider; - @Override - protected void channelRead0(ChannelHandlerContext ctx, RpcRequest request) throws Exception { - RpcResponse response = getResponse(request); - ctx.writeAndFlush(response); - ctx.close(); - } - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } - private RpcResponse getResponse(RpcRequest rpcRequest){ - //得到服务名 - String interfaceName=rpcRequest.getInterfaceName(); - //得到服务端相应服务实现类 - Object service = serviceProvider.getService(interfaceName); - //反射调用方法 - Method method=null; - try { - method= service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); - Object invoke=method.invoke(service,rpcRequest.getParams()); - return RpcResponse.sussess(invoke); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - System.out.println("方法执行错误"); - return RpcResponse.fail(); - } - } -} diff --git a/version1/src/main/java/part3/Server/netty/nettyInitializer/NettyServerInitializer.java b/version1/src/main/java/part3/Server/netty/nettyInitializer/NettyServerInitializer.java deleted file mode 100644 index aff1fdb..0000000 --- a/version1/src/main/java/part3/Server/netty/nettyInitializer/NettyServerInitializer.java +++ /dev/null @@ -1,46 +0,0 @@ -package part3.Server.netty.nettyInitializer; - - -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.handler.codec.LengthFieldPrepender; -import io.netty.handler.codec.serialization.ClassResolver; -import io.netty.handler.codec.serialization.ObjectDecoder; -import io.netty.handler.codec.serialization.ObjectEncoder; -import lombok.AllArgsConstructor; -import part3.Server.provider.ServiceProvider; -import part3.Server.netty.handler.NettyRPCServerHandler; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 16:15 - */ -@AllArgsConstructor -public class NettyServerInitializer extends ChannelInitializer { - private ServiceProvider serviceProvider; - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ChannelPipeline pipeline = ch.pipeline(); - //消息格式 【长度】【消息体】,解决沾包问题 - pipeline.addLast( - new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,0,4,0,4)); - //计算当前待发送消息的长度,写入到前4个字节中 - pipeline.addLast(new LengthFieldPrepender(4)); - - //使用Java序列化方式,netty的自带的解码编码支持传输这种结构 - pipeline.addLast(new ObjectEncoder()); - //使用了Netty中的ObjectDecoder,它用于将字节流解码为 Java 对象。 - //在ObjectDecoder的构造函数中传入了一个ClassResolver 对象,用于解析类名并加载相应的类。 - pipeline.addLast(new ObjectDecoder(new ClassResolver() { - @Override - public Class resolve(String className) throws ClassNotFoundException { - return Class.forName(className); - } - })); - - pipeline.addLast(new NettyRPCServerHandler(serviceProvider)); - } -} diff --git a/version1/src/main/java/part3/Server/provider/ServiceProvider.java b/version1/src/main/java/part3/Server/provider/ServiceProvider.java deleted file mode 100644 index fa39e0a..0000000 --- a/version1/src/main/java/part3/Server/provider/ServiceProvider.java +++ /dev/null @@ -1,47 +0,0 @@ -package part3.Server.provider; - -import part3.Server.serviceRegister.ServiceRegister; -import part3.Server.serviceRegister.impl.ZKServiceRegister; - -import java.net.InetSocketAddress; -import java.util.HashMap; -import java.util.Map; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/16 17:35 - */ -public class ServiceProvider { - private Map interfaceProvider; - - private int port; - private String host; - //注册服务类 - private ServiceRegister serviceRegister; - - public ServiceProvider(String host,int port){ - //需要传入服务端自身的网络地址 - this.host=host; - this.port=port; - this.interfaceProvider=new HashMap<>(); - this.serviceRegister=new ZKServiceRegister(); - } - - public void provideServiceInterface(Object service){ - String serviceName=service.getClass().getName(); - Class[] interfaceName=service.getClass().getInterfaces(); - - for (Class clazz:interfaceName){ - //本机的映射表 - interfaceProvider.put(clazz.getName(),service); - //在注册中心注册服务 - serviceRegister.register(clazz.getName(),new InetSocketAddress(host,port)); - } - } - - public Object getService(String interfaceName){ - return interfaceProvider.get(interfaceName); - } - -} diff --git a/version1/src/main/java/part3/Server/server/RpcServer.java b/version1/src/main/java/part3/Server/server/RpcServer.java deleted file mode 100644 index d0a0fa5..0000000 --- a/version1/src/main/java/part3/Server/server/RpcServer.java +++ /dev/null @@ -1,11 +0,0 @@ -package part3.Server.server; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/12 11:26 - */ -public interface RpcServer { - void start(int port); - void stop(); -} diff --git a/version1/src/main/java/part3/Server/server/impl/NettyRPCRPCServer.java b/version1/src/main/java/part3/Server/server/impl/NettyRPCRPCServer.java deleted file mode 100644 index 2e4a34b..0000000 --- a/version1/src/main/java/part3/Server/server/impl/NettyRPCRPCServer.java +++ /dev/null @@ -1,48 +0,0 @@ -package part3.Server.server.impl; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import lombok.AllArgsConstructor; -import part3.Server.netty.nettyInitializer.NettyServerInitializer; -import part3.Server.provider.ServiceProvider; -import part3.Server.server.RpcServer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 14:01 - */ -@AllArgsConstructor -public class NettyRPCRPCServer implements RpcServer { - private ServiceProvider serviceProvider; - @Override - public void start(int port) { - // netty 服务线程组boss负责建立连接, work负责具体的请求 - NioEventLoopGroup bossGroup = new NioEventLoopGroup(); - NioEventLoopGroup workGroup = new NioEventLoopGroup(); - System.out.println("netty服务端启动了"); - try { - //启动netty服务器 - ServerBootstrap serverBootstrap = new ServerBootstrap(); - //初始化 - serverBootstrap.group(bossGroup,workGroup).channel(NioServerSocketChannel.class) - .childHandler(new NettyServerInitializer(serviceProvider)); - //同步堵塞 - ChannelFuture channelFuture=serverBootstrap.bind(port).sync(); - //死循环监听 - channelFuture.channel().closeFuture().sync(); - }catch (InterruptedException e){ - e.printStackTrace(); - }finally { - bossGroup.shutdownGracefully(); - workGroup.shutdownGracefully(); - } - } - - @Override - public void stop() { - - } -} diff --git a/version1/src/main/java/part3/Server/server/impl/SimpleRPCRPCServer.java b/version1/src/main/java/part3/Server/server/impl/SimpleRPCRPCServer.java deleted file mode 100644 index f77262a..0000000 --- a/version1/src/main/java/part3/Server/server/impl/SimpleRPCRPCServer.java +++ /dev/null @@ -1,39 +0,0 @@ -package part3.Server.server.impl; - - -import lombok.AllArgsConstructor; -import part3.Server.provider.ServiceProvider; -import part3.Server.server.RpcServer; -import part3.Server.server.work.WorkThread; - -import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/12 11:37 - */ -@AllArgsConstructor -public class SimpleRPCRPCServer implements RpcServer { - private ServiceProvider serviceProvide; - @Override - public void start(int port) { - try { - ServerSocket serverSocket=new ServerSocket(port); - System.out.println("服务器启动了"); - while (true) { - Socket socket = serverSocket.accept(); - new Thread(new WorkThread(socket,serviceProvide)).start(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void stop() { - - } -} diff --git a/version1/src/main/java/part3/Server/server/work/WorkThread.java b/version1/src/main/java/part3/Server/server/work/WorkThread.java deleted file mode 100644 index 32eb732..0000000 --- a/version1/src/main/java/part3/Server/server/work/WorkThread.java +++ /dev/null @@ -1,58 +0,0 @@ -package part3.Server.server.work; - - -import lombok.AllArgsConstructor; -import part3.common.Message.RpcRequest; -import part3.common.Message.RpcResponse; -import part3.Server.provider.ServiceProvider; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/14 17:39 - */ -@AllArgsConstructor -public class WorkThread implements Runnable{ - private Socket socket; - private ServiceProvider serviceProvide; - @Override - public void run() { - try { - ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois=new ObjectInputStream(socket.getInputStream()); - //读取客户端传过来的request - RpcRequest rpcRequest = (RpcRequest) ois.readObject(); - //反射调用服务方法获取返回值 - RpcResponse rpcResponse=getResponse(rpcRequest); - //向客户端写入response - oos.writeObject(rpcResponse); - oos.flush(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - } - private RpcResponse getResponse(RpcRequest rpcRequest){ - //得到服务名 - String interfaceName=rpcRequest.getInterfaceName(); - //得到服务端相应服务实现类 - Object service = serviceProvide.getService(interfaceName); - //反射调用方法 - Method method=null; - try { - method= service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); - Object invoke=method.invoke(service,rpcRequest.getParams()); - return RpcResponse.sussess(invoke); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - System.out.println("方法执行错误"); - return RpcResponse.fail(); - } - } -} diff --git a/version1/src/main/java/part3/Server/serviceRegister/ServiceRegister.java b/version1/src/main/java/part3/Server/serviceRegister/ServiceRegister.java deleted file mode 100644 index 65c5be3..0000000 --- a/version1/src/main/java/part3/Server/serviceRegister/ServiceRegister.java +++ /dev/null @@ -1,15 +0,0 @@ -package part3.Server.serviceRegister; - -import java.net.InetSocketAddress; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 16:58 - */ -// 服务注册接口 -public interface ServiceRegister { - // 注册:保存服务与地址。 - void register(String serviceName, InetSocketAddress serviceAddress); - -} diff --git a/version1/src/main/java/part3/Server/serviceRegister/impl/ZKServiceRegister.java b/version1/src/main/java/part3/Server/serviceRegister/impl/ZKServiceRegister.java deleted file mode 100644 index 9fe332a..0000000 --- a/version1/src/main/java/part3/Server/serviceRegister/impl/ZKServiceRegister.java +++ /dev/null @@ -1,62 +0,0 @@ -package part3.Server.serviceRegister.impl; - -import org.apache.curator.RetryPolicy; -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.retry.ExponentialBackoffRetry; -import org.apache.zookeeper.CreateMode; -import part3.Server.serviceRegister.ServiceRegister; - -import java.net.InetSocketAddress; -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 17:28 - */ -public class ZKServiceRegister implements ServiceRegister { - // curator 提供的zookeeper客户端 - private CuratorFramework client; - //zookeeper根路径节点 - private static final String ROOT_PATH = "MyRPC"; - - //负责zookeeper客户端的初始化,并与zookeeper服务端进行连接 - public ZKServiceRegister(){ - // 指数时间重试 - RetryPolicy policy = new ExponentialBackoffRetry(1000, 3); - // zookeeper的地址固定,不管是服务提供者还是,消费者都要与之建立连接 - // sessionTimeoutMs 与 zoo.cfg中的tickTime 有关系, - // zk还会根据minSessionTimeout与maxSessionTimeout两个参数重新调整最后的超时值。默认分别为tickTime 的2倍和20倍 - // 使用心跳监听状态 - this.client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181") - .sessionTimeoutMs(40000).retryPolicy(policy).namespace(ROOT_PATH).build(); - this.client.start(); - System.out.println("zookeeper 连接成功"); - } - //注册服务到注册中心 - @Override - public void register(String serviceName, InetSocketAddress serviceAddress) { - try { - // serviceName创建成永久节点,服务提供者下线时,不删服务名,只删地址 - if(client.checkExists().forPath("/" + serviceName) == null){ - client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/" + serviceName); - } - // 路径地址,一个/代表一个节点 - String path = "/" + serviceName +"/"+ getServiceAddress(serviceAddress); - // 临时节点,服务器下线就删除节点 - client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path); - } catch (Exception e) { - System.out.println("此服务已存在"); - } - } - // 地址 -> XXX.XXX.XXX.XXX:port 字符串 - private String getServiceAddress(InetSocketAddress serverAddress) { - return serverAddress.getHostName() + - ":" + - serverAddress.getPort(); - } - // 字符串解析为地址 - private InetSocketAddress parseAddress(String address) { - String[] result = address.split(":"); - return new InetSocketAddress(result[0], Integer.parseInt(result[1])); - } -} diff --git a/version1/src/main/java/part3/common/Message/RpcRequest.java b/version1/src/main/java/part3/common/Message/RpcRequest.java deleted file mode 100644 index 63ba31f..0000000 --- a/version1/src/main/java/part3/common/Message/RpcRequest.java +++ /dev/null @@ -1,25 +0,0 @@ -package part3.common.Message; - -import lombok.Builder; -import lombok.Data; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/1 18:30 - * 定义发送的消息格式 - */ -@Data -@Builder -public class RpcRequest implements Serializable { - //服务类名,客户端只知道接口 - private String interfaceName; - //调用的方法名 - private String methodName; - //参数列表 - private Object[] params; - //参数类型 - private Class[] paramsType; -} diff --git a/version1/src/main/java/part3/common/Message/RpcResponse.java b/version1/src/main/java/part3/common/Message/RpcResponse.java deleted file mode 100644 index 537b630..0000000 --- a/version1/src/main/java/part3/common/Message/RpcResponse.java +++ /dev/null @@ -1,29 +0,0 @@ -package part3.common.Message; - -import lombok.Builder; -import lombok.Data; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/1 19:18 - */ -@Data -@Builder -public class RpcResponse implements Serializable { - //状态信息 - private int code; - private String message; - //具体数据 - private Object data; - - public static RpcResponse sussess(Object data){ - return RpcResponse.builder().code(200).data(data).build(); - } - public static RpcResponse fail(){ - return RpcResponse.builder().code(500).message("服务器发生错误").build(); - } -} - diff --git a/version1/src/main/java/part3/common/service/Impl/UserServiceImpl.java b/version1/src/main/java/part3/common/service/Impl/UserServiceImpl.java deleted file mode 100644 index 6fc44b2..0000000 --- a/version1/src/main/java/part3/common/service/Impl/UserServiceImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package part3.common.service.Impl; - - -import part3.common.pojo.User; -import part3.common.service.UserService; - -import java.util.Random; -import java.util.UUID; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 16:28 - */ -public class UserServiceImpl implements UserService { - @Override - public User getUserByUserId(Integer id) { - System.out.println("客户端查询了"+id+"的用户"); - // 模拟从数据库中取用户的行为 - Random random = new Random(); - User user = User.builder().userName(UUID.randomUUID().toString()) - .id(id) - .sex(random.nextBoolean()).build(); - return user; - } - - @Override - public Integer insertUserId(User user) { - System.out.println("插入数据成功"+user.getUserName()); - return user.getId(); - } -} \ No newline at end of file diff --git a/version1/src/main/java/part3/common/service/UserService.java b/version1/src/main/java/part3/common/service/UserService.java deleted file mode 100644 index 07efce0..0000000 --- a/version1/src/main/java/part3/common/service/UserService.java +++ /dev/null @@ -1,16 +0,0 @@ -package part3.common.service; - - -import part3.common.pojo.User; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 16:27 - */ -public interface UserService { - // 客户端通过这个接口调用服务端的实现类 - User getUserByUserId(Integer id); - //新增一个功能 - Integer insertUserId(User user); -} diff --git a/version1/target/classes/log4j.properties b/version1/target/classes/log4j.properties deleted file mode 100644 index 4e012fe..0000000 --- a/version1/target/classes/log4j.properties +++ /dev/null @@ -1,8 +0,0 @@ -log4j.rootLogger=ERROR, stdout -log4j.appender.stdout=org.apache.log4j.ConsoleAppender - -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n -log4j.appender.logfile=org.apache.log4j.FileAppender -log4j.appender.logfile.File=target/spring.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout -log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n diff --git a/version1/target/classes/part1/Client/IOClient.class b/version1/target/classes/part1/Client/IOClient.class deleted file mode 100644 index 3887808be5ef845b87d645be5c366db61faa6015..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1487 zcma)6TT|0O6#kZ80wLT=ffi6MqP7)?AYPz=Vg;?1Rw={CV+bn*+N36_`rwbk7nqS5 z$7lbJ?~Z4a7J}1ZY^J-}bG~!?&e{C>^Zf^a1-z3H!+i;JGTJaN;epr}WQ6fh!Xt5b zEJMN*Az2j5k~n51EK69Cuqxvzo=I4f@SGvKY?y|-$`DGWcNoGsYo9ap6bzFW>(xDO zZ)K;ObUQZ`hz~(Ic3gc9mUCKi<@8UV|j$ z804~5w{^Z@h%RZb_Gdb!-UOONQiCSb#7EuaFn0 z*9zXCpkNbm1x1t?#{Ge5)$}I8{Y}65(gkf~=t;c+%2hPSDO&D^RX6u9AXKx0x1y|p zmP5(Vd+EX-1O`8r=k>x7!(gj%6_=#vfM1y&hD0iTIXGA6D%tQNhzx3kqi%8(AdGHO zz)wIyolRW22`Yq_&d;{t@@6dq!K{5@R-hsuDs|_O=7HvYzX^^v<9W3=&{SZJ?j~Ig znx$=9(>W&4N8cRrYXi}RIIRP8QfX(jM>1z%-#qmotx-=H!w|hIJ^%?M>C}N?jF3ba z|E5oqM0@TWZM&I~GlYug2=C6EB65c4QurK_IJBRkV=0mhPoF|ghELI%jGRLGiLRw+ zGI~-ZL@zs`ynrm0(cRd45Q0c01DV!AT8HRKV2TpRPzow;U=cUTVhk%7#~Rfr(%nKk zVdpVQ`VdKO6K0GOog&+D!bHd_gh||@B3I}?MTijDv8V@ diff --git a/version1/target/classes/part1/Client/TestClient.class b/version1/target/classes/part1/Client/TestClient.class deleted file mode 100644 index 0ccacd24d34f3889fe8e9bf243acf50547d41a22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2082 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 diff --git a/version1/target/classes/part1/Server/server/RpcServer.class b/version1/target/classes/part1/Server/server/RpcServer.class deleted file mode 100644 index 50b6f39fe3acde2d3340e2962ba659c259c24b5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 163 zcmX|)K?=e!6h!B@X;UkR7jR!U2Ej83t^^D2V+h4kY)E1c=fVScDDg+Z)i7^nnAiL9 z1hB(gVkS`&iV(Gr1koJUXO<90N64FG>UO+)WB1p=5*8$?e}xgxovG3)KA2AL@_pxg+x_nS@?+x@fI;LHoKzv8Cvge`4LGgh z3A|-7( z*EEXv4BwXfiZD@f%>|3>*4!gw+0Y#;&rDWcT5!-vEWmTBmc5$jQ*N{P{ zf@>PaaGeGI_WDKn`J3{qmGaAX<>xD3H=ZdN*Kh+jHQWL-X$j2~4QF1TdFWfl1A(J8 z$6P7PW7l8M?{kPy8rrd2I=d~0I~qEW7HAKR)z(`>4rvLZKD(3Ue-ykXw8^u!d)V9yA`H<+X)H*Q(fel{*JgxETDK2RCLHoMLiT2h%DQg z9}bV!Fl9f{Kq_6;gTLBzxI(My-T&x-u4<>#OO7LNN9eXW3@mKE8Q(B1^zcHr@_x7R zACqUocc6~z4s>$t;_fpNh;ts=gqZDKM=bvyb#3uA)c36+ad#8S>?Rs!`!gSqT!*@j zU2D+ZZk6*?H?7hLp!3&AvwOHc!p8$#C9#)|_tVWm^x+T@hxz98@DVynjeLyisq4f( zbd#CH31Sa0#8V9BAn`F`hREsRELTU!6FA0oCt}~xs^IvRBq%t+E2p5B+7!~2q_V`x z$iym#SQuC$6!eD9wMbbp&-;gLg*ZyIbggFA(VWSCMDkAyZJ`AQAyK~rRKwab5+*A> G_WuM-B~D8K diff --git a/version1/target/classes/part1/Server/server/impl/ThreadPoolRPCRPCServer.class b/version1/target/classes/part1/Server/server/impl/ThreadPoolRPCRPCServer.class deleted file mode 100644 index 29a7d90f4f97b6280b67f783de882bd182368a0b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2536 zcmcguTT>fV9RDo@mV`xa1;i4u6eWa9ic+-&QJ~ZYxs^~V*4wfiVIkRFHyZ>$Kp#5e zj32<4KIx1PopvlZWyTlZ{2ZeF5RUbCPC`f&93C7Q=CJ2~`~B~SU;cdZ6M$g^5wv4U z$Mp!_#SM8RtH_W)qhU*93uQY)8!HGONO0GFQ{2G|jk{nO-)1Tiy%AP_SWVH4K#lNT=zWo$=Bo zVJ$99@;C1{-Sf`sRWdn!O2+JrxWy1hPG(P}U2DsB)^FxSPK?Od49oR}EJDiuk`ZZ1 z#+fm9>`X3mOs(4z!W&Q9+hU3KDK*Wcac-yhDCAa6Ju`G3ibu<>q`#T(@PnpFbYQ(!L#(qidiO6P&~|j=LZRb}vg~cL8PcpLTS^0&*COKANrw3{_BkLk4URq*>&3ZHq zQie^?%#zt@IT_rdmdIvZpDT+s=lDmJ(SNMs!a!@#Q&W@kbJtQDlCl4850ylp+RX-n zrK)su%)xOVFZi|-qyoMg85zP+?n}sY&XYoEhkCJ+JwPpPJ+<(vO-l{~4IJgBY{o_k zY9++-MSkk*BIiXH>Yd`Sw3Wga*N~K{S1zjYTk=gy-~u1gc4&BkFJ+VLXFj?WvZeVq zM0zJ);(39$3~I>%2IBkB;s>Z$`4N?S2sKtdJ%_4C&<{|v(y+FV@IE4sQ5)}j4CA3P z*Tu7m=0KkO*QS|bwQpv^9r<{(`*#T55+8`3Na*5vt zU6h)G7$W6Weplc%(uQ%lkg=aprSyj$p|0tWpep8fp)W)LlOBSts+2;NWdON5mn4imD4|M|R* zH>labg1(6>bgZ9_T*ZhAaj2MpA&kx#O591k^`4 b8MJm>)@nt#qQLVR;X|uRsbP|$6}a{n-EExy diff --git a/version1/target/classes/part1/Server/server/work/WorkThread.class b/version1/target/classes/part1/Server/server/work/WorkThread.class deleted file mode 100644 index e26c7777683c13714bda141107827cfedeafa1c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3143 zcma)8X?N6Q6n@gqG;Ihi1uB%aWoaZsVoA+h|hxI7}`Q5laZcpRF7Dhvx3DFq|Y6|BOj zkd2AUxB>%*#nXg>G%^ZISTeFQj>xbTIMAx#B3Fq?1xImAtRELHo{;gRjHhHgEuq4( zQWLr>p|<<5HmM~|-AxX9q7Dhwj&4sHDZSseCXEqY!rJbvX1nW?gOuxbGV9B2@4cjF z)3n^qnY=bN?~@Sgw1ja@w_)nNxy-O`4{5_`O6GQ3DJ{KEvkmbc2+J+Yk+8&vV_3<) z;lp~$?aR5@oIB{+x|R{{ErUvnZ&Kl&8HwU|3DK(3B*CMYF!M=g6I zxu2JzafUQP_1S~2mYV3%vK|jIo*|$y-5t;ifOa*_fXEB8qj?66BIXLioU|r9`n{BU zz$LLQEYKWzl(cN)t zM8cxb7Ph|y6C&0+yvjT%<5{mhPsn(Vc3Tb8aJNb52(X1}G|KHQ>rqspGHB)Ol)l># zl~+@uzDlIRVP3&^S6`8C2@RgqOIBxEbDUnw-EHN}k)jGqM#Y;*sCWx+t7t;A zjCWMLi}zHV#u*i7h4_7ZAmf~h5Al(TkMW6&6DqdjQyHJB_#Eenx3p2OHJD3{`?)FZ z6M@o|PU~Y@dS@!djtZ$HN=^zX?qb=cydoOXY*uzrn^~6eg^Dln6=%Zrvp-+|@yzv; z7jB$C_2=nxH!fb3@wJL?a6!el_)aiOj#fqn(ezCvVNMB!U*Pm#5)I@`(;q}WwR;V;@Y__R+qwF(E4?BpDWZ7*TdG#mY|vnbS{gU20L&xoTv z$MZTkR9WQxe(3}Ue{nX3#5`oY`bzVQBT|Wl#EWl`QO!t8Sj8OwS704z}q|RCe=TbD92u&1lE$;9gD7t$c2Q!s`;$U@4YiIngvyz7ls5 z;btOhC&~^=w-a9*HMgOHx=l#pc4AzHdaTDCUKF*o+2DCquo0UOqg{+X?xG$ez!v%f zWq^z_ej{#;(TqovAF8C#w1SI!h<8p8W36RWb9<%sSZf~hD4frKT^_f!$LeFPd|r^p z!uEK5{3_}%iF+PPf55W2%kyZsipEQH=ObDa+!qJ;C6UMzojHi~7tY9o{UK|@3 z!A7FpgigjFBHv5gZG^a;vBW8_rF^HCojpNp1n=2$FyS8lIvHR!*Y2f-K(h(Eu-oGW zSPbcJ(iNAnN5)Er}~AYgu;%wU;R>^DupJ&rN9v6#k~SZR=v8KmkRmg3^{tt>6`k0$MI9m;fOm{@S)%t=eE1{Md&5P&na5OJL>S2d8zx)(%;(XpIITLi>8z(5$9O zfZ;B{a%zPzfo0v$trZ4uB6-N*Td$P}9m(qk-)&Y4+&s_<6+7HoQL7wkrY_FTrO!In zDZYWddU20`Zt{k;*3>H{ZZfD_hQUoc5>AkXJVk3|(#2Y}S~Jo+ywT9gJncT5a!rSW zg4;;6CGHd{c_XIHM0@^D4R1!Z(Lp6^eKV$5zN4npNT;sb-7ZA8Zsx^b5Itd-OkDY% zN*=Uovd|1e^q|*_?$?@Tk>_+V77@2?^8%~l9`36c!mx^%5F;2>F@`$~6IV=tc>0cE zW#B5w{O;*8%icM_U7Nru+6^h$cwG__OO zO0~p!{h-zG>5j2$Es2|wvx0a)pTR-;O8VdtttQJOx@~J}xUH$@V7P1B<4{P`WYEn7 zS!vRYv_EwL_RWUGNe1l82+;$o1mGba(TRo;k4cKhOXSQ$T1m}(hbQ%wOb_BD+n>iI z#Cc9&J5J#>)|<$CZ6cAVAR57RuZVotCK8nrL}N%$v?8?~(yi3|Hj(!lsmW3&i9l9O zAtzHG^4_!o`|XrqN3Tj#6h-z%zL1=cAwh0!r_4O5V{{H)uZ`zB&agTA8~< z@aO`eX!snr1TU$mDs8W@`=ssrf!pF3kw?FC?5E>72L9(g=Xm$f_=uK2!4&B*d5=;~ HlL-9z*RurnpG#%PNnuKJ6g7-Im zgFirCc+jM87|B4Nf=k62w^1*Gs^X<3|Y}$6Uma{Y830(5Gf}I*JOD;jC>SvtVFOW zb0LCa1SL7T5kWbEitO59RKvKbuxGK9U9@ggt%`lJn#-?QWd&oVP_W9U@@A!CRTMgM z1=}iLHM7>dxoIiHXRnzz%}m}btY?<&a;~sGp%C4)?2Y1@s}U-hWpk6JdslqA3#-?x ztS!3k@$#*b+~!wtd{U!rDYsrQ?P{3{J-ZYp)5ob3n#>h)_Hl*Tq|b>5X!nl)77vMk z%k`YPprD;9uF-95HdnCbtDCDsW-(-(vvc=8K zVj(kURVwDXm1zW*fO}_~?D=}{j)nj20TLN`LwL28%VWvZ)1VDCP5vB!fAm@al@=^xbzPuQ!@(s z`Nf&J(}YSnRJJPBysgl=(|P-l-%G?Ux<$xBUn*A1S!+5cLk3>L%L-$q|1PH8j8)kG6dMEQaoS+VJ!aq?kzNz&b-WSAX9jNJwt+V>Zs0vE z8u%PvDD>?ld%Zy>8c#_!rDw{(m-vdD8yRebWQzT4WRURK5~=VtzHt=X4dFi(RLa1I zIL5kbICc4;(CuvHikT>tX$m?Y1Lki0pRtt9CA*IZ-Z~x5&5Xnq`%ojB=4`BB)2P zR-`8(4KX}hr$FoC5GI(Vl2uq!7;RN@yLv>UsW=Xn>-0F(3R{aFg9H4+?SsPe&=3&D z@Y5L((l|4DwZdU!xT3w|UCsv_{{cr51VKj<3>uD5Hk?}qNa!SYTvTId!z*}| zCxU5^nB*_=0HKTb5&nU)YC@oduAX*=v-s81KOrEh0iSBz0qeTdJ+Mj`-oiMz)402( zF)O2mv9{B=x1}*F$qT$6w!YK2zlE_IsR{a?#FU3XE|XY=oXkn4{EzQ+Zs~P3>X{08 znNm33`kvsk-XlDd*uRChTj9~3^&Vk~+;ajaiB%Xd%enrpT?~BEyIh_hp}m{%ki)SW z^H0$O`PiPOZ z=Pr!Vgtm?Lnuam1Q^gn$C3MjVJw*I2Iud#!?!@VFY`ZCT@()fP@?{d^JhY7~=3@dkz_a8)iIPy0- z!OEFcf~dpi_w~212;x&`^w3JF2NCiPa;>XvRH(KB>7%-ZFF6cePdjcgM{XtL?p;Ol1&~nczfy#Mot#3!{#=p zWiM<&Vp+m6(dbyf`;-ERGE^6cG{}$Z7(Sq+IUza+?J@eGF+@r+EKuq(l^W}SZ1g~{ zDb#ed<}IqxA3t1P3`+DVO=|i9;%sSqnt^Kl0xJ$m)Sq^Zy hjpuf@3zsY|>8HI{2XN8J*d^@e9HsXVKNc^b?O(62x0(O| diff --git a/version1/target/classes/part1/common/Message/RpcResponse$RpcResponseBuilder.class b/version1/target/classes/part1/common/Message/RpcResponse$RpcResponseBuilder.class deleted file mode 100644 index 5944e04c7b26af5cdbc2a0fbf2a526df1559e75f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1588 zcmb_cZBNrs6n^gBI%?&m3{XLxirS5riVQ_z^M%A@$Qp#c_i)ZXU&tjGB3kfeJtO=wV&aNpSssd8W^gLsa{?yvO@zv0qhP|h6 z`L1Q}apbPy8|TkH*7wbZPiL8R%eMTAKvFAgQ|LwjI#RQ2^TR=_Zn~e0dNTla8b)*5 za4r6iHdFo=%Ol{;c4O1@+K%m+Zx5{IuIUOWRogb*ji%vwCdI7O+J@^d=?$mVa%}y5 z*svbUoQ?Sr3iY?DRSQ>4t!lkw{1>c&%hBtTq^d7|8lgsH8xSGWzH%Z#f5U z!+dA4P@^##7dcqLP25s2j+}xCOe&bd4T1b1IXG=yVCwIBrvk_IT8tHq0yG}avVt-y zyu1>S=kw8=mT6??^E{P7z-yY~f`Z4;1eOQ&6)$_*%jj8`p*RAXR_)~~wsRsP4SmLF zw@sTAS?D`4XV{?*QB{&=hKKXw<8yE)^)8IZJ$emPdMA=duv+9LSg^p7W@Iz;k(dye zCQm0T$fk>3i0|YiFhgr5*c`@f@|7?EcL*HhkK;bAoV-TS39?dg`Ur{QH*$N^C&Q2^ zoq~hDxatHR^Z?BrA$e&az8C{dVYVMo>e4{W3LSzso*_-SQ<`WJBdpKF0ArPoA??S6utk&)k!`xPfiwyEK*fLH zjN>@N4URL6H{t~|=!^tMW*ogi$NvH9y_X_BXLr+VOBgzI+V?&0d(L_Goadag+duyM z>1P1L_#}!L-ie|G$7Oj}miNLqA^XWFHsVx-2B&3tUzRflJ`mk0182q6l4VYoj9AZ$ zWQ%mpz(N!WoC;%6_N*-D!?+MePQ;}!^0F5U6b)Qdh|d%=Gj_RH$d~PX)ogCwE-9Fk z`Mg~k&spWNT~^RCg?U>+O)3~mcDZaV@D!gqZ(Xv|IV-=Ao~@L!`Grwh&RZ30rS8bw zc{@{~&L~#}j(9tgK3`AYKUK6!m2K%vVQHz5Pfxp#N&BJ`_;DwYbyL~AeYm4yq+5`_hGF*UBS9j0_sNuq!Nl>tRVzn&ni`yBKNS@8LS@nEIAOAHxw&G_b>kdy)NXS{ zU7dS~%~q_;g=wqk)ST17zE%ilto(j?I>kk+yy$YKADx+;-mefU+2v}kLS5qldY_9I zt`yuPNyBWRTFTf5veIB}zItpCmQ8HOu!+qmnRp3h6BTS>s`tP8?B1te-@E$lz0be+ z^UAfquU!4>=1miQsG3OQk~q8|#}~!xWrgie>iQ;)pwRmyFB4PPXW~`tFtHQ6OuQk- z-54=3jU5V|s~cr`^xJ)jCS~r&OniusWciq!4EB088ec-Nbapl(_f|xZ zL_e)kJdIMXxVQfZ)sEk52&8HV)}VdoxD0R&IR>2=q-?sz($hReFoZ20P>MkE6Bi)$ z4}s!(4IvLnp@Gy*t2DNHey8cD@g|YF4I|Zk3*pq@Eksg7w-EiF_W_@0s}n=YwZ}HR zLOng5L?wxYld8m#a3TycLQb#uq+Tz=@Ex?AxD8V>^vBi869>t&PIDJbJ@o^^Hz@c6 zY4?$#dx0n!z$VU-)l9~lI&)^5I7e4ICz?8sVvpxM!Z?M1kVEBa0%MN%de>r^z>r6v z!Wi~Gf-}HstQAK(O=x=!uQ$Vaq@a(BN7_qp_%?HKlw@Tvuj)YR8|d1NfnO2(5_<5) zz%PhR53*@nog;;HgZ#TDIv&~%^VBw?4gH3eF6}PbufrVb(rRe0o5x3Vn#4y!UAowW z?jn92u`a!fz3UojQvRT?58bd2x&bZISjD&#b_dR4g1s4_W&-knGdkuz+3zcs|VQNiV^-7A}@Q7*WKKu&bkn>x;_20 z*4vY&jK-yvp9T-+K0$QCOtg*e(Z+h(Mi+&^vttf(awKozwt?#~hH7}mxsQ)%qUh2* zO<35Zs;4)Hny^q62!}pl+kByrLPO$1j$b^BF!QT6ZQSC| px^ldR?syO78lGD{jxN*gTXERSF@Ra32b@X+Q9i4MujO7u{s#<5a7_RJ diff --git a/version1/target/classes/part1/common/pojo/User$UserBuilder.class b/version1/target/classes/part1/common/pojo/User$UserBuilder.class deleted file mode 100644 index 4dad3e51692c03f433541e35221ad0eb6122eb3d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1467 zcma)6+iuf95IyT$oVbRzsY$sLN`WN3m_mS-w0&qLq)JtJC{*eTl9Q~0Bgc*$2k}`T zl}4fxAHYW;W@0CGXh3=J&g|^WnVB=Y{`LFEPXHC{YM4hki#e?DvdYVviggVsm@1xW zP*KicgXMExUSv?o;AIA{c=uYxriv{A#cl{J9JZ{_mg!h-(>!nk*_3`&Ak*tg|Hx`f zfn3btIPh(^N#}{K{4yT9=Xs8_Tsli{+pZn#l2fsCB9Pqo8U!Q9*R!35^ab<-*OmUhV|BZd4wnx*mLF`Gb+6s_T(je~ zJd^#GV?k8MRxwuju(i^3v77POsOu?1$I=d2nKCw2n>3D*t0!xz<$EPSTcbWfPttIP$Ks7#_;asoM5VMS? zK-V#Cbvn`|j@RNaqY+=G3r$hGMEjV3SWERP`$K;`q(?bV&ou#s87EC)(g%`wCz+;? z1_By4X(mZQGF9$Fd?Q7{9a_@^<1Fryu7?h|hXU>BWm1wbxJup%+0^pNcPQnrq+Sir zhb~b#IS=aMtOk}Q0VSpe;>H*#k4KY$l2ZdQGYqth#}Uvj{nVHj;{vJE@)>n^h6H`d zKGKu>3~4e(G|^>?us#w4j8(aSdfG=OmpzBZnCF7kw=k-HY^Nw!}n{T#FZ%T07TCrlAv_udEQ;GDkr_w-;Ec~C;@bDzG&eDfFw8mo?z8qj>#VcSPXGGn*WUn~z?O|q(@P@_EC?muU=O*}+YjzmnmW1JA*lgR*?B3vStl zZ{ur)%xc50pKAq`b-%9Q&R45`{d~o1H2j7_B3M^Au(0KQ=M^hnb)z_6ZTcI2eOAF~ zF>cA*_7$=*z)G_oR5!SuZ1}gkW6#xU72m6J&0cHocVu#EVaKaCj}^Q`%S%FWv%$%Ndu6MD26I>Vbx zX>Vu`gzna!Jp1%o$1$+d^vd5XdOM-stXWnY6PLZ}1>s3^(`#(%D@{&L&6CFE<@v=6 zG8HWbChIyoQly!QU6(}iyr-ZSxdl?`i*{p}!*_eS*#2;IY2JM?<=@bBR3Vm{z{<0Lh@s{I@d~)13aV#RymB)DAJR-m3IgYpbJ&Mrc$zzf{7*2A zdxbw>{RlI8ukbsp#p(Pm?C_I@voy`2WX$}DOwM?W{deKcB8*(Vsa z@jm}M>In{NGZi(c$W8f^%mk*$C+we99OfQ-lbnUUlD?wTsH2Rt7`-|)d)k-_ zB|kJYyGg;Fp~79*GrMqai9cO3WFconD~?=)UdoiraEUh%201x1TsqWW)H8a+h*lEI zxIn?!_Hj9sE`c;V)kmb7 zfHubHc118N2J0Yuy#$jco2b?fH>sWUl@pIJz%H~eJGhG>k#HCLvsrCtIAsrLJ1zcU z+PfI(Z3epDbQ?MmNu%UfB-*Rf!yaO^_wDTudqHmxTfkBje1k*{5*^MnIP50*=?5_K xGY{~ecbpA#~^mdYEJUp0!Jz$JbqczZ8!mOoVavx6K`{{ls%=wAQ; diff --git a/version1/target/classes/part1/common/service/Impl/UserServiceImpl.class b/version1/target/classes/part1/common/service/Impl/UserServiceImpl.class deleted file mode 100644 index 4f66e73cdc8f4e466b69131e9f9fa0f602f4af9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1965 zcma)7TW=dh6#gc5vd(&FTIWijr70!YNz>K1VZrAmr9W;AtAMehfUN<`~ZFjarhO8GrPWRaA+U)%$}J!-}%mEX8!!=(H{WL zpsZpPS}$I~DFv^ph(L?sv>eY!@mdV8%kiv=b2zWy4Ha={DyDHk#hbV&1+87eTT)z> zt1~KQF(=ixrI?T59l8HqDbfnwQ}Dim3`5Ta!!q2943T7Ng&{g?7X(9J#<0XfwUiUi zlAbeZCXuo8y1Ak|hSckmQTK*XVVKO6b;muW9zpgwSP>QGW*;3dhl{f?bk) zeaNb7nA$aejtrw!^2jitli$){q;fZ?!CVsZ2tA=8;+~^K#FS&y}Nh5 z+WqMl+QE^?+v~2AMZ(?J6bArL+mXM8)mV%VlBhZKois)J^*&nhZnj7cl(a z{V~@LP^rYp{{j(;4D;n;8*2&}x$9<@6kb8l0OzNi?GJPmi1y$26^qv?>B+VBBGz|M#F2`) z$q*vbSbWMfcl%{y7~Qun2mm zXk;{YPi%qxMn7G6fn<+A*@vU_&w~vFa*Q;F7jc}VG~OhzD2?;Kqw6sut6PXBx;^wv zdQcKE`ti`~L4AxkE%7VccxD?1JoI@uNLvn_@Q~O>zlQ-2g9}p+2`TVCO8$Wa`53@B z25}lgIE!J-VZ>)N5qPaLBL8$JjT5JFT74NwLYbp4g$X~{Nt~$jT_wGXkjL8i4h4LN tn{0{MNQ;W<8yu#L9r0Zc1prOgW4;@DTrlO+KZ%cNRLS8bdNSA0`!8Xx3kU!J diff --git a/version1/target/classes/part1/common/service/UserService.class b/version1/target/classes/part1/common/service/UserService.class deleted file mode 100644 index 216f6e47e6b4e4ab96a9153bd5252c4b4cee198a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269 zcmZ`!K?=e^44i1SS_OTAM|;pk@Yb6Lp-}K3K47h(w6xu_)`DO2-~)V=xLX7f^pb?h z%w+O--tGX_7`Yg_@CcKH>%*D#=4xwrA}r=nCL1YoStcSZYfe}PepE?auSBehLY1OY znG#kI5XNa~hSuaQ|3meE_!7Lmy6Bj=(wLVv1!4B(X4ZDs-hT6p>XUbO c%s8(51VYC=3UnMo7Y<;04}F6WT#IAy0;cUuIsgCw diff --git a/version1/target/classes/part2/Client/IOClient.class b/version1/target/classes/part2/Client/IOClient.class deleted file mode 100644 index 56de353bc735b9f0b991343d255121619f0c467c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1487 zcma)6TT|0O6#kZ80wvr^ffi6MqP7)?B3@`g#R^(2tx|@O#}HNsl%yu9`rwbkmv%;G z9H0F=zB`^xS{j@VV>8{&p7WjCch2V5pYJ~aEaP1SQQVbqFM=*CNw_ceZVV_RwNq7>$Q#_NfF5x*tcvUxa=Ltg~nc8It=F9`mFi_A9UaXz& zb8AQ4uaG2KFg3NZt6I7^H-$mxNVgfr3RTr|mXusY=Z2%?OWsSCq1Wcd!8ZR`=_ zK3O%+piTP`0>jtA||Ku4+xQZ0ZVxT{R7xQ=qVIYA2jx z40$08?kHtfM9P3^QkIjRMmLqx{xR2_Qq8H>97=<$r!Gj8GVu>6Z}>6Y7WX1D%>GYS zjEEcY)x7aV<5fpD4T={$G6g45pSnp2>8hqhI+kaUtQLDSS44CPCZ~O6N7YWY)T-Mc z2|0#H*{oR_-_%7H`&zwO6pfHEj2JcBZAzOlA%4Ly?ut9oC1V4d0``(2aT(?#OvWqZ z1?shoHz>&1LQF;xC5CBlU^+FuMeuOTZ@zRv8yUJ%cYtyg)wYYKvuW0hg9`}NEaR;x zYoy~)G7Pp|c!R*;#d5t~IAR#>G_K;33>@-H)58!?rrLvZd9D&oFM>$FMmXvxM?S*n zCi(pM6x7*x+l^l#y!3vybceTU8S!WB39|wf`cSFaM>G#K?*}b#tQF6#y@{p*t8_Q% zYS1k0SgOV`gCY9nh+h|oF2raZp_4*8qdk;vfPHh-qqK%yVH9KZE_(pPk)Tr##xX$> zVf>puO%m<7b9C*cCmIM8&k@{Ps3X)sI1@aFBo5sT^khPb;CvmCM6izDM5qq=C;Bqs zMEI;oh(UHnc>!6hqQAKhAOMj{8WCDYX&s{{jyXyoO(`h2h80{Viz%#O8tYV}NOv3E zgk8cU=>sIWNth{0bdGGN2@@i#0A_K6id>`r93cW^m%}aGrd_-xk#dX9QKUPR**r;! PlCKgLNWMs?E+~HiQF?Lq diff --git a/version1/target/classes/part2/Client/TestClient.class b/version1/target/classes/part2/Client/TestClient.class deleted file mode 100644 index 9dae8654942dfd5da2e7896dfa69ef4f1592745d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2084 zcma)7OLN;)7(Lf7*@}o0=jjGYNt@PblekF>ZId>o2^0)&5^x$wLjl>obrodE$a0#j zU;#4>GdwrUFl<<`V!>nKv}C5kn%{xjzrc#&yOLbXCYjcrxi5W>bI$i&>92qPxDVhg z?#Or=XC$1B;&~YXyddG6n9s|&fY~mDF&D!{T#_&^L&ljXE{pj^8CS3%Rx~W)C9!>3 z##Ou$#j9e@$aoE}i&a((*F>bHD3*oGii9^LyvY!`s2Q3)&k#(FuQ7xc%_3)rXElQ_ z)yjEpt*UvQP7+zOpz3R?rHQ?F7_x6`Rfc4?qFVM$dQsQ7VW(Gl)pnP26tJvn2E$-# zBfF_?scBs`O6ir(UxJj-L_(GnvNk^uo^=^D-t{(_>5um61V8FoHJ`y zfnU{xK=BssDZy01GdRp}xJ{b>VP=R;&zze&P5)`(kt3R}$HCAQtm3+aH3e_sZ3XMN zAz?$oJGjX()G6{pP1B2l=Apm$zI^b*7md$u+uI6slqDDfE@` z&5cE+>TSjM>c=2$sd|ks-xA%K@q4u@9H&g8X%=?Gn4wOX^e1c@jvw4YK4Q6@s?EzJ zrCB3-11?O>Os~*ou!$g7%Y-zdRw~@+%+$OwK5p)jS6^}*Z0nmxZA^06rfbX4pYrqc zf>L`s>a;^4eJTQ&PPcc!Pr3<(3L)j2-PPr&)Z8fd?J1IF9f?F=9sT4r zP{&{$L$jfYWau7-1DFl_A|%N*Nl6a5{w>_2h!UP2bfXu;=p)4axQsz;UoB#j- diff --git a/version1/target/classes/part2/Client/netty/handler/NettyClientHandler.class b/version1/target/classes/part2/Client/netty/handler/NettyClientHandler.class deleted file mode 100644 index 1f6f7ecadfd0753b13723f64c8a9885117124243..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1901 zcmbVMTUXOS5dO9of^85eB8oRa!2;Ew;uS=+fFK1tEk~cXVJ*=#=}9*VzrkPQ3yKdO zpZ!rDXPfkb<)#nGW@dK2Z+7;Z{QCX<2Y_kh66nH2Cngif;8qg1VI(nyJ4xKdJ@qx6 zzMx$C7gl(e(HmhFI3!5)9or%Mt5-xhT9%UbM-R%DE=D z-*C@TcIb@BZL7*)c%t zSWD+DH_QtoMmE?H=44$*iXAx^jDps8)GN82O5s7uAaERK<)sMbwl#45tQV z==8#LhLMvgh~R_RWw_j|+LxAXJeSh5ioO)9VwVni{$R^?EA_U`ACotGGW{H3Cl+^1 zQIQrMSp(VKqHbroU)q)o^QS(3?mhp=4Vyb9V{_YcKdB3@wJ~mTze;!Cf9MW|r~gB- zQG72zDFGSW>4x0C|Ko+EkYfvI7QcYwn90awo3)q_e`;5DFqL-EAh5E zxsJ2wW=Q5=XX_%;FstJ!<}^IhF^}gOUg*eTLBpbsCA`$Jj1>*9bgZh>p+Npei&95F z&NJNlr!is3v<<~EEn(6S|_kdB?w%y{!o+Hy&A zV-4i`jU76(#1h77V$v;`e`OKkg`*JZ$HZy47#_AruDzxf@Pk3Z9%x`64AC%G1hjV1bl(1-*O8!i1jMmXqf=5dSS4o?K5s)cR3BY6U&Oc((CHA^1SrqzPgortizK!q)3NdT{O+>2W z6N*|3dWZakhcQ>e7HF8qlmhT zhL0vH)c@1Bzq-v(UOxEM@K8jCVMpru7)`hu#WXz;H8u)UK@FsF;Hb@Wb{aF88y%a)zXd|+wm zj|6E{-s;4*oi@v%6{B4ME0=AFY58*W7vYh1jkpfUR^v6AU%(n)k^7w4_(aKz=oT&z zU7uOuBFZF@eTK%!;u0#zXIRfjvRH-YH{?GNlfx3GwgOXFz!Y#9SIF%uSvz#D<67o- Yogi;y+)Zp`ceijGCE{%24xRM<1~Bd?4gdfE diff --git a/version1/target/classes/part2/Client/netty/nettyInitializer/NettyClientInitializer.class b/version1/target/classes/part2/Client/netty/nettyInitializer/NettyClientInitializer.class deleted file mode 100644 index 9f22eb6ee3fa34411dc60db9b88ed80a4f9856a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1876 zcmbtUTTc@~6#k}L8M-YXpeQOA0i~47DtM(8ltQIRMIr{%_%v)MbaB}>yNeND^e_1$ zQKRwMAK=ds&$LUaw2ilYm@|9kT)uPt_T%Fh05_1;(TAxhdNIv0!(nh-)7~5&9_k3= zdK9ymgUIPw6;|dmIZKiwv=><48Ac3(u1t zLtDynEPsJPi%)Dagwv&hWa!FSj$GT@-IDH8v1JpdCs#6sy(wHv{RhmjU$n?ZDpwY+ zKWn6IOFF*cNZ;SDo>{VO3EO%tU1LqLt0HymBtujoNEZd+vKbQboK*^Jm{q3XmCP5? zH#RCHkW4DLA+yLZ{)Y+-?PaShZ3>NHq){m_ydKC9GJWNhDa*c9ay*Xv39_gr$Y*3v;;^r=Rnrm-$4FdL;k*OVDcmE&UbY|iY6mm-Gq=#OC(4;Y3Tav9)V z6;8pHF2h_+f|9LRhDj}88ae4~`^AhU?ZT4qWFg~k>yghGncUO#a^Nx+}}lA#+MK!!X-I#go)@)I&lQ!g##3BTawB34r{KQVo6T-}`m! zx01NFM;Xpd*rr{-|DmA4~t1}+MPobY^xO#FFE^FgMPe*_>LuQ*?f z|IhwW@Nd`6^-=k%Q}Ao=Rkr36>6Pr4(xnB2%d}bhXk!B!7_~${ofqiOAj*iIN*sW_ zqe}=E>1?YodvS^Gv8n(DFi3x4RdSM2%HL_7Yee5pen5!f(Ny>|w7m8S;e1b<#x;Hb zzVQL=Av~)+Me@YePjaLA1H?`;JMy2*#=qWiP6eGtzt)elC?Mfw1hO4KSDcbQM+Bu>jdWj?^zoPd& h&K$dKOjjf@Uo%Bc6y1}g9Xbr951_WZS}5A4Kmf&JQ=(E{(Y7Fo2;yrxy`)2vnJ}3G#RtCr z3m^QVOAV+?e}F$q-S^HUnUGZ0;=|0`$9e2?&c0{v-~asn7l7CBy@3&&*Kxr>0vG$R z2bXkQHqe8M2J(2vz`Iy9unS8DmT^T+)#$36z9*;G*A0At8&cz@jt>po z!bdtj*71psPc`)URePcA2shAhXt8Sf!Kq9*&op;3*BUZe4ZZV@>jXIsBU6iatb10b zY`LXOA@Ciyl+EX-uWLvxc&kFg&PB%+%Nvyy;TNryGFOHcJ=-c@w|qy=qs3IP=F~Kd zw>z);-h<5u$yGU~>(rW8Bg~;rzuc>OKKHad5!!2>SEIWfg}}1cm#nJtq=NoT!=7%q zCG1|uz2~h{uMn5GvT{e*K{n>o7q`n?$}EXs&0Edhifu*0)16BidQ?d5@FRKpt|(&~ z#$u|^IAV~NUt+3;ySUV#`{M3~kO`WIQfYgYisuq%t!9;ktm3s$gt^@2i(1ulWttjg z?BJ~&pocE}CFXul|B8dZhkD-_EQQ92CIK3RBmlHUMv&3?cJL%9H z_a-=_UmU_=QlK)aTrDICRw59<&O%*^o3g89&OdfUJfrQx

Z^cKenyv^sF8ZF>9zXo@fdBGOw`wvAB48Z^Z diff --git a/version1/target/classes/part2/Client/rpcClient/RpcClient.class b/version1/target/classes/part2/Client/rpcClient/RpcClient.class deleted file mode 100644 index 0038bab2c2b55276bf6fc913162071b1c2079544..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 216 zcmaKmJr06E6ols?fh($ diff --git a/version1/target/classes/part2/Client/rpcClient/impl/NettyRpcClient.class b/version1/target/classes/part2/Client/rpcClient/impl/NettyRpcClient.class deleted file mode 100644 index 4192d71fb43383e1ab04e903ba77d4e9799772e3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2804 zcma)8Yg-dX6n-ZOE`(JqAj+lGOKSnawO*N-Vo9NOYAR(0E!mNroX zA=9og(>DE!0$l_3x=at=pgI|6SqijeO|F(( z3Lixk>$tDrfr=6yGT2c9ZkIxl2@1Yc@fE&S@QsRZ@f|CyvF}xUkBq?4N*R`m$|hyj zbZTo$#oHKQj#SXw6s?LM@FR<*f+mGF7x^5Na^*aJ5s?UlqiK?^ecxg#WXD1RkJFulvJ#0rA z6tI5>)!6w~B*WQBPyRO}$X1mlxsvBgR%+5I62C7(Q|cTqIiFTYJx_*?P)IGAwig1B zWs|Sk_OhSZRoX&C*nSpV-C%2JT8Zww=_;GcNmW~z)q&co$?>J&nl=3D3-x^U=^0D+ zyjSN{c(E*7l2O=Bqd1ADBFw8wWs~gZD~6?q6cSt==F=t-bWP4ZLE{W(_8rbi;s!Cq z@fcS(iA!>B8+r~gbnF=tLw(PX{EegphB>xVB+$*V2Q7TD>_Hz!NI4j>;W#v|C?Gsm zgnz-o2_A3)??lIly+rTg-mS+-4L#){Pm$a}(u74EJGBWlLE>(Km)JAf^cZd3O&i$T-SlW?cmwU?5l=$!G~@d#6>5GQt)vX1 zlZN(E=OffqW0QOrXE24cn8P`u&tn0je87!`R!u=6{t`~&6fNi_;xy4o^1ROPEG17- z>N#>XkuOEg3&hc`iXU!K(tFh9BB?6pi1QM$mq}@c_!~I|ej=nHh* ze2&g1*!Kcm{M-KoDSGTN_HE$6OLVn&Z=i?s3-ofgZv(F{29e@T!Lf@vfoYItY&sbY QjTWC`Bm~|kJ%NdT0VHY%GXMYp diff --git a/version1/target/classes/part2/Client/rpcClient/impl/SimpleSocketRpcCilent.class b/version1/target/classes/part2/Client/rpcClient/impl/SimpleSocketRpcCilent.class deleted file mode 100644 index 84f7e0d7c73e59968809537f443867db96519ac6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1648 zcmb7EYf}_Q6g|DKk!55R5m{M{7)_Q%oQUQjAes<1Vs;^62`N4fLkC88XC^bVNxtPT zX_Z2iR9X3)-{Nnua=K@C86ssRGgbY#_w>29Z=deJ-@SeV;2wT1VhneOZ~^yJ^SOa9 zipb$h17E5Beh~%C8(2`2#Uh6AKv|Yl^H5D68Ti`3HwKoA_!cV$>IS|u@K_+X??e2ePUIhu;_Yjyd*GQeIL0xy+!b{zbgew4cC)v-Oi2- zH|?D^Eu#(JvD;gA=&E_on2Yz_NZ@WGu)}!HT5h}2i>)wldLy?Jw5^tEWy^P-$#{b< zw@nc98jhs5yCHw=N|pLbwMXLkosREWO&LY@p0v24hgq2Z03r%}FOp;}L^_bb`DBNl zjIAU#omt;!x|PJ^`qui+Q|ZL(-8ksRte3Pq8l?6#`7h9_m&Tk4WfD=~`hUqvu!0v; zC13f&kwNVG9^)BdzXnqupweX``fMwz1+5=Xw8r7e%IR_Kv)VBTX-UH=YOkF;M_5NB8ow( z?}=JzSPNYsNmVB`$b%}Ys+&~WlP8oVFj1X87S&13m3#M56+P`yL?a|h6<6R=iYMiu zI3|v1(hkKk{CnuevcI>B>HD7;7ZfW0OS>EGQ&PMOyM6FjKc3!b56uk*d|-HOD96pv zb|j|wrj3C@M}|LT#z!xsl%{*?3X}9!INPQ@%f3`Qgs9EDLZ()Eh3pFryux;rFCa*k zBiRtCMo4y*mTSo}e8iFZN;-_tBNZsa08_Z$3-gxi3-r~GklU`kWR#c49wOg7LSg&X z0gOYOSv$gz8W#^SJfEALIe-FcEjmox$ zBHKyYEBvoun)%&khI7nh5g&8K4Lrh4zS*DXT|9KL&qbAX4IH_ireGK=&o$FXE;nX@gbQy zny?tG6gXBV6mORY!PkrPGy0-hl$0Y4Egi==Vc1MXCbAi-$pL*B+;BHg;HX=QiF(!c z0xmy0>M+*LJLeg}!}GMvbmJbXBLwfHwA}A8Lw*|2#iC1OwwrzIL)~rlWWZE^X?#pO zn`TCH-dcct58Vchh0s_ekVOT5Lzeyxz+578wLrGBM2_bC`_|D9 z6qeAgS_>4r$14rvCrTM4{M(cP#8)J)D%R=U#4fhbKrPH^MZ9F+AY2i9LzaK!fAYKl diff --git a/version1/target/classes/part2/Server/netty/handler/NettyRPCServerHandler.class b/version1/target/classes/part2/Server/netty/handler/NettyRPCServerHandler.class deleted file mode 100644 index 465acff2293d50b67be09686a82fb074b6b07357..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3318 zcmbVO+glW69DYC8-GO05L@~umG!GnIGqVIE4MizH1k%b*!|(wEyEE(TEJAiZTXt4^ zy6mb;?S$GzPuKk+KK4&k?>95d?goNS7dtcG_dC76^ZxnwZ@&ZBk8gD};+Y!sV?aFy zb)3YIj!igKO~SB_5sd117N^zS8TEKh$MbkWeVx_uB3{z*GG5W}ss>ZTm<|g=)fk7Y z!i0`VOewmpV+*D=%qVLa4OtD2z}md@W^GFjdG4$|Eib>G%$znoTb-lJgg<5H z1@@JL55W+FvYsAP(1wS4LeC;h^rO=9=LGHWV;>C-XVi$rJka71%=_ z!qJb-Su*F_6w%-^0&?-(V-_Z-e1XIFjJ1E-oHf%K)0s?Nm6|o??Ny{uKL=DSw z2-HkUe>lc{ta%0CQOZ`}h+RwB&a68VjXfDAsEGIIg*t7CvPI{(_ zNE{j!Coe7-fi*Tu%bPGQIcR48V_?MhY-f@ZT2$-;sjT#;+;M@%5_?`~j|Hh{xN^+iWxhXm@1w_y{MU4<1Tu&Kzk7^E=P0=tT& zmAa9POW-a$`q@+GJ=>Q@obldFAwMOszqI2QYkX-@=b z#8Z%SHOH~w2Q5D8ad2=EG^_5aV^Q>#Pm>L_QjA1APj;52^=_Mz{X~swE^vJ^Ql$<@ zs!FxTi`hfL4R=11pqv_#ZrOJFaGtu1;IsjrR| z1-qq4kKirUQVO`dW{69v3vqD2lw*jUJ6IZp=(f~MTnR-mv20Tq_T`#xanWk|LO#z? zAaGzALoF*z!FX4d_Rf6Xms!?_Tj2JMRwfI6C@dgPnpwIXR$2KqcTP}c8UEF3C`GcE zc=bnT!n892JDB6u9P7e1{(0NNe~khaYP#|(iG&(5JU8()&3A(DjjioBAO_nyZlR(A zXWDL|QsB&wq*PD`P#En2EjD~A@E z7y_MgDas#jTR?K4^%taQQX3SViH-$S@v@pfeE~I{iOq=)ej5u|)0y0yyouWD>b-#a zpRm4u!vY#^V&iqHTgM%=A8Vs`UG!c@iV9jQbUt@7L7O$9oWq^`rGd?pp-*xBQFjA7+K!&7)12kC4rpPkgF&>Wz?Lk!jvl-UCD z53iFNx-~qh;jo4y8l{9rgM$0$SQr;{Q%MB{^wt}=ueI%0q>6b@kq6iiz}pyd#ZdI1 vqD0+M)>AKOP2^NCR5tb2w)Q`;X#ty;*JT8H^+;D~zK&D6f}!XO-cSDv$mE5~ diff --git a/version1/target/classes/part2/Server/netty/nettyInitializer/NettyServerInitializer$1.class b/version1/target/classes/part2/Server/netty/nettyInitializer/NettyServerInitializer$1.class deleted file mode 100644 index 9fc32557665e4363f88cdd320d52c6252730e738..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1102 zcmbtT-)|B@5dO9to?K5s)cT|Ts0w<3@oeLZLhymKNfV@rn7%K^3R|zc&E7%Oze*pB z#s~iZ|0v_^L4c?aroH55cfOtZW_D)w=dbTS06fFv0vz1&kjGsQTe#=qzKaJgDh%h+ zu}msY8Cu;FZql8wFU(Y!P>D4CFq8XArjp0dcE^*QL+3o!WmN(s}6d6EcH+h<6kvQ77KjYxDn zrKr`Qd&H+ajJXurlH^6QiVGw+ zW>&a}5@}?gu`#l^gfem&*K^V=SHAHLxlgoN!;&Ugp~)|3^0Aaow{ROp+S$Y%TIu@@AL1w+ diff --git a/version1/target/classes/part2/Server/netty/nettyInitializer/NettyServerInitializer.class b/version1/target/classes/part2/Server/netty/nettyInitializer/NettyServerInitializer.class deleted file mode 100644 index 7527f69c0a75a12c1b907cfe8fdb882003b339e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2026 zcmbtVTTc@~6#k}L8M<8*@P5C6mR4N_?^I9=)oMXvji&Kw*iK+^-8Q=mQ4`~X{vi{! zQKRwMpWu%X&uo`cXd5v$=}hNbzVn^SOn?6V@*TiMJV;^}Opfy$7dS?>H><0wIy8(W zNqLFmvW{L{;kc?p$2E@Y9OF9rkkw(}2FFAKdoZb^A2)UERTj5&lHBIVaZE871=p2c z&Jn&ZeTE&r^j2(3&Uw`pyCOY?)5V(bf>E-I;Cb}_eQDwI^k_^2yyCxmt$8e(EDN1H8 zvLSeV`h_KHfn9Zdj%kLTtSZk$SeUIW@6dD9_@*c{WqXZfN;Gjq1<^6?jH1vkd1u0Ik(B?9jux zTw~g!q8r$c1Il@XVYr#JMLu**JKjhG2XTnudWT3M@s?@oa=RE#wnd6Yp~abD=XztC zw}oLSHPSw$k$cMp>rEBZN8OTR-J-3TGjLI<6onr!-XP4$|7X^5*H()lo*ej!N` z;9cf37{kn&_&3DL+E-}h!EGAXcpW{Z&)_jUX{vh5Bu#9V>g76;n}tUCEBeamI=0ub zW3#fqoc@4;ItC-fd*Ttp5n7Lc(|Ul`LpXt>xJv5`hOvY*c#E?n0gg3z(|(*zlmXeC zq&zuZ(~C1qNT)~|C&_90(umWlGM*q!jCP$^?M!DrVqiUP57_{_L;O7rt0ul4){pg1 xQT5WKQ&?jWRwAAGfnA@lyEBv#!X_f9by^xS1QMg9&W8Ir?4w;L>pt4)^9QtwG)n*g diff --git a/version1/target/classes/part2/Server/provider/ServiceProvider.class b/version1/target/classes/part2/Server/provider/ServiceProvider.class deleted file mode 100644 index 2e22d589c487db712f09c887294f20f7d97392bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1474 zcma)6+fEZv6kVsC_LO#@Tv`+r1raDkC?X(G1Oz3T0GiZbj88)uVX%~DIwg^3zr+_` zHBpF~@B#jWPyT~X;yN?a3*duEbEbRmwJ&S!GxOumw-W#pScxKr5sA?#0vKsR6dC0i zi{cK()p0jQ)TBD5B<@K}3$$59$FyG?dGndQe_(Bywm^J!*EldT6~`)M){IhCpebi< z7Y(Okn*x((qjR2FFpArmoMT(X?QDbR>E^DPce3-W5uUS(mNPF9Obu-aXv_OstQKFj zispJ{Z_~7&8=D1s+E@4UMq$ISEoJ*o&DpWa0)wk1!*<3qInzEc?M%rZ*|n`Y1$MjS z#}ty0CsmdL$<)R9)Igzp!8kmmA`Ri?f>AEBnk;)|)O4;kE?u9TK+F%X8+$H+I>c8* zpt+{A4|>&5sM@CUEcLggD*eQH@LXC+n!HfN^Ec-lBmai0bJg=!Eiog}BM{v-9bXiI zfkrL-S%(^W)fh%|`xQHHu2^bA2|vGjV@4HU9j$1idiAUG*eLIC1|2$@b<83wF{k4` z=5;J!QR0D)B`oWBh(`kb|Fu|w*1ERdaA#Z|1%U`jx}pknq#6lTm5$fT_&CWFZ#9WC z8TAbkP`gIFi-cW}pF3%;3qbO`?WKw%Fx@D$uj)me8z-$vA7tNioAP7-fTNdheT-iN z!A}5n=d*=Y0C5EQpDW_oPS28S1Fh*}i1c>^ULGU(1==SU-NCbk2z6@AjWaVrOJ_E7 zkVGe+e9LgzulI}S2z`sgM+hAuyyiXS`pB%-rJYQLf>YsSI2n46o-QpJ9-o!z&(OLg zp~GJh3F5`Ou=sHLQ}x%N`d>kqX9ue$*s&8s>^8&a0wZdc354itMHg*Jd(odt{kw{5 zoGXH9bmKY#M2+DFdN^Y*k)8B-nKzl~#rhb##aK52r%aa;{SpHbgAytJ1bP2PABzql s?NeT0nE+E_iU~UO+)WB1p=5*8$;)D^W^*oY-sd^*?Y!ZSf1dpcU;w6s z!5A2Z8Ze9-^|%?s2yRJuJ%%WT_;6do9X^jrc%uPlFcw22#<^sI50j0U!kc_}s}U(o zbFvu;cVjq(*%;a}B;joda}v@F&93gO8=5}r*y~1CcNi|G@~Y$YD`|S6J4!xyA@&uD z!weDEBTa^IVybt6rcpbq6JyG-^qIn1MtA1bj7gGs%GOkKL3Iqi4}{`i-MM4ip6fYk zp5ao;uoX-9yiFyuFAc0HY0;@oT28er-5f7?1&7!#lwrXeWwcU*AWW#OsOzd?s@AeH zWqG>e6!M;)9s5Mn^PXW_q!#vahRe`b9RMC6ii5G1H1_^CC)FH{O7Lh$Zy1*0jW8q=)%G5lFpi3)?SiA};|9-5+aY(Z@fb1mloGKY(VC{qco_o{ z-jT6@MTRpXcYl5R)!w7;{{HdF-ZxM79{up=vj-C1m9d2P7`jWmMs&4TTwe3d zXJ{=$=5vm{;orFmqV%Tg>1$Lsc7f6ne`VM-~W~Dg`ycFj#5SsHwW{a7~We8Qx%x#sQ_@yvUdHhYGz) zgJ1ehOQWlk_#b3vk5Qtt+K)Pmp;0q!SKn``aW_}+vi62GK|#~+7ff@L`%_^-!81%n zvn{RQIMmIQl0VI&U_=v}=U{Zv2dbUEKpphd@e4*Dxe%?-;v9|V0rmyLkVyJ?7i?)8 zb<@E-^Akexa1oJRL`g0Ug*(E1SBt2RHxv>39noDhE+v14yp5(JPAqnWJBw)EK?^m3 zNJnG`CmD7S=L3lr`-*5?BzWuM_vqnVMVzjb#fPHhZAbLCr({+;?$ISaCFU(MaTN~u zyoJxj9K!RonnY(hb1UX!gczA<`>fv`cDw-CHmJxQE5ATK$Z%3HwE0>k%VVM}=o5-p#fh)|2WRJT#sB~S diff --git a/version1/target/classes/part2/Server/server/impl/SimpleRPCRPCServer.class b/version1/target/classes/part2/Server/server/impl/SimpleRPCRPCServer.class deleted file mode 100644 index 8c1adcc23e6f7cd2476191ec04e4c9b71d7f9418..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1396 zcmb7ETTc@~6#k|_m#&LQ6;KfsFW8pLdaE}OF9?d3ODNIsxU3skX?Hi<1@#a3U}EB{ zi7!6Mo53heB=Ob6-(md~M*U{DN~`$bb~`(B&Ue0ZnKSeG`-hJJ&SFx*pb7y!fs;7Z zjMFO4;H;En6`WIWK7n1hprRQURVcV5ham;SDq3(^MH@yGTv2dU!8L)MCCgv6O>4$? zSMB?jz=@n^_`zvCPr2pmUL^O!^%l+_5@;#~L<%&fCenBL8Fi(7YtDA8sg>e_<!6{+b}Vu!1V+gQZn!Ou}g&4^I?~X&A>%4Y$Bdc7-$r!&%hlmVC>& zFL1POo2zAc==#h0Jq{5{!*1-6&Th-$j)r!m1$KvI_4U?}Lt28U@7s>~9|f-qZF=E> zWwQ3&+Y!uqX0%6jCi%yuz$$Vp+!Y#bwZe>VJ3&5RszvVU?}%%}0*WU=1&4O2sE5J= z(aLrfhr+EjOxaH)NTq9f@K>7-Rn2O8_dhzIv)1YCisQ)B5xQ*+0}GpP&Noa8Jv`8D zJl{$FV{%V;4>WMzjt-8UTzx_ujr?XeA?CZvh)uplL$YxLP5m2)Pi;b(-$e8LK;|71 zWvFHB*nsx>M`e=go$Dk4bpBdMyO;ALyga~J0{iH=i*62}AKgS8lo)9hRXg5J=%7AdRrJb&n`8jcVxU8|WgS~Gp`k@%A#88R>kiTWL&8rGJP JFj?tw;3rtMPDTI# diff --git a/version1/target/classes/part2/Server/server/impl/ThreadPoolRPCRPCServer.class b/version1/target/classes/part2/Server/server/impl/ThreadPoolRPCRPCServer.class deleted file mode 100644 index 3ef15efbb0d71b14aa8cecf21c86ce52bce9781b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2536 zcmcguTT>fV9RDo@mV`xa1;i4u6eWa9N~LNGR)JC*-a>+ry3%`x-ZPtdDl&A=$+m$x6DK?u+s_4b*!B43nxe{ z7DXnvg_R3je?&ulR`^@CCFXs1%U%_}hMsB9^n;6u6dA%#cm;;Kmk3g~denC8;Hrjr z?36maOBzBG?y4a0wC#x5TxLc1i{?t2l%{FdGSf?@Z_9gu7z)S+vol`0 zB&>z`3I68&rhDFLy-FshPRN*@5w{rP$nos)v}F3J2?Wdrsu(-}+3 zYju_d61+F&qi{r!NGTEnF!D{5ziVhK5mDV$6x0}DOP*`HiR9emwk5p4b{!fCd9K8( zO9iI2Ib(XNYdN`UH1Cj~4O~w{WlXvgNx3=S64!0n?Prh1v9xao<>(sd#5gDMlw+*p zGXo}83|LszAq;$ufs@q7eBazDYY~ZdNgitk&Z5IW6ff&oH(+CfQ~BHduMh4$`2G8b z2j4tAxcA+!Pw(p3G>}GyX;B`kw3g(|fCE><`LaDy7+KlAiQ7E#;Y(Q0z!%`+X;#L{ zQ*0nBGm$vX)W1x>h6ZI!we8%>hOk(q=y66CJS)F2*d#|P?DRm*W@JqS#Y;=9uvrhM zLCUZRnprYCEhmFp)DqdO>vLtX<{ba1GWw5ITo`B#dTMfFZuVMALo)W??V*zBQ#;u} zuvC?9jyX8$<9Xk9f>gj)BO^mN%zX)&&UsQO?NBdPvInTet)~`VwQ0#=pn=2Ol+D;k zL9K*XzQ|8}UF5vzLcLQQmbOy(;u?}N^~yyxev7_o37q3Y+71mb@uh5%{me(VLbf#j zhDh(kD?HEfmO(8!z(9NtT6`ZB%Ri!W7oo<=XJ=6L82UbHmK#?05Z*)N32NhgPhdP! z=DK(`(HsaBB2*7y`U!HLl-9gabmLXtXkLMH%@g`H@+9;Fg!%jf(IRw5v^CUT-LC%) zsuD*~U4-gJ8_jmmkc7GcT^cDuMGH`p)`OUGB#K^sRVukS`jpdAIy-=BMH@tdRxa?{ zpo>y-5JRL~;)a~umn2ZC3g(tg@F1f cCxh0G%37@mmlb$EBYbF8DK$(`v;x=u0vDj22LJ#7 diff --git a/version1/target/classes/part2/Server/server/work/WorkThread.class b/version1/target/classes/part2/Server/server/work/WorkThread.class deleted file mode 100644 index 99c3e6c4a15833065428e9ec55ee0bfd29e1a6ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3143 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 diff --git a/version1/target/classes/part2/common/Message/RpcRequest.class b/version1/target/classes/part2/common/Message/RpcRequest.class deleted file mode 100644 index cb983fd23ab039783faa7586a72dd37d998e3f6d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3426 zcmb_dTXz#x6#h;!lcediDWSJil!8^#v?YMxr56;CLa`TYD+*O)nhtFsO+qq3K}CJz zH~0hOg$G^B7MHB$(idFIALNsW-=3KylQakqcBSX+bI#spe`oJ+@A>neUw#E}6yHX% z2PRoopN4TIiV#-9Fr!?r%8(K5HIXbCu12wr4Uw{Pa7~ui!^lMu$4Ug7 zGUp>GL{OBY8xfQuD9f%LMkS1!3cD7InMLbH#VXq;E7{zdRZ=i!@_DOtDrc6>|1Zl&wNCE(uK27A8VyJO*hdw@hn-Vk1`=JHr__*u|~>L@)55Ny}FWzRI` zy_;9H$b1Ji=X}X;fe`l7LtH^{O=JYq9MnzpK0hUQdfCN-R34 z+JKMiD!$&N->nC)YUBsl)1X)c4 zt)Zss+wB}S@5UTee+_oIdj74BCELtgpEHXN@7Pz^1Qa3}Gk;p3Qrs}h8!r8W$>A9V z{ruw0+-X9k94cAmO3qg3Y3vLmz(3c98QpTFjO8La)78yzG(wnQp?jc*(UcSHD31vPBo zBOGJh)t$P0Q0R8HvW4`L#nzL{-ges&GemZ~`V~8yOP?r}%vf zu~wufAq_D+Tcbeh;t(d7#iEs8Qy6PiayxoNy{R}3mTUAl&< zjVFR>keK8z@(`hm4-o!=vT8t}gsz@;nzQ)TQ$HafssW#B+yU#l)IG3D7~aA-*lgV0 z(wLRe!dPoI?rmwzO7a5lhpjgo_qQ;1BQ-(albG@l$Ym0%kdrydl>hOa&Mm#JMlDkz zFH;J~Ti+9W-g|^+68pFDPAfdx^WGyYk$X zcHM(9me97*Uez$hb*dQSp@c3vp+|_{Lq|eSgnUXJRO$E`omHb4*RkqayH70sDs$g> z*2P%M-Ca!M3}4WLGS0H{0*u@mX1Et*MPJ4_N*e!9;608y<}krno?+$A@&5g24@dq+ zXBhL3(Hq7Be-ZT<{jS)iVli6tYv9I+ZC^QA&?Ptm@M+|#Ru+qpumqrz&xLo*U$m1J zv)nZ?sZBWn-P1L(!Ei>pM(!azwvDbUvTuxQa*)uxlZXVFN3zLd25(nw!N|#?b=chI zwCsf~NGwZOCK??J_<&LXQHJUQkp}s3J&X@2X-Hsb}8M}nNoTKy};>Y48wEYX#cDJ4Y diff --git a/version1/target/classes/part2/common/Message/RpcResponse$RpcResponseBuilder.class b/version1/target/classes/part2/common/Message/RpcResponse$RpcResponseBuilder.class deleted file mode 100644 index eaa4c0500e362b83d22b3aa9d2f159dd21c322f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1588 zcmb_cZBNrs6n^gBI%?&m3{XLxirS5rDhx$o^M%A@$4t!lkw{1>c&%hBtTq^d7|8lgsH8xSGWzH%Z#f5U z!+dA4P@^##7dcqLP25s2j+}xCOe&bd4T1b1IXG=yVCwIBrvk_IT8tHq0yG}avVt-y zyu1>S=kw8=mT6??^E{P7z-yY~f`Z4;1eOQ&6)$_*%jj8`p*RAXR_)~~wsRsP4SmLF zw@sTAS?D`4XV{?*QB{&=hKKXw<8yE)^)8IZJ$emPdMA=duv+9LSg^p7W@Iz;k(dye zCQm0T$fk>3i0|YiFhgr5*c`@f@|7?EcL*HhkK;bAoV-TS39?dg`Ur{QH*$N^C&Q2^ zoq~hDxatHR^Z?BrA$e&az8C{dVYVMo>e4{W3LSzso*_-SQ<`WJBdpKF0ArPoA?^WJ^M{yyFyod`?6l5*HxPD#NW zFBF{8zPw#7J7oneTby+i)VPAN;FQbu98cE7dHa%`$=ijw%ygxcE6k11a@MZc%XLR) z&O6x(bw;@=aKzi53i$f^zKKP5F>*|9_%uU067uoV%5%*o~8yT*-u3Uy;zxdJ5HGFU23jY_quV8xoWSu z;-1bsv`$y-?1f2t(XBbBgMF?Y+;x z`18uOzpq^V>*h@py{MYV;F37JAjcQQ>t%&)PwM(6jiAu;Brg*a*lXfdY&Wq3J59VH z$6XjUF^TO8T`L=9Y4qCziKb-kM@@W)k7W6noDB5%H5z3L4D<+TuEAxNv(Lm7c9N?G zxYrKsP4_BS%uG8R(R}W*H?}+3a8I0_CJb;C#)ExX@4BbN(%sQqfm!eMr^Muda!Mlh z;-XWSRTvD0y9C`J%DZYzdbcq1c=a;4rR*PPkB$61JO_p65k^Q_kRPFtbfLSm5xKV^ zh7|f}mF8)Ldd0o{N2qrEUPCBdL%0U*JJ+S3Ys59^!T@E{GnSs_DTYC8_JPs_k{?Te z)IS8W^co^Ql0pM%J*_g>;`^PZpT?Vx^lcdF4Yv?Y58Og5J$MW8?|B~zc(%DQq&<7Q zg00lk(@j*8=x|e&I6B-2!;FyA>p!W-k1%=%EhlcnlnjG$weiG3@~t!61yfJ|fanbh z!9dyrWaxe%N(Qirb8ID(R#RurY!m1BO6QKI&Li0EI}bBXAt2&Xxst$E*L$sJu|#0R zCs1J&dmh2*XEj!fBb_F+y@uDD;XG2%$HgPGDN)e0`ew_BohQclUx>WyeO`BQmpbc0#LD&z z(pqm%nlc)XR(=|MnEM3L2{V=$*{zLsCr0Llz_X(+b8;ka(M11s7=txD%nUPH?l< pd$Lu-2CJKL4bQF|M~`XmtvKZ87{WBsLvE#kIG@$R*K!YH{{vLR diff --git a/version1/target/classes/part2/common/pojo/User$UserBuilder.class b/version1/target/classes/part2/common/pojo/User$UserBuilder.class deleted file mode 100644 index 76e3c451beb542438bab47b85169edaef315c77f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1467 zcma)6+iuf95IyT$oTP@NsY$sLN`NH27)pSaw0&qLq)JhFC{*eTl9Q~0Bgc*$2k}`T zl~$q>AHYW;W@0CGX+U}K&g|^WnVB=Y{`LFEPXIOSWH66v8aXWUvck)%inR<9FjPFt zKt(l$=PcKGd67abg_kM3;@xW%8!9#h6ss+;(CC_wjBvht6XI`Q>u#uIt*;bm%O(WjU6=Lr&$&kwARUZ4*qkVL9?(*lSAfz1g%! zz;4U5k4(?veQ1pPpR9qv+y~0PJGAV!^aQkh$C2KiZ4L&K4oi)`>G|tM%kA}C$LPCV z*I@rrB#7$REJrFIw^o@gb|V@ac0FV0rL<#KW{gcVxn+Ud<$ne6YfUF3h)?8=reP>;@LJlCrm$GAT(ATqkdZY-)A+JCy2IQm=*= z0+%qHoJVzWRvk;zfMPQPabpZrz@uqE@tJ{`83rohaR{_SKQ-n>KS$!YdP3cuAVy#O z49V$z1~lmtn&`5HSRaW2#;Tn|Jw8J!pFTx~F;6j<*8)98B7ZH=<7~f9`YE#i%T)_= UDJYMauiyd64CTsE_4kqf0}q@xBLDyZ diff --git a/version1/target/classes/part2/common/pojo/User.class b/version1/target/classes/part2/common/pojo/User.class deleted file mode 100644 index c59ad76e871c8288e82107f6b3db18e655dffb52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2753 zcma)8?Q&C96kR8|UrBCh3H>07TCrlAv_ugFQ;GMW|VVHCF-DmB6)>&tto&NRDufG8}iESI7q@l2! zf`t_suF9}#V=c}3QyD%>V+_~Cx-P@#@_EC?7ikP&*}+Yjzm(yY1JA*_gR*>W2yWSi zZ{sV4%xc50pKk?~4Zp77&R45`{X)fSH2j7_BG^zkw6N`c>lG_rb+b5MZTg#jeOAF~ zF>cA*@fET$z)G_oR5!VvZ1}gkW6#%W72m6J&0cTscWiQMVb`lSPZZ0wot;{>xLez< z6@}77j2A3S&lGMKc3lzTG^|tdG$c>QIOHx z3V6K3PuZLMWtdhN=o1ciCEq`zMbL^IvwQQ-LCuCHH#*se+teDjA)vF(NE{aJA}EWf zaG$O`?QKGY|4qxQ@JL-LF0XI<<>u_vbp=)HzNcu3`qi3Sa`U!GG9mZvgdS~%&hREv z+8f#fp}Vy&&jG#GaSW_9z4F(K-fpNjYnIi<#AUB~QFzka@)}$EN|TdQ^Q3WQd4BOC zdD6D(exp@svW7wu#)Kv?(aG;LYg!(H&ji(=d6wWw5n?tjVY^ym;zz2+JaHM*E45a= z>|Y9`vQn!&;Bl!bg`@vpq%Ib)=;C=Caq$9Pbnz0#6-N69x;T%wT)c{7E+0FsY0S9D zqu}BK-d7mwl(J^L|3V#MH5qKox!A;(3<1k%db};p93`0^r(!hJl#7p1P#Ef@(-*HW z9J+#9amDA;s082Z=VW=iyMC2bFcTNDU5hc;pM5+WMA zUP5#WXG+I;04d^*67>qd#k#xEg>-Oz}&J`W$NGj0c$zzf{Esk= zdxbw>{Qxt0ukbsp#p(PW?C_I@voy`2WX$}DOwM?OgLmQ1>M;&$GZi(c$W8f^%mk*$C+weA9OgcIlbnUUlD?wTsN;;Y7`-|)d&Zax zB|kDWyG6mBp~79*Gkb7vi9cO3WFconD~?=)UdoiraEUh%201x1TsqQU)U$fSh*lEI zxJbd+_HiYYE`c;V)rX{- zfHubHc118N2J0Yuy#$jco2b?fH>sWUm6H!Kz%FzkJGh4-k#G+OvsrCtIAsrMJ1zcU z+Itx3Z3epDbQ?MuNu%UfB-*Rf!yaI?_w5}FdqHmxTfkBje1k*{5*^MnIP50*>H9G9 xGxzbIcbpA#~^mdYEJUp0!Jz-4|Vcze%rmOoVavx6K`{{m*o=wko? diff --git a/version1/target/classes/part2/common/service/Impl/UserServiceImpl.class b/version1/target/classes/part2/common/service/Impl/UserServiceImpl.class deleted file mode 100644 index 9ed2ee720bdf9012a29e2a6ce6d6c633af20f957..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1965 zcma)7TW=dh6#gc5vd(&FTIWijr70!YNz;Y4(3X^zCLv&OlTs&vgzMU#x*OKJ)_NVa z?|>>K1VZrAmr9W;AtAMehfUN<`~ZFjarhO8GrPWRaA+U)%$}J!-}%mEX8!!=(H{WL zpsZpPS}$I~s|rr3h(L?sv>eY!@mdV8%kiv=b2zWy4Ha={DyDHk#hbV&1+87eTT)z> zt1~KQF(=ixrI?T59l8HqDbfnwQ}Dim3`5Ta!!q2943T7Ng&{g?7X(9J#<0XfwUiUi zlAbeZCXuo8y1Ak|hSckmQTK*XVVKO6b;muW9zpgwSP>QGW*;3dhl{f?bk) zeaNb7nA$aejtrw!^2jitli$){q;fZ?!CVsZ2tA=8;+~^K#FS&y}Nh5 z+WqMl+QE^?+v~2AMZ(?J6bArL+mXM8)mV%VlBhZKois)J^*&nhZnj7cl(a z{V~@LP^rYp{{j(;4D;n;8*2&}x$9<@6kb8l0OzNi?GJPmi1y$26^qv?>B+VBBGz|M#F2`) z$q*vbSbWMfcl%{y7~Qun2mm zXk;{YPi%qxMn7G6fn<+A*@vU_&w~vFa*Q;F7jc}VG~OhzD2?;Kqw6sut6PXBx;^wv zdQcKE`ti`~L4AxkE%7VccxD?1JoI@uNLvn_@Q~O>zlQ-2g9}p+2`TVCO8$Wa`53@B z25}lgIE!J-VZ>)N5qPaLBL8$JjT5JFT74NwLYbp4g$X~{Nt~$jT_wGXkjL8i4h4LN tn{0{MNQ;W<8yu#L9r0Zc1prOgW4;@DTrlO+KZ%cNRLS8bdNSA0`!AQV3l#tW diff --git a/version1/target/classes/part2/common/service/UserService.class b/version1/target/classes/part2/common/service/UserService.class deleted file mode 100644 index 51f12d341ed0302d147c7556d325f3d996a21004..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269 zcmZ`!K?=e^44i1SS_OTAM|;o(@z$FMp-}K3K47h(w6xu_)`DO2-~)V=xLX7f^pb?h z%w+O--tGX_7`Yg_@CcKH>%*D#=4xwrA}r=nCL1YoStcSZYfe}PepE?auSBehLY1OY znG#kI5XNa~hSuaQ|3meE_!7Lmy6Bj=(wLVv1!4B(X4ZDs-hT6p>XUbO c%s8(51VYC=3UnMo7Y<;04}F6WT#IAy0;sc0Jpcdz diff --git a/version1/target/classes/part3/Client/TestClient.class b/version1/target/classes/part3/Client/TestClient.class deleted file mode 100644 index 7e2734218b45e304333ee315b0b8300e84580a1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2032 zcma)7+jA3D9R5z4bdz+oCGM=!}#pqVc^|A!0|h~3E9+kU?0x)clo~W{Lb0G{{7<)fYYeO zaS$gpoQfl)`qQd^Hjd};d>_I%6T?}|YM6^7hLcg8Q~mik=JA3Wv3U_Msp&!-X}lc8 zE2_T`$E$cvjWVivT}65$imY^m(XxZ46%QgZGpam7jfCKH@5`FyVF$FYAdH_!E6z4QDCBFTCgh> z+e+1>vtbrwYL$bWKUUD{oC+N1wyoOhwr5BSQ5OiAMZyb!&seT3Nr&6hI8=QA~9_hC>2}yQKLaX0q}P_C~5>8Eb5qB4m>Skq;tzF{QPE++)=|Yr0tcI4e{(;<-LJlFe)f}!&Ln10Wgv!;F76$D z1O_^|m-6ef;0i=b()Er};Ak=+ce-rUYIBo;72kvU@9RWq9g2XqVU+7~>6$9JOwg-y zZ2ionDq&$uwHY4obTDDtaB}au2*A&6)m&MjV0N7(hJ2W&omysvyR36*REV_Ks8*%5 zGgJE-1i1N2ty84qa94HQuT9G3+P;Uzp14AbWH za4-YKv|!t1X?U;J<)E~!b#m&d$;}<0+nW!mO2ku{_jFGgnMOA)QuB(nRi?XZ*>yeI z>g_1&)~yNh@dauZ8=k-z|3c~uL8#Y@?P1PR>;?PC@tY98dE1Y(?e!K1FwU{=8!*HK zXE8j9BV19=|DcDKz$e=XUAl>$?1@CUfykc-Uz`fxLho&8AuRrm=r&^9k0<&X(5D-C zgk1xVHqd_y0|P}`Hn1;|Xkb6R1{)Y^V0bn>H5$H+kq~Ahfd~iaIvQzU)c5Zoo-3XBFs>%2=||+UkJ~j$UaWbG-DPJ`wwH6E>i#i diff --git a/version1/target/classes/part3/Client/netty/handler/NettyClientHandler.class b/version1/target/classes/part3/Client/netty/handler/NettyClientHandler.class deleted file mode 100644 index 4d071692d59052c187a26d9628da0affd4ee8f68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1901 zcmbVMU02gU5WU+Lf^85eB8VS+C|aNz)G8{7U;#lYcv_A=Z^K%mY0{H!6n=xh#upSH zJU;uQJkB=h2UY=nNH#OGbMNfzo&5Ou^&5Z;a&dHHsteO`q;WHWTQCxs!R-X@;I8`0 z#BmSzRUo5bHVz#RG(6Psh@o@daxA&P5KT?KVu)qk9l_9(vmCMMmy5#N=0%%4$((C) z`xW;rWrxm~+_kCb|Y z8M?eMonicB3LwBhHwUmMf+m(1r zom|IR^e`myFSB(KX_(jX7z-Mn=vc&(hNn8RSk|zjV-?SItYKZla~&Hhbu^Iw-$kio z0OuKQ{?nK+q}zt#n3gc~H}A2b4u;_dNSj6(wD;Wh#nu~!nN-Uq7f8oWX>PK4CvCZ; zx$6z&`i=c@W{D+?)5N4&Fn`M;#G$_-(vOMLa52obNUpu67Vx7%!X9j39}UqkR|U<> zKx+e9MA~86t{Q^zV@hB3m57O?2kxd{HxL6;@}qYz zSq80)){d#qV4vtCf5cV;B!h%##&Wd(#K#qH@lJl?2B;TZ;`*-UTFxK~*st>~B<| yH>%Kam1>PNnR=J0851E>hVm3sd}=!V9q|Jsj%#N;#BWv|!F9@x;098)b@CUT=J4VG diff --git a/version1/target/classes/part3/Client/netty/nettyInitializer/NettyClientInitializer$1.class b/version1/target/classes/part3/Client/netty/nettyInitializer/NettyClientInitializer$1.class deleted file mode 100644 index 15ceae66cceee21520a111deb6da717458874035..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1102 zcmbtT-ER^>5dSS4o?K6%sP&_Mw3g}t#AsRi@>qTpN!YXMsmYSMNjNP@W^INS!C8Q62MkU} z4+TT1E0yR?js_xm!v`^GDqS7%_<$$U$}^>7AHd-6D!da!oEqQ8Z~Q6sw^gX6eAnF$B(j1|8imQcHc+h*hsBX7u)2}mm|f^ zBq4|3e}c5?ZHnXd^(2YJp0p)d|93+k+VE7uT@}STrHo$+GuA^F_k7$(;KRjvA4Sw$ z)O|Eiq5hw~{nZ_Y^5Vg-28SXt43DLrjnSB^VNBB#QDdVp71Tf)CvHnY^F~#BJuP;^ zu(80&ZhG46>4_T7Ysc{X^qDfO*fH%;LQ2F8^`JXXGMXyGR7dZG3H#YGvuxVA%md=`)g_q19HxLvxJ+(W$l9TE4OcV2 YYXo^c<8EL*ySs^7C=q89cj%<=H$KTH5dZ)H diff --git a/version1/target/classes/part3/Client/netty/nettyInitializer/NettyClientInitializer.class b/version1/target/classes/part3/Client/netty/nettyInitializer/NettyClientInitializer.class deleted file mode 100644 index 322f0e7ba0fb96dafb1c062191a1878b0c60991a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1876 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 diff --git a/version1/target/classes/part3/Client/serviceCenter/ServiceCenter.class b/version1/target/classes/part3/Client/serviceCenter/ServiceCenter.class deleted file mode 100644 index 0cace88dd894e1cdc6d6616d19b66dd7e7f483bb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 212 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 diff --git a/version1/target/classes/part3/Server/netty/handler/NettyRPCServerHandler.class b/version1/target/classes/part3/Server/netty/handler/NettyRPCServerHandler.class deleted file mode 100644 index 2d7b34d4091cae58b2e7ac61f6cf783733383976..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3318 zcmbVOS$h*z7=BMlGVL&wvdW@Tkflvqf`BM3AXv6)TS{9&#ceu0G((e_FqxEA+;3AM5sIN0RUc^f}UdAgLUe#b~7}H^4s0rhc zjX0}g0$D}3b*#rZ4U@`RPD5UUBe1k6y(!z0L!LWjk4sNrTYtgy{9Tz55~PvbJpPWwHP1G)0QmwHbpeJjDW11d(F~B))zQ<-&p(4nNwyaXF3y^(X8iQP!S8Fo3zZ5LbPg5 z4uQoJ(jSg-A8DHhc$BhvIAYgQwln2U205$(J27@nT0R{YB(&Aw8J1^rq}WsPL_vC{ zibxz96(=t)7=a}=OUpZJT5{0L|Hr_H@7c}-CA6s61yXtGXWemubv5?9&>jm?(a67K z#5b+U0kaSkSvP83k~1Dv`@VUy6z1`OitLD6@+^7OR_(TK&bHaE@@L>t?9|{J zC}GOL1x#z0G4L8L8h9OV7s6Gw=@HHSnIIypInwd}!b!d~DznK4Cx& z?82uSE*tm^p9^fLR>+_`QnIpPTH*>2XsvSe<#KYu%pI~U4wD*|jw(wfyL~J{D=4N> z(_@v#+)Sv3FARK%uQ+7xT)Tbe=c{)v{c!jD%YR+@?(X&L8ooC04XzltifaZA<03(Z zv+|yk%)rCgAh4ruq~6C=66l;YOXo?ez>2D)u|ona)!VQM>aN0y5?E8^sst&FwZPUY zX})eG<1Dyyj(+yk1<&^7A!qz(u2jql?5^$jN{!F1=}6nrlB#-^Xwu5L!9;CqUzoWj zIPnzZTrF@c_(6-0dK?^F1Z}FjT38f)_0wb}tyCis&yy{6X}#B`WIs`(nhRW?j8v_| zk*Zql@i=UxRBz5Ka?Gr#vmacl@kE9&QQ^!}=ONQG^TpAb0xc2snHty?v87c{BK1wN zqF}dF=@GoyT518;*9>tfbs-M!mwF7bb9-x}5Z%_Ai7TNBCYEgt!#-EjRTiyQEES6! z1p<5KFw{QJ6pVLOZSTw!eVJ!{xFv4iXl1hChr$B#q?xDNVU^WibLRwAmg8ToRkcVe ziC2Gg&YE^kU^8>PkYhdA$UkrE`L9u+K}}bFC6Q1=hUZqE&hee#dv&_=Cd6Pz*KIU3 z;B?1rED|{VBPk8k0W1%=)*?lH&D6Mx+BWe%9ZKU7Z03o2umxLbO?_=c8>LfdK|A>t zp@X*x(mMI;!uANkFi(p}F*?gg%(B}Y&^A!66^n^P*=!B@W1B{7(?AA0sJCjVL9HBG zXk`d=%B3iOtfP$NK>8P?Xi^&#-HEO;8hP2opI*k|?!?+e7r%`%mUJiACU2qnhI*H= z{3onfzOsx}x3KyK)h*)=+Kr{ryCr%rBV{8ErJ?h=nIYfGptX^jrUM;xy^~U1*u$?L zLhdDK<=Am(yh#N*lcX-gV|*qR36)|9b!Ze2#8SC4en=Ia=x8yJed;QjQ!D=LM_ diff --git a/version1/target/classes/part3/Server/netty/nettyInitializer/NettyServerInitializer$1.class b/version1/target/classes/part3/Server/netty/nettyInitializer/NettyServerInitializer$1.class deleted file mode 100644 index 35a2e4a7efadeadf30513beeadc95e3218af3fc7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1102 zcmbtT-)|B@5dIbpPp+pRYW-1vR0Tc2cvgK;2tG7z(u86nrtizK!q)3*Ah^D#IBw zmTC1dL%Vy-6Z16ei)1R2Pzhr`%;cVuM)FvGB)DhcnaK*=BA&J+vkt?{;50<_0|sYX z4+TT1E0yR?js_xm!v`@Tm9CC>e83ZF^*QL+3o!V5N{M7U=4mQO?VKWs>K5I{O+>2W zDMhUX-9tX*Va(Mi?3+ZYQLDZJWiiR47}?-Gew1bUmkWcp^F9*CMrxJ1sF6cojubbO zgdBqZ3DRzKD2~_HlOz(m(w1c7-wkM`?jp%(28OAQ-U$=-vt@4CvU8aatStSJ zAdSjfo!GY1%W~+6(OUp3mu-pZ@#W|*!XtEzb{*0!;x(FIz#3nX`<&VMB*}|p4d+O% z&#Z7BWzxt#V`F4-0TtvkuIHp#u0r!0@}Fpv!;&Ugp(!kA3b=?%$cflh?*E5^beV+ zjT(*5{se!FcxJnlLfeS3NoP9e@}2KoX8QB@m+t^B;6W0*U~-)0ILC2bd$YQ_szbwg zl9U%YF6rpSWsWO4bX?`Q#xbFz4_O@su5(N#um?AE^y8+Ey~^U2PLkUkIgTj?qu{#I z%Q?dLrO&X#m)?qP$vLmOVppWcaI#nvUNCN!NFhD57AeAWi{S)A(su12wxHH#6&k{EvoFcMv|eoX4j-c{1}GXouXvs zA{&C&r(amI7T8tS=a^>b$*S^9hK1Q$MO9%Acc@}(;Swc#!4<)>N3>?U(rQUO+iujc zE0ZdPQgzw0WZqVtIM}(6XO_f@Fff8V!_l@{MpW+#x8kT_8gE+AL@1GIQR6MMDBXo% zF>gz!a$ESalJ~@OIVF{nyarSZ(-H21S#SfnAUy*q+~K%upn!V}nZLu%d9o&5f>W;d z8P0ccq4^IdN2t!359XJo6->J!5#?F@H_v7Y*$plKr%@d_rvlHYWtQP=2cWfDh8=o1 zmupOWRCELTaX>kbF^o2ow#bLBX~!FB;2;h$TTU$Lq7GiD|}S5i7gR`r^4V`N>R9x z`k&WGAzW^`>T4Zs+>VVi8NSsIrC)XEJ*L+a$LT%aOMe#hq^VxhFAZ_kLpmR((=Q}R z0=&z724k2x75|1aH|@viL>Z9H zFy+bdnqHhyLOMaxI7v>@mqwgcmGLBLVzleTYG*q05d-USd&maZ9pdk4ST*tWuzsw6 ximI0;ox&QAuoCIa5A6Dc-JPL~5H=A(t<%zwA&?j)bvoS7U?1%|S@+RSpFh?iG*SQn diff --git a/version1/target/classes/part3/Server/provider/ServiceProvider.class b/version1/target/classes/part3/Server/provider/ServiceProvider.class deleted file mode 100644 index de60431983f58a0764007a03ef2ebb1c678c9d78..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1951 zcmaJ?TUQfT6#mXkl9S7D5ePI^t-YWSgj7LV38EHjO$}&`#iG)#Axy()NU|mqy6SU( zNniTfu2p2IYx&T}{-QorzcZIG0ottO%-NT-_qX@{&gAcZU%de^hab`y#zG21D5_;q z;%XW(U$Z1}Ee+`l*OlXqG`_&HT5e|WC2mQ4l}0~qXHde|N^?h|EU_YR!fv>h^P^d{ z?m5j}d&_bJ2Fg#(U9-?}?RsIwY!wAk6}#3j-Hu}kT<*0l`eNN|)Cv{Xu^Y8wM00oZ zsa180ON+lS&2(%f2g;bc zZMOx^_u^;;{R#nu{Ud;}z@`urS}AO?KsJgfXpRCDuhz}y&pD0=;N`m6ZZnz;D(-Dq za9AJ{m{-jm7SPw7r!NmZJ|^O5ZN=d9r zObeuImK)SBa4uSQFzU%ju5K~uO0(lsty{Jl#z=5J?Cgx9rGYcJYv3f_H}D>EY}o-> zZ=3CHqA@UntibI5(#GCt)eDdA1Svwc890U02JYb-iTegBcwpdLtVujH@Ez6#PI}oI zmRl%ssWhw4EceFNmSeTs3fTt|j|@D<69XIgUSPZj!+%jmV9*QeT_V31Ju1Ir0{VpF zN|K%RxFIk+5$$3~n1O>}fuH0NpAREFC%U(;j}Bd$lIwIkGIJ84@1WQ0GXb?ayvLtM zryGp&=y0P*yYs%#)1QFJ;V{CR70N8#>An>%Mw140_(_i)PEmDEXO)M@7$7+Y96scG zc9<{U7&JvF@O?r_!x(>Lp0_6ry(d}2r%oSofa_UGKT+2C9MA7VamC7nlX!xC?-~I%hz?=%H%15^@z6|xM K)ug=Vf8`xXd)Ui?P~wk*t6|>EFt7LH z31El0#7v?l6d`IK38Fcy&nzL1j*vIW)a`ip#_q3!B`i+PwAN47Z+bmx!piY*tA0#{ mZ>0Vu!ZOv=pl_WzUV3X{Ng!l=4`hNrAOO|^B@=>79MuO(X(T!T diff --git a/version1/target/classes/part3/Server/server/impl/NettyRPCRPCServer.class b/version1/target/classes/part3/Server/server/impl/NettyRPCRPCServer.class deleted file mode 100644 index 4925c1168f0a02fd1e4428431a014ad820584233..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2316 zcma)8Yg61*7=8|WNmPjCON+2j+GvZHLNB(+O&5wR7VD*&&8BQ1Bs)nK#Brvh zAL>jUFF(L9e$p8~bn57K+Rmt-{T-tJLVZpWmZd<)naw#T?|Gl+ytnga|M=(8uK)&M zD>$Elz+f|maA6lNW^f6Y6}*~38iR7UqTs5WhZVfmj6)d7par8+GA4)d7EIuEIlR$= zJSHXCl!9v+?8kHl?HE+>rh*v-1%X!I^p-8doc7#ht7LitJ^7061?RK^H%w2f#2evz zgW`}t$`7b1kjzc=UgtFImP|6{EytXyE)`90RxjF=Wb>|}+t+o^lJBuFJlOQEx^CbH zo?a2?%3H4Hm_e|r71yP)6?HA1y4xu0j$_)R)u8H;{rCnf-qD5|H3$)*+Je5UYqsvp zYZFdjdS0~>n5B`A46_ngu0yqCP_}%5{>=f90b(4irHZXhN$X~&hxv=bBT*Gs20=^+ zG#6dpAM@NQy~%Ag%b|Z$mOHX+IzirbE1@PCnpa$JF^26f1iG;}saL`Iej${_*;esBZt~h}s@|xa!f}G(vUJ<}n8^$sk2o5{DxSe%>C{Uq zKEQ`6bQBdBDoQXV`z;0YD$4T3!h*oDr&pAUMGP=Mn+$qtH3_tBP+lu8m<9{$=yv#- ziV>MFux|r0TlUk0Rni^Ehx&}~v}ZX%A@EFniA5OEY!(YB6{%!9 z#N{Gjc!7wrocSSHQK|W;-pkt*{1cVF^+r6Q(7U0rV}a0AC9Vm9^NmIg+q&-$ZOd_` zD0_?%H1-kIC|h=ETz5*gYuOH~d*IP z29~WEu47a^kKIhG`_md0OxVO`B^aIjK(+G=)WN4oUNC;-5?mj_QI5v|@fng(DE;~| z#El1NnvCbEpODBVYe+ptnsQ|@*^%r&UBj+ya}Al_k$#Mp8+|`ReSqCH?3wFG9*emc5SvgQN*I&cFIl}kNeUEO*Rl|WsS#~hJ@!FC8?LN(F$4y@1{o#C@ zCN9E*oNwdPa8BS^zRgerbaNN=+URIIo$I7)L)^X0RURkF(*pxJc8^}NbYTh4k*fzQ zlzl?kZLaTd{RP)wp%2H&IL@$i;v%0Dv?Y%$dAg7yHbrzdWegf|InHv`OPrt;pW_tz z8SFN)p5`inGu%In#J@Z`sX!A7p63soUnnRzyN9rI{Ob|sgJ32_KKD5^g&w9uffib& vMw{`uLbl5oc!}Cg#ANy&;9%dWU!Xq8us38l7-`il&xB>cPbgjvPkiM+eTi|r diff --git a/version1/target/classes/part3/Server/server/impl/SimpleRPCRPCServer.class b/version1/target/classes/part3/Server/server/impl/SimpleRPCRPCServer.class deleted file mode 100644 index bd2c8f6d9cb2538a73d38323d0dff2d4107d12a7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1396 zcmb7ETTc@~6#k|_m#zy)6{;dAqSzL2Rj4-*FL*=CC6s7*T-FV)w7Z+_g8B!1FfsAf z#226R&1e)7NqjZ&cUXUgQNP)((keW--OkRO^PTTp=FEKg@$nOY5lksKrb0kZ;5be+ zc?|ps5@XDbSdn%-rT@!j<-IdE2q3S4xYPKW{7+ zDM{vC(N#RjBuu9wtcZG(VtuX7`PEZJ#YKeRLC*m5hfZ|C|(V<;B>Y=be zw6dM0(Qs=GQ}z=H(wUkb{N1LbRkNDj{f`bv)jFM9aU6L%Lbq*UU}5vk`-W+umj}9? z=R3)NOzsKqfdbkk=?y3g8)#k_%DzWp z9qKxEtU-JAvob|>>syilI)5#s-NX4IULN2qfxUFxMK}8~h;AZ!c;_78CDcoeyo{Qt z>%=}{8i?*EuA3nqXD~g)#fZt_Akp&4k++Y&4s+g#*mtxmIPy~(DCp;rQ*e~pG&0qs z28ff9iMJeLVPNr4&>uS2B4w4H=MMu_!*QaeYc;!$w(P(MB>rYdh71fsqW%P^hP7oR JOjddv`UP+FPE7y+ diff --git a/version1/target/classes/part3/Server/server/work/WorkThread.class b/version1/target/classes/part3/Server/server/work/WorkThread.class deleted file mode 100644 index 05f64e6782a4dad9cfe18a01b9365ae622317a9c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3143 zcma)8X?N6Q6n@gqG;Ihi1uB%aWo<<0MZ{qie-4ftNh165dw z0R@8?QXt_$8T-V`eg$znBrXSJ98{=tNGv}rE|17~RK{Zp9*3r&3d6!hO2G(p1*xe!BHF&>&JzQCuBS+<0%+H z)P(LzsO>(iO=?L~cawvjs6#@vquY~4O7FL=Nn=Epu(ms^+3xz}AmzH9%=&WMdoStP zG%dGtCa+D+`y|9VEn!^KZJ2s*E;Fp#L)vhflDXYhN=xt4Y(u;U!g9-UBrNga7*?`x z_^_UG`*LnJ=MK8Iu4ROK%b?QYo0PiDu#RG9Qv>>uobE8Z#sGQB%494v*`qs-Hl`;B ziYjzE%QJAYmgx}OiWw|?9hyi~tn*Q%HFGSv>sU(9x`t(PE#{63kgKDd2}()bQOll4 z?&oD_oFR=+efFTMr6zi`tjB|lX9#FacL($Wpj}NfAo9ZOXr4i%h`GWrC#?yOelO)7 zaGzzuXbMF$ppT}>y)mixWp!HGC*2;KZ#S3^*MGsz*P#;wfRi28M@ruxTRmDlXCSkeXGqRK{m2KF4|DEp60m4dznger}5U zM4)t~)B2c}-kD0Vqe3c)l9NJ;yI6K9uZV^;o0VPEW|n1qq2fz?#hGyZ?9bPKJahfz zg&XHj{dxM_jf)p$e68XeTu|{Xz7x!nqm_|CG<{P^m{UUG7dZWwL<2d~^aqj8c(j8f z)_yrlSXi5sVVyDL$IcIpYj4%W1&r z%>g%Lb6${J4{2n4M0Y9Svg-}ETXC7we}Mi@}wDqu7kMPBe{_uf%#H z+)QNcMA<>EGw;+@mOSZf*8++L|Y)|$sW3g`1*m&a}GvHDmmpBLn@ zusvQMzl!=x;-1ISAFyoh@;n-@qVW>l`G^(;_r<||NhIqH&}_mk?Dlv8 z7DM`*bj4-tk+D}smyG*l+z&}cHyPM1L0yjH{9Oh|7{nI&(fWG^-i$V#8suhP`AbIIgD7|7~k zHLp#tg=kH-!u@An@=u2_{GQkybJo5`AOy{AfI>nCVaw2M HFhK7KkGVXY diff --git a/version1/target/classes/part3/Server/serviceRegister/impl/ZKServiceRegister.class b/version1/target/classes/part3/Server/serviceRegister/impl/ZKServiceRegister.class deleted file mode 100644 index f281b3c325395a52ee8f8fd6779c7fddd00b6add..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3883 zcmbtX`*#z^75+wktSoJatq>q2F{Y)74GxQq2`Qumql%(NHmc=1g|to9tFgUU-c?sC z!0G#uG$l=%K1qQlO+uQ!Xp=ONap>!}p40!socss78z zFJNR`Z`v@6rZpoCtL&M+>lss?IVVrK-mH-fR}L>P>=)=5J9>2diR|$B5rIVJgn805 z3Z^q{zuU-3@1*pM68~&Vj>&1em9N9kUHb=6r_h`>E-si0qTzG=;ln8m;~tBx}=UiH$V(t&LSPL(h-_I;dP=q}}m&Gu5%2TlOq@ z*j5p+VHJftReb5#jUjvA^Mb}|C+h*YqUF1$p1<}_j|FyrgeVhe8<`)=CUyKo3HvF2reh}z4L{fM z3k+#EtK%j7lGZ)ty0cOirPuSpKVH82!W&ngeR1i`D;mz}IFAcDeub9>Hm=O5LuI>= zmmVX_(D4d>t>aa^rr~uR7x9LU-{4IRzt!#QH2g`&pYfK!fhI1iC%0L& zjp1ZQxop~V%T7Ma2p)Fwhvt1*QaPyOFg~N>ZCoOKbzHTOX3k!{bn)ti=aG%uYRgmA)P|>k~%L1DNDNRFD!=jG&aYeEASAovDzN3>Tq{Rs8 zUz43`9xT@c($bqwtHc~y(+Mjp++ovV31r34CYK$r)hN)@jw8Kf!7P;|tJ1;VzGh{m z?&0eQ-&PgKlJM|H0k?dfHNkR;$nwKf78q+%xNaF^Cygz!f{ojA(k=TVw0yWXeam9w zLGp&>SK!IsX0B|k(6_9x!(rVm@v38~X$#m@mHtDDC1($OD9)&hx1q=QZ3yYyJnyYJ zUWxQ)?Y^*GBg;EfktxkNDhhM%+GPf2QEe(XJlBkEMtq!?xiy2nct15Z@VAOY)gK<3-*R!~G+w5G^eXGFG;3?NrrAgqv8-NKb1wGep z(S<&FzA59A!RERRH%55P2^Q@@9owI*>G2*arKd)v%uBj&_5vSM5KtkKlL;)`&Y-P{h4`vlVA0nzv z;8(?F?7{%o2KgL89Ibq2!^3e8SDxcM!v9CMFF;&D$bm(b&I%N@GkC5bXAaeI}rXL$8KmGH&X0f=;Z8fY$2Q;JVK*ko91y6U4k1b3eVXrewEPzn|3OkiD#|ssQdLTibEYU=HlDuPMxzp+ z2>o_n1^3f+Z*fN?z`8Ebw})SJdvPy=qRvov4MR7MP_y8PG(KC?(-xfEv_pyR9l3(O zWBo0I{jGzS!D!l1*Py;;L54N*tEBgY=W5b7;nBcC4PD4!gu5dc4e%Ys5BMLW#tD85 IKZ}n41D$tcEC2ui diff --git a/version1/target/classes/part3/common/Message/RpcRequest$RpcRequestBuilder.class b/version1/target/classes/part3/common/Message/RpcRequest$RpcRequestBuilder.class deleted file mode 100644 index 2b9369e8137d6128e551f3588da61a8c40164654..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1979 zcmbVM>rN9v6#k~SZR=v8KmkRmg3^{tMeqtm0WFslOn{IOe{I{bENQoOyEWmhG(j+u z_y9hX@yyPq+uBA*fApL)({H|W-`{_J{sORsoiGNm5JD7Bg;*3~Nr-0(o`(^@3k5I3 z2x1|KS3AvM02Ow7cE`Zj8gi* zGIgW0%n+_{>!ezgh(Jvh!Kpc7{eWgiEAc6JblM7 z@~_M0NX@kPa!u#&MB930RJ=!)mTorgZd8UgVm2oUZhb?q{qtyj*N(S`=JT8$gj&$%wVoeguBNru+2^m2O5G_^C@ zO0~#&?XcPK>9(MT1m}(hbQ%wOb_BDTc5`y z#Cc9&J5J#>)}6?EVtzHG^4_!o|8%rqL?|j#KAUz;k%%=cAwh5=!@SO5V|CH)uZ`z8VEATA95< z@c0s;X!ruR1TU$mDs8W@`=ssrf!pF3kw?FC?5E=e2L9(g>v;Fj_=uK2!4&B*d5=;~ HlL-9neUw#E}6yHX% z2g_}U;A0s+k>RoopN4TIiV&8=Fr!?r$dDE7Rgo+iu12wjb&+y%a7~ui!^lSw$8rQ4 zG8ZB!Mo^NY8xfQvsK~AzMm3C^3cD6c*#+xH)vDMhtGWEDRaP*j3k9ouDsNUQRz;yB zSFo+}RWobNnH!cueCC>Y)6C?}!dhn0F6Rns;|kFY%U&<8x*DO9SvEIlx_jBDJHK+x z%G#pq9xvT0$!&fW$0s$~7ISL_)2^1O(6d8fB7K}Xp^01}XCGIXN&1|4fOhWqZ}E`$ zw_MMu3kuq);ws(7W^x5em6yzwyz}m2*34fp%Q;zlo0`3z<3sn&@J;rSOt!eO zQ7mL;txCmQvoej~5^(QKlRaPW-7){aJwPHOZwRl{a(OJ7dKR>y21<_t1lzS{+0)H= z@8(r4GT%YXSzq$oxIXXYzbBdU2f5Awv2k@=67XujUX2EQEwuC{1iA4uh zoA7a6!`GYiyY=AJjQjw5niLyk>EF3u%Rz`$W#-9^CSWxmmlRa7xt8kD(Tn!F)L~q> zHMFhzb~}gLcVmvKzXrQpJ^xn6qHSic&zdENckC-{0t%6=SvW0FDXyE9b(j9ZWNKPL zKff?Ndzw%whssu^nzt1?w>xhi@_UKcMYjl9=!?Z_IcrVjqA#ClA2R9Kr;%RI&=I3Ztz`Zby%3G!@6eQk@&ds`Z_lDxqCVe8wC`&$^hks7D(2~2tj$jO{!%K!LI=aybqqn@dd zmnntgt?vmw?>)jZiT&GnrxhOUdG8UH$UP@;l30ZSGo0)1+QGo5z02kKA==sG zG5-`ju)n!Tl|&^>&AY?t@1bk=hkr-pJLtjt!@nUiJCfc)o3o@4og3jWrj7oA_JsBb zyY9glO=w$auW1-#I#rCZP(l}-&?Cg}p(CLuLO!Jqs&xE}&YDq->sW2A-6s}*mAP*` z>td|u?k=WqhA-$r1!q}#0Y+{W)7%TPqA%kdC5`_l@E%7UvlwSA&#-c5dH;U2ha-QZ zGmN>%=nZ3@zleH_ephT$u^6rSHE?6Zwy&Hl=n@#~1G$%yopgln!G=@kih6PGJp;BWVkc}Sb zHHDgv*1SbE`s0Voi$RG#rAbXaM4T;ccf5NGJrW8|@m^OpMDBBCzO`SL33tiYI?Dkr ixA4ODcHxr6CH<85>Hsb}8M}nNoTKy};>Y48wEYYHJ-4C& diff --git a/version1/target/classes/part3/common/Message/RpcResponse$RpcResponseBuilder.class b/version1/target/classes/part3/common/Message/RpcResponse$RpcResponseBuilder.class deleted file mode 100644 index 410842135037ec9801edd0f1c670db254b1ac323..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1588 zcmb_cZBNrs6n^gBI%?&m3{XLxirS5rsvC;JhDu_xWNHG2gfAxDXs~2!m$vx3G=VLV z#2?^~GM>{GC~gQLe&{`?_nz~dbD!tr{`&pnCx9~E$WSpigfYzXvcSut1YJfNPb55* zAz?0yXKYKnl(SgM;yJr7vRG#OQo<_T|(F%Z_rqS9m zT#Nss&6NMe@(6gN)7&tV9Gtc)F!gu66M^G;EyjvQ0UD2IML`8s zUe*NU`Fu2|6&l(3JWpj1@S3K$px`kyfzm~N#mk=bGJ4u&D2{-p)%v-L?Hr3pL!U7^ z9n&U776wktDR!tsRF$Ne;o&_0_zc`}y>sJnk6r_n-iagNC$CU+f~-`WK18DUjokk9$uJ~J zr{JJ3t~!ASeL!=ENM0ImR^x-<|o!$1%5C<3a|Ys$Rjj*#9i9?u1wW2OKA diff --git a/version1/target/classes/part3/common/Message/RpcResponse.class b/version1/target/classes/part3/common/Message/RpcResponse.class deleted file mode 100644 index 3321fd04e93e900ec8a261f9020bc69bde99ee17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3094 zcmbVOU2ha+6n@^_nVs3~w6tqWS*TdB>UP_*D3yyFHx zcQO^~jB-`rh_^i%@b&fmlSR8!*_O@}78eWo^py9QbRar`-{%IhW-^<14p$dvozgLT zHs=OY$k@5#b}1`o|57_=XLAaD$yH%Tc4zb1${vMeav~6(pIYFi9`JF-Q(4F|pUta@ z-I%SjyJHmr^#v05%OVucI~9+DaI&A(i1F+*rO-*(CM6M{aknbV4FYwkgKEi%er6Rb z2T;3$werajBZEdB>@tf0IT7b#)y|QgrUob3PXz_NP+4$0PMGXlYOYrIx^a%WYOlFs zp3Xb8&Q$Eog(7G6ZzLIqox>iw@iyZ7nW_pW|>@AEJI zymIaDD_8%zdDB84sut3?Bo5EZ@dfdENnzWQy1q#xDD*zb%fck~T6h)PE$qNf3vbAA z7e*{hVY@>2%0^il{fR0JLa7?UHE7?tE(2U6u0b~jDO;Yg^fXUV3}K58lp>J)#05zG zL!h``L&Qf?XdtbpRT^7;zti;7c+;7>4I{PT7R=P(Eksj8w-EcD_o0Ain;S#Qv&YML zg?f6riAoZkZmJSTryF6I5psI{C-wRfns?B0;x;VFFc?=GPaGuQI?Y`$_0$hAZ%_yZ z(h(p-_XANffK8mEE18Tpb>_@AagMEY?riEjirv2R2;&q2A}*CH32b$}*LoI91V(%U z6~?gV5u5>5W3@QaX+qm;c)c0UBL#h2Jknl*!?&4-qa-VXc~u8e-$2)H4E&1LFQJET z4E%!DsX;bvn|q|NW{`i^M8`w>VV>GYw4vY7lF;s=<2tONgjPdG-8?>`(S@l>u!rxn6lO^e^R>i(2-qY?D1|tyTXB?;h50t=#@m!Mmytuz9+DP~j3`AC zpwvSeHO?Wq=z?B1sM~1EuV}{S@r&i>e1^}I$sWFgPQC}a;%jT@mb7bF7f*O{JGc0H pPmb5HA>Ko|hG$ofqsO%ORvh+o3}J@oA-B>%jL&M}Yq=NE{{fm@1xW zP*Kj{Im;KktY=Wo;AIA{c=uYxhKfxA#cm2L9JH;^mg!h-%iMPZ*^+)uAk*(j|Iq44 zfn3btDDZ8!Mdyj0{4yT9>v@i}Tsli{*{&VzkW;aAERfvungla@V7v0L->FOgy;XMx zz+S_0jxFEjePm1qpX{E%%m>Q9+qa#j^ab>N*OmUBWA%EH4hsie%MaGghS%wMuG#h4 zp2_}&SP<2*S&UUaY^^k1>_$8`>Uzr1v9v>0ri@M1xn+Ud#eW6xYyvN=NWdV!%khn- zqaAsDzaih+Ommi5Sz|99H*rfx4huRA+|ZH7qCkE!ne6;VVDWGG(NK&5ZjADx-Q3nu z!xk^wG{eeLKe|PauIIM=H*#4MvJ z&~;2(-L76C5{?H!}=~2$pb4@^D#z|9{^noPaNv7$e zfq=$Mnn_ZSOqI_ezLBEf4z1~daTa$;*Fy)~!xHW2Wm1wbxJKRz+0^pNcPQnrq+Sir zhb~b#IS=aMtOk}R0VSpe;>H*#k4KY$l2ZdQGYnL~;|OSnern8%ae>rH`INdlMS{NM zIntB+3~4e(G|^>?us#w4j8(mWdUB3TE_()zG0!lQ(?dN$B6ls+lWf0E`Wa^bm#Z4( UQcxT)U%~^D8s(a!>hB}_2P*S7DgXcg diff --git a/version1/target/classes/part3/common/pojo/User.class b/version1/target/classes/part3/common/pojo/User.class deleted file mode 100644 index c6480d7b4b75ae196f1d7614916605e5202f5237..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2753 zcma)8?Q&C96kR8|UrBCh3H>07TCrlAv_t^~Q;GDkr_w-;Ec~C;@bDzG&eDfFw8mo?z8qj>#VcSPXGGn*WUn~z?O|q(@P@_EC?muU=O*}+YjzmnmW1JA*lgR*?B3vStl zZ{ur)%xc50pKAq`b-%9Q&R45`{d~o1H2j7_B3M^Au(0KQ=M^hnb)z_6ZTcI2eOAF~ zF>cA*_7$=*z)G_oR5!SuZ1}gkW6#xU72m6J&0cHocVu#EVaKaCj~C0e?d@8%xKrDz z6@}77j2AQ`%S%FWv%$%Ndu6MD26I>Vbx zX>Vu`gzna!Jp1%o$1$+d^vd5XdOM-stXWnY6PLZ}1>s3^(`#(%D@{&L&6CFE<@v=6 zG8HWbChIyoQly!QU6(}iyr-ZSxdl?`i*{p}!*_eS*#2;IY2JM?<=@bBR3Vm{z{<0Lh@s{I@d~)13@m55lE06KKc|?B6a}3A(J&Mrc$zzf{7*2A zdxbw>{RlI8ukbsp#p(Pm?C_I@voy`2WX$}DOwM?W{deKcB8*(Vsa z@jm}M>In{NGZi(c$W8f^%mk*$C+we99OfQ-lbnUUlD?wTsH2Rt7`-|)d)k-_ zB|kJYyGg;Fp~79*GrMqai9cO3WFconD~?=)UdoiraEUh%201x1TsqWW)H8a+h*lEI zxIn?!_Hj9sE`c;V)kmb7 zfHubHc118N2J0Yuy#$jco2b?fH>sWUl@pIJz%H~eJGhG>k#HCLvsrCtIAsrLJ1zcU z+PfI(Z3epDbQ?MmNu%UfB-*Rf!yaO^_wDTudqHmxTfkBje1k*{5*^MnIP50*=?5_K xGY{~ecbpA#~^mdYEJUp0!Jz$JbqczZ8!mOoVavx6K`{{n~Z=w|=` diff --git a/version1/target/classes/part3/common/service/Impl/UserServiceImpl.class b/version1/target/classes/part3/common/service/Impl/UserServiceImpl.class deleted file mode 100644 index 181193155636a16b609a31201e53728613461930..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1965 zcma)7TW=dh6#gc5vd(&FTIWijr70!YNz(;VXiG{9NeCF+q|`|u;kve`?uPZQwO&W< zJD>^)Q6YHYrBb9yNJwqrVH33yKY-ss9DW7j%&u=69NLFHvu9?`cfNC(nLqz|_y>S9 zD61HS){B?$vVvDsM4-hmEypubyc)x6ay+Zz9L_6vT}2$4iWyu`@dhqRL2H-rrW9|< z)masDn3w9?QY^&qj@o%4GP9v?>YAxrMJ;W)q9~l1R2Z~uZ`eKW1;V5C5!-CC_3Z;coc3{ODjQrv*jW+bPH@b<+WfCc{ws1q}ap zf6TQ5R4Q@uzrcjp?>h@KWKhbIuW3;T?G4{xNT+Wol$K_*k!h~c7IB%RW|Q!=WeI1_ z)GHN12XUO}bcQ(DW<~@LwVGsQB|Xoe2InSF5{;<*(`_FZX z@yXboZ#RA1eXuXGxFv45v$kytof1u#+B(CLR_&WB%BF5s#nLrOdUCzJi1i&5aik({ zFoei77N0Q9-G12^Mh~nDxrx{B!ys+lq{*9Suu+51rHC;+O)mw*GxTgkXr#-8m<+p@8pj tlPxhDX;D#qgQJwOW4`O50HEo5%y&bN3#NSfr|~h3DmlDFPv$y${{_vo3nBmj diff --git a/version1/target/classes/part3/common/service/UserService.class b/version1/target/classes/part3/common/service/UserService.class deleted file mode 100644 index a2e6fc6ea69bb56feb6a20f41f081588892737e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269 zcmZ`!F$%&!5S-O$Gz$6zOH=3-+NHA)0s#y00cTu7LXrz-4EQw*AK;_JyC8_5&F(Tg zGdufu-tGX_7`Yg_@CcKH>%*D#=4xwrA}r=nCL1YoStcSZYfe}PepE?auSBehLY1OY znG#kI5XNa~hSuaQ|3meE_!7Lmy6Bj=(wLVv1!4B(X4ZDs-hT6p>XUbO c%s8(51VYC=3UnMo7Y<;04}F6WT#IAy0;+jTKmY&$ diff --git a/version2/pom.xml b/version2/pom.xml deleted file mode 100644 index 4626ed3..0000000 --- a/version2/pom.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - 4.0.0 - - org.example - version2 - 1.0-SNAPSHOT - - - 8 - 8 - UTF-8 - - - - org.projectlombok - lombok - 1.18.30 - compile - - - org.slf4j - slf4j-log4j12 - 1.7.25 - - - org.apache.logging.log4j - log4j-1.2-api - 2.8.2 - - - - io.netty - netty-all - 4.1.51.Final - compile - - - - org.apache.curator - curator-recipes - 5.1.0 - - - com.alibaba - fastjson - 1.2.83 - - - - - \ No newline at end of file diff --git a/version2/src/main/java/part1/Client/TestClient.java b/version2/src/main/java/part1/Client/TestClient.java deleted file mode 100644 index 6e6715c..0000000 --- a/version2/src/main/java/part1/Client/TestClient.java +++ /dev/null @@ -1,28 +0,0 @@ -package part1.Client; - - -import part1.Client.proxy.ClientProxy; -import part1.common.service.UserService; -import part1.common.pojo.User; - - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/6 18:39 - */ - -public class TestClient { - public static void main(String[] args) { - ClientProxy clientProxy=new ClientProxy(); - //ClientProxy clientProxy=new part2.Client.proxy.ClientProxy("127.0.0.1",9999,0); - UserService proxy=clientProxy.getProxy(UserService.class); - - User user = proxy.getUserByUserId(1); - System.out.println("从服务端得到的user="+user.toString()); - - User u=User.builder().id(100).userName("wxx").sex(true).build(); - Integer id = proxy.insertUserId(u); - System.out.println("向服务端插入user的id"+id); - } -} diff --git a/version2/src/main/java/part1/Client/netty/handler/NettyClientHandler.java b/version2/src/main/java/part1/Client/netty/handler/NettyClientHandler.java deleted file mode 100644 index 31858c6..0000000 --- a/version2/src/main/java/part1/Client/netty/handler/NettyClientHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -package part1.Client.netty.handler; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.util.AttributeKey; -import part1.common.Message.RpcResponse; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 17:29 - */ -public class NettyClientHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, RpcResponse response) throws Exception { - // 接收到response, 给channel设计别名,让sendRequest里读取response - AttributeKey key = AttributeKey.valueOf("RPCResponse"); - ctx.channel().attr(key).set(response); - ctx.channel().close(); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } -} diff --git a/version2/src/main/java/part1/Client/netty/nettyInitializer/NettyClientInitializer.java b/version2/src/main/java/part1/Client/netty/nettyInitializer/NettyClientInitializer.java deleted file mode 100644 index 28e781f..0000000 --- a/version2/src/main/java/part1/Client/netty/nettyInitializer/NettyClientInitializer.java +++ /dev/null @@ -1,31 +0,0 @@ -package part1.Client.netty.nettyInitializer; - - -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.handler.codec.LengthFieldPrepender; -import io.netty.handler.codec.serialization.ClassResolver; -import io.netty.handler.codec.serialization.ObjectDecoder; -import io.netty.handler.codec.serialization.ObjectEncoder; -import part1.Client.netty.handler.NettyClientHandler; -import part1.common.serializer.myCode.MyDecoder; -import part1.common.serializer.myCode.MyEncoder; -import part1.common.serializer.mySerializer.JsonSerializer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 17:26 - */ -public class NettyClientInitializer extends ChannelInitializer { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ChannelPipeline pipeline = ch.pipeline(); - //使用自定义的编/解码器 - pipeline.addLast(new MyDecoder()); - pipeline.addLast(new MyEncoder(new JsonSerializer())); - pipeline.addLast(new NettyClientHandler()); - } -} diff --git a/version2/src/main/java/part1/Client/proxy/ClientProxy.java b/version2/src/main/java/part1/Client/proxy/ClientProxy.java deleted file mode 100644 index c4ff57b..0000000 --- a/version2/src/main/java/part1/Client/proxy/ClientProxy.java +++ /dev/null @@ -1,42 +0,0 @@ -package part1.Client.proxy; - - -import part1.Client.rpcClient.RpcClient; -import part1.Client.rpcClient.impl.NettyRpcClient; -import part1.common.Message.RpcRequest; -import part1.common.Message.RpcResponse; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/6 16:49 - */ -public class ClientProxy implements InvocationHandler { - //传入参数service接口的class对象,反射封装成一个request - - private RpcClient rpcClient; - public ClientProxy(){ - rpcClient=new NettyRpcClient(); - } - - //jdk动态代理,每一次代理对象调用方法,都会经过此方法增强(反射获取request对象,socket发送到服务端) - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - //构建request - RpcRequest request=RpcRequest.builder() - .interfaceName(method.getDeclaringClass().getName()) - .methodName(method.getName()) - .params(args).paramsType(method.getParameterTypes()).build(); - //数据传输 - RpcResponse response= rpcClient.sendRequest(request); - return response.getData(); - } - public T getProxy(Class clazz){ - Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this); - return (T)o; - } -} diff --git a/version2/src/main/java/part1/Client/rpcClient/RpcClient.java b/version2/src/main/java/part1/Client/rpcClient/RpcClient.java deleted file mode 100644 index c665530..0000000 --- a/version2/src/main/java/part1/Client/rpcClient/RpcClient.java +++ /dev/null @@ -1,15 +0,0 @@ -package part1.Client.rpcClient; - -import part1.common.Message.RpcRequest; -import part1.common.Message.RpcResponse; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 18:55 - */ -public interface RpcClient { - - //定义底层通信的方法 - RpcResponse sendRequest(RpcRequest request); -} diff --git a/version2/src/main/java/part1/Client/rpcClient/impl/NettyRpcClient.java b/version2/src/main/java/part1/Client/rpcClient/impl/NettyRpcClient.java deleted file mode 100644 index 4cc425c..0000000 --- a/version2/src/main/java/part1/Client/rpcClient/impl/NettyRpcClient.java +++ /dev/null @@ -1,68 +0,0 @@ -package part1.Client.rpcClient.impl; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.util.AttributeKey; -import part1.Client.rpcClient.RpcClient; -import part1.common.Message.RpcRequest; -import part1.Client.netty.nettyInitializer.NettyClientInitializer; -import part1.Client.serviceCenter.ServiceCenter; -import part1.Client.serviceCenter.ZKServiceCenter; -import part1.common.Message.RpcResponse; - -import java.net.InetSocketAddress; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 19:40 - */ -public class NettyRpcClient implements RpcClient { - - private static final Bootstrap bootstrap; - private static final EventLoopGroup eventLoopGroup; - - private ServiceCenter serviceCenter; - public NettyRpcClient(){ - this.serviceCenter=new ZKServiceCenter(); - } - - //netty客户端初始化 - static { - eventLoopGroup = new NioEventLoopGroup(); - bootstrap = new Bootstrap(); - bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) - .handler(new NettyClientInitializer()); - } - @Override - public RpcResponse sendRequest(RpcRequest request) { - //从注册中心获取host,post - InetSocketAddress address = serviceCenter.serviceDiscovery(request.getInterfaceName()); - String host = address.getHostName(); - int port = address.getPort(); - try { - ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); - Channel channel = channelFuture.channel(); - // 发送数据 - channel.writeAndFlush(request); - //sync()堵塞获取结果 - channel.closeFuture().sync(); - // 阻塞的获得结果,通过给channel设计别名,获取特定名字下的channel中的内容(这个在hanlder中设置) - // AttributeKey是,线程隔离的,不会由线程安全问题。 - // 当前场景下选择堵塞获取结果 - // 其它场景也可以选择添加监听器的方式来异步获取结果 channelFuture.addListener... - AttributeKey key = AttributeKey.valueOf("RPCResponse"); - RpcResponse response = channel.attr(key).get(); - - System.out.println(response); - return response; - } catch (InterruptedException e) { - e.printStackTrace(); - } - return null; - } -} diff --git a/version2/src/main/java/part1/Client/rpcClient/impl/SimpleSocketRpcCilent.java b/version2/src/main/java/part1/Client/rpcClient/impl/SimpleSocketRpcCilent.java deleted file mode 100644 index d74af41..0000000 --- a/version2/src/main/java/part1/Client/rpcClient/impl/SimpleSocketRpcCilent.java +++ /dev/null @@ -1,41 +0,0 @@ -package part1.Client.rpcClient.impl; - -import part1.Client.rpcClient.RpcClient; -import part1.common.Message.RpcRequest; -import part1.common.Message.RpcResponse; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 18:58 - */ -public class SimpleSocketRpcCilent implements RpcClient { - private String host; - private int port; - public SimpleSocketRpcCilent(String host,int port){ - this.host=host; - this.port=port; - } - @Override - public RpcResponse sendRequest(RpcRequest request) { - try { - Socket socket=new Socket(host, port); - ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois=new ObjectInputStream(socket.getInputStream()); - - oos.writeObject(request); - oos.flush(); - - RpcResponse response=(RpcResponse) ois.readObject(); - return response; - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/version2/src/main/java/part1/Client/serviceCenter/ServiceCenter.java b/version2/src/main/java/part1/Client/serviceCenter/ServiceCenter.java deleted file mode 100644 index 1842b94..0000000 --- a/version2/src/main/java/part1/Client/serviceCenter/ServiceCenter.java +++ /dev/null @@ -1,14 +0,0 @@ -package part1.Client.serviceCenter; - -import java.net.InetSocketAddress; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 21:42 - */ -//服务中心接口 -public interface ServiceCenter { - // 查询:根据服务名查找地址 - InetSocketAddress serviceDiscovery(String serviceName); -} diff --git a/version2/src/main/java/part1/Client/serviceCenter/ZKServiceCenter.java b/version2/src/main/java/part1/Client/serviceCenter/ZKServiceCenter.java deleted file mode 100644 index b62de1f..0000000 --- a/version2/src/main/java/part1/Client/serviceCenter/ZKServiceCenter.java +++ /dev/null @@ -1,59 +0,0 @@ -package part1.Client.serviceCenter; - -import org.apache.curator.RetryPolicy; -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.retry.ExponentialBackoffRetry; - -import java.net.InetSocketAddress; -import java.util.List; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 21:41 - */ -public class ZKServiceCenter implements ServiceCenter{ - // curator 提供的zookeeper客户端 - private CuratorFramework client; - //zookeeper根路径节点 - private static final String ROOT_PATH = "MyRPC"; - - //负责zookeeper客户端的初始化,并与zookeeper服务端进行连接 - public ZKServiceCenter(){ - // 指数时间重试 - RetryPolicy policy = new ExponentialBackoffRetry(1000, 3); - // zookeeper的地址固定,不管是服务提供者还是,消费者都要与之建立连接 - // sessionTimeoutMs 与 zoo.cfg中的tickTime 有关系, - // zk还会根据minSessionTimeout与maxSessionTimeout两个参数重新调整最后的超时值。默认分别为tickTime 的2倍和20倍 - // 使用心跳监听状态 - this.client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181") - .sessionTimeoutMs(40000).retryPolicy(policy).namespace(ROOT_PATH).build(); - this.client.start(); - System.out.println("zookeeper 连接成功"); - } - //根据服务名(接口名)返回地址 - @Override - public InetSocketAddress serviceDiscovery(String serviceName) { - try { - List strings = client.getChildren().forPath("/" + serviceName); - // 这里默认用的第一个,后面加负载均衡 - String string = strings.get(0); - return parseAddress(string); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - // 地址 -> XXX.XXX.XXX.XXX:port 字符串 - private String getServiceAddress(InetSocketAddress serverAddress) { - return serverAddress.getHostName() + - ":" + - serverAddress.getPort(); - } - // 字符串解析为地址 - private InetSocketAddress parseAddress(String address) { - String[] result = address.split(":"); - return new InetSocketAddress(result[0], Integer.parseInt(result[1])); - } -} diff --git a/version2/src/main/java/part1/Server/TestServer.java b/version2/src/main/java/part1/Server/TestServer.java deleted file mode 100644 index baaf058..0000000 --- a/version2/src/main/java/part1/Server/TestServer.java +++ /dev/null @@ -1,26 +0,0 @@ -package part1.Server; - - -import part1.Server.provider.ServiceProvider; -import part1.Server.server.impl.NettyRPCRPCServer; -import part1.Server.server.RpcServer; -import part1.common.service.Impl.UserServiceImpl; -import part1.common.service.UserService; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/11 19:39 - */ - -public class TestServer { - public static void main(String[] args) { - UserService userService=new UserServiceImpl(); - - ServiceProvider serviceProvider=new ServiceProvider("127.0.0.1",9999); - serviceProvider.provideServiceInterface(userService); - - RpcServer rpcServer=new NettyRPCRPCServer(serviceProvider); - rpcServer.start(9999); - } -} diff --git a/version2/src/main/java/part1/Server/netty/handler/NettyRPCServerHandler.java b/version2/src/main/java/part1/Server/netty/handler/NettyRPCServerHandler.java deleted file mode 100644 index 5b01246..0000000 --- a/version2/src/main/java/part1/Server/netty/handler/NettyRPCServerHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -package part1.Server.netty.handler; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import lombok.AllArgsConstructor; -import part1.Server.provider.ServiceProvider; -import part1.common.Message.RpcRequest; -import part1.common.Message.RpcResponse; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 16:40 - * 因为是服务器端,我们知道接受到请求格式是RPCRequest - * Object类型也行,强制转型就行 - */ -@AllArgsConstructor -public class NettyRPCServerHandler extends SimpleChannelInboundHandler { - private ServiceProvider serviceProvider; - @Override - protected void channelRead0(ChannelHandlerContext ctx, RpcRequest request) throws Exception { - RpcResponse response = getResponse(request); - ctx.writeAndFlush(response); - ctx.close(); - } - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } - private RpcResponse getResponse(RpcRequest rpcRequest){ - //得到服务名 - String interfaceName=rpcRequest.getInterfaceName(); - //得到服务端相应服务实现类 - Object service = serviceProvider.getService(interfaceName); - //反射调用方法 - Method method=null; - try { - method= service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); - Object invoke=method.invoke(service,rpcRequest.getParams()); - return RpcResponse.sussess(invoke); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - System.out.println("方法执行错误"); - return RpcResponse.fail(); - } - } -} diff --git a/version2/src/main/java/part1/Server/netty/nettyInitializer/NettyServerInitializer.java b/version2/src/main/java/part1/Server/netty/nettyInitializer/NettyServerInitializer.java deleted file mode 100644 index bb7a4a1..0000000 --- a/version2/src/main/java/part1/Server/netty/nettyInitializer/NettyServerInitializer.java +++ /dev/null @@ -1,35 +0,0 @@ -package part1.Server.netty.nettyInitializer; - - -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.socket.SocketChannel; -import io.netty.handler.codec.LengthFieldBasedFrameDecoder; -import io.netty.handler.codec.LengthFieldPrepender; -import io.netty.handler.codec.serialization.ClassResolver; -import io.netty.handler.codec.serialization.ObjectDecoder; -import io.netty.handler.codec.serialization.ObjectEncoder; -import lombok.AllArgsConstructor; -import part1.Server.netty.handler.NettyRPCServerHandler; -import part1.Server.provider.ServiceProvider; -import part1.common.serializer.myCode.MyDecoder; -import part1.common.serializer.myCode.MyEncoder; -import part1.common.serializer.mySerializer.JsonSerializer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 16:15 - */ -@AllArgsConstructor -public class NettyServerInitializer extends ChannelInitializer { - private ServiceProvider serviceProvider; - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ChannelPipeline pipeline = ch.pipeline(); - //使用自定义的编/解码器 - pipeline.addLast(new MyEncoder(new JsonSerializer())); - pipeline.addLast(new MyDecoder()); - pipeline.addLast(new NettyRPCServerHandler(serviceProvider)); - } -} diff --git a/version2/src/main/java/part1/Server/provider/ServiceProvider.java b/version2/src/main/java/part1/Server/provider/ServiceProvider.java deleted file mode 100644 index f7355dc..0000000 --- a/version2/src/main/java/part1/Server/provider/ServiceProvider.java +++ /dev/null @@ -1,47 +0,0 @@ -package part1.Server.provider; - -import part1.Server.serviceRegister.ServiceRegister; -import part1.Server.serviceRegister.impl.ZKServiceRegister; - -import java.net.InetSocketAddress; -import java.util.HashMap; -import java.util.Map; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/16 17:35 - */ -public class ServiceProvider { - private Map interfaceProvider; - - private int port; - private String host; - //注册服务类 - private ServiceRegister serviceRegister; - - public ServiceProvider(String host,int port){ - //需要传入服务端自身的网络地址 - this.host=host; - this.port=port; - this.interfaceProvider=new HashMap<>(); - this.serviceRegister=new ZKServiceRegister(); - } - - public void provideServiceInterface(Object service){ - String serviceName=service.getClass().getName(); - Class[] interfaceName=service.getClass().getInterfaces(); - - for (Class clazz:interfaceName){ - //本机的映射表 - interfaceProvider.put(clazz.getName(),service); - //在注册中心注册服务 - serviceRegister.register(clazz.getName(),new InetSocketAddress(host,port)); - } - } - - public Object getService(String interfaceName){ - return interfaceProvider.get(interfaceName); - } - -} diff --git a/version2/src/main/java/part1/Server/server/RpcServer.java b/version2/src/main/java/part1/Server/server/RpcServer.java deleted file mode 100644 index 7ed9584..0000000 --- a/version2/src/main/java/part1/Server/server/RpcServer.java +++ /dev/null @@ -1,11 +0,0 @@ -package part1.Server.server; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/12 11:26 - */ -public interface RpcServer { - void start(int port); - void stop(); -} diff --git a/version2/src/main/java/part1/Server/server/impl/NettyRPCRPCServer.java b/version2/src/main/java/part1/Server/server/impl/NettyRPCRPCServer.java deleted file mode 100644 index e3022e8..0000000 --- a/version2/src/main/java/part1/Server/server/impl/NettyRPCRPCServer.java +++ /dev/null @@ -1,48 +0,0 @@ -package part1.Server.server.impl; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import lombok.AllArgsConstructor; -import part1.Server.provider.ServiceProvider; -import part1.Server.netty.nettyInitializer.NettyServerInitializer; -import part1.Server.server.RpcServer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 14:01 - */ -@AllArgsConstructor -public class NettyRPCRPCServer implements RpcServer { - private ServiceProvider serviceProvider; - @Override - public void start(int port) { - // netty 服务线程组boss负责建立连接, work负责具体的请求 - NioEventLoopGroup bossGroup = new NioEventLoopGroup(); - NioEventLoopGroup workGroup = new NioEventLoopGroup(); - System.out.println("netty服务端启动了"); - try { - //启动netty服务器 - ServerBootstrap serverBootstrap = new ServerBootstrap(); - //初始化 - serverBootstrap.group(bossGroup,workGroup).channel(NioServerSocketChannel.class) - .childHandler(new NettyServerInitializer(serviceProvider)); - //同步堵塞 - ChannelFuture channelFuture=serverBootstrap.bind(port).sync(); - //死循环监听 - channelFuture.channel().closeFuture().sync(); - }catch (InterruptedException e){ - e.printStackTrace(); - }finally { - bossGroup.shutdownGracefully(); - workGroup.shutdownGracefully(); - } - } - - @Override - public void stop() { - - } -} diff --git a/version2/src/main/java/part1/Server/server/impl/SimpleRPCRPCServer.java b/version2/src/main/java/part1/Server/server/impl/SimpleRPCRPCServer.java deleted file mode 100644 index 277926e..0000000 --- a/version2/src/main/java/part1/Server/server/impl/SimpleRPCRPCServer.java +++ /dev/null @@ -1,39 +0,0 @@ -package part1.Server.server.impl; - - -import lombok.AllArgsConstructor; -import part1.Server.provider.ServiceProvider; -import part1.Server.server.work.WorkThread; -import part1.Server.server.RpcServer; - -import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/12 11:37 - */ -@AllArgsConstructor -public class SimpleRPCRPCServer implements RpcServer { - private ServiceProvider serviceProvide; - @Override - public void start(int port) { - try { - ServerSocket serverSocket=new ServerSocket(port); - System.out.println("服务器启动了"); - while (true) { - Socket socket = serverSocket.accept(); - new Thread(new WorkThread(socket,serviceProvide)).start(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void stop() { - - } -} diff --git a/version2/src/main/java/part1/Server/server/work/WorkThread.java b/version2/src/main/java/part1/Server/server/work/WorkThread.java deleted file mode 100644 index 064b9c2..0000000 --- a/version2/src/main/java/part1/Server/server/work/WorkThread.java +++ /dev/null @@ -1,58 +0,0 @@ -package part1.Server.server.work; - - -import lombok.AllArgsConstructor; -import part1.Server.provider.ServiceProvider; -import part1.common.Message.RpcRequest; -import part1.common.Message.RpcResponse; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/14 17:39 - */ -@AllArgsConstructor -public class WorkThread implements Runnable{ - private Socket socket; - private ServiceProvider serviceProvide; - @Override - public void run() { - try { - ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois=new ObjectInputStream(socket.getInputStream()); - //读取客户端传过来的request - RpcRequest rpcRequest = (RpcRequest) ois.readObject(); - //反射调用服务方法获取返回值 - RpcResponse rpcResponse=getResponse(rpcRequest); - //向客户端写入response - oos.writeObject(rpcResponse); - oos.flush(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - } - private RpcResponse getResponse(RpcRequest rpcRequest){ - //得到服务名 - String interfaceName=rpcRequest.getInterfaceName(); - //得到服务端相应服务实现类 - Object service = serviceProvide.getService(interfaceName); - //反射调用方法 - Method method=null; - try { - method= service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); - Object invoke=method.invoke(service,rpcRequest.getParams()); - return RpcResponse.sussess(invoke); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - System.out.println("方法执行错误"); - return RpcResponse.fail(); - } - } -} diff --git a/version2/src/main/java/part1/Server/serviceRegister/ServiceRegister.java b/version2/src/main/java/part1/Server/serviceRegister/ServiceRegister.java deleted file mode 100644 index 54c52b1..0000000 --- a/version2/src/main/java/part1/Server/serviceRegister/ServiceRegister.java +++ /dev/null @@ -1,15 +0,0 @@ -package part1.Server.serviceRegister; - -import java.net.InetSocketAddress; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 16:58 - */ -// 服务注册接口 -public interface ServiceRegister { - // 注册:保存服务与地址。 - void register(String serviceName, InetSocketAddress serviceAddress); - -} diff --git a/version2/src/main/java/part1/Server/serviceRegister/impl/ZKServiceRegister.java b/version2/src/main/java/part1/Server/serviceRegister/impl/ZKServiceRegister.java deleted file mode 100644 index d569338..0000000 --- a/version2/src/main/java/part1/Server/serviceRegister/impl/ZKServiceRegister.java +++ /dev/null @@ -1,62 +0,0 @@ -package part1.Server.serviceRegister.impl; - -import org.apache.curator.RetryPolicy; -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.retry.ExponentialBackoffRetry; -import org.apache.zookeeper.CreateMode; -import part1.Server.serviceRegister.ServiceRegister; - -import java.net.InetSocketAddress; -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 17:28 - */ -public class ZKServiceRegister implements ServiceRegister { - // curator 提供的zookeeper客户端 - private CuratorFramework client; - //zookeeper根路径节点 - private static final String ROOT_PATH = "MyRPC"; - - //负责zookeeper客户端的初始化,并与zookeeper服务端进行连接 - public ZKServiceRegister(){ - // 指数时间重试 - RetryPolicy policy = new ExponentialBackoffRetry(1000, 3); - // zookeeper的地址固定,不管是服务提供者还是,消费者都要与之建立连接 - // sessionTimeoutMs 与 zoo.cfg中的tickTime 有关系, - // zk还会根据minSessionTimeout与maxSessionTimeout两个参数重新调整最后的超时值。默认分别为tickTime 的2倍和20倍 - // 使用心跳监听状态 - this.client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181") - .sessionTimeoutMs(40000).retryPolicy(policy).namespace(ROOT_PATH).build(); - this.client.start(); - System.out.println("zookeeper 连接成功"); - } - //注册服务到注册中心 - @Override - public void register(String serviceName, InetSocketAddress serviceAddress) { - try { - // serviceName创建成永久节点,服务提供者下线时,不删服务名,只删地址 - if(client.checkExists().forPath("/" + serviceName) == null){ - client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/" + serviceName); - } - // 路径地址,一个/代表一个节点 - String path = "/" + serviceName +"/"+ getServiceAddress(serviceAddress); - // 临时节点,服务器下线就删除节点 - client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path); - } catch (Exception e) { - System.out.println("此服务已存在"); - } - } - // 地址 -> XXX.XXX.XXX.XXX:port 字符串 - private String getServiceAddress(InetSocketAddress serverAddress) { - return serverAddress.getHostName() + - ":" + - serverAddress.getPort(); - } - // 字符串解析为地址 - private InetSocketAddress parseAddress(String address) { - String[] result = address.split(":"); - return new InetSocketAddress(result[0], Integer.parseInt(result[1])); - } -} diff --git a/version2/src/main/java/part1/common/Message/MessageType.java b/version2/src/main/java/part1/common/Message/MessageType.java deleted file mode 100644 index ebbcc83..0000000 --- a/version2/src/main/java/part1/common/Message/MessageType.java +++ /dev/null @@ -1,17 +0,0 @@ -package part1.common.Message; - -import lombok.AllArgsConstructor; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:29 - */ -@AllArgsConstructor -public enum MessageType { - REQUEST(0),RESPONSE(1); - private int code; - public int getCode(){ - return code; - } -} \ No newline at end of file diff --git a/version2/src/main/java/part1/common/Message/RpcRequest.java b/version2/src/main/java/part1/common/Message/RpcRequest.java deleted file mode 100644 index 2642f38..0000000 --- a/version2/src/main/java/part1/common/Message/RpcRequest.java +++ /dev/null @@ -1,29 +0,0 @@ -package part1.common.Message; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/1 18:30 - * 定义发送的消息格式 - */ -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class RpcRequest implements Serializable { - //服务类名,客户端只知道接口 - private String interfaceName; - //调用的方法名 - private String methodName; - //参数列表 - private Object[] params; - //参数类型 - private Class[] paramsType; -} diff --git a/version2/src/main/java/part1/common/Message/RpcResponse.java b/version2/src/main/java/part1/common/Message/RpcResponse.java deleted file mode 100644 index 7a44b45..0000000 --- a/version2/src/main/java/part1/common/Message/RpcResponse.java +++ /dev/null @@ -1,35 +0,0 @@ -package part1.common.Message; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/1 19:18 - */ -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class RpcResponse implements Serializable { - //状态信息 - private int code; - private String message; - //更新:加入传输数据的类型,以便在自定义序列化器中解析 - private Class dataType; - //具体数据 - private Object data; - - public static RpcResponse sussess(Object data){ - return RpcResponse.builder().code(200).dataType(data.getClass()).data(data).build(); - } - public static RpcResponse fail(){ - return RpcResponse.builder().code(500).message("服务器发生错误").build(); - } -} - diff --git a/version2/src/main/java/part1/common/pojo/User.java b/version2/src/main/java/part1/common/pojo/User.java deleted file mode 100644 index d7cef8c..0000000 --- a/version2/src/main/java/part1/common/pojo/User.java +++ /dev/null @@ -1,25 +0,0 @@ -package part1.common.pojo; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 17:50 - */ -@Builder -@Data -@NoArgsConstructor -@AllArgsConstructor -public class User implements Serializable { - // 客户端和服务端共有的 - private Integer id; - private String userName; - private Boolean sex; -} - diff --git a/version2/src/main/java/part1/common/serializer/myCode/MyDecoder.java b/version2/src/main/java/part1/common/serializer/myCode/MyDecoder.java deleted file mode 100644 index 8788c0e..0000000 --- a/version2/src/main/java/part1/common/serializer/myCode/MyDecoder.java +++ /dev/null @@ -1,42 +0,0 @@ -package part1.common.serializer.myCode; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import part1.common.Message.MessageType; -import part1.common.serializer.mySerializer.Serializer; - -import java.awt.*; -import java.util.List; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:24 - * 按照自定义的消息格式解码数据 - */ -public class MyDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List out) throws Exception { - //1.读取消息类型 - short messageType = in.readShort(); - // 现在还只支持request与response请求 - if(messageType != MessageType.REQUEST.getCode() && - messageType != MessageType.RESPONSE.getCode()){ - System.out.println("暂不支持此种数据"); - return; - } - //2.读取序列化的方式&类型 - short serializerType = in.readShort(); - Serializer serializer = Serializer.getSerializerByCode(serializerType); - if(serializer == null) - throw new RuntimeException("不存在对应的序列化器"); - //3.读取序列化数组长度 - int length = in.readInt(); - //4.读取序列化数组 - byte[] bytes=new byte[length]; - in.readBytes(bytes); - Object deserialize= serializer.deserialize(bytes, messageType); - out.add(deserialize); - } -} diff --git a/version2/src/main/java/part1/common/serializer/myCode/MyEncoder.java b/version2/src/main/java/part1/common/serializer/myCode/MyEncoder.java deleted file mode 100644 index 7ce0fd4..0000000 --- a/version2/src/main/java/part1/common/serializer/myCode/MyEncoder.java +++ /dev/null @@ -1,41 +0,0 @@ -package part1.common.serializer.myCode; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToByteEncoder; -import lombok.AllArgsConstructor; -import part1.common.Message.MessageType; -import part1.common.Message.RpcRequest; -import part1.common.Message.RpcResponse; -import part1.common.serializer.mySerializer.Serializer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:24 - * 依次按照自定义的消息格式写入,传入的数据为request或者response - * 需要持有一个serialize器,负责将传入的对象序列化成字节数组 - */ -@AllArgsConstructor -public class MyEncoder extends MessageToByteEncoder { - private Serializer serializer; - @Override - protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { - System.out.println(msg.getClass()); - //1.写入消息类型 - if(msg instanceof RpcRequest){ - out.writeShort(MessageType.REQUEST.getCode()); - } - else if(msg instanceof RpcResponse){ - out.writeShort(MessageType.RESPONSE.getCode()); - } - //2.写入序列化方式 - out.writeShort(serializer.getType()); - //得到序列化数组 - byte[] serializeBytes = serializer.serialize(msg); - //3.写入长度 - out.writeInt(serializeBytes.length); - //4.写入序列化数组 - out.writeBytes(serializeBytes); - } -} diff --git a/version2/src/main/java/part1/common/serializer/mySerializer/JsonSerializer.java b/version2/src/main/java/part1/common/serializer/mySerializer/JsonSerializer.java deleted file mode 100644 index 39240cf..0000000 --- a/version2/src/main/java/part1/common/serializer/mySerializer/JsonSerializer.java +++ /dev/null @@ -1,65 +0,0 @@ -package part1.common.serializer.mySerializer; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import part1.common.Message.RpcRequest; -import part1.common.Message.RpcResponse; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:31 - */ -public class JsonSerializer implements Serializer { - @Override - public byte[] serialize(Object obj) { - byte[] bytes = JSONObject.toJSONBytes(obj); - return bytes; - } - - @Override - public Object deserialize(byte[] bytes, int messageType) { - Object obj = null; - // 传输的消息分为request与response - switch (messageType){ - case 0: - RpcRequest request = JSON.parseObject(bytes, RpcRequest.class); - Object[] objects = new Object[request.getParams().length]; - // 把json字串转化成对应的对象, fastjson可以读出基本数据类型,不用转化 - // 对转换后的request中的params属性逐个进行类型判断 - for(int i = 0; i < objects.length; i++){ - Class paramsType = request.getParamsType()[i]; - //判断每个对象类型是否和paramsTypes中的一致 - if (!paramsType.isAssignableFrom(request.getParams()[i].getClass())){ - //如果不一致,就行进行类型转换 - objects[i] = JSONObject.toJavaObject((JSONObject) request.getParams()[i],request.getParamsType()[i]); - }else{ - //如果一致就直接赋给objects[i] - objects[i] = request.getParams()[i]; - } - } - request.setParams(objects); - obj = request; - break; - case 1: - RpcResponse response = JSON.parseObject(bytes, RpcResponse.class); - Class dataType = response.getDataType(); - //判断转化后的response对象中的data的类型是否正确 - if(! dataType.isAssignableFrom(response.getData().getClass())){ - response.setData(JSONObject.toJavaObject((JSONObject) response.getData(),dataType)); - } - obj = response; - break; - default: - System.out.println("暂时不支持此种消息"); - throw new RuntimeException(); - } - return obj; - } - - //1 代表json序列化方式 - @Override - public int getType() { - return 1; - } -} diff --git a/version2/src/main/java/part1/common/serializer/mySerializer/ObjectSerializer.java b/version2/src/main/java/part1/common/serializer/mySerializer/ObjectSerializer.java deleted file mode 100644 index 3eec03c..0000000 --- a/version2/src/main/java/part1/common/serializer/mySerializer/ObjectSerializer.java +++ /dev/null @@ -1,54 +0,0 @@ -package part1.common.serializer.mySerializer; - -import java.io.*; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:36 - */ -public class ObjectSerializer implements Serializer { - //利用Java io 对象 -》字节数组 - @Override - public byte[] serialize(Object obj) { - byte[] bytes=null; - ByteArrayOutputStream bos=new ByteArrayOutputStream(); - try { - //是一个对象输出流,用于将 Java 对象序列化为字节流,并将其连接到bos上 - ObjectOutputStream oos = new ObjectOutputStream(bos); - oos.writeObject(obj); - //刷新 ObjectOutputStream,确保所有缓冲区中的数据都被写入到底层流中。 - oos.flush(); - //将bos其内部缓冲区中的数据转换为字节数组 - bytes = bos.toByteArray(); - oos.close(); - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - return bytes; - } - - //字节数组 -》对象 - @Override - public Object deserialize(byte[] bytes, int messageType) { - Object obj = null; - ByteArrayInputStream bis = new ByteArrayInputStream(bytes); - try { - ObjectInputStream ois = new ObjectInputStream(bis); - obj = ois.readObject(); - ois.close(); - bis.close(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - return obj; - } - - //0 代表Java 原生序列器 - @Override - public int getType() { - return 0; - } -} - diff --git a/version2/src/main/java/part1/common/serializer/mySerializer/Serializer.java b/version2/src/main/java/part1/common/serializer/mySerializer/Serializer.java deleted file mode 100644 index e0829d0..0000000 --- a/version2/src/main/java/part1/common/serializer/mySerializer/Serializer.java +++ /dev/null @@ -1,29 +0,0 @@ -package part1.common.serializer.mySerializer; - - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:31 - */ -public interface Serializer { - // 把对象序列化成字节数组 - byte[] serialize(Object obj); - // 从字节数组反序列化成消息, 使用java自带序列化方式不用messageType也能得到相应的对象(序列化字节数组里包含类信息) - // 其它方式需指定消息格式,再根据message转化成相应的对象 - Object deserialize(byte[] bytes, int messageType); - // 返回使用的序列器,是哪个 - // 0:java自带序列化方式, 1: json序列化方式 - int getType(); - // 根据序号取出序列化器,暂时有两种实现方式,需要其它方式,实现这个接口即可 - static Serializer getSerializerByCode(int code){ - switch (code){ - case 0: - return new ObjectSerializer(); - case 1: - return new JsonSerializer(); - default: - return null; - } - } -} diff --git a/version2/src/main/java/part1/common/service/Impl/UserServiceImpl.java b/version2/src/main/java/part1/common/service/Impl/UserServiceImpl.java deleted file mode 100644 index 41cde93..0000000 --- a/version2/src/main/java/part1/common/service/Impl/UserServiceImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package part1.common.service.Impl; - - -import part1.common.service.UserService; -import part1.common.pojo.User; - -import java.util.Random; -import java.util.UUID; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 16:28 - */ -public class UserServiceImpl implements UserService { - @Override - public User getUserByUserId(Integer id) { - System.out.println("客户端查询了"+id+"的用户"); - // 模拟从数据库中取用户的行为 - Random random = new Random(); - User user = User.builder().userName(UUID.randomUUID().toString()) - .id(id) - .sex(random.nextBoolean()).build(); - return user; - } - - @Override - public Integer insertUserId(User user) { - System.out.println("插入数据成功"+user.getUserName()); - return user.getId(); - } -} \ No newline at end of file diff --git a/version2/src/main/java/part1/common/service/UserService.java b/version2/src/main/java/part1/common/service/UserService.java deleted file mode 100644 index 0e539bd..0000000 --- a/version2/src/main/java/part1/common/service/UserService.java +++ /dev/null @@ -1,16 +0,0 @@ -package part1.common.service; - - -import part1.common.pojo.User; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 16:27 - */ -public interface UserService { - // 客户端通过这个接口调用服务端的实现类 - User getUserByUserId(Integer id); - //新增一个功能 - Integer insertUserId(User user); -} diff --git a/version2/src/main/java/part2/Client/TestClient.java b/version2/src/main/java/part2/Client/TestClient.java deleted file mode 100644 index e1c3007..0000000 --- a/version2/src/main/java/part2/Client/TestClient.java +++ /dev/null @@ -1,28 +0,0 @@ -package part2.Client; - - -import part2.Client.proxy.ClientProxy; -import part2.common.pojo.User; -import part2.common.service.UserService; - - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/6 18:39 - */ - -public class TestClient { - public static void main(String[] args) throws InterruptedException { - ClientProxy clientProxy=new ClientProxy(); - //ClientProxy clientProxy=new part2.Client.proxy.ClientProxy("127.0.0.1",9999,0); - UserService proxy=clientProxy.getProxy(UserService.class); - - User user = proxy.getUserByUserId(1); - System.out.println("从服务端得到的user="+user.toString()); - - User u=User.builder().id(100).userName("wxx").sex(true).build(); - Integer id = proxy.insertUserId(u); - System.out.println("向服务端插入user的id"+id); - } -} diff --git a/version2/src/main/java/part2/Client/cache/serviceCache.java b/version2/src/main/java/part2/Client/cache/serviceCache.java deleted file mode 100644 index 4da39df..0000000 --- a/version2/src/main/java/part2/Client/cache/serviceCache.java +++ /dev/null @@ -1,54 +0,0 @@ -package part2.Client.cache; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/4 0:57 - */ -public class serviceCache { - //key: serviceName 服务名 - //value: addressList 服务提供者列表 - private static Map> cache=new HashMap<>(); - - //添加服务 - public void addServcieToCache(String serviceName,String address){ - if(cache.containsKey(serviceName)){ - List addressList = cache.get(serviceName); - addressList.add(address); - System.out.println("将name为"+serviceName+"和地址为"+address+"的服务添加到本地缓存中"); - }else { - List addressList=new ArrayList<>(); - addressList.add(address); - cache.put(serviceName,addressList); - } - } - //修改服务地址 - public void replaceServiceAddress(String serviceName,String oldAddress,String newAddress){ - if(cache.containsKey(serviceName)){ - List addressList=cache.get(serviceName); - addressList.remove(oldAddress); - addressList.add(newAddress); - }else { - System.out.println("修改失败,服务不存在"); - } - } - //从缓存中取服务地址 - public List getServcieFromCache(String serviceName){ - if(!cache.containsKey(serviceName)) { - return null; - } - List a=cache.get(serviceName); - return a; - } - //从缓存中删除服务地址 - public void delete(String serviceName,String address){ - List addressList = cache.get(serviceName); - addressList.remove(address); - System.out.println("将name为"+serviceName+"和地址为"+address+"的服务从本地缓存中删除"); - } -} diff --git a/version2/src/main/java/part2/Client/netty/handler/NettyClientHandler.java b/version2/src/main/java/part2/Client/netty/handler/NettyClientHandler.java deleted file mode 100644 index 95eaf28..0000000 --- a/version2/src/main/java/part2/Client/netty/handler/NettyClientHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -package part2.Client.netty.handler; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.util.AttributeKey; -import part2.common.Message.RpcResponse; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 17:29 - */ -public class NettyClientHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, RpcResponse response) throws Exception { - // 接收到response, 给channel设计别名,让sendRequest里读取response - AttributeKey key = AttributeKey.valueOf("RPCResponse"); - ctx.channel().attr(key).set(response); - ctx.channel().close(); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } -} diff --git a/version2/src/main/java/part2/Client/netty/nettyInitializer/NettyClientInitializer.java b/version2/src/main/java/part2/Client/netty/nettyInitializer/NettyClientInitializer.java deleted file mode 100644 index 175c729..0000000 --- a/version2/src/main/java/part2/Client/netty/nettyInitializer/NettyClientInitializer.java +++ /dev/null @@ -1,26 +0,0 @@ -package part2.Client.netty.nettyInitializer; - - -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.socket.SocketChannel; -import part2.Client.netty.handler.NettyClientHandler; -import part2.common.serializer.myCode.MyDecoder; -import part2.common.serializer.myCode.MyEncoder; -import part2.common.serializer.mySerializer.JsonSerializer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 17:26 - */ -public class NettyClientInitializer extends ChannelInitializer { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ChannelPipeline pipeline = ch.pipeline(); - //使用自定义的编/解码器 - pipeline.addLast(new MyEncoder(new JsonSerializer())); - pipeline.addLast(new MyDecoder()); - pipeline.addLast(new NettyClientHandler()); - } -} diff --git a/version2/src/main/java/part2/Client/proxy/ClientProxy.java b/version2/src/main/java/part2/Client/proxy/ClientProxy.java deleted file mode 100644 index d549e0d..0000000 --- a/version2/src/main/java/part2/Client/proxy/ClientProxy.java +++ /dev/null @@ -1,42 +0,0 @@ -package part2.Client.proxy; - - -import part2.Client.rpcClient.RpcClient; -import part2.Client.rpcClient.impl.NettyRpcClient; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/6 16:49 - */ -public class ClientProxy implements InvocationHandler { - //传入参数service接口的class对象,反射封装成一个request - - private RpcClient rpcClient; - public ClientProxy() throws InterruptedException { - rpcClient=new NettyRpcClient(); - } - - //jdk动态代理,每一次代理对象调用方法,都会经过此方法增强(反射获取request对象,socket发送到服务端) - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - //构建request - RpcRequest request=RpcRequest.builder() - .interfaceName(method.getDeclaringClass().getName()) - .methodName(method.getName()) - .params(args).paramsType(method.getParameterTypes()).build(); - //数据传输 - RpcResponse response= rpcClient.sendRequest(request); - return response.getData(); - } - public T getProxy(Class clazz){ - Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this); - return (T)o; - } -} diff --git a/version2/src/main/java/part2/Client/rpcClient/RpcClient.java b/version2/src/main/java/part2/Client/rpcClient/RpcClient.java deleted file mode 100644 index 21690b1..0000000 --- a/version2/src/main/java/part2/Client/rpcClient/RpcClient.java +++ /dev/null @@ -1,15 +0,0 @@ -package part2.Client.rpcClient; - -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 18:55 - */ -public interface RpcClient { - - //定义底层通信的方法 - RpcResponse sendRequest(RpcRequest request); -} diff --git a/version2/src/main/java/part2/Client/rpcClient/impl/NettyRpcClient.java b/version2/src/main/java/part2/Client/rpcClient/impl/NettyRpcClient.java deleted file mode 100644 index bf006a7..0000000 --- a/version2/src/main/java/part2/Client/rpcClient/impl/NettyRpcClient.java +++ /dev/null @@ -1,68 +0,0 @@ -package part2.Client.rpcClient.impl; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.util.AttributeKey; -import part2.Client.netty.nettyInitializer.NettyClientInitializer; -import part2.Client.rpcClient.RpcClient; -import part2.Client.serviceCenter.ServiceCenter; -import part2.Client.serviceCenter.ZKServiceCenter; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -import java.net.InetSocketAddress; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 19:40 - */ -public class NettyRpcClient implements RpcClient { - - private static final Bootstrap bootstrap; - private static final EventLoopGroup eventLoopGroup; - - private ServiceCenter serviceCenter; - public NettyRpcClient() throws InterruptedException { - this.serviceCenter=new ZKServiceCenter(); - } - - //netty客户端初始化 - static { - eventLoopGroup = new NioEventLoopGroup(); - bootstrap = new Bootstrap(); - bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) - .handler(new NettyClientInitializer()); - } - @Override - public RpcResponse sendRequest(RpcRequest request) { - //从注册中心获取host,post - InetSocketAddress address = serviceCenter.serviceDiscovery(request.getInterfaceName()); - String host = address.getHostName(); - int port = address.getPort(); - try { - ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); - Channel channel = channelFuture.channel(); - // 发送数据 - channel.writeAndFlush(request); - //sync()堵塞获取结果 - channel.closeFuture().sync(); - // 阻塞的获得结果,通过给channel设计别名,获取特定名字下的channel中的内容(这个在hanlder中设置) - // AttributeKey是,线程隔离的,不会由线程安全问题。 - // 当前场景下选择堵塞获取结果 - // 其它场景也可以选择添加监听器的方式来异步获取结果 channelFuture.addListener... - AttributeKey key = AttributeKey.valueOf("RPCResponse"); - RpcResponse response = channel.attr(key).get(); - - System.out.println(response); - return response; - } catch (InterruptedException e) { - e.printStackTrace(); - } - return null; - } -} diff --git a/version2/src/main/java/part2/Client/rpcClient/impl/SimpleSocketRpcCilent.java b/version2/src/main/java/part2/Client/rpcClient/impl/SimpleSocketRpcCilent.java deleted file mode 100644 index 8faae62..0000000 --- a/version2/src/main/java/part2/Client/rpcClient/impl/SimpleSocketRpcCilent.java +++ /dev/null @@ -1,41 +0,0 @@ -package part2.Client.rpcClient.impl; - -import part2.Client.rpcClient.RpcClient; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 18:58 - */ -public class SimpleSocketRpcCilent implements RpcClient { - private String host; - private int port; - public SimpleSocketRpcCilent(String host,int port){ - this.host=host; - this.port=port; - } - @Override - public RpcResponse sendRequest(RpcRequest request) { - try { - Socket socket=new Socket(host, port); - ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois=new ObjectInputStream(socket.getInputStream()); - - oos.writeObject(request); - oos.flush(); - - RpcResponse response=(RpcResponse) ois.readObject(); - return response; - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/version2/src/main/java/part2/Client/serviceCenter/ServiceCenter.java b/version2/src/main/java/part2/Client/serviceCenter/ServiceCenter.java deleted file mode 100644 index d0562e6..0000000 --- a/version2/src/main/java/part2/Client/serviceCenter/ServiceCenter.java +++ /dev/null @@ -1,14 +0,0 @@ -package part2.Client.serviceCenter; - -import java.net.InetSocketAddress; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 21:42 - */ -//服务中心接口 -public interface ServiceCenter { - // 查询:根据服务名查找地址 - InetSocketAddress serviceDiscovery(String serviceName); -} diff --git a/version2/src/main/java/part2/Client/serviceCenter/ZKServiceCenter.java b/version2/src/main/java/part2/Client/serviceCenter/ZKServiceCenter.java deleted file mode 100644 index b53dec4..0000000 --- a/version2/src/main/java/part2/Client/serviceCenter/ZKServiceCenter.java +++ /dev/null @@ -1,75 +0,0 @@ -package part2.Client.serviceCenter; - -import org.apache.curator.RetryPolicy; -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.retry.ExponentialBackoffRetry; -import part2.Client.cache.serviceCache; -import part2.Client.serviceCenter.ZkWatcher.watchZK; - -import java.net.InetSocketAddress; -import java.util.List; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 21:41 - */ -public class ZKServiceCenter implements ServiceCenter{ - // curator 提供的zookeeper客户端 - private CuratorFramework client; - //zookeeper根路径节点 - private static final String ROOT_PATH = "MyRPC"; - //serviceCache - private serviceCache cache; - - //负责zookeeper客户端的初始化,并与zookeeper服务端进行连接 - public ZKServiceCenter() throws InterruptedException { - // 指数时间重试 - RetryPolicy policy = new ExponentialBackoffRetry(1000, 3); - // zookeeper的地址固定,不管是服务提供者还是,消费者都要与之建立连接 - // sessionTimeoutMs 与 zoo.cfg中的tickTime 有关系, - // zk还会根据minSessionTimeout与maxSessionTimeout两个参数重新调整最后的超时值。默认分别为tickTime 的2倍和20倍 - // 使用心跳监听状态 - this.client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181") - .sessionTimeoutMs(40000).retryPolicy(policy).namespace(ROOT_PATH).build(); - this.client.start(); - System.out.println("zookeeper 连接成功"); - //初始化本地缓存 - cache=new serviceCache(); - //加入zookeeper事件监听器 - watchZK watcher=new watchZK(client,cache); - //监听启动 - watcher.watchToUpdate(ROOT_PATH); - } - //根据服务名(接口名)返回地址 - @Override - public InetSocketAddress serviceDiscovery(String serviceName) { - try { - //先从本地缓存中找 - List serviceList=cache.getServcieFromCache(serviceName); - //如果找不到,再去zookeeper中找 - //这种i情况基本不会发生,或者说只会出现在初始化阶段 - if(serviceList==null) { - serviceList=client.getChildren().forPath("/" + serviceName); - } - // 这里默认用的第一个,后面加负载均衡 - String string = serviceList.get(0); - return parseAddress(string); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - // 地址 -> XXX.XXX.XXX.XXX:port 字符串 - private String getServiceAddress(InetSocketAddress serverAddress) { - return serverAddress.getHostName() + - ":" + - serverAddress.getPort(); - } - // 字符串解析为地址 - private InetSocketAddress parseAddress(String address) { - String[] result = address.split(":"); - return new InetSocketAddress(result[0], Integer.parseInt(result[1])); - } -} diff --git a/version2/src/main/java/part2/Client/serviceCenter/ZkWatcher/watchZK.java b/version2/src/main/java/part2/Client/serviceCenter/ZkWatcher/watchZK.java deleted file mode 100644 index 6d90bfe..0000000 --- a/version2/src/main/java/part2/Client/serviceCenter/ZkWatcher/watchZK.java +++ /dev/null @@ -1,87 +0,0 @@ -package part2.Client.serviceCenter.ZkWatcher; - -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.recipes.cache.ChildData; -import org.apache.curator.framework.recipes.cache.CuratorCache; -import org.apache.curator.framework.recipes.cache.CuratorCacheListener; -import part2.Client.cache.serviceCache; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/4 1:00 - */ -public class watchZK { - // curator 提供的zookeeper客户端 - private CuratorFramework client; - //本地缓存 - serviceCache cache; - - public watchZK(CuratorFramework client,serviceCache cache){ - this.client=client; - this.cache=cache; - } - - /** - * 监听当前节点和子节点的 更新,创建,删除 - * @param path - */ - public void watchToUpdate(String path) throws InterruptedException { - CuratorCache curatorCache = CuratorCache.build(client, "/"); - curatorCache.listenable().addListener(new CuratorCacheListener() { - @Override - public void event(Type type, ChildData childData, ChildData childData1) { - // 第一个参数:事件类型(枚举) - // 第二个参数:节点更新前的状态、数据 - // 第三个参数:节点更新后的状态、数据 - // 创建节点时:节点刚被创建,不存在 更新前节点 ,所以第二个参数为 null - // 删除节点时:节点被删除,不存在 更新后节点 ,所以第三个参数为 null - // 节点创建时没有赋予值 create /curator/app1 只创建节点,在这种情况下,更新前节点的 data 为 null,获取不到更新前节点的数据 - switch (type.name()) { - case "NODE_CREATED": // 监听器第一次执行时节点存在也会触发次事件 - String[] pathList= pasrePath(childData1); - if(pathList.length<=2) break; - else { - String serviceName=pathList[1]; - String address=pathList[2]; - //将新注册的服务加入到本地缓存中 - cache.addServcieToCache(serviceName,address); - } - break; - case "NODE_CHANGED": // 节点更新 - if (childData.getData() != null) { - System.out.println("修改前的数据: " + new String(childData.getData())); - } else { - System.out.println("节点第一次赋值!"); - } - String[] oldPathList=pasrePath(childData); - String[] newPathList=pasrePath(childData1); - cache.replaceServiceAddress(oldPathList[1],oldPathList[2],newPathList[2]); - System.out.println("修改后的数据: " + new String(childData1.getData())); - break; - case "NODE_DELETED": // 节点删除 - String[] pathList_d= pasrePath(childData); - if(pathList_d.length<=2) break; - else { - String serviceName=pathList_d[1]; - String address=pathList_d[2]; - //将新注册的服务加入到本地缓存中 - cache.delete(serviceName,address); - } - break; - default: - break; - } - } - }); - //开启监听 - curatorCache.start(); - } - //解析节点对应地址 - public String[] pasrePath(ChildData childData){ - //获取更新的节点的路径 - String path=new String(childData.getPath()); - //按照格式 ,读取 - return path.split("/"); - } -} \ No newline at end of file diff --git a/version2/src/main/java/part2/Server/TestServer.java b/version2/src/main/java/part2/Server/TestServer.java deleted file mode 100644 index 694a5fe..0000000 --- a/version2/src/main/java/part2/Server/TestServer.java +++ /dev/null @@ -1,27 +0,0 @@ -package part2.Server; - - -import part2.Server.provider.ServiceProvider; -import part2.Server.server.RpcServer; -import part2.Server.server.impl.NettyRPCRPCServer; -import part2.common.service.Impl.UserServiceImpl; -import part2.common.service.UserService; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/11 19:39 - */ - -public class TestServer { - public static void main(String[] args) throws InterruptedException { - UserService userService=new UserServiceImpl(); - - ServiceProvider serviceProvider=new ServiceProvider("127.0.0.1",9999); - - serviceProvider.provideServiceInterface(userService); - - RpcServer rpcServer=new NettyRPCRPCServer(serviceProvider); - rpcServer.start(9999); - } -} diff --git a/version2/src/main/java/part2/Server/netty/handler/NettyRPCServerHandler.java b/version2/src/main/java/part2/Server/netty/handler/NettyRPCServerHandler.java deleted file mode 100644 index adefac7..0000000 --- a/version2/src/main/java/part2/Server/netty/handler/NettyRPCServerHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -package part2.Server.netty.handler; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import lombok.AllArgsConstructor; -import part2.Server.provider.ServiceProvider; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 16:40 - * 因为是服务器端,我们知道接受到请求格式是RPCRequest - * Object类型也行,强制转型就行 - */ -@AllArgsConstructor -public class NettyRPCServerHandler extends SimpleChannelInboundHandler { - private ServiceProvider serviceProvider; - @Override - protected void channelRead0(ChannelHandlerContext ctx, RpcRequest request) throws Exception { - RpcResponse response = getResponse(request); - ctx.writeAndFlush(response); - ctx.close(); - } - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } - private RpcResponse getResponse(RpcRequest rpcRequest){ - //得到服务名 - String interfaceName=rpcRequest.getInterfaceName(); - //得到服务端相应服务实现类 - Object service = serviceProvider.getService(interfaceName); - //反射调用方法 - Method method=null; - try { - method= service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); - Object invoke=method.invoke(service,rpcRequest.getParams()); - return RpcResponse.sussess(invoke); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - System.out.println("方法执行错误"); - return RpcResponse.fail(); - } - } -} diff --git a/version2/src/main/java/part2/Server/netty/nettyInitializer/NettyServerInitializer.java b/version2/src/main/java/part2/Server/netty/nettyInitializer/NettyServerInitializer.java deleted file mode 100644 index 4d174a1..0000000 --- a/version2/src/main/java/part2/Server/netty/nettyInitializer/NettyServerInitializer.java +++ /dev/null @@ -1,30 +0,0 @@ -package part2.Server.netty.nettyInitializer; - - -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.socket.SocketChannel; -import lombok.AllArgsConstructor; -import part2.Server.netty.handler.NettyRPCServerHandler; -import part2.Server.provider.ServiceProvider; -import part2.common.serializer.myCode.MyDecoder; -import part2.common.serializer.myCode.MyEncoder; -import part2.common.serializer.mySerializer.JsonSerializer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 16:15 - */ -@AllArgsConstructor -public class NettyServerInitializer extends ChannelInitializer { - private ServiceProvider serviceProvider; - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ChannelPipeline pipeline = ch.pipeline(); - //使用自定义的编/解码器 - pipeline.addLast(new MyEncoder(new JsonSerializer())); - pipeline.addLast(new MyDecoder()); - pipeline.addLast(new NettyRPCServerHandler(serviceProvider)); - } -} diff --git a/version2/src/main/java/part2/Server/provider/ServiceProvider.java b/version2/src/main/java/part2/Server/provider/ServiceProvider.java deleted file mode 100644 index f7265f4..0000000 --- a/version2/src/main/java/part2/Server/provider/ServiceProvider.java +++ /dev/null @@ -1,47 +0,0 @@ -package part2.Server.provider; - -import part2.Server.serviceRegister.ServiceRegister; -import part2.Server.serviceRegister.impl.ZKServiceRegister; - -import java.net.InetSocketAddress; -import java.util.HashMap; -import java.util.Map; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/16 17:35 - */ -public class ServiceProvider { - private Map interfaceProvider; - - private int port; - private String host; - //注册服务类 - private ServiceRegister serviceRegister; - - public ServiceProvider(String host,int port){ - //需要传入服务端自身的网络地址 - this.host=host; - this.port=port; - this.interfaceProvider=new HashMap<>(); - this.serviceRegister=new ZKServiceRegister(); - } - - public void provideServiceInterface(Object service){ - String serviceName=service.getClass().getName(); - Class[] interfaceName=service.getClass().getInterfaces(); - - for (Class clazz:interfaceName){ - //本机的映射表 - interfaceProvider.put(clazz.getName(),service); - //在注册中心注册服务 - serviceRegister.register(clazz.getName(),new InetSocketAddress(host,port)); - } - } - - public Object getService(String interfaceName){ - return interfaceProvider.get(interfaceName); - } - -} diff --git a/version2/src/main/java/part2/Server/server/RpcServer.java b/version2/src/main/java/part2/Server/server/RpcServer.java deleted file mode 100644 index 6abbf2a..0000000 --- a/version2/src/main/java/part2/Server/server/RpcServer.java +++ /dev/null @@ -1,11 +0,0 @@ -package part2.Server.server; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/12 11:26 - */ -public interface RpcServer { - void start(int port); - void stop(); -} diff --git a/version2/src/main/java/part2/Server/server/impl/NettyRPCRPCServer.java b/version2/src/main/java/part2/Server/server/impl/NettyRPCRPCServer.java deleted file mode 100644 index 7a4349a..0000000 --- a/version2/src/main/java/part2/Server/server/impl/NettyRPCRPCServer.java +++ /dev/null @@ -1,48 +0,0 @@ -package part2.Server.server.impl; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import lombok.AllArgsConstructor; -import part2.Server.netty.nettyInitializer.NettyServerInitializer; -import part2.Server.provider.ServiceProvider; -import part2.Server.server.RpcServer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 14:01 - */ -@AllArgsConstructor -public class NettyRPCRPCServer implements RpcServer { - private ServiceProvider serviceProvider; - @Override - public void start(int port) { - // netty 服务线程组boss负责建立连接, work负责具体的请求 - NioEventLoopGroup bossGroup = new NioEventLoopGroup(); - NioEventLoopGroup workGroup = new NioEventLoopGroup(); - System.out.println("netty服务端启动了"); - try { - //启动netty服务器 - ServerBootstrap serverBootstrap = new ServerBootstrap(); - //初始化 - serverBootstrap.group(bossGroup,workGroup).channel(NioServerSocketChannel.class) - .childHandler(new NettyServerInitializer(serviceProvider)); - //同步堵塞 - ChannelFuture channelFuture=serverBootstrap.bind(port).sync(); - //死循环监听 - channelFuture.channel().closeFuture().sync(); - }catch (InterruptedException e){ - e.printStackTrace(); - }finally { - bossGroup.shutdownGracefully(); - workGroup.shutdownGracefully(); - } - } - - @Override - public void stop() { - - } -} diff --git a/version2/src/main/java/part2/Server/server/impl/SimpleRPCRPCServer.java b/version2/src/main/java/part2/Server/server/impl/SimpleRPCRPCServer.java deleted file mode 100644 index 8033bab..0000000 --- a/version2/src/main/java/part2/Server/server/impl/SimpleRPCRPCServer.java +++ /dev/null @@ -1,39 +0,0 @@ -package part2.Server.server.impl; - - -import lombok.AllArgsConstructor; -import part2.Server.provider.ServiceProvider; -import part2.Server.server.RpcServer; -import part2.Server.server.work.WorkThread; - -import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/12 11:37 - */ -@AllArgsConstructor -public class SimpleRPCRPCServer implements RpcServer { - private ServiceProvider serviceProvide; - @Override - public void start(int port) { - try { - ServerSocket serverSocket=new ServerSocket(port); - System.out.println("服务器启动了"); - while (true) { - Socket socket = serverSocket.accept(); - new Thread(new WorkThread(socket,serviceProvide)).start(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void stop() { - - } -} diff --git a/version2/src/main/java/part2/Server/server/work/WorkThread.java b/version2/src/main/java/part2/Server/server/work/WorkThread.java deleted file mode 100644 index a3985bf..0000000 --- a/version2/src/main/java/part2/Server/server/work/WorkThread.java +++ /dev/null @@ -1,58 +0,0 @@ -package part2.Server.server.work; - - -import lombok.AllArgsConstructor; -import part2.Server.provider.ServiceProvider; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/14 17:39 - */ -@AllArgsConstructor -public class WorkThread implements Runnable{ - private Socket socket; - private ServiceProvider serviceProvide; - @Override - public void run() { - try { - ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois=new ObjectInputStream(socket.getInputStream()); - //读取客户端传过来的request - RpcRequest rpcRequest = (RpcRequest) ois.readObject(); - //反射调用服务方法获取返回值 - RpcResponse rpcResponse=getResponse(rpcRequest); - //向客户端写入response - oos.writeObject(rpcResponse); - oos.flush(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - } - private RpcResponse getResponse(RpcRequest rpcRequest){ - //得到服务名 - String interfaceName=rpcRequest.getInterfaceName(); - //得到服务端相应服务实现类 - Object service = serviceProvide.getService(interfaceName); - //反射调用方法 - Method method=null; - try { - method= service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); - Object invoke=method.invoke(service,rpcRequest.getParams()); - return RpcResponse.sussess(invoke); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - System.out.println("方法执行错误"); - return RpcResponse.fail(); - } - } -} diff --git a/version2/src/main/java/part2/Server/serviceRegister/ServiceRegister.java b/version2/src/main/java/part2/Server/serviceRegister/ServiceRegister.java deleted file mode 100644 index a300602..0000000 --- a/version2/src/main/java/part2/Server/serviceRegister/ServiceRegister.java +++ /dev/null @@ -1,15 +0,0 @@ -package part2.Server.serviceRegister; - -import java.net.InetSocketAddress; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 16:58 - */ -// 服务注册接口 -public interface ServiceRegister { - // 注册:保存服务与地址。 - void register(String serviceName, InetSocketAddress serviceAddress); - -} diff --git a/version2/src/main/java/part2/Server/serviceRegister/impl/ZKServiceRegister.java b/version2/src/main/java/part2/Server/serviceRegister/impl/ZKServiceRegister.java deleted file mode 100644 index 6e1c006..0000000 --- a/version2/src/main/java/part2/Server/serviceRegister/impl/ZKServiceRegister.java +++ /dev/null @@ -1,62 +0,0 @@ -package part2.Server.serviceRegister.impl; - -import org.apache.curator.RetryPolicy; -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.retry.ExponentialBackoffRetry; -import org.apache.zookeeper.CreateMode; -import part2.Server.serviceRegister.ServiceRegister; - -import java.net.InetSocketAddress; -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 17:28 - */ -public class ZKServiceRegister implements ServiceRegister { - // curator 提供的zookeeper客户端 - private CuratorFramework client; - //zookeeper根路径节点 - private static final String ROOT_PATH = "MyRPC"; - - //负责zookeeper客户端的初始化,并与zookeeper服务端进行连接 - public ZKServiceRegister(){ - // 指数时间重试 - RetryPolicy policy = new ExponentialBackoffRetry(1000, 3); - // zookeeper的地址固定,不管是服务提供者还是,消费者都要与之建立连接 - // sessionTimeoutMs 与 zoo.cfg中的tickTime 有关系, - // zk还会根据minSessionTimeout与maxSessionTimeout两个参数重新调整最后的超时值。默认分别为tickTime 的2倍和20倍 - // 使用心跳监听状态 - this.client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181") - .sessionTimeoutMs(40000).retryPolicy(policy).namespace(ROOT_PATH).build(); - this.client.start(); - System.out.println("zookeeper 连接成功"); - } - //注册服务到注册中心 - @Override - public void register(String serviceName, InetSocketAddress serviceAddress) { - try { - // serviceName创建成永久节点,服务提供者下线时,不删服务名,只删地址 - if(client.checkExists().forPath("/" + serviceName) == null){ - client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/" + serviceName); - } - // 路径地址,一个/代表一个节点 - String path = "/" + serviceName +"/"+ getServiceAddress(serviceAddress); - // 临时节点,服务器下线就删除节点 - client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path); - } catch (Exception e) { - System.out.println("此服务已存在"); - } - } - // 地址 -> XXX.XXX.XXX.XXX:port 字符串 - private String getServiceAddress(InetSocketAddress serverAddress) { - return serverAddress.getHostName() + - ":" + - serverAddress.getPort(); - } - // 字符串解析为地址 - private InetSocketAddress parseAddress(String address) { - String[] result = address.split(":"); - return new InetSocketAddress(result[0], Integer.parseInt(result[1])); - } -} diff --git a/version2/src/main/java/part2/common/Message/MessageType.java b/version2/src/main/java/part2/common/Message/MessageType.java deleted file mode 100644 index 0241fd6..0000000 --- a/version2/src/main/java/part2/common/Message/MessageType.java +++ /dev/null @@ -1,17 +0,0 @@ -package part2.common.Message; - -import lombok.AllArgsConstructor; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:29 - */ -@AllArgsConstructor -public enum MessageType { - REQUEST(0),RESPONSE(1); - private int code; - public int getCode(){ - return code; - } -} \ No newline at end of file diff --git a/version2/src/main/java/part2/common/Message/RpcRequest.java b/version2/src/main/java/part2/common/Message/RpcRequest.java deleted file mode 100644 index 9ed8c3a..0000000 --- a/version2/src/main/java/part2/common/Message/RpcRequest.java +++ /dev/null @@ -1,29 +0,0 @@ -package part2.common.Message; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/1 18:30 - * 定义发送的消息格式 - */ -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class RpcRequest implements Serializable { - //服务类名,客户端只知道接口 - private String interfaceName; - //调用的方法名 - private String methodName; - //参数列表 - private Object[] params; - //参数类型 - private Class[] paramsType; -} diff --git a/version2/src/main/java/part2/common/Message/RpcResponse.java b/version2/src/main/java/part2/common/Message/RpcResponse.java deleted file mode 100644 index 8df2e59..0000000 --- a/version2/src/main/java/part2/common/Message/RpcResponse.java +++ /dev/null @@ -1,35 +0,0 @@ -package part2.common.Message; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/1 19:18 - */ -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class RpcResponse implements Serializable { - //状态信息 - private int code; - private String message; - //更新:加入传输数据的类型,以便在自定义序列化器中解析 - private Class dataType; - //具体数据 - private Object data; - - public static RpcResponse sussess(Object data){ - return RpcResponse.builder().code(200).dataType(data.getClass()).data(data).build(); - } - public static RpcResponse fail(){ - return RpcResponse.builder().code(500).message("服务器发生错误").build(); - } -} - diff --git a/version2/src/main/java/part2/common/pojo/User.java b/version2/src/main/java/part2/common/pojo/User.java deleted file mode 100644 index bf999d7..0000000 --- a/version2/src/main/java/part2/common/pojo/User.java +++ /dev/null @@ -1,25 +0,0 @@ -package part2.common.pojo; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 17:50 - */ -@Builder -@Data -@NoArgsConstructor -@AllArgsConstructor -public class User implements Serializable { - // 客户端和服务端共有的 - private Integer id; - private String userName; - private Boolean sex; -} - diff --git a/version2/src/main/java/part2/common/serializer/myCode/MyDecoder.java b/version2/src/main/java/part2/common/serializer/myCode/MyDecoder.java deleted file mode 100644 index 7970141..0000000 --- a/version2/src/main/java/part2/common/serializer/myCode/MyDecoder.java +++ /dev/null @@ -1,41 +0,0 @@ -package part2.common.serializer.myCode; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import part2.common.Message.MessageType; -import part2.common.serializer.mySerializer.Serializer; - -import java.util.List; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:24 - * 按照自定义的消息格式解码数据 - */ -public class MyDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List out) throws Exception { - //1.读取消息类型 - short messageType = in.readShort(); - // 现在还只支持request与response请求 - if(messageType != MessageType.REQUEST.getCode() && - messageType != MessageType.RESPONSE.getCode()){ - System.out.println("暂不支持此种数据"); - return; - } - //2.读取序列化的方式&类型 - short serializerType = in.readShort(); - Serializer serializer = Serializer.getSerializerByCode(serializerType); - if(serializer == null) - throw new RuntimeException("不存在对应的序列化器"); - //3.读取序列化数组长度 - int length = in.readInt(); - //4.读取序列化数组 - byte[] bytes=new byte[length]; - in.readBytes(bytes); - Object deserialize= serializer.deserialize(bytes, messageType); - out.add(deserialize); - } -} diff --git a/version2/src/main/java/part2/common/serializer/myCode/MyEncoder.java b/version2/src/main/java/part2/common/serializer/myCode/MyEncoder.java deleted file mode 100644 index c6ef573..0000000 --- a/version2/src/main/java/part2/common/serializer/myCode/MyEncoder.java +++ /dev/null @@ -1,41 +0,0 @@ -package part2.common.serializer.myCode; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToByteEncoder; -import lombok.AllArgsConstructor; -import part2.common.Message.MessageType; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; -import part2.common.serializer.mySerializer.Serializer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:24 - * 依次按照自定义的消息格式写入,传入的数据为request或者response - * 需要持有一个serialize器,负责将传入的对象序列化成字节数组 - */ -@AllArgsConstructor -public class MyEncoder extends MessageToByteEncoder { - private Serializer serializer; - @Override - protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { - System.out.println(msg.getClass()); - //1.写入消息类型 - if(msg instanceof RpcRequest){ - out.writeShort(MessageType.REQUEST.getCode()); - } - else if(msg instanceof RpcResponse){ - out.writeShort(MessageType.RESPONSE.getCode()); - } - //2.写入序列化方式 - out.writeShort(serializer.getType()); - //得到序列化数组 - byte[] serializeBytes = serializer.serialize(msg); - //3.写入长度 - out.writeInt(serializeBytes.length); - //4.写入序列化数组 - out.writeBytes(serializeBytes); - } -} diff --git a/version2/src/main/java/part2/common/serializer/mySerializer/JsonSerializer.java b/version2/src/main/java/part2/common/serializer/mySerializer/JsonSerializer.java deleted file mode 100644 index 63c000b..0000000 --- a/version2/src/main/java/part2/common/serializer/mySerializer/JsonSerializer.java +++ /dev/null @@ -1,65 +0,0 @@ -package part2.common.serializer.mySerializer; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:31 - */ -public class JsonSerializer implements Serializer { - @Override - public byte[] serialize(Object obj) { - byte[] bytes = JSONObject.toJSONBytes(obj); - return bytes; - } - - @Override - public Object deserialize(byte[] bytes, int messageType) { - Object obj = null; - // 传输的消息分为request与response - switch (messageType){ - case 0: - RpcRequest request = JSON.parseObject(bytes, RpcRequest.class); - Object[] objects = new Object[request.getParams().length]; - // 把json字串转化成对应的对象, fastjson可以读出基本数据类型,不用转化 - // 对转换后的request中的params属性逐个进行类型判断 - for(int i = 0; i < objects.length; i++){ - Class paramsType = request.getParamsType()[i]; - //判断每个对象类型是否和paramsTypes中的一致 - if (!paramsType.isAssignableFrom(request.getParams()[i].getClass())){ - //如果不一致,就行进行类型转换 - objects[i] = JSONObject.toJavaObject((JSONObject) request.getParams()[i],request.getParamsType()[i]); - }else{ - //如果一致就直接赋给objects[i] - objects[i] = request.getParams()[i]; - } - } - request.setParams(objects); - obj = request; - break; - case 1: - RpcResponse response = JSON.parseObject(bytes, RpcResponse.class); - Class dataType = response.getDataType(); - //判断转化后的response对象中的data的类型是否正确 - if(! dataType.isAssignableFrom(response.getData().getClass())){ - response.setData(JSONObject.toJavaObject((JSONObject) response.getData(),dataType)); - } - obj = response; - break; - default: - System.out.println("暂时不支持此种消息"); - throw new RuntimeException(); - } - return obj; - } - - //1 代表json序列化方式 - @Override - public int getType() { - return 1; - } -} diff --git a/version2/src/main/java/part2/common/serializer/mySerializer/ObjectSerializer.java b/version2/src/main/java/part2/common/serializer/mySerializer/ObjectSerializer.java deleted file mode 100644 index 5940fb1..0000000 --- a/version2/src/main/java/part2/common/serializer/mySerializer/ObjectSerializer.java +++ /dev/null @@ -1,54 +0,0 @@ -package part2.common.serializer.mySerializer; - -import java.io.*; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:36 - */ -public class ObjectSerializer implements Serializer { - //利用Java io 对象 -》字节数组 - @Override - public byte[] serialize(Object obj) { - byte[] bytes=null; - ByteArrayOutputStream bos=new ByteArrayOutputStream(); - try { - //是一个对象输出流,用于将 Java 对象序列化为字节流,并将其连接到bos上 - ObjectOutputStream oos = new ObjectOutputStream(bos); - oos.writeObject(obj); - //刷新 ObjectOutputStream,确保所有缓冲区中的数据都被写入到底层流中。 - oos.flush(); - //将bos其内部缓冲区中的数据转换为字节数组 - bytes = bos.toByteArray(); - oos.close(); - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - return bytes; - } - - //字节数组 -》对象 - @Override - public Object deserialize(byte[] bytes, int messageType) { - Object obj = null; - ByteArrayInputStream bis = new ByteArrayInputStream(bytes); - try { - ObjectInputStream ois = new ObjectInputStream(bis); - obj = ois.readObject(); - ois.close(); - bis.close(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - return obj; - } - - //0 代表Java 原生序列器 - @Override - public int getType() { - return 0; - } -} - diff --git a/version2/src/main/java/part2/common/serializer/mySerializer/Serializer.java b/version2/src/main/java/part2/common/serializer/mySerializer/Serializer.java deleted file mode 100644 index c751d36..0000000 --- a/version2/src/main/java/part2/common/serializer/mySerializer/Serializer.java +++ /dev/null @@ -1,29 +0,0 @@ -package part2.common.serializer.mySerializer; - - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:31 - */ -public interface Serializer { - // 把对象序列化成字节数组 - byte[] serialize(Object obj); - // 从字节数组反序列化成消息, 使用java自带序列化方式不用messageType也能得到相应的对象(序列化字节数组里包含类信息) - // 其它方式需指定消息格式,再根据message转化成相应的对象 - Object deserialize(byte[] bytes, int messageType); - // 返回使用的序列器,是哪个 - // 0:java自带序列化方式, 1: json序列化方式 - int getType(); - // 根据序号取出序列化器,暂时有两种实现方式,需要其它方式,实现这个接口即可 - static Serializer getSerializerByCode(int code){ - switch (code){ - case 0: - return new ObjectSerializer(); - case 1: - return new JsonSerializer(); - default: - return null; - } - } -} diff --git a/version2/src/main/java/part2/common/service/Impl/UserServiceImpl.java b/version2/src/main/java/part2/common/service/Impl/UserServiceImpl.java deleted file mode 100644 index 37e6262..0000000 --- a/version2/src/main/java/part2/common/service/Impl/UserServiceImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package part2.common.service.Impl; - - -import part2.common.pojo.User; -import part2.common.service.UserService; - -import java.util.Random; -import java.util.UUID; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 16:28 - */ -public class UserServiceImpl implements UserService { - @Override - public User getUserByUserId(Integer id) { - System.out.println("客户端查询了"+id+"的用户"); - // 模拟从数据库中取用户的行为 - Random random = new Random(); - User user = User.builder().userName(UUID.randomUUID().toString()) - .id(id) - .sex(random.nextBoolean()).build(); - return user; - } - - @Override - public Integer insertUserId(User user) { - System.out.println("插入数据成功"+user.getUserName()); - return user.getId(); - } -} \ No newline at end of file diff --git a/version2/src/main/java/part2/common/service/UserService.java b/version2/src/main/java/part2/common/service/UserService.java deleted file mode 100644 index b6817fe..0000000 --- a/version2/src/main/java/part2/common/service/UserService.java +++ /dev/null @@ -1,16 +0,0 @@ -package part2.common.service; - - -import part2.common.pojo.User; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 16:27 - */ -public interface UserService { - // 客户端通过这个接口调用服务端的实现类 - User getUserByUserId(Integer id); - //新增一个功能 - Integer insertUserId(User user); -} diff --git a/version2/src/main/resources/log4j.properties b/version2/src/main/resources/log4j.properties deleted file mode 100644 index 4e012fe..0000000 --- a/version2/src/main/resources/log4j.properties +++ /dev/null @@ -1,8 +0,0 @@ -log4j.rootLogger=ERROR, stdout -log4j.appender.stdout=org.apache.log4j.ConsoleAppender - -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n -log4j.appender.logfile=org.apache.log4j.FileAppender -log4j.appender.logfile.File=target/spring.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout -log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n diff --git a/version3/pom.xml b/version3/pom.xml deleted file mode 100644 index 2484083..0000000 --- a/version3/pom.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - 4.0.0 - - org.example - version3 - 1.0-SNAPSHOT - - - 8 - 8 - UTF-8 - - - - org.projectlombok - lombok - 1.18.30 - compile - - - org.slf4j - slf4j-log4j12 - 1.7.25 - - - org.apache.logging.log4j - log4j-1.2-api - 2.8.2 - - - - io.netty - netty-all - 4.1.51.Final - compile - - - - org.apache.curator - curator-recipes - 5.1.0 - - - com.alibaba - fastjson - 1.2.83 - - - com.github.rholder - guava-retrying - 2.0.0 - - - - \ No newline at end of file diff --git a/version3/src/main/java/part1/Client/TestClient.java b/version3/src/main/java/part1/Client/TestClient.java deleted file mode 100644 index 2c80f33..0000000 --- a/version3/src/main/java/part1/Client/TestClient.java +++ /dev/null @@ -1,28 +0,0 @@ -package part1.Client; - - -import part1.Client.proxy.ClientProxy; -import part1.common.pojo.User; -import part1.common.service.UserService; - - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/6 18:39 - */ - -public class TestClient { - public static void main(String[] args) throws InterruptedException { - ClientProxy clientProxy=new ClientProxy(); - //ClientProxy clientProxy=new proxy.Client.part1.ClientProxy("127.0.0.1",9999,0); - UserService proxy=clientProxy.getProxy(UserService.class); - - User user = proxy.getUserByUserId(1); - System.out.println("从服务端得到的user="+user.toString()); - - User u=User.builder().id(100).userName("wxx").sex(true).build(); - Integer id = proxy.insertUserId(u); - System.out.println("向服务端插入user的id"+id); - } -} diff --git a/version3/src/main/java/part1/Client/cache/serviceCache.java b/version3/src/main/java/part1/Client/cache/serviceCache.java deleted file mode 100644 index dee03ce..0000000 --- a/version3/src/main/java/part1/Client/cache/serviceCache.java +++ /dev/null @@ -1,57 +0,0 @@ -package part1.Client.cache; - -import part1.Client.serviceCenter.balance.LoadBalance; -import part1.Client.serviceCenter.balance.impl.ConsistencyHashBalance; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/4 0:57 - */ -public class serviceCache { - //key: serviceName 服务名 - //value: addressList 服务提供者列表 - private static Map> cache=new HashMap<>(); - - //添加服务 - public void addServcieToCache(String serviceName,String address){ - if(cache.containsKey(serviceName)){ - List addressList = cache.get(serviceName); - addressList.add(address); - System.out.println("将name为"+serviceName+"和地址为"+address+"的服务添加到本地缓存中"); - }else { - List addressList=new ArrayList<>(); - addressList.add(address); - cache.put(serviceName,addressList); - } - } - //修改服务地址 - public void replaceServiceAddress(String serviceName,String oldAddress,String newAddress){ - if(cache.containsKey(serviceName)){ - List addressList=cache.get(serviceName); - addressList.remove(oldAddress); - addressList.add(newAddress); - }else { - System.out.println("修改失败,服务不存在"); - } - } - //从缓存中取服务地址列表 - public List getServiceListFromCache(String serviceName){ - if(!cache.containsKey(serviceName)) { - return null; - } - return cache.get(serviceName); - } - - //从缓存中删除服务地址 - public void delete(String serviceName,String address){ - List addressList = cache.get(serviceName); - addressList.remove(address); - System.out.println("将name为"+serviceName+"和地址为"+address+"的服务从本地缓存中删除"); - } -} diff --git a/version3/src/main/java/part1/Client/netty/handler/NettyClientHandler.java b/version3/src/main/java/part1/Client/netty/handler/NettyClientHandler.java deleted file mode 100644 index 31858c6..0000000 --- a/version3/src/main/java/part1/Client/netty/handler/NettyClientHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -package part1.Client.netty.handler; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.util.AttributeKey; -import part1.common.Message.RpcResponse; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 17:29 - */ -public class NettyClientHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, RpcResponse response) throws Exception { - // 接收到response, 给channel设计别名,让sendRequest里读取response - AttributeKey key = AttributeKey.valueOf("RPCResponse"); - ctx.channel().attr(key).set(response); - ctx.channel().close(); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } -} diff --git a/version3/src/main/java/part1/Client/netty/nettyInitializer/NettyClientInitializer.java b/version3/src/main/java/part1/Client/netty/nettyInitializer/NettyClientInitializer.java deleted file mode 100644 index e0b520a..0000000 --- a/version3/src/main/java/part1/Client/netty/nettyInitializer/NettyClientInitializer.java +++ /dev/null @@ -1,26 +0,0 @@ -package part1.Client.netty.nettyInitializer; - - -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.socket.SocketChannel; -import part1.Client.netty.handler.NettyClientHandler; -import part1.common.serializer.myCode.MyDecoder; -import part1.common.serializer.myCode.MyEncoder; -import part1.common.serializer.mySerializer.JsonSerializer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 17:26 - */ -public class NettyClientInitializer extends ChannelInitializer { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ChannelPipeline pipeline = ch.pipeline(); - //使用自定义的编/解码器 - pipeline.addLast(new MyEncoder(new JsonSerializer())); - pipeline.addLast(new MyDecoder()); - pipeline.addLast(new NettyClientHandler()); - } -} diff --git a/version3/src/main/java/part1/Client/proxy/ClientProxy.java b/version3/src/main/java/part1/Client/proxy/ClientProxy.java deleted file mode 100644 index bacca21..0000000 --- a/version3/src/main/java/part1/Client/proxy/ClientProxy.java +++ /dev/null @@ -1,42 +0,0 @@ -package part1.Client.proxy; - - -import part1.Client.rpcClient.RpcClient; -import part1.common.Message.RpcRequest; -import part1.common.Message.RpcResponse; -import part1.Client.rpcClient.impl.NettyRpcClient; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/6 16:49 - */ -public class ClientProxy implements InvocationHandler { - //传入参数service接口的class对象,反射封装成一个request - - private RpcClient rpcClient; - public ClientProxy() throws InterruptedException { - rpcClient=new NettyRpcClient(); - } - - //jdk动态代理,每一次代理对象调用方法,都会经过此方法增强(反射获取request对象,socket发送到服务端) - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - //构建request - RpcRequest request=RpcRequest.builder() - .interfaceName(method.getDeclaringClass().getName()) - .methodName(method.getName()) - .params(args).paramsType(method.getParameterTypes()).build(); - //数据传输 - RpcResponse response= rpcClient.sendRequest(request); - return response.getData(); - } - public T getProxy(Class clazz){ - Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this); - return (T)o; - } -} diff --git a/version3/src/main/java/part1/Client/rpcClient/RpcClient.java b/version3/src/main/java/part1/Client/rpcClient/RpcClient.java deleted file mode 100644 index c665530..0000000 --- a/version3/src/main/java/part1/Client/rpcClient/RpcClient.java +++ /dev/null @@ -1,15 +0,0 @@ -package part1.Client.rpcClient; - -import part1.common.Message.RpcRequest; -import part1.common.Message.RpcResponse; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 18:55 - */ -public interface RpcClient { - - //定义底层通信的方法 - RpcResponse sendRequest(RpcRequest request); -} diff --git a/version3/src/main/java/part1/Client/rpcClient/impl/NettyRpcClient.java b/version3/src/main/java/part1/Client/rpcClient/impl/NettyRpcClient.java deleted file mode 100644 index 0daab8c..0000000 --- a/version3/src/main/java/part1/Client/rpcClient/impl/NettyRpcClient.java +++ /dev/null @@ -1,68 +0,0 @@ -package part1.Client.rpcClient.impl; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.util.AttributeKey; -import part1.Client.rpcClient.RpcClient; -import part1.Client.serviceCenter.ServiceCenter; -import part1.Client.serviceCenter.ZKServiceCenter; -import part1.common.Message.RpcRequest; -import part1.common.Message.RpcResponse; -import part1.Client.netty.nettyInitializer.NettyClientInitializer; - -import java.net.InetSocketAddress; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 19:40 - */ -public class NettyRpcClient implements RpcClient { - - private static final Bootstrap bootstrap; - private static final EventLoopGroup eventLoopGroup; - - private ServiceCenter serviceCenter; - public NettyRpcClient() throws InterruptedException { - this.serviceCenter=new ZKServiceCenter(); - } - - //netty客户端初始化 - static { - eventLoopGroup = new NioEventLoopGroup(); - bootstrap = new Bootstrap(); - bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) - .handler(new NettyClientInitializer()); - } - @Override - public RpcResponse sendRequest(RpcRequest request) { - //从注册中心获取host,post - InetSocketAddress address = serviceCenter.serviceDiscovery(request.getInterfaceName()); - String host = address.getHostName(); - int port = address.getPort(); - try { - ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); - Channel channel = channelFuture.channel(); - // 发送数据 - channel.writeAndFlush(request); - //sync()堵塞获取结果 - channel.closeFuture().sync(); - // 阻塞的获得结果,通过给channel设计别名,获取特定名字下的channel中的内容(这个在hanlder中设置) - // AttributeKey是,线程隔离的,不会由线程安全问题。 - // 当前场景下选择堵塞获取结果 - // 其它场景也可以选择添加监听器的方式来异步获取结果 channelFuture.addListener... - AttributeKey key = AttributeKey.valueOf("RPCResponse"); - RpcResponse response = channel.attr(key).get(); - - System.out.println(response); - return response; - } catch (InterruptedException e) { - e.printStackTrace(); - } - return null; - } -} diff --git a/version3/src/main/java/part1/Client/rpcClient/impl/SimpleSocketRpcCilent.java b/version3/src/main/java/part1/Client/rpcClient/impl/SimpleSocketRpcCilent.java deleted file mode 100644 index d74af41..0000000 --- a/version3/src/main/java/part1/Client/rpcClient/impl/SimpleSocketRpcCilent.java +++ /dev/null @@ -1,41 +0,0 @@ -package part1.Client.rpcClient.impl; - -import part1.Client.rpcClient.RpcClient; -import part1.common.Message.RpcRequest; -import part1.common.Message.RpcResponse; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 18:58 - */ -public class SimpleSocketRpcCilent implements RpcClient { - private String host; - private int port; - public SimpleSocketRpcCilent(String host,int port){ - this.host=host; - this.port=port; - } - @Override - public RpcResponse sendRequest(RpcRequest request) { - try { - Socket socket=new Socket(host, port); - ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois=new ObjectInputStream(socket.getInputStream()); - - oos.writeObject(request); - oos.flush(); - - RpcResponse response=(RpcResponse) ois.readObject(); - return response; - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/version3/src/main/java/part1/Client/serviceCenter/ServiceCenter.java b/version3/src/main/java/part1/Client/serviceCenter/ServiceCenter.java deleted file mode 100644 index 1842b94..0000000 --- a/version3/src/main/java/part1/Client/serviceCenter/ServiceCenter.java +++ /dev/null @@ -1,14 +0,0 @@ -package part1.Client.serviceCenter; - -import java.net.InetSocketAddress; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 21:42 - */ -//服务中心接口 -public interface ServiceCenter { - // 查询:根据服务名查找地址 - InetSocketAddress serviceDiscovery(String serviceName); -} diff --git a/version3/src/main/java/part1/Client/serviceCenter/ZKServiceCenter.java b/version3/src/main/java/part1/Client/serviceCenter/ZKServiceCenter.java deleted file mode 100644 index 0a23a1f..0000000 --- a/version3/src/main/java/part1/Client/serviceCenter/ZKServiceCenter.java +++ /dev/null @@ -1,76 +0,0 @@ -package part1.Client.serviceCenter; - -import org.apache.curator.RetryPolicy; -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.retry.ExponentialBackoffRetry; -import part1.Client.cache.serviceCache; -import part1.Client.serviceCenter.ZkWatcher.watchZK; -import part1.Client.serviceCenter.balance.impl.ConsistencyHashBalance; - -import java.net.InetSocketAddress; -import java.util.List; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 21:41 - */ -public class ZKServiceCenter implements ServiceCenter{ - // curator 提供的zookeeper客户端 - private CuratorFramework client; - //zookeeper根路径节点 - private static final String ROOT_PATH = "MyRPC"; - //serviceCache - private serviceCache cache; - - //负责zookeeper客户端的初始化,并与zookeeper服务端进行连接 - public ZKServiceCenter() throws InterruptedException { - // 指数时间重试 - RetryPolicy policy = new ExponentialBackoffRetry(1000, 3); - // zookeeper的地址固定,不管是服务提供者还是,消费者都要与之建立连接 - // sessionTimeoutMs 与 zoo.cfg中的tickTime 有关系, - // zk还会根据minSessionTimeout与maxSessionTimeout两个参数重新调整最后的超时值。默认分别为tickTime 的2倍和20倍 - // 使用心跳监听状态 - this.client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181") - .sessionTimeoutMs(40000).retryPolicy(policy).namespace(ROOT_PATH).build(); - this.client.start(); - System.out.println("zookeeper 连接成功"); - //初始化本地缓存 - cache=new serviceCache(); - //加入zookeeper事件监听器 - watchZK watcher=new watchZK(client,cache); - //监听启动 - watcher.watchToUpdate(ROOT_PATH); - } - //根据服务名(接口名)返回地址 - @Override - public InetSocketAddress serviceDiscovery(String serviceName) { - try { - //先从本地缓存中找 - List serviceList=cache.getServiceListFromCache(serviceName); - //如果找不到,再去zookeeper中找 - //这种i情况基本不会发生,或者说只会出现在初始化阶段 - if(serviceList==null) { - serviceList=client.getChildren().forPath("/" + serviceName); - } - // 负载均衡得到地址 - String address = new ConsistencyHashBalance().balance(serviceList); - return parseAddress(address); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - // 地址 -> XXX.XXX.XXX.XXX:port 字符串 - private String getServiceAddress(InetSocketAddress serverAddress) { - return serverAddress.getHostName() + - ":" + - serverAddress.getPort(); - } - // 字符串解析为地址 - private InetSocketAddress parseAddress(String address) { - String[] result = address.split(":"); - return new InetSocketAddress(result[0], Integer.parseInt(result[1])); - } -} diff --git a/version3/src/main/java/part1/Client/serviceCenter/ZkWatcher/watchZK.java b/version3/src/main/java/part1/Client/serviceCenter/ZkWatcher/watchZK.java deleted file mode 100644 index c8ef382..0000000 --- a/version3/src/main/java/part1/Client/serviceCenter/ZkWatcher/watchZK.java +++ /dev/null @@ -1,87 +0,0 @@ -package part1.Client.serviceCenter.ZkWatcher; - -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.recipes.cache.ChildData; -import org.apache.curator.framework.recipes.cache.CuratorCache; -import org.apache.curator.framework.recipes.cache.CuratorCacheListener; -import part1.Client.cache.serviceCache; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/4 1:00 - */ -public class watchZK { - // curator 提供的zookeeper客户端 - private CuratorFramework client; - //本地缓存 - serviceCache cache; - - public watchZK(CuratorFramework client, serviceCache cache){ - this.client=client; - this.cache=cache; - } - - /** - * 监听当前节点和子节点的 更新,创建,删除 - * @param path - */ - public void watchToUpdate(String path) throws InterruptedException { - CuratorCache curatorCache = CuratorCache.build(client, "/"); - curatorCache.listenable().addListener(new CuratorCacheListener() { - @Override - public void event(Type type, ChildData childData, ChildData childData1) { - // 第一个参数:事件类型(枚举) - // 第二个参数:节点更新前的状态、数据 - // 第三个参数:节点更新后的状态、数据 - // 创建节点时:节点刚被创建,不存在 更新前节点 ,所以第二个参数为 null - // 删除节点时:节点被删除,不存在 更新后节点 ,所以第三个参数为 null - // 节点创建时没有赋予值 create /curator/app1 只创建节点,在这种情况下,更新前节点的 data 为 null,获取不到更新前节点的数据 - switch (type.name()) { - case "NODE_CREATED": // 监听器第一次执行时节点存在也会触发次事件 - String[] pathList= pasrePath(childData1); - if(pathList.length<=2) break; - else { - String serviceName=pathList[1]; - String address=pathList[2]; - //将新注册的服务加入到本地缓存中 - cache.addServcieToCache(serviceName,address); - } - break; - case "NODE_CHANGED": // 节点更新 - if (childData.getData() != null) { - System.out.println("修改前的数据: " + new String(childData.getData())); - } else { - System.out.println("节点第一次赋值!"); - } - String[] oldPathList=pasrePath(childData); - String[] newPathList=pasrePath(childData1); - cache.replaceServiceAddress(oldPathList[1],oldPathList[2],newPathList[2]); - System.out.println("修改后的数据: " + new String(childData1.getData())); - break; - case "NODE_DELETED": // 节点删除 - String[] pathList_d= pasrePath(childData); - if(pathList_d.length<=2) break; - else { - String serviceName=pathList_d[1]; - String address=pathList_d[2]; - //将新注册的服务加入到本地缓存中 - cache.delete(serviceName,address); - } - break; - default: - break; - } - } - }); - //开启监听 - curatorCache.start(); - } - //解析节点对应地址 - public String[] pasrePath(ChildData childData){ - //获取更新的节点的路径 - String path=new String(childData.getPath()); - //按照格式 ,读取 - return path.split("/"); - } -} \ No newline at end of file diff --git a/version3/src/main/java/part1/Client/serviceCenter/balance/LoadBalance.java b/version3/src/main/java/part1/Client/serviceCenter/balance/LoadBalance.java deleted file mode 100644 index 03d3f7a..0000000 --- a/version3/src/main/java/part1/Client/serviceCenter/balance/LoadBalance.java +++ /dev/null @@ -1,15 +0,0 @@ -package part1.Client.serviceCenter.balance; - -import java.util.List; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/19 21:00 - * 给服务地址列表,根据不同的负载均衡策略选择一个 - */ -public interface LoadBalance { - String balance(List addressList); - void addNode(String node) ; - void delNode(String node); -} \ No newline at end of file diff --git a/version3/src/main/java/part1/Client/serviceCenter/balance/impl/ConsistencyHashBalance.java b/version3/src/main/java/part1/Client/serviceCenter/balance/impl/ConsistencyHashBalance.java deleted file mode 100644 index 43b56af..0000000 --- a/version3/src/main/java/part1/Client/serviceCenter/balance/impl/ConsistencyHashBalance.java +++ /dev/null @@ -1,119 +0,0 @@ -package part1.Client.serviceCenter.balance.impl; - -import part1.Client.serviceCenter.balance.LoadBalance; - -import java.util.*; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/19 21:16 - * 一致性哈希算法 负载均衡 - */ -public class ConsistencyHashBalance implements LoadBalance { - // 虚拟节点的个数 - private static final int VIRTUAL_NUM = 5; - - // 虚拟节点分配,key是hash值,value是虚拟节点服务器名称 - private SortedMap shards = new TreeMap(); - - // 真实节点列表 - private List realNodes = new LinkedList(); - - //模拟初始服务器 - private String[] servers =null; - - private void init(List serviceList) { - for (String server :serviceList) { - realNodes.add(server); - System.out.println("真实节点[" + server + "] 被添加"); - for (int i = 0; i < VIRTUAL_NUM; i++) { - String virtualNode = server + "&&VN" + i; - int hash = getHash(virtualNode); - shards.put(hash, virtualNode); - System.out.println("虚拟节点[" + virtualNode + "] hash:" + hash + ",被添加"); - } - } - } - /** - * 获取被分配的节点名 - * - * @param node - * @return - */ - public String getServer(String node,List serviceList) { - init(serviceList); - int hash = getHash(node); - Integer key = null; - SortedMap subMap = shards.tailMap(hash); - if (subMap.isEmpty()) { - key = shards.lastKey(); - } else { - key = subMap.firstKey(); - } - String virtualNode = shards.get(key); - return virtualNode.substring(0, virtualNode.indexOf("&&")); - } - - /** - * 添加节点 - * - * @param node - */ - public void addNode(String node) { - if (!realNodes.contains(node)) { - realNodes.add(node); - System.out.println("真实节点[" + node + "] 上线添加"); - for (int i = 0; i < VIRTUAL_NUM; i++) { - String virtualNode = node + "&&VN" + i; - int hash = getHash(virtualNode); - shards.put(hash, virtualNode); - System.out.println("虚拟节点[" + virtualNode + "] hash:" + hash + ",被添加"); - } - } - } - - /** - * 删除节点 - * - * @param node - */ - public void delNode(String node) { - if (realNodes.contains(node)) { - realNodes.remove(node); - System.out.println("真实节点[" + node + "] 下线移除"); - for (int i = 0; i < VIRTUAL_NUM; i++) { - String virtualNode = node + "&&VN" + i; - int hash = getHash(virtualNode); - shards.remove(hash); - System.out.println("虚拟节点[" + virtualNode + "] hash:" + hash + ",被移除"); - } - } - } - - /** - * FNV1_32_HASH算法 - */ - private static int getHash(String str) { - final int p = 16777619; - int hash = (int) 2166136261L; - for (int i = 0; i < str.length(); i++) - hash = (hash ^ str.charAt(i)) * p; - hash += hash << 13; - hash ^= hash >> 7; - hash += hash << 3; - hash ^= hash >> 17; - hash += hash << 5; - // 如果算出来的值为负数则取其绝对值 - if (hash < 0) - hash = Math.abs(hash); - return hash; - } - - @Override - public String balance(List addressList) { - String random= UUID.randomUUID().toString(); - return getServer(random,addressList); - } - -} diff --git a/version3/src/main/java/part1/Client/serviceCenter/balance/impl/RandomLoadBalance.java b/version3/src/main/java/part1/Client/serviceCenter/balance/impl/RandomLoadBalance.java deleted file mode 100644 index 9776d6b..0000000 --- a/version3/src/main/java/part1/Client/serviceCenter/balance/impl/RandomLoadBalance.java +++ /dev/null @@ -1,24 +0,0 @@ -package part1.Client.serviceCenter.balance.impl; - -import part1.Client.serviceCenter.balance.LoadBalance; - -import java.util.List; -import java.util.Random; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/19 21:20 - * 随机 负载均衡 - */ -public class RandomLoadBalance implements LoadBalance { - @Override - public String balance(List addressList) { - Random random=new Random(); - int choose = random.nextInt(addressList.size()); - System.out.println("负载均衡选择了"+choose+"服务器"); - return null; - } - public void addNode(String node){} ; - public void delNode(String node){}; -} diff --git a/version3/src/main/java/part1/Client/serviceCenter/balance/impl/RoundLoadBalance.java b/version3/src/main/java/part1/Client/serviceCenter/balance/impl/RoundLoadBalance.java deleted file mode 100644 index 9f90d59..0000000 --- a/version3/src/main/java/part1/Client/serviceCenter/balance/impl/RoundLoadBalance.java +++ /dev/null @@ -1,24 +0,0 @@ -package part1.Client.serviceCenter.balance.impl; - -import part1.Client.serviceCenter.balance.LoadBalance; - -import java.util.List; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/19 21:21 - * 轮询 负载均衡 - */ -public class RoundLoadBalance implements LoadBalance { - private int choose=-1; - @Override - public String balance(List addressList) { - choose++; - choose=choose%addressList.size(); - System.out.println("负载均衡选择了"+choose+"服务器"); - return addressList.get(choose); - } - public void addNode(String node) {}; - public void delNode(String node){}; -} diff --git a/version3/src/main/java/part1/Server/TestServer.java b/version3/src/main/java/part1/Server/TestServer.java deleted file mode 100644 index c91be84..0000000 --- a/version3/src/main/java/part1/Server/TestServer.java +++ /dev/null @@ -1,27 +0,0 @@ -package part1.Server; - - -import part1.Server.server.impl.NettyRPCRPCServer; -import part1.common.service.Impl.UserServiceImpl; -import part1.Server.provider.ServiceProvider; -import part1.Server.server.RpcServer; -import part1.common.service.UserService; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/11 19:39 - */ - -public class TestServer { - public static void main(String[] args) throws InterruptedException { - UserService userService=new UserServiceImpl(); - - ServiceProvider serviceProvider=new ServiceProvider("127.0.0.1",9999); - - serviceProvider.provideServiceInterface(userService); - - RpcServer rpcServer=new NettyRPCRPCServer(serviceProvider); - rpcServer.start(9999); - } -} diff --git a/version3/src/main/java/part1/Server/netty/handler/NettyRPCServerHandler.java b/version3/src/main/java/part1/Server/netty/handler/NettyRPCServerHandler.java deleted file mode 100644 index ab63437..0000000 --- a/version3/src/main/java/part1/Server/netty/handler/NettyRPCServerHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -package part1.Server.netty.handler; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import lombok.AllArgsConstructor; -import part1.common.Message.RpcRequest; -import part1.common.Message.RpcResponse; -import part1.Server.provider.ServiceProvider; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 16:40 - * 因为是服务器端,我们知道接受到请求格式是RPCRequest - * Object类型也行,强制转型就行 - */ -@AllArgsConstructor -public class NettyRPCServerHandler extends SimpleChannelInboundHandler { - private ServiceProvider serviceProvider; - @Override - protected void channelRead0(ChannelHandlerContext ctx, RpcRequest request) throws Exception { - RpcResponse response = getResponse(request); - ctx.writeAndFlush(response); - ctx.close(); - } - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } - private RpcResponse getResponse(RpcRequest rpcRequest){ - //得到服务名 - String interfaceName=rpcRequest.getInterfaceName(); - //得到服务端相应服务实现类 - Object service = serviceProvider.getService(interfaceName); - //反射调用方法 - Method method=null; - try { - method= service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); - Object invoke=method.invoke(service,rpcRequest.getParams()); - return RpcResponse.sussess(invoke); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - System.out.println("方法执行错误"); - return RpcResponse.fail(); - } - } -} diff --git a/version3/src/main/java/part1/Server/netty/nettyInitializer/NettyServerInitializer.java b/version3/src/main/java/part1/Server/netty/nettyInitializer/NettyServerInitializer.java deleted file mode 100644 index f19c612..0000000 --- a/version3/src/main/java/part1/Server/netty/nettyInitializer/NettyServerInitializer.java +++ /dev/null @@ -1,30 +0,0 @@ -package part1.Server.netty.nettyInitializer; - - -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.socket.SocketChannel; -import lombok.AllArgsConstructor; -import part1.common.serializer.myCode.MyEncoder; -import part1.common.serializer.mySerializer.JsonSerializer; -import part1.Server.netty.handler.NettyRPCServerHandler; -import part1.Server.provider.ServiceProvider; -import part1.common.serializer.myCode.MyDecoder; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 16:15 - */ -@AllArgsConstructor -public class NettyServerInitializer extends ChannelInitializer { - private ServiceProvider serviceProvider; - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ChannelPipeline pipeline = ch.pipeline(); - //使用自定义的编/解码器 - pipeline.addLast(new MyEncoder(new JsonSerializer())); - pipeline.addLast(new MyDecoder()); - pipeline.addLast(new NettyRPCServerHandler(serviceProvider)); - } -} diff --git a/version3/src/main/java/part1/Server/provider/ServiceProvider.java b/version3/src/main/java/part1/Server/provider/ServiceProvider.java deleted file mode 100644 index f7355dc..0000000 --- a/version3/src/main/java/part1/Server/provider/ServiceProvider.java +++ /dev/null @@ -1,47 +0,0 @@ -package part1.Server.provider; - -import part1.Server.serviceRegister.ServiceRegister; -import part1.Server.serviceRegister.impl.ZKServiceRegister; - -import java.net.InetSocketAddress; -import java.util.HashMap; -import java.util.Map; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/16 17:35 - */ -public class ServiceProvider { - private Map interfaceProvider; - - private int port; - private String host; - //注册服务类 - private ServiceRegister serviceRegister; - - public ServiceProvider(String host,int port){ - //需要传入服务端自身的网络地址 - this.host=host; - this.port=port; - this.interfaceProvider=new HashMap<>(); - this.serviceRegister=new ZKServiceRegister(); - } - - public void provideServiceInterface(Object service){ - String serviceName=service.getClass().getName(); - Class[] interfaceName=service.getClass().getInterfaces(); - - for (Class clazz:interfaceName){ - //本机的映射表 - interfaceProvider.put(clazz.getName(),service); - //在注册中心注册服务 - serviceRegister.register(clazz.getName(),new InetSocketAddress(host,port)); - } - } - - public Object getService(String interfaceName){ - return interfaceProvider.get(interfaceName); - } - -} diff --git a/version3/src/main/java/part1/Server/server/RpcServer.java b/version3/src/main/java/part1/Server/server/RpcServer.java deleted file mode 100644 index 7ed9584..0000000 --- a/version3/src/main/java/part1/Server/server/RpcServer.java +++ /dev/null @@ -1,11 +0,0 @@ -package part1.Server.server; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/12 11:26 - */ -public interface RpcServer { - void start(int port); - void stop(); -} diff --git a/version3/src/main/java/part1/Server/server/impl/NettyRPCRPCServer.java b/version3/src/main/java/part1/Server/server/impl/NettyRPCRPCServer.java deleted file mode 100644 index 514b857..0000000 --- a/version3/src/main/java/part1/Server/server/impl/NettyRPCRPCServer.java +++ /dev/null @@ -1,48 +0,0 @@ -package part1.Server.server.impl; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import lombok.AllArgsConstructor; -import part1.Server.netty.nettyInitializer.NettyServerInitializer; -import part1.Server.provider.ServiceProvider; -import part1.Server.server.RpcServer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 14:01 - */ -@AllArgsConstructor -public class NettyRPCRPCServer implements RpcServer { - private ServiceProvider serviceProvider; - @Override - public void start(int port) { - // netty 服务线程组boss负责建立连接, work负责具体的请求 - NioEventLoopGroup bossGroup = new NioEventLoopGroup(); - NioEventLoopGroup workGroup = new NioEventLoopGroup(); - System.out.println("netty服务端启动了"); - try { - //启动netty服务器 - ServerBootstrap serverBootstrap = new ServerBootstrap(); - //初始化 - serverBootstrap.group(bossGroup,workGroup).channel(NioServerSocketChannel.class) - .childHandler(new NettyServerInitializer(serviceProvider)); - //同步堵塞 - ChannelFuture channelFuture=serverBootstrap.bind(port).sync(); - //死循环监听 - channelFuture.channel().closeFuture().sync(); - }catch (InterruptedException e){ - e.printStackTrace(); - }finally { - bossGroup.shutdownGracefully(); - workGroup.shutdownGracefully(); - } - } - - @Override - public void stop() { - - } -} diff --git a/version3/src/main/java/part1/Server/server/impl/SimpleRPCRPCServer.java b/version3/src/main/java/part1/Server/server/impl/SimpleRPCRPCServer.java deleted file mode 100644 index 917c8a2..0000000 --- a/version3/src/main/java/part1/Server/server/impl/SimpleRPCRPCServer.java +++ /dev/null @@ -1,39 +0,0 @@ -package part1.Server.server.impl; - - -import lombok.AllArgsConstructor; -import part1.Server.provider.ServiceProvider; -import part1.Server.server.RpcServer; -import part1.Server.server.work.WorkThread; - -import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/12 11:37 - */ -@AllArgsConstructor -public class SimpleRPCRPCServer implements RpcServer { - private ServiceProvider serviceProvide; - @Override - public void start(int port) { - try { - ServerSocket serverSocket=new ServerSocket(port); - System.out.println("服务器启动了"); - while (true) { - Socket socket = serverSocket.accept(); - new Thread(new WorkThread(socket,serviceProvide)).start(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void stop() { - - } -} diff --git a/version3/src/main/java/part1/Server/server/work/WorkThread.java b/version3/src/main/java/part1/Server/server/work/WorkThread.java deleted file mode 100644 index 50fbeca..0000000 --- a/version3/src/main/java/part1/Server/server/work/WorkThread.java +++ /dev/null @@ -1,58 +0,0 @@ -package part1.Server.server.work; - - -import lombok.AllArgsConstructor; -import part1.common.Message.RpcResponse; -import part1.Server.provider.ServiceProvider; -import part1.common.Message.RpcRequest; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/14 17:39 - */ -@AllArgsConstructor -public class WorkThread implements Runnable{ - private Socket socket; - private ServiceProvider serviceProvide; - @Override - public void run() { - try { - ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois=new ObjectInputStream(socket.getInputStream()); - //读取客户端传过来的request - RpcRequest rpcRequest = (RpcRequest) ois.readObject(); - //反射调用服务方法获取返回值 - RpcResponse rpcResponse=getResponse(rpcRequest); - //向客户端写入response - oos.writeObject(rpcResponse); - oos.flush(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - } - private RpcResponse getResponse(RpcRequest rpcRequest){ - //得到服务名 - String interfaceName=rpcRequest.getInterfaceName(); - //得到服务端相应服务实现类 - Object service = serviceProvide.getService(interfaceName); - //反射调用方法 - Method method=null; - try { - method= service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); - Object invoke=method.invoke(service,rpcRequest.getParams()); - return RpcResponse.sussess(invoke); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - System.out.println("方法执行错误"); - return RpcResponse.fail(); - } - } -} diff --git a/version3/src/main/java/part1/Server/serviceRegister/ServiceRegister.java b/version3/src/main/java/part1/Server/serviceRegister/ServiceRegister.java deleted file mode 100644 index 54c52b1..0000000 --- a/version3/src/main/java/part1/Server/serviceRegister/ServiceRegister.java +++ /dev/null @@ -1,15 +0,0 @@ -package part1.Server.serviceRegister; - -import java.net.InetSocketAddress; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 16:58 - */ -// 服务注册接口 -public interface ServiceRegister { - // 注册:保存服务与地址。 - void register(String serviceName, InetSocketAddress serviceAddress); - -} diff --git a/version3/src/main/java/part1/Server/serviceRegister/impl/ZKServiceRegister.java b/version3/src/main/java/part1/Server/serviceRegister/impl/ZKServiceRegister.java deleted file mode 100644 index d569338..0000000 --- a/version3/src/main/java/part1/Server/serviceRegister/impl/ZKServiceRegister.java +++ /dev/null @@ -1,62 +0,0 @@ -package part1.Server.serviceRegister.impl; - -import org.apache.curator.RetryPolicy; -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.retry.ExponentialBackoffRetry; -import org.apache.zookeeper.CreateMode; -import part1.Server.serviceRegister.ServiceRegister; - -import java.net.InetSocketAddress; -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 17:28 - */ -public class ZKServiceRegister implements ServiceRegister { - // curator 提供的zookeeper客户端 - private CuratorFramework client; - //zookeeper根路径节点 - private static final String ROOT_PATH = "MyRPC"; - - //负责zookeeper客户端的初始化,并与zookeeper服务端进行连接 - public ZKServiceRegister(){ - // 指数时间重试 - RetryPolicy policy = new ExponentialBackoffRetry(1000, 3); - // zookeeper的地址固定,不管是服务提供者还是,消费者都要与之建立连接 - // sessionTimeoutMs 与 zoo.cfg中的tickTime 有关系, - // zk还会根据minSessionTimeout与maxSessionTimeout两个参数重新调整最后的超时值。默认分别为tickTime 的2倍和20倍 - // 使用心跳监听状态 - this.client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181") - .sessionTimeoutMs(40000).retryPolicy(policy).namespace(ROOT_PATH).build(); - this.client.start(); - System.out.println("zookeeper 连接成功"); - } - //注册服务到注册中心 - @Override - public void register(String serviceName, InetSocketAddress serviceAddress) { - try { - // serviceName创建成永久节点,服务提供者下线时,不删服务名,只删地址 - if(client.checkExists().forPath("/" + serviceName) == null){ - client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/" + serviceName); - } - // 路径地址,一个/代表一个节点 - String path = "/" + serviceName +"/"+ getServiceAddress(serviceAddress); - // 临时节点,服务器下线就删除节点 - client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path); - } catch (Exception e) { - System.out.println("此服务已存在"); - } - } - // 地址 -> XXX.XXX.XXX.XXX:port 字符串 - private String getServiceAddress(InetSocketAddress serverAddress) { - return serverAddress.getHostName() + - ":" + - serverAddress.getPort(); - } - // 字符串解析为地址 - private InetSocketAddress parseAddress(String address) { - String[] result = address.split(":"); - return new InetSocketAddress(result[0], Integer.parseInt(result[1])); - } -} diff --git a/version3/src/main/java/part1/common/Message/MessageType.java b/version3/src/main/java/part1/common/Message/MessageType.java deleted file mode 100644 index ebbcc83..0000000 --- a/version3/src/main/java/part1/common/Message/MessageType.java +++ /dev/null @@ -1,17 +0,0 @@ -package part1.common.Message; - -import lombok.AllArgsConstructor; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:29 - */ -@AllArgsConstructor -public enum MessageType { - REQUEST(0),RESPONSE(1); - private int code; - public int getCode(){ - return code; - } -} \ No newline at end of file diff --git a/version3/src/main/java/part1/common/Message/RpcRequest.java b/version3/src/main/java/part1/common/Message/RpcRequest.java deleted file mode 100644 index 2642f38..0000000 --- a/version3/src/main/java/part1/common/Message/RpcRequest.java +++ /dev/null @@ -1,29 +0,0 @@ -package part1.common.Message; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/1 18:30 - * 定义发送的消息格式 - */ -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class RpcRequest implements Serializable { - //服务类名,客户端只知道接口 - private String interfaceName; - //调用的方法名 - private String methodName; - //参数列表 - private Object[] params; - //参数类型 - private Class[] paramsType; -} diff --git a/version3/src/main/java/part1/common/Message/RpcResponse.java b/version3/src/main/java/part1/common/Message/RpcResponse.java deleted file mode 100644 index 7a44b45..0000000 --- a/version3/src/main/java/part1/common/Message/RpcResponse.java +++ /dev/null @@ -1,35 +0,0 @@ -package part1.common.Message; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/1 19:18 - */ -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class RpcResponse implements Serializable { - //状态信息 - private int code; - private String message; - //更新:加入传输数据的类型,以便在自定义序列化器中解析 - private Class dataType; - //具体数据 - private Object data; - - public static RpcResponse sussess(Object data){ - return RpcResponse.builder().code(200).dataType(data.getClass()).data(data).build(); - } - public static RpcResponse fail(){ - return RpcResponse.builder().code(500).message("服务器发生错误").build(); - } -} - diff --git a/version3/src/main/java/part1/common/pojo/User.java b/version3/src/main/java/part1/common/pojo/User.java deleted file mode 100644 index d7cef8c..0000000 --- a/version3/src/main/java/part1/common/pojo/User.java +++ /dev/null @@ -1,25 +0,0 @@ -package part1.common.pojo; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 17:50 - */ -@Builder -@Data -@NoArgsConstructor -@AllArgsConstructor -public class User implements Serializable { - // 客户端和服务端共有的 - private Integer id; - private String userName; - private Boolean sex; -} - diff --git a/version3/src/main/java/part1/common/serializer/myCode/MyDecoder.java b/version3/src/main/java/part1/common/serializer/myCode/MyDecoder.java deleted file mode 100644 index 78ed394..0000000 --- a/version3/src/main/java/part1/common/serializer/myCode/MyDecoder.java +++ /dev/null @@ -1,41 +0,0 @@ -package part1.common.serializer.myCode; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import part1.common.Message.MessageType; -import part1.common.serializer.mySerializer.Serializer; - -import java.util.List; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:24 - * 按照自定义的消息格式解码数据 - */ -public class MyDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List out) throws Exception { - //1.读取消息类型 - short messageType = in.readShort(); - // 现在还只支持request与response请求 - if(messageType != MessageType.REQUEST.getCode() && - messageType != MessageType.RESPONSE.getCode()){ - System.out.println("暂不支持此种数据"); - return; - } - //2.读取序列化的方式&类型 - short serializerType = in.readShort(); - Serializer serializer = Serializer.getSerializerByCode(serializerType); - if(serializer == null) - throw new RuntimeException("不存在对应的序列化器"); - //3.读取序列化数组长度 - int length = in.readInt(); - //4.读取序列化数组 - byte[] bytes=new byte[length]; - in.readBytes(bytes); - Object deserialize= serializer.deserialize(bytes, messageType); - out.add(deserialize); - } -} diff --git a/version3/src/main/java/part1/common/serializer/myCode/MyEncoder.java b/version3/src/main/java/part1/common/serializer/myCode/MyEncoder.java deleted file mode 100644 index 7ce0fd4..0000000 --- a/version3/src/main/java/part1/common/serializer/myCode/MyEncoder.java +++ /dev/null @@ -1,41 +0,0 @@ -package part1.common.serializer.myCode; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToByteEncoder; -import lombok.AllArgsConstructor; -import part1.common.Message.MessageType; -import part1.common.Message.RpcRequest; -import part1.common.Message.RpcResponse; -import part1.common.serializer.mySerializer.Serializer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:24 - * 依次按照自定义的消息格式写入,传入的数据为request或者response - * 需要持有一个serialize器,负责将传入的对象序列化成字节数组 - */ -@AllArgsConstructor -public class MyEncoder extends MessageToByteEncoder { - private Serializer serializer; - @Override - protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { - System.out.println(msg.getClass()); - //1.写入消息类型 - if(msg instanceof RpcRequest){ - out.writeShort(MessageType.REQUEST.getCode()); - } - else if(msg instanceof RpcResponse){ - out.writeShort(MessageType.RESPONSE.getCode()); - } - //2.写入序列化方式 - out.writeShort(serializer.getType()); - //得到序列化数组 - byte[] serializeBytes = serializer.serialize(msg); - //3.写入长度 - out.writeInt(serializeBytes.length); - //4.写入序列化数组 - out.writeBytes(serializeBytes); - } -} diff --git a/version3/src/main/java/part1/common/serializer/mySerializer/JsonSerializer.java b/version3/src/main/java/part1/common/serializer/mySerializer/JsonSerializer.java deleted file mode 100644 index 4557f3c..0000000 --- a/version3/src/main/java/part1/common/serializer/mySerializer/JsonSerializer.java +++ /dev/null @@ -1,65 +0,0 @@ -package part1.common.serializer.mySerializer; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import part1.common.Message.RpcResponse; -import part1.common.Message.RpcRequest; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:31 - */ -public class JsonSerializer implements Serializer { - @Override - public byte[] serialize(Object obj) { - byte[] bytes = JSONObject.toJSONBytes(obj); - return bytes; - } - - @Override - public Object deserialize(byte[] bytes, int messageType) { - Object obj = null; - // 传输的消息分为request与response - switch (messageType){ - case 0: - RpcRequest request = JSON.parseObject(bytes, RpcRequest.class); - Object[] objects = new Object[request.getParams().length]; - // 把json字串转化成对应的对象, fastjson可以读出基本数据类型,不用转化 - // 对转换后的request中的params属性逐个进行类型判断 - for(int i = 0; i < objects.length; i++){ - Class paramsType = request.getParamsType()[i]; - //判断每个对象类型是否和paramsTypes中的一致 - if (!paramsType.isAssignableFrom(request.getParams()[i].getClass())){ - //如果不一致,就行进行类型转换 - objects[i] = JSONObject.toJavaObject((JSONObject) request.getParams()[i],request.getParamsType()[i]); - }else{ - //如果一致就直接赋给objects[i] - objects[i] = request.getParams()[i]; - } - } - request.setParams(objects); - obj = request; - break; - case 1: - RpcResponse response = JSON.parseObject(bytes, RpcResponse.class); - Class dataType = response.getDataType(); - //判断转化后的response对象中的data的类型是否正确 - if(! dataType.isAssignableFrom(response.getData().getClass())){ - response.setData(JSONObject.toJavaObject((JSONObject) response.getData(),dataType)); - } - obj = response; - break; - default: - System.out.println("暂时不支持此种消息"); - throw new RuntimeException(); - } - return obj; - } - - //1 代表json序列化方式 - @Override - public int getType() { - return 1; - } -} diff --git a/version3/src/main/java/part1/common/serializer/mySerializer/ObjectSerializer.java b/version3/src/main/java/part1/common/serializer/mySerializer/ObjectSerializer.java deleted file mode 100644 index 3eec03c..0000000 --- a/version3/src/main/java/part1/common/serializer/mySerializer/ObjectSerializer.java +++ /dev/null @@ -1,54 +0,0 @@ -package part1.common.serializer.mySerializer; - -import java.io.*; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:36 - */ -public class ObjectSerializer implements Serializer { - //利用Java io 对象 -》字节数组 - @Override - public byte[] serialize(Object obj) { - byte[] bytes=null; - ByteArrayOutputStream bos=new ByteArrayOutputStream(); - try { - //是一个对象输出流,用于将 Java 对象序列化为字节流,并将其连接到bos上 - ObjectOutputStream oos = new ObjectOutputStream(bos); - oos.writeObject(obj); - //刷新 ObjectOutputStream,确保所有缓冲区中的数据都被写入到底层流中。 - oos.flush(); - //将bos其内部缓冲区中的数据转换为字节数组 - bytes = bos.toByteArray(); - oos.close(); - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - return bytes; - } - - //字节数组 -》对象 - @Override - public Object deserialize(byte[] bytes, int messageType) { - Object obj = null; - ByteArrayInputStream bis = new ByteArrayInputStream(bytes); - try { - ObjectInputStream ois = new ObjectInputStream(bis); - obj = ois.readObject(); - ois.close(); - bis.close(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - return obj; - } - - //0 代表Java 原生序列器 - @Override - public int getType() { - return 0; - } -} - diff --git a/version3/src/main/java/part1/common/serializer/mySerializer/Serializer.java b/version3/src/main/java/part1/common/serializer/mySerializer/Serializer.java deleted file mode 100644 index e0829d0..0000000 --- a/version3/src/main/java/part1/common/serializer/mySerializer/Serializer.java +++ /dev/null @@ -1,29 +0,0 @@ -package part1.common.serializer.mySerializer; - - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:31 - */ -public interface Serializer { - // 把对象序列化成字节数组 - byte[] serialize(Object obj); - // 从字节数组反序列化成消息, 使用java自带序列化方式不用messageType也能得到相应的对象(序列化字节数组里包含类信息) - // 其它方式需指定消息格式,再根据message转化成相应的对象 - Object deserialize(byte[] bytes, int messageType); - // 返回使用的序列器,是哪个 - // 0:java自带序列化方式, 1: json序列化方式 - int getType(); - // 根据序号取出序列化器,暂时有两种实现方式,需要其它方式,实现这个接口即可 - static Serializer getSerializerByCode(int code){ - switch (code){ - case 0: - return new ObjectSerializer(); - case 1: - return new JsonSerializer(); - default: - return null; - } - } -} diff --git a/version3/src/main/java/part1/common/service/Impl/UserServiceImpl.java b/version3/src/main/java/part1/common/service/Impl/UserServiceImpl.java deleted file mode 100644 index 373243b..0000000 --- a/version3/src/main/java/part1/common/service/Impl/UserServiceImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package part1.common.service.Impl; - - -import part1.common.pojo.User; -import part1.common.service.UserService; - -import java.util.Random; -import java.util.UUID; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 16:28 - */ -public class UserServiceImpl implements UserService { - @Override - public User getUserByUserId(Integer id) { - System.out.println("客户端查询了"+id+"的用户"); - // 模拟从数据库中取用户的行为 - Random random = new Random(); - User user = User.builder().userName(UUID.randomUUID().toString()) - .id(id) - .sex(random.nextBoolean()).build(); - return user; - } - - @Override - public Integer insertUserId(User user) { - System.out.println("插入数据成功"+user.getUserName()); - return user.getId(); - } -} \ No newline at end of file diff --git a/version3/src/main/java/part1/common/service/UserService.java b/version3/src/main/java/part1/common/service/UserService.java deleted file mode 100644 index 0e539bd..0000000 --- a/version3/src/main/java/part1/common/service/UserService.java +++ /dev/null @@ -1,16 +0,0 @@ -package part1.common.service; - - -import part1.common.pojo.User; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 16:27 - */ -public interface UserService { - // 客户端通过这个接口调用服务端的实现类 - User getUserByUserId(Integer id); - //新增一个功能 - Integer insertUserId(User user); -} diff --git a/version3/src/main/java/part2/Client/TestClient.java b/version3/src/main/java/part2/Client/TestClient.java deleted file mode 100644 index f679b83..0000000 --- a/version3/src/main/java/part2/Client/TestClient.java +++ /dev/null @@ -1,28 +0,0 @@ -package part2.Client; - - -import part2.Client.proxy.ClientProxy; -import part2.common.pojo.User; -import part2.common.service.UserService; - - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/6 18:39 - */ - -public class TestClient { - public static void main(String[] args) throws InterruptedException { - ClientProxy clientProxy=new ClientProxy(); - //ClientProxy clientProxy=new proxy.Client.part1.ClientProxy("127.0.0.1",9999,0); - UserService proxy=clientProxy.getProxy(UserService.class); - - User user = proxy.getUserByUserId(1); - System.out.println("从服务端得到的user="+user.toString()); - - User u=User.builder().id(100).userName("wxx").sex(true).build(); - Integer id = proxy.insertUserId(u); - System.out.println("向服务端插入user的id"+id); - } -} diff --git a/version3/src/main/java/part2/Client/cache/serviceCache.java b/version3/src/main/java/part2/Client/cache/serviceCache.java deleted file mode 100644 index f6c7106..0000000 --- a/version3/src/main/java/part2/Client/cache/serviceCache.java +++ /dev/null @@ -1,54 +0,0 @@ -package part2.Client.cache; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/4 0:57 - */ -public class serviceCache { - //key: serviceName 服务名 - //value: addressList 服务提供者列表 - private static Map> cache=new HashMap<>(); - - //添加服务 - public void addServcieToCache(String serviceName,String address){ - if(cache.containsKey(serviceName)){ - List addressList = cache.get(serviceName); - addressList.add(address); - System.out.println("将name为"+serviceName+"和地址为"+address+"的服务添加到本地缓存中"); - }else { - List addressList=new ArrayList<>(); - addressList.add(address); - cache.put(serviceName,addressList); - } - } - //修改服务地址 - public void replaceServiceAddress(String serviceName,String oldAddress,String newAddress){ - if(cache.containsKey(serviceName)){ - List addressList=cache.get(serviceName); - addressList.remove(oldAddress); - addressList.add(newAddress); - }else { - System.out.println("修改失败,服务不存在"); - } - } - //从缓存中取服务地址列表 - public List getServiceListFromCache(String serviceName){ - if(!cache.containsKey(serviceName)) { - return null; - } - return cache.get(serviceName); - } - - //从缓存中删除服务地址 - public void delete(String serviceName,String address){ - List addressList = cache.get(serviceName); - addressList.remove(address); - System.out.println("将name为"+serviceName+"和地址为"+address+"的服务从本地缓存中删除"); - } -} diff --git a/version3/src/main/java/part2/Client/netty/handler/NettyClientHandler.java b/version3/src/main/java/part2/Client/netty/handler/NettyClientHandler.java deleted file mode 100644 index 95eaf28..0000000 --- a/version3/src/main/java/part2/Client/netty/handler/NettyClientHandler.java +++ /dev/null @@ -1,27 +0,0 @@ -package part2.Client.netty.handler; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.util.AttributeKey; -import part2.common.Message.RpcResponse; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 17:29 - */ -public class NettyClientHandler extends SimpleChannelInboundHandler { - @Override - protected void channelRead0(ChannelHandlerContext ctx, RpcResponse response) throws Exception { - // 接收到response, 给channel设计别名,让sendRequest里读取response - AttributeKey key = AttributeKey.valueOf("RPCResponse"); - ctx.channel().attr(key).set(response); - ctx.channel().close(); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } -} diff --git a/version3/src/main/java/part2/Client/netty/nettyInitializer/NettyClientInitializer.java b/version3/src/main/java/part2/Client/netty/nettyInitializer/NettyClientInitializer.java deleted file mode 100644 index 175c729..0000000 --- a/version3/src/main/java/part2/Client/netty/nettyInitializer/NettyClientInitializer.java +++ /dev/null @@ -1,26 +0,0 @@ -package part2.Client.netty.nettyInitializer; - - -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.socket.SocketChannel; -import part2.Client.netty.handler.NettyClientHandler; -import part2.common.serializer.myCode.MyDecoder; -import part2.common.serializer.myCode.MyEncoder; -import part2.common.serializer.mySerializer.JsonSerializer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 17:26 - */ -public class NettyClientInitializer extends ChannelInitializer { - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ChannelPipeline pipeline = ch.pipeline(); - //使用自定义的编/解码器 - pipeline.addLast(new MyEncoder(new JsonSerializer())); - pipeline.addLast(new MyDecoder()); - pipeline.addLast(new NettyClientHandler()); - } -} diff --git a/version3/src/main/java/part2/Client/proxy/ClientProxy.java b/version3/src/main/java/part2/Client/proxy/ClientProxy.java deleted file mode 100644 index 289c7fc..0000000 --- a/version3/src/main/java/part2/Client/proxy/ClientProxy.java +++ /dev/null @@ -1,55 +0,0 @@ -package part2.Client.proxy; - - -import part2.Client.retry.guavaRetry; -import part2.Client.rpcClient.RpcClient; -import part2.Client.rpcClient.impl.NettyRpcClient; -import part2.Client.serviceCenter.ServiceCenter; -import part2.Client.serviceCenter.ZKServiceCenter; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/6 16:49 - */ -public class ClientProxy implements InvocationHandler { - //传入参数service接口的class对象,反射封装成一个request - - private RpcClient rpcClient; - private ServiceCenter serviceCenter; - public ClientProxy() throws InterruptedException { - serviceCenter=new ZKServiceCenter(); - rpcClient=new NettyRpcClient(serviceCenter); - } - - //jdk动态代理,每一次代理对象调用方法,都会经过此方法增强(反射获取request对象,socket发送到服务端) - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - //构建request - RpcRequest request=RpcRequest.builder() - .interfaceName(method.getDeclaringClass().getName()) - .methodName(method.getName()) - .params(args).paramsType(method.getParameterTypes()).build(); - //数据传输 - RpcResponse response; - //后续添加逻辑:为保持幂等性,只对白名单上的服务进行重试 - if (serviceCenter.checkRetry(request.getInterfaceName())){ - //调用retry框架进行重试操作 - response=new guavaRetry().sendServiceWithRetry(request,rpcClient); - }else { - //只调用一次 - response= rpcClient.sendRequest(request); - } - return response.getData(); - } - public T getProxy(Class clazz){ - Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this); - return (T)o; - } -} diff --git a/version3/src/main/java/part2/Client/retry/guavaRetry.java b/version3/src/main/java/part2/Client/retry/guavaRetry.java deleted file mode 100644 index 2fc5bfd..0000000 --- a/version3/src/main/java/part2/Client/retry/guavaRetry.java +++ /dev/null @@ -1,43 +0,0 @@ -package part2.Client.retry; - -import com.github.rholder.retry.*; -import part2.Client.rpcClient.RpcClient; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -import java.util.Objects; -import java.util.concurrent.TimeUnit; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/20 19:28 - */ -public class guavaRetry { - private RpcClient rpcClient; - public RpcResponse sendServiceWithRetry(RpcRequest request, RpcClient rpcClient) { - this.rpcClient=rpcClient; - Retryer retryer = RetryerBuilder.newBuilder() - //无论出现什么异常,都进行重试 - .retryIfException() - //返回结果为 error时进行重试 - .retryIfResult(response -> Objects.equals(response.getCode(), 500)) - //重试等待策略:等待 2s 后再进行重试 - .withWaitStrategy(WaitStrategies.fixedWait(2, TimeUnit.SECONDS)) - //重试停止策略:重试达到 3 次 - .withStopStrategy(StopStrategies.stopAfterAttempt(3)) - .withRetryListener(new RetryListener() { - @Override - public void onRetry(Attempt attempt) { - System.out.println("RetryListener: 第" + attempt.getAttemptNumber() + "次调用"); - } - }) - .build(); - try { - return retryer.call(() -> rpcClient.sendRequest(request)); - } catch (Exception e) { - e.printStackTrace(); - } - return RpcResponse.fail(); - } -} \ No newline at end of file diff --git a/version3/src/main/java/part2/Client/rpcClient/RpcClient.java b/version3/src/main/java/part2/Client/rpcClient/RpcClient.java deleted file mode 100644 index 21690b1..0000000 --- a/version3/src/main/java/part2/Client/rpcClient/RpcClient.java +++ /dev/null @@ -1,15 +0,0 @@ -package part2.Client.rpcClient; - -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 18:55 - */ -public interface RpcClient { - - //定义底层通信的方法 - RpcResponse sendRequest(RpcRequest request); -} diff --git a/version3/src/main/java/part2/Client/rpcClient/impl/NettyRpcClient.java b/version3/src/main/java/part2/Client/rpcClient/impl/NettyRpcClient.java deleted file mode 100644 index 1f5d026..0000000 --- a/version3/src/main/java/part2/Client/rpcClient/impl/NettyRpcClient.java +++ /dev/null @@ -1,68 +0,0 @@ -package part2.Client.rpcClient.impl; - -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.util.AttributeKey; -import part2.Client.netty.nettyInitializer.NettyClientInitializer; -import part2.Client.rpcClient.RpcClient; -import part2.Client.serviceCenter.ServiceCenter; -import part2.Client.serviceCenter.ZKServiceCenter; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -import java.net.InetSocketAddress; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 19:40 - */ -public class NettyRpcClient implements RpcClient { - - private static final Bootstrap bootstrap; - private static final EventLoopGroup eventLoopGroup; - - private ServiceCenter serviceCenter; - public NettyRpcClient(ServiceCenter serviceCenter) throws InterruptedException { - this.serviceCenter=serviceCenter; - } - - //netty客户端初始化 - static { - eventLoopGroup = new NioEventLoopGroup(); - bootstrap = new Bootstrap(); - bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) - .handler(new NettyClientInitializer()); - } - @Override - public RpcResponse sendRequest(RpcRequest request) { - //从注册中心获取host,post - InetSocketAddress address = serviceCenter.serviceDiscovery(request.getInterfaceName()); - String host = address.getHostName(); - int port = address.getPort(); - try { - ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); - Channel channel = channelFuture.channel(); - // 发送数据 - channel.writeAndFlush(request); - //sync()堵塞获取结果 - channel.closeFuture().sync(); - // 阻塞的获得结果,通过给channel设计别名,获取特定名字下的channel中的内容(这个在hanlder中设置) - // AttributeKey是,线程隔离的,不会由线程安全问题。 - // 当前场景下选择堵塞获取结果 - // 其它场景也可以选择添加监听器的方式来异步获取结果 channelFuture.addListener... - AttributeKey key = AttributeKey.valueOf("RPCResponse"); - RpcResponse response = channel.attr(key).get(); - - System.out.println(response); - return response; - } catch (InterruptedException e) { - e.printStackTrace(); - } - return null; - } -} diff --git a/version3/src/main/java/part2/Client/rpcClient/impl/SimpleSocketRpcCilent.java b/version3/src/main/java/part2/Client/rpcClient/impl/SimpleSocketRpcCilent.java deleted file mode 100644 index 8faae62..0000000 --- a/version3/src/main/java/part2/Client/rpcClient/impl/SimpleSocketRpcCilent.java +++ /dev/null @@ -1,41 +0,0 @@ -package part2.Client.rpcClient.impl; - -import part2.Client.rpcClient.RpcClient; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/2 18:58 - */ -public class SimpleSocketRpcCilent implements RpcClient { - private String host; - private int port; - public SimpleSocketRpcCilent(String host,int port){ - this.host=host; - this.port=port; - } - @Override - public RpcResponse sendRequest(RpcRequest request) { - try { - Socket socket=new Socket(host, port); - ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois=new ObjectInputStream(socket.getInputStream()); - - oos.writeObject(request); - oos.flush(); - - RpcResponse response=(RpcResponse) ois.readObject(); - return response; - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/version3/src/main/java/part2/Client/serviceCenter/ServiceCenter.java b/version3/src/main/java/part2/Client/serviceCenter/ServiceCenter.java deleted file mode 100644 index ab72194..0000000 --- a/version3/src/main/java/part2/Client/serviceCenter/ServiceCenter.java +++ /dev/null @@ -1,16 +0,0 @@ -package part2.Client.serviceCenter; - -import java.net.InetSocketAddress; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 21:42 - */ -//服务中心接口 -public interface ServiceCenter { - // 查询:根据服务名查找地址 - InetSocketAddress serviceDiscovery(String serviceName); - //判断是否可重试 - boolean checkRetry(String serviceName) ; -} diff --git a/version3/src/main/java/part2/Client/serviceCenter/ZKServiceCenter.java b/version3/src/main/java/part2/Client/serviceCenter/ZKServiceCenter.java deleted file mode 100644 index 4befc04..0000000 --- a/version3/src/main/java/part2/Client/serviceCenter/ZKServiceCenter.java +++ /dev/null @@ -1,93 +0,0 @@ -package part2.Client.serviceCenter; - -import org.apache.curator.RetryPolicy; -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.retry.ExponentialBackoffRetry; -import part2.Client.cache.serviceCache; -import part2.Client.serviceCenter.ZkWatcher.watchZK; -import part2.Client.serviceCenter.balance.impl.ConsistencyHashBalance; - -import java.net.InetSocketAddress; -import java.util.List; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 21:41 - */ -public class ZKServiceCenter implements ServiceCenter{ - // curator 提供的zookeeper客户端 - private CuratorFramework client; - //zookeeper根路径节点 - private static final String ROOT_PATH = "MyRPC"; - private static final String RETRY = "CanRetry"; - //serviceCache - private serviceCache cache; - - //负责zookeeper客户端的初始化,并与zookeeper服务端进行连接 - public ZKServiceCenter() throws InterruptedException { - // 指数时间重试 - RetryPolicy policy = new ExponentialBackoffRetry(1000, 3); - // zookeeper的地址固定,不管是服务提供者还是,消费者都要与之建立连接 - // sessionTimeoutMs 与 zoo.cfg中的tickTime 有关系, - // zk还会根据minSessionTimeout与maxSessionTimeout两个参数重新调整最后的超时值。默认分别为tickTime 的2倍和20倍 - // 使用心跳监听状态 - this.client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181") - .sessionTimeoutMs(40000).retryPolicy(policy).namespace(ROOT_PATH).build(); - this.client.start(); - System.out.println("zookeeper 连接成功"); - //初始化本地缓存 - cache=new serviceCache(); - //加入zookeeper事件监听器 - watchZK watcher=new watchZK(client,cache); - //监听启动 - watcher.watchToUpdate(ROOT_PATH); - } - //根据服务名(接口名)返回地址 - @Override - public InetSocketAddress serviceDiscovery(String serviceName) { - try { - //先从本地缓存中找 - List addressList=cache.getServiceListFromCache(serviceName); - //如果找不到,再去zookeeper中找 - //这种i情况基本不会发生,或者说只会出现在初始化阶段 - if(addressList==null) { - addressList=client.getChildren().forPath("/" + serviceName); - } - // 负载均衡得到地址 - String address = new ConsistencyHashBalance().balance(addressList); - return parseAddress(address); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - // - public boolean checkRetry(String serviceName) { - boolean canRetry =false; - try { - List serviceList = client.getChildren().forPath("/" + RETRY); - for(String s:serviceList){ - if(s.equals(serviceName)){ - System.out.println("服务"+serviceName+"在白名单上,可进行重试"); - canRetry=true; - } - } - }catch (Exception e) { - e.printStackTrace(); - } - return canRetry; - } - // 地址 -> XXX.XXX.XXX.XXX:port 字符串 - private String getServiceAddress(InetSocketAddress serverAddress) { - return serverAddress.getHostName() + - ":" + - serverAddress.getPort(); - } - // 字符串解析为地址 - private InetSocketAddress parseAddress(String address) { - String[] result = address.split(":"); - return new InetSocketAddress(result[0], Integer.parseInt(result[1])); - } -} diff --git a/version3/src/main/java/part2/Client/serviceCenter/ZkWatcher/watchZK.java b/version3/src/main/java/part2/Client/serviceCenter/ZkWatcher/watchZK.java deleted file mode 100644 index 14e9d58..0000000 --- a/version3/src/main/java/part2/Client/serviceCenter/ZkWatcher/watchZK.java +++ /dev/null @@ -1,88 +0,0 @@ -package part2.Client.serviceCenter.ZkWatcher; - -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.recipes.cache.ChildData; -import org.apache.curator.framework.recipes.cache.CuratorCache; -import org.apache.curator.framework.recipes.cache.CuratorCacheListener; -import part2.Client.cache.serviceCache; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/4 1:00 - */ -public class watchZK { - // curator 提供的zookeeper客户端 - private CuratorFramework client; - //本地缓存 - serviceCache cache; - - - public watchZK(CuratorFramework client,serviceCache cache){ - this.client=client; - this.cache=cache; - } - - /** - * 监听当前节点和子节点的 更新,创建,删除 - * @param path - */ - public void watchToUpdate(String path) throws InterruptedException { - CuratorCache curatorCache = CuratorCache.build(client, "/"); - curatorCache.listenable().addListener(new CuratorCacheListener() { - @Override - public void event(Type type, ChildData childData, ChildData childData1) { - // 第一个参数:事件类型(枚举) - // 第二个参数:节点更新前的状态、数据 - // 第三个参数:节点更新后的状态、数据 - // 创建节点时:节点刚被创建,不存在 更新前节点 ,所以第二个参数为 null - // 删除节点时:节点被删除,不存在 更新后节点 ,所以第三个参数为 null - // 节点创建时没有赋予值 create /curator/app1 只创建节点,在这种情况下,更新前节点的 data 为 null,获取不到更新前节点的数据 - switch (type.name()) { - case "NODE_CREATED": // 监听器第一次执行时节点存在也会触发次事件 - String[] pathList= pasrePath(childData1); - if(pathList.length<=2) break; - else { - String serviceName=pathList[1]; - String address=pathList[2]; - //将新注册的服务加入到本地缓存中 - cache.addServcieToCache(serviceName,address); - } - break; - case "NODE_CHANGED": // 节点更新 - if (childData.getData() != null) { - System.out.println("修改前的数据: " + new String(childData.getData())); - } else { - System.out.println("节点第一次赋值!"); - } - String[] oldPathList=pasrePath(childData); - String[] newPathList=pasrePath(childData1); - cache.replaceServiceAddress(oldPathList[1],oldPathList[2],newPathList[2]); - System.out.println("修改后的数据: " + new String(childData1.getData())); - break; - case "NODE_DELETED": // 节点删除 - String[] pathList_d= pasrePath(childData); - if(pathList_d.length<=2) break; - else { - String serviceName=pathList_d[1]; - String address=pathList_d[2]; - //将新注册的服务加入到本地缓存中 - cache.delete(serviceName,address); - } - break; - default: - break; - } - } - }); - //开启监听 - curatorCache.start(); - } - //解析节点对应地址 - public String[] pasrePath(ChildData childData){ - //获取更新的节点的路径 - String path=new String(childData.getPath()); - //按照格式 ,读取 - return path.split("/"); - } -} \ No newline at end of file diff --git a/version3/src/main/java/part2/Client/serviceCenter/balance/LoadBalance.java b/version3/src/main/java/part2/Client/serviceCenter/balance/LoadBalance.java deleted file mode 100644 index ef28246..0000000 --- a/version3/src/main/java/part2/Client/serviceCenter/balance/LoadBalance.java +++ /dev/null @@ -1,15 +0,0 @@ -package part2.Client.serviceCenter.balance; - -import java.util.List; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/19 21:00 - * 给服务地址列表,根据不同的负载均衡策略选择一个 - */ -public interface LoadBalance { - String balance(List addressList); - void addNode(String node) ; - void delNode(String node); -} \ No newline at end of file diff --git a/version3/src/main/java/part2/Client/serviceCenter/balance/impl/ConsistencyHashBalance.java b/version3/src/main/java/part2/Client/serviceCenter/balance/impl/ConsistencyHashBalance.java deleted file mode 100644 index 372c79e..0000000 --- a/version3/src/main/java/part2/Client/serviceCenter/balance/impl/ConsistencyHashBalance.java +++ /dev/null @@ -1,119 +0,0 @@ -package part2.Client.serviceCenter.balance.impl; - -import part2.Client.serviceCenter.balance.LoadBalance; - -import java.util.*; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/19 21:16 - * 一致性哈希算法 负载均衡 - */ -public class ConsistencyHashBalance implements LoadBalance { - // 虚拟节点的个数 - private static final int VIRTUAL_NUM = 5; - - // 虚拟节点分配,key是hash值,value是虚拟节点服务器名称 - private SortedMap shards = new TreeMap(); - - // 真实节点列表 - private List realNodes = new LinkedList(); - - //模拟初始服务器 - private String[] servers =null; - - private void init(List serviceList) { - for (String server :serviceList) { - realNodes.add(server); - System.out.println("真实节点[" + server + "] 被添加"); - for (int i = 0; i < VIRTUAL_NUM; i++) { - String virtualNode = server + "&&VN" + i; - int hash = getHash(virtualNode); - shards.put(hash, virtualNode); - System.out.println("虚拟节点[" + virtualNode + "] hash:" + hash + ",被添加"); - } - } - } - /** - * 获取被分配的节点名 - * - * @param node - * @return - */ - public String getServer(String node,List serviceList) { - init(serviceList); - int hash = getHash(node); - Integer key = null; - SortedMap subMap = shards.tailMap(hash); - if (subMap.isEmpty()) { - key = shards.lastKey(); - } else { - key = subMap.firstKey(); - } - String virtualNode = shards.get(key); - return virtualNode.substring(0, virtualNode.indexOf("&&")); - } - - /** - * 添加节点 - * - * @param node - */ - public void addNode(String node) { - if (!realNodes.contains(node)) { - realNodes.add(node); - System.out.println("真实节点[" + node + "] 上线添加"); - for (int i = 0; i < VIRTUAL_NUM; i++) { - String virtualNode = node + "&&VN" + i; - int hash = getHash(virtualNode); - shards.put(hash, virtualNode); - System.out.println("虚拟节点[" + virtualNode + "] hash:" + hash + ",被添加"); - } - } - } - - /** - * 删除节点 - * - * @param node - */ - public void delNode(String node) { - if (realNodes.contains(node)) { - realNodes.remove(node); - System.out.println("真实节点[" + node + "] 下线移除"); - for (int i = 0; i < VIRTUAL_NUM; i++) { - String virtualNode = node + "&&VN" + i; - int hash = getHash(virtualNode); - shards.remove(hash); - System.out.println("虚拟节点[" + virtualNode + "] hash:" + hash + ",被移除"); - } - } - } - - /** - * FNV1_32_HASH算法 - */ - private static int getHash(String str) { - final int p = 16777619; - int hash = (int) 2166136261L; - for (int i = 0; i < str.length(); i++) - hash = (hash ^ str.charAt(i)) * p; - hash += hash << 13; - hash ^= hash >> 7; - hash += hash << 3; - hash ^= hash >> 17; - hash += hash << 5; - // 如果算出来的值为负数则取其绝对值 - if (hash < 0) - hash = Math.abs(hash); - return hash; - } - - @Override - public String balance(List addressList) { - String random= UUID.randomUUID().toString(); - return getServer(random,addressList); - } - -} diff --git a/version3/src/main/java/part2/Client/serviceCenter/balance/impl/RandomLoadBalance.java b/version3/src/main/java/part2/Client/serviceCenter/balance/impl/RandomLoadBalance.java deleted file mode 100644 index a45602a..0000000 --- a/version3/src/main/java/part2/Client/serviceCenter/balance/impl/RandomLoadBalance.java +++ /dev/null @@ -1,24 +0,0 @@ -package part2.Client.serviceCenter.balance.impl; - -import part2.Client.serviceCenter.balance.LoadBalance; - -import java.util.List; -import java.util.Random; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/19 21:20 - * 随机 负载均衡 - */ -public class RandomLoadBalance implements LoadBalance { - @Override - public String balance(List addressList) { - Random random=new Random(); - int choose = random.nextInt(addressList.size()); - System.out.println("负载均衡选择了"+choose+"服务器"); - return null; - } - public void addNode(String node){} ; - public void delNode(String node){}; -} diff --git a/version3/src/main/java/part2/Client/serviceCenter/balance/impl/RoundLoadBalance.java b/version3/src/main/java/part2/Client/serviceCenter/balance/impl/RoundLoadBalance.java deleted file mode 100644 index 6748fb4..0000000 --- a/version3/src/main/java/part2/Client/serviceCenter/balance/impl/RoundLoadBalance.java +++ /dev/null @@ -1,24 +0,0 @@ -package part2.Client.serviceCenter.balance.impl; - -import part2.Client.serviceCenter.balance.LoadBalance; - -import java.util.List; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/19 21:21 - * 轮询 负载均衡 - */ -public class RoundLoadBalance implements LoadBalance { - private int choose=-1; - @Override - public String balance(List addressList) { - choose++; - choose=choose%addressList.size(); - System.out.println("负载均衡选择了"+choose+"服务器"); - return addressList.get(choose); - } - public void addNode(String node) {}; - public void delNode(String node){}; -} diff --git a/version3/src/main/java/part2/Server/TestServer.java b/version3/src/main/java/part2/Server/TestServer.java deleted file mode 100644 index 54941a3..0000000 --- a/version3/src/main/java/part2/Server/TestServer.java +++ /dev/null @@ -1,27 +0,0 @@ -package part2.Server; - - -import part2.Server.provider.ServiceProvider; -import part2.Server.server.RpcServer; -import part2.Server.server.impl.NettyRPCRPCServer; -import part2.common.service.Impl.UserServiceImpl; -import part2.common.service.UserService; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/11 19:39 - */ - -public class TestServer { - public static void main(String[] args) throws InterruptedException { - UserService userService=new UserServiceImpl(); - - ServiceProvider serviceProvider=new ServiceProvider("127.0.0.1",9999); - - serviceProvider.provideServiceInterface(userService,true); - - RpcServer rpcServer=new NettyRPCRPCServer(serviceProvider); - rpcServer.start(9999); - } -} diff --git a/version3/src/main/java/part2/Server/netty/handler/NettyRPCServerHandler.java b/version3/src/main/java/part2/Server/netty/handler/NettyRPCServerHandler.java deleted file mode 100644 index adefac7..0000000 --- a/version3/src/main/java/part2/Server/netty/handler/NettyRPCServerHandler.java +++ /dev/null @@ -1,51 +0,0 @@ -package part2.Server.netty.handler; - -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import lombok.AllArgsConstructor; -import part2.Server.provider.ServiceProvider; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 16:40 - * 因为是服务器端,我们知道接受到请求格式是RPCRequest - * Object类型也行,强制转型就行 - */ -@AllArgsConstructor -public class NettyRPCServerHandler extends SimpleChannelInboundHandler { - private ServiceProvider serviceProvider; - @Override - protected void channelRead0(ChannelHandlerContext ctx, RpcRequest request) throws Exception { - RpcResponse response = getResponse(request); - ctx.writeAndFlush(response); - ctx.close(); - } - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - cause.printStackTrace(); - ctx.close(); - } - private RpcResponse getResponse(RpcRequest rpcRequest){ - //得到服务名 - String interfaceName=rpcRequest.getInterfaceName(); - //得到服务端相应服务实现类 - Object service = serviceProvider.getService(interfaceName); - //反射调用方法 - Method method=null; - try { - method= service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); - Object invoke=method.invoke(service,rpcRequest.getParams()); - return RpcResponse.sussess(invoke); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - System.out.println("方法执行错误"); - return RpcResponse.fail(); - } - } -} diff --git a/version3/src/main/java/part2/Server/netty/nettyInitializer/NettyServerInitializer.java b/version3/src/main/java/part2/Server/netty/nettyInitializer/NettyServerInitializer.java deleted file mode 100644 index 4d174a1..0000000 --- a/version3/src/main/java/part2/Server/netty/nettyInitializer/NettyServerInitializer.java +++ /dev/null @@ -1,30 +0,0 @@ -package part2.Server.netty.nettyInitializer; - - -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.socket.SocketChannel; -import lombok.AllArgsConstructor; -import part2.Server.netty.handler.NettyRPCServerHandler; -import part2.Server.provider.ServiceProvider; -import part2.common.serializer.myCode.MyDecoder; -import part2.common.serializer.myCode.MyEncoder; -import part2.common.serializer.mySerializer.JsonSerializer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 16:15 - */ -@AllArgsConstructor -public class NettyServerInitializer extends ChannelInitializer { - private ServiceProvider serviceProvider; - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ChannelPipeline pipeline = ch.pipeline(); - //使用自定义的编/解码器 - pipeline.addLast(new MyEncoder(new JsonSerializer())); - pipeline.addLast(new MyDecoder()); - pipeline.addLast(new NettyRPCServerHandler(serviceProvider)); - } -} diff --git a/version3/src/main/java/part2/Server/provider/ServiceProvider.java b/version3/src/main/java/part2/Server/provider/ServiceProvider.java deleted file mode 100644 index 80e4134..0000000 --- a/version3/src/main/java/part2/Server/provider/ServiceProvider.java +++ /dev/null @@ -1,47 +0,0 @@ -package part2.Server.provider; - -import part2.Server.serviceRegister.ServiceRegister; -import part2.Server.serviceRegister.impl.ZKServiceRegister; - -import java.net.InetSocketAddress; -import java.util.HashMap; -import java.util.Map; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/16 17:35 - */ -public class ServiceProvider { - private Map interfaceProvider; - - private int port; - private String host; - //注册服务类 - private ServiceRegister serviceRegister; - - public ServiceProvider(String host,int port){ - //需要传入服务端自身的网络地址 - this.host=host; - this.port=port; - this.interfaceProvider=new HashMap<>(); - this.serviceRegister=new ZKServiceRegister(); - } - - public void provideServiceInterface(Object service,boolean canRetry){ - String serviceName=service.getClass().getName(); - Class[] interfaceName=service.getClass().getInterfaces(); - - for (Class clazz:interfaceName){ - //本机的映射表 - interfaceProvider.put(clazz.getName(),service); - //在注册中心注册服务 - serviceRegister.register(clazz.getName(),new InetSocketAddress(host,port),canRetry); - } - } - - public Object getService(String interfaceName){ - return interfaceProvider.get(interfaceName); - } - -} diff --git a/version3/src/main/java/part2/Server/server/RpcServer.java b/version3/src/main/java/part2/Server/server/RpcServer.java deleted file mode 100644 index 6abbf2a..0000000 --- a/version3/src/main/java/part2/Server/server/RpcServer.java +++ /dev/null @@ -1,11 +0,0 @@ -package part2.Server.server; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/12 11:26 - */ -public interface RpcServer { - void start(int port); - void stop(); -} diff --git a/version3/src/main/java/part2/Server/server/impl/NettyRPCRPCServer.java b/version3/src/main/java/part2/Server/server/impl/NettyRPCRPCServer.java deleted file mode 100644 index 7a4349a..0000000 --- a/version3/src/main/java/part2/Server/server/impl/NettyRPCRPCServer.java +++ /dev/null @@ -1,48 +0,0 @@ -package part2.Server.server.impl; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import lombok.AllArgsConstructor; -import part2.Server.netty.nettyInitializer.NettyServerInitializer; -import part2.Server.provider.ServiceProvider; -import part2.Server.server.RpcServer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/26 14:01 - */ -@AllArgsConstructor -public class NettyRPCRPCServer implements RpcServer { - private ServiceProvider serviceProvider; - @Override - public void start(int port) { - // netty 服务线程组boss负责建立连接, work负责具体的请求 - NioEventLoopGroup bossGroup = new NioEventLoopGroup(); - NioEventLoopGroup workGroup = new NioEventLoopGroup(); - System.out.println("netty服务端启动了"); - try { - //启动netty服务器 - ServerBootstrap serverBootstrap = new ServerBootstrap(); - //初始化 - serverBootstrap.group(bossGroup,workGroup).channel(NioServerSocketChannel.class) - .childHandler(new NettyServerInitializer(serviceProvider)); - //同步堵塞 - ChannelFuture channelFuture=serverBootstrap.bind(port).sync(); - //死循环监听 - channelFuture.channel().closeFuture().sync(); - }catch (InterruptedException e){ - e.printStackTrace(); - }finally { - bossGroup.shutdownGracefully(); - workGroup.shutdownGracefully(); - } - } - - @Override - public void stop() { - - } -} diff --git a/version3/src/main/java/part2/Server/server/impl/SimpleRPCRPCServer.java b/version3/src/main/java/part2/Server/server/impl/SimpleRPCRPCServer.java deleted file mode 100644 index 8033bab..0000000 --- a/version3/src/main/java/part2/Server/server/impl/SimpleRPCRPCServer.java +++ /dev/null @@ -1,39 +0,0 @@ -package part2.Server.server.impl; - - -import lombok.AllArgsConstructor; -import part2.Server.provider.ServiceProvider; -import part2.Server.server.RpcServer; -import part2.Server.server.work.WorkThread; - -import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/12 11:37 - */ -@AllArgsConstructor -public class SimpleRPCRPCServer implements RpcServer { - private ServiceProvider serviceProvide; - @Override - public void start(int port) { - try { - ServerSocket serverSocket=new ServerSocket(port); - System.out.println("服务器启动了"); - while (true) { - Socket socket = serverSocket.accept(); - new Thread(new WorkThread(socket,serviceProvide)).start(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void stop() { - - } -} diff --git a/version3/src/main/java/part2/Server/server/work/WorkThread.java b/version3/src/main/java/part2/Server/server/work/WorkThread.java deleted file mode 100644 index a3985bf..0000000 --- a/version3/src/main/java/part2/Server/server/work/WorkThread.java +++ /dev/null @@ -1,58 +0,0 @@ -package part2.Server.server.work; - - -import lombok.AllArgsConstructor; -import part2.Server.provider.ServiceProvider; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.Socket; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/14 17:39 - */ -@AllArgsConstructor -public class WorkThread implements Runnable{ - private Socket socket; - private ServiceProvider serviceProvide; - @Override - public void run() { - try { - ObjectOutputStream oos=new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois=new ObjectInputStream(socket.getInputStream()); - //读取客户端传过来的request - RpcRequest rpcRequest = (RpcRequest) ois.readObject(); - //反射调用服务方法获取返回值 - RpcResponse rpcResponse=getResponse(rpcRequest); - //向客户端写入response - oos.writeObject(rpcResponse); - oos.flush(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - } - private RpcResponse getResponse(RpcRequest rpcRequest){ - //得到服务名 - String interfaceName=rpcRequest.getInterfaceName(); - //得到服务端相应服务实现类 - Object service = serviceProvide.getService(interfaceName); - //反射调用方法 - Method method=null; - try { - method= service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); - Object invoke=method.invoke(service,rpcRequest.getParams()); - return RpcResponse.sussess(invoke); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - System.out.println("方法执行错误"); - return RpcResponse.fail(); - } - } -} diff --git a/version3/src/main/java/part2/Server/serviceRegister/ServiceRegister.java b/version3/src/main/java/part2/Server/serviceRegister/ServiceRegister.java deleted file mode 100644 index da48e4d..0000000 --- a/version3/src/main/java/part2/Server/serviceRegister/ServiceRegister.java +++ /dev/null @@ -1,15 +0,0 @@ -package part2.Server.serviceRegister; - -import java.net.InetSocketAddress; - -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 16:58 - */ -// 服务注册接口 -public interface ServiceRegister { - // 注册:保存服务与地址。 - void register(String serviceName, InetSocketAddress serviceAddress,boolean canRetry); - -} diff --git a/version3/src/main/java/part2/Server/serviceRegister/impl/ZKServiceRegister.java b/version3/src/main/java/part2/Server/serviceRegister/impl/ZKServiceRegister.java deleted file mode 100644 index 04e9e7c..0000000 --- a/version3/src/main/java/part2/Server/serviceRegister/impl/ZKServiceRegister.java +++ /dev/null @@ -1,68 +0,0 @@ -package part2.Server.serviceRegister.impl; - -import org.apache.curator.RetryPolicy; -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.retry.ExponentialBackoffRetry; -import org.apache.zookeeper.CreateMode; -import part2.Server.serviceRegister.ServiceRegister; - -import java.net.InetSocketAddress; -/** - * @author wxx - * @version 1.0 - * @create 2024/5/3 17:28 - */ -public class ZKServiceRegister implements ServiceRegister { - // curator 提供的zookeeper客户端 - private CuratorFramework client; - //zookeeper根路径节点 - private static final String ROOT_PATH = "MyRPC"; - private static final String RETRY = "CanRetry"; - - //负责zookeeper客户端的初始化,并与zookeeper服务端进行连接 - public ZKServiceRegister(){ - // 指数时间重试 - RetryPolicy policy = new ExponentialBackoffRetry(1000, 3); - // zookeeper的地址固定,不管是服务提供者还是,消费者都要与之建立连接 - // sessionTimeoutMs 与 zoo.cfg中的tickTime 有关系, - // zk还会根据minSessionTimeout与maxSessionTimeout两个参数重新调整最后的超时值。默认分别为tickTime 的2倍和20倍 - // 使用心跳监听状态 - this.client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181") - .sessionTimeoutMs(40000).retryPolicy(policy).namespace(ROOT_PATH).build(); - this.client.start(); - System.out.println("zookeeper 连接成功"); - } - //注册服务到注册中心 - @Override - public void register(String serviceName, InetSocketAddress serviceAddress,boolean canRetry) { - try { - // serviceName创建成永久节点,服务提供者下线时,不删服务名,只删地址 - if(client.checkExists().forPath("/" + serviceName) == null){ - client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/" + serviceName); - } - // 路径地址,一个/代表一个节点 - String path = "/" + serviceName +"/"+ getServiceAddress(serviceAddress); - // 临时节点,服务器下线就删除节点 - client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path); - //如果这个服务是幂等性,就增加到节点中 - if (canRetry){ - path ="/"+RETRY+"/"+serviceName; - client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path); - } - } catch (Exception e) { - System.out.println("此服务已存在"); - } - } - // 地址 -> XXX.XXX.XXX.XXX:port 字符串 - private String getServiceAddress(InetSocketAddress serverAddress) { - return serverAddress.getHostName() + - ":" + - serverAddress.getPort(); - } - // 字符串解析为地址 - private InetSocketAddress parseAddress(String address) { - String[] result = address.split(":"); - return new InetSocketAddress(result[0], Integer.parseInt(result[1])); - } -} diff --git a/version3/src/main/java/part2/common/Message/MessageType.java b/version3/src/main/java/part2/common/Message/MessageType.java deleted file mode 100644 index 0241fd6..0000000 --- a/version3/src/main/java/part2/common/Message/MessageType.java +++ /dev/null @@ -1,17 +0,0 @@ -package part2.common.Message; - -import lombok.AllArgsConstructor; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:29 - */ -@AllArgsConstructor -public enum MessageType { - REQUEST(0),RESPONSE(1); - private int code; - public int getCode(){ - return code; - } -} \ No newline at end of file diff --git a/version3/src/main/java/part2/common/Message/RpcRequest.java b/version3/src/main/java/part2/common/Message/RpcRequest.java deleted file mode 100644 index 9ed8c3a..0000000 --- a/version3/src/main/java/part2/common/Message/RpcRequest.java +++ /dev/null @@ -1,29 +0,0 @@ -package part2.common.Message; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/1 18:30 - * 定义发送的消息格式 - */ -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class RpcRequest implements Serializable { - //服务类名,客户端只知道接口 - private String interfaceName; - //调用的方法名 - private String methodName; - //参数列表 - private Object[] params; - //参数类型 - private Class[] paramsType; -} diff --git a/version3/src/main/java/part2/common/Message/RpcResponse.java b/version3/src/main/java/part2/common/Message/RpcResponse.java deleted file mode 100644 index 8df2e59..0000000 --- a/version3/src/main/java/part2/common/Message/RpcResponse.java +++ /dev/null @@ -1,35 +0,0 @@ -package part2.common.Message; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/2/1 19:18 - */ -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class RpcResponse implements Serializable { - //状态信息 - private int code; - private String message; - //更新:加入传输数据的类型,以便在自定义序列化器中解析 - private Class dataType; - //具体数据 - private Object data; - - public static RpcResponse sussess(Object data){ - return RpcResponse.builder().code(200).dataType(data.getClass()).data(data).build(); - } - public static RpcResponse fail(){ - return RpcResponse.builder().code(500).message("服务器发生错误").build(); - } -} - diff --git a/version3/src/main/java/part2/common/pojo/User.java b/version3/src/main/java/part2/common/pojo/User.java deleted file mode 100644 index bf999d7..0000000 --- a/version3/src/main/java/part2/common/pojo/User.java +++ /dev/null @@ -1,25 +0,0 @@ -package part2.common.pojo; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 17:50 - */ -@Builder -@Data -@NoArgsConstructor -@AllArgsConstructor -public class User implements Serializable { - // 客户端和服务端共有的 - private Integer id; - private String userName; - private Boolean sex; -} - diff --git a/version3/src/main/java/part2/common/serializer/myCode/MyDecoder.java b/version3/src/main/java/part2/common/serializer/myCode/MyDecoder.java deleted file mode 100644 index 7970141..0000000 --- a/version3/src/main/java/part2/common/serializer/myCode/MyDecoder.java +++ /dev/null @@ -1,41 +0,0 @@ -package part2.common.serializer.myCode; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import part2.common.Message.MessageType; -import part2.common.serializer.mySerializer.Serializer; - -import java.util.List; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:24 - * 按照自定义的消息格式解码数据 - */ -public class MyDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List out) throws Exception { - //1.读取消息类型 - short messageType = in.readShort(); - // 现在还只支持request与response请求 - if(messageType != MessageType.REQUEST.getCode() && - messageType != MessageType.RESPONSE.getCode()){ - System.out.println("暂不支持此种数据"); - return; - } - //2.读取序列化的方式&类型 - short serializerType = in.readShort(); - Serializer serializer = Serializer.getSerializerByCode(serializerType); - if(serializer == null) - throw new RuntimeException("不存在对应的序列化器"); - //3.读取序列化数组长度 - int length = in.readInt(); - //4.读取序列化数组 - byte[] bytes=new byte[length]; - in.readBytes(bytes); - Object deserialize= serializer.deserialize(bytes, messageType); - out.add(deserialize); - } -} diff --git a/version3/src/main/java/part2/common/serializer/myCode/MyEncoder.java b/version3/src/main/java/part2/common/serializer/myCode/MyEncoder.java deleted file mode 100644 index c6ef573..0000000 --- a/version3/src/main/java/part2/common/serializer/myCode/MyEncoder.java +++ /dev/null @@ -1,41 +0,0 @@ -package part2.common.serializer.myCode; - -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToByteEncoder; -import lombok.AllArgsConstructor; -import part2.common.Message.MessageType; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; -import part2.common.serializer.mySerializer.Serializer; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:24 - * 依次按照自定义的消息格式写入,传入的数据为request或者response - * 需要持有一个serialize器,负责将传入的对象序列化成字节数组 - */ -@AllArgsConstructor -public class MyEncoder extends MessageToByteEncoder { - private Serializer serializer; - @Override - protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { - System.out.println(msg.getClass()); - //1.写入消息类型 - if(msg instanceof RpcRequest){ - out.writeShort(MessageType.REQUEST.getCode()); - } - else if(msg instanceof RpcResponse){ - out.writeShort(MessageType.RESPONSE.getCode()); - } - //2.写入序列化方式 - out.writeShort(serializer.getType()); - //得到序列化数组 - byte[] serializeBytes = serializer.serialize(msg); - //3.写入长度 - out.writeInt(serializeBytes.length); - //4.写入序列化数组 - out.writeBytes(serializeBytes); - } -} diff --git a/version3/src/main/java/part2/common/serializer/mySerializer/JsonSerializer.java b/version3/src/main/java/part2/common/serializer/mySerializer/JsonSerializer.java deleted file mode 100644 index 63c000b..0000000 --- a/version3/src/main/java/part2/common/serializer/mySerializer/JsonSerializer.java +++ /dev/null @@ -1,65 +0,0 @@ -package part2.common.serializer.mySerializer; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import part2.common.Message.RpcRequest; -import part2.common.Message.RpcResponse; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:31 - */ -public class JsonSerializer implements Serializer { - @Override - public byte[] serialize(Object obj) { - byte[] bytes = JSONObject.toJSONBytes(obj); - return bytes; - } - - @Override - public Object deserialize(byte[] bytes, int messageType) { - Object obj = null; - // 传输的消息分为request与response - switch (messageType){ - case 0: - RpcRequest request = JSON.parseObject(bytes, RpcRequest.class); - Object[] objects = new Object[request.getParams().length]; - // 把json字串转化成对应的对象, fastjson可以读出基本数据类型,不用转化 - // 对转换后的request中的params属性逐个进行类型判断 - for(int i = 0; i < objects.length; i++){ - Class paramsType = request.getParamsType()[i]; - //判断每个对象类型是否和paramsTypes中的一致 - if (!paramsType.isAssignableFrom(request.getParams()[i].getClass())){ - //如果不一致,就行进行类型转换 - objects[i] = JSONObject.toJavaObject((JSONObject) request.getParams()[i],request.getParamsType()[i]); - }else{ - //如果一致就直接赋给objects[i] - objects[i] = request.getParams()[i]; - } - } - request.setParams(objects); - obj = request; - break; - case 1: - RpcResponse response = JSON.parseObject(bytes, RpcResponse.class); - Class dataType = response.getDataType(); - //判断转化后的response对象中的data的类型是否正确 - if(! dataType.isAssignableFrom(response.getData().getClass())){ - response.setData(JSONObject.toJavaObject((JSONObject) response.getData(),dataType)); - } - obj = response; - break; - default: - System.out.println("暂时不支持此种消息"); - throw new RuntimeException(); - } - return obj; - } - - //1 代表json序列化方式 - @Override - public int getType() { - return 1; - } -} diff --git a/version3/src/main/java/part2/common/serializer/mySerializer/ObjectSerializer.java b/version3/src/main/java/part2/common/serializer/mySerializer/ObjectSerializer.java deleted file mode 100644 index 5940fb1..0000000 --- a/version3/src/main/java/part2/common/serializer/mySerializer/ObjectSerializer.java +++ /dev/null @@ -1,54 +0,0 @@ -package part2.common.serializer.mySerializer; - -import java.io.*; - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:36 - */ -public class ObjectSerializer implements Serializer { - //利用Java io 对象 -》字节数组 - @Override - public byte[] serialize(Object obj) { - byte[] bytes=null; - ByteArrayOutputStream bos=new ByteArrayOutputStream(); - try { - //是一个对象输出流,用于将 Java 对象序列化为字节流,并将其连接到bos上 - ObjectOutputStream oos = new ObjectOutputStream(bos); - oos.writeObject(obj); - //刷新 ObjectOutputStream,确保所有缓冲区中的数据都被写入到底层流中。 - oos.flush(); - //将bos其内部缓冲区中的数据转换为字节数组 - bytes = bos.toByteArray(); - oos.close(); - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - return bytes; - } - - //字节数组 -》对象 - @Override - public Object deserialize(byte[] bytes, int messageType) { - Object obj = null; - ByteArrayInputStream bis = new ByteArrayInputStream(bytes); - try { - ObjectInputStream ois = new ObjectInputStream(bis); - obj = ois.readObject(); - ois.close(); - bis.close(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - return obj; - } - - //0 代表Java 原生序列器 - @Override - public int getType() { - return 0; - } -} - diff --git a/version3/src/main/java/part2/common/serializer/mySerializer/Serializer.java b/version3/src/main/java/part2/common/serializer/mySerializer/Serializer.java deleted file mode 100644 index c751d36..0000000 --- a/version3/src/main/java/part2/common/serializer/mySerializer/Serializer.java +++ /dev/null @@ -1,29 +0,0 @@ -package part2.common.serializer.mySerializer; - - -/** - * @author wxx - * @version 1.0 - * @create 2024/6/2 22:31 - */ -public interface Serializer { - // 把对象序列化成字节数组 - byte[] serialize(Object obj); - // 从字节数组反序列化成消息, 使用java自带序列化方式不用messageType也能得到相应的对象(序列化字节数组里包含类信息) - // 其它方式需指定消息格式,再根据message转化成相应的对象 - Object deserialize(byte[] bytes, int messageType); - // 返回使用的序列器,是哪个 - // 0:java自带序列化方式, 1: json序列化方式 - int getType(); - // 根据序号取出序列化器,暂时有两种实现方式,需要其它方式,实现这个接口即可 - static Serializer getSerializerByCode(int code){ - switch (code){ - case 0: - return new ObjectSerializer(); - case 1: - return new JsonSerializer(); - default: - return null; - } - } -} diff --git a/version3/src/main/java/part2/common/service/Impl/UserServiceImpl.java b/version3/src/main/java/part2/common/service/Impl/UserServiceImpl.java deleted file mode 100644 index 37e6262..0000000 --- a/version3/src/main/java/part2/common/service/Impl/UserServiceImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package part2.common.service.Impl; - - -import part2.common.pojo.User; -import part2.common.service.UserService; - -import java.util.Random; -import java.util.UUID; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 16:28 - */ -public class UserServiceImpl implements UserService { - @Override - public User getUserByUserId(Integer id) { - System.out.println("客户端查询了"+id+"的用户"); - // 模拟从数据库中取用户的行为 - Random random = new Random(); - User user = User.builder().userName(UUID.randomUUID().toString()) - .id(id) - .sex(random.nextBoolean()).build(); - return user; - } - - @Override - public Integer insertUserId(User user) { - System.out.println("插入数据成功"+user.getUserName()); - return user.getId(); - } -} \ No newline at end of file diff --git a/version3/src/main/java/part2/common/service/UserService.java b/version3/src/main/java/part2/common/service/UserService.java deleted file mode 100644 index b6817fe..0000000 --- a/version3/src/main/java/part2/common/service/UserService.java +++ /dev/null @@ -1,16 +0,0 @@ -package part2.common.service; - - -import part2.common.pojo.User; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 16:27 - */ -public interface UserService { - // 客户端通过这个接口调用服务端的实现类 - User getUserByUserId(Integer id); - //新增一个功能 - Integer insertUserId(User user); -} diff --git a/version3/src/main/resources/log4j.properties b/version3/src/main/resources/log4j.properties deleted file mode 100644 index 4e012fe..0000000 --- a/version3/src/main/resources/log4j.properties +++ /dev/null @@ -1,8 +0,0 @@ -log4j.rootLogger=ERROR, stdout -log4j.appender.stdout=org.apache.log4j.ConsoleAppender - -log4j.appender.stdout.layout=org.apache.log4j.PatternLayout -log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n -log4j.appender.logfile=org.apache.log4j.FileAppender -log4j.appender.logfile.File=target/spring.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout -log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n diff --git a/version4/pom.xml b/version4/pom.xml index 254fdb9..e8b0729 100644 --- a/version4/pom.xml +++ b/version4/pom.xml @@ -3,17 +3,28 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.0.0.RELEASE + + org.example version4 1.0-SNAPSHOT + 8 8 8 UTF-8 + + org.springframework.boot + spring-boot-starter-web + org.projectlombok lombok @@ -61,4 +72,22 @@ + + + + + org.springframework.boot + spring-boot-maven-plugin + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.1 + + 8 + 8 + + + + \ No newline at end of file diff --git a/version4/src/main/java/part1/Client/TestClient.java b/version4/src/main/java/part1/Client/TestClient.java index ea18b2a..7e2d407 100644 --- a/version4/src/main/java/part1/Client/TestClient.java +++ b/version4/src/main/java/part1/Client/TestClient.java @@ -1,9 +1,6 @@ package part1.Client; -import part1.Client.proxy.ClientProxy; -import part1.common.pojo.User; -import part1.common.service.UserService; /** @@ -13,29 +10,29 @@ */ public class TestClient { - public static void main(String[] args) throws InterruptedException { - ClientProxy clientProxy=new ClientProxy(); - UserService proxy=clientProxy.getProxy(UserService.class); - for(int i = 0; i < 120; i++) { - Integer i1 = i; - if (i%30==0) { - Thread.sleep(10000); - } - new Thread(()->{ - try{ - User user = proxy.getUserByUserId(i1); - - System.out.println("从服务端得到的user="+user.toString()); - - Integer id = proxy.insertUserId(User.builder().id(i1).userName("User" + i1.toString()).sex(true).build()); - System.out.println("向服务端插入user的id"+id); - } catch (NullPointerException e){ - System.out.println("user为空"); - e.printStackTrace(); - } - }).start(); - } - } +// public static void main(String[] args) throws InterruptedException { +// ClientProxy clientProxy=new ClientProxy(); +// UserService proxy=clientProxy.getProxy(UserService.class); +// for(int i = 0; i < 120; i++) { +// Integer i1 = i; +// if (i%30==0) { +// Thread.sleep(10000); +// } +// new Thread(()->{ +// try{ +// User user = proxy.getUserByUserId(i1); +// +// System.out.println("从服务端得到的user="+user.toString()); +// +// Integer id = proxy.insertUserId(User.builder().id(i1).userName("User" + i1.toString()).sex(true).build()); +// System.out.println("向服务端插入user的id"+id); +// } catch (NullPointerException e){ +// System.out.println("user为空"); +// e.printStackTrace(); +// } +// }).start(); +// } +// } //User user = proxy.getUserByUserId(1); //System.out.println("从服务端得到的user="+user.toString()); // diff --git a/version4/src/main/java/part1/Client/cache/serviceCache.java b/version4/src/main/java/part1/Client/cache/serviceCache.java index 6b29acb..af9ef1b 100644 --- a/version4/src/main/java/part1/Client/cache/serviceCache.java +++ b/version4/src/main/java/part1/Client/cache/serviceCache.java @@ -16,7 +16,7 @@ public class serviceCache { private static Map> cache=new HashMap<>(); //添加服务 - public void addServcieToCache(String serviceName,String address){ + public void addServiceToCache(String serviceName, String address){ if(cache.containsKey(serviceName)){ List addressList = cache.get(serviceName); addressList.add(address); diff --git a/version4/src/main/java/part1/Client/netty/nettyInitializer/NettyClientInitializer.java b/version4/src/main/java/part1/Client/netty/nettyInitializer/NettyClientInitializer.java index e0b520a..31ac08a 100644 --- a/version4/src/main/java/part1/Client/netty/nettyInitializer/NettyClientInitializer.java +++ b/version4/src/main/java/part1/Client/netty/nettyInitializer/NettyClientInitializer.java @@ -8,6 +8,7 @@ import part1.common.serializer.myCode.MyDecoder; import part1.common.serializer.myCode.MyEncoder; import part1.common.serializer.mySerializer.JsonSerializer; +import part1.common.serializer.mySerializer.ObjectSerializer; /** * @author wxx @@ -19,7 +20,7 @@ public class NettyClientInitializer extends ChannelInitializer { protected void initChannel(SocketChannel ch) throws Exception { ChannelPipeline pipeline = ch.pipeline(); //使用自定义的编/解码器 - pipeline.addLast(new MyEncoder(new JsonSerializer())); + pipeline.addLast(new MyEncoder(new ObjectSerializer())); pipeline.addLast(new MyDecoder()); pipeline.addLast(new NettyClientHandler()); } diff --git a/version4/src/main/java/part1/Client/proxy/ClientProxy.java b/version4/src/main/java/part1/Client/proxy/ClientProxy.java index 9f90383..6f09765 100644 --- a/version4/src/main/java/part1/Client/proxy/ClientProxy.java +++ b/version4/src/main/java/part1/Client/proxy/ClientProxy.java @@ -1,6 +1,7 @@ package part1.Client.proxy; +import lombok.extern.slf4j.Slf4j; import part1.Client.circuitBreaker.CircuitBreaker; import part1.Client.circuitBreaker.CircuitBreakerProvider; import part1.Client.retry.guavaRetry; @@ -8,24 +9,30 @@ import part1.Client.rpcClient.impl.NettyRpcClient; import part1.Client.serviceCenter.ServiceCenter; import part1.Client.serviceCenter.ZKServiceCenter; +import part1.Server.integration.References; import part1.common.Message.RpcRequest; import part1.common.Message.RpcResponse; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; +import java.util.HashMap; /** * @author wxx * @version 1.0 * @create 2024/2/6 16:49 */ +@Slf4j public class ClientProxy implements InvocationHandler { //传入参数service接口的class对象,反射封装成一个request private RpcClient rpcClient; private ServiceCenter serviceCenter; private CircuitBreakerProvider circuitBreakerProvider; + private HashMap referencesHashMap = new HashMap<>(); + private References references; + private Class clazz; public ClientProxy() throws InterruptedException { serviceCenter=new ZKServiceCenter(); rpcClient=new NettyRpcClient(serviceCenter); @@ -39,7 +46,9 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl RpcRequest request=RpcRequest.builder() .interfaceName(method.getDeclaringClass().getName()) .methodName(method.getName()) - .params(args).paramsType(method.getParameterTypes()).build(); + .params(args).paramsType(method.getParameterTypes()) + .references(references) + .build(); //获取熔断器 CircuitBreaker circuitBreaker=circuitBreakerProvider.getCircuitBreaker(method.getName()); //判断熔断器是否允许请求经过 @@ -50,7 +59,7 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl //数据传输 RpcResponse response; //后续添加逻辑:为保持幂等性,只对白名单上的服务进行重试 - if (serviceCenter.checkRetry(request.getInterfaceName())){ + if (serviceCenter.checkRetry(request)){ //调用retry框架进行重试操作 response = new guavaRetry().sendServiceWithRetry(request, rpcClient); }else { @@ -66,8 +75,21 @@ public Object invoke(Object proxy, Method method, Object[] args) throws Throwabl } return response.getData(); } - public T getProxy(Class clazz){ + + /** + * 获取代理对象 + * @param clazz + * @param rpcReference + * @return + * @param + */ + public T getProxy(Class clazz,References rpcReference){ Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this); + //记录接口服务与注解信息 + log.info("添加服务:{},注解信息:{}",clazz.getName(),rpcReference.toString()); + referencesHashMap.put(clazz.toString(),rpcReference); + this.references = rpcReference; + this.clazz = clazz; return (T)o; } } diff --git a/version4/src/main/java/part1/Client/rpcClient/impl/NettyRpcClient.java b/version4/src/main/java/part1/Client/rpcClient/impl/NettyRpcClient.java index bca9e15..cd7a0d9 100644 --- a/version4/src/main/java/part1/Client/rpcClient/impl/NettyRpcClient.java +++ b/version4/src/main/java/part1/Client/rpcClient/impl/NettyRpcClient.java @@ -7,6 +7,7 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioSocketChannel; import io.netty.util.AttributeKey; +import lombok.extern.slf4j.Slf4j; import part1.Client.netty.nettyInitializer.NettyClientInitializer; import part1.Client.rpcClient.RpcClient; import part1.common.Message.RpcRequest; @@ -20,6 +21,7 @@ * @version 1.0 * @create 2024/5/2 19:40 */ +@Slf4j public class NettyRpcClient implements RpcClient { private static final Bootstrap bootstrap; @@ -39,8 +41,10 @@ public NettyRpcClient(ServiceCenter serviceCenter) throws InterruptedException { } @Override public RpcResponse sendRequest(RpcRequest request) { + log.info("客户端发生请求" + request); //从注册中心获取host,post - InetSocketAddress address = serviceCenter.serviceDiscovery(request.getInterfaceName()); + InetSocketAddress address = serviceCenter + .serviceDiscovery(request.getInterfaceName() + "." +request.getReferences().version()); String host = address.getHostName(); int port = address.getPort(); try { @@ -57,7 +61,7 @@ public RpcResponse sendRequest(RpcRequest request) { AttributeKey key = AttributeKey.valueOf("RPCResponse"); RpcResponse response = channel.attr(key).get(); - System.out.println(response); + log.info("完成请求——请求返回结果(客户端接受)" + response); return response; } catch (InterruptedException e) { e.printStackTrace(); diff --git a/version4/src/main/java/part1/Client/serviceCenter/ServiceCenter.java b/version4/src/main/java/part1/Client/serviceCenter/ServiceCenter.java index 57a250d..f60a866 100644 --- a/version4/src/main/java/part1/Client/serviceCenter/ServiceCenter.java +++ b/version4/src/main/java/part1/Client/serviceCenter/ServiceCenter.java @@ -1,5 +1,7 @@ package part1.Client.serviceCenter; +import part1.common.Message.RpcRequest; + import java.net.InetSocketAddress; /** @@ -11,6 +13,6 @@ public interface ServiceCenter { // 查询:根据服务名查找地址 InetSocketAddress serviceDiscovery(String serviceName); - //判断是否可重试 - boolean checkRetry(String serviceName) ; + //判断是否可重试,将参数修改为请求,根据请求中注解信息判断是否可重试 + boolean checkRetry(RpcRequest rpcRequest) ; } diff --git a/version4/src/main/java/part1/Client/serviceCenter/ZKServiceCenter.java b/version4/src/main/java/part1/Client/serviceCenter/ZKServiceCenter.java index d549d18..b560122 100644 --- a/version4/src/main/java/part1/Client/serviceCenter/ZKServiceCenter.java +++ b/version4/src/main/java/part1/Client/serviceCenter/ZKServiceCenter.java @@ -7,9 +7,12 @@ import part1.Client.serviceCenter.ZkWatcher.watchZK; import part1.Client.cache.serviceCache; import part1.Client.serviceCenter.balance.impl.ConsistencyHashBalance; +import part1.common.Message.RpcRequest; import java.net.InetSocketAddress; +import java.util.HashMap; import java.util.List; +import java.util.Map; /** * @author wxx @@ -64,21 +67,40 @@ public InetSocketAddress serviceDiscovery(String serviceName) { return null; } // - public boolean checkRetry(String serviceName) { + // TODO 是否可重试的校验修改为 从zoo节点中的注解信息获取 + public boolean checkRetry(RpcRequest rpcRequest) { boolean canRetry =false; try { - List serviceList = client.getChildren().forPath("/" + RETRY); - for(String s:serviceList){ - if(s.equals(serviceName)){ - System.out.println("服务"+serviceName+"在白名单上,可进行重试"); - canRetry=true; - } - } + List serviceList = client.getChildren() + .forPath("/" + rpcRequest.getInterfaceName() + "." + rpcRequest.getReferences().version()); +// for(String s:serviceList){ +// if(s.equals(serviceName)){ +// log.info("服务"+serviceName+"在白名单上,可进行重试"); +// canRetry=true; +// } +// } + String serviceInfo = serviceList.get(0).split("-")[1]; + Map infoMap = convertStringToHashMap(serviceInfo); + return infoMap.get("canRetry").equals("true"); }catch (Exception e) { e.printStackTrace(); } return canRetry; } + public static Map convertStringToHashMap(String str) { + Map map = new HashMap<>(); + if (str != null && !str.isEmpty()) { + str = str.replace("{","").replace("}",""); + String[] pairs = str.split(","); + for (String pair : pairs) { + String[] keyValue = pair.split("="); + if (keyValue.length == 2) { + map.put(keyValue[0].trim(), keyValue[1].trim()); + } + } + } + return map; + } // 地址 -> XXX.XXX.XXX.XXX:port 字符串 private String getServiceAddress(InetSocketAddress serverAddress) { return serverAddress.getHostName() + @@ -87,7 +109,7 @@ private String getServiceAddress(InetSocketAddress serverAddress) { } // 字符串解析为地址 private InetSocketAddress parseAddress(String address) { - String[] result = address.split(":"); + String[] result = address.split("-")[0].split(":"); return new InetSocketAddress(result[0], Integer.parseInt(result[1])); } } diff --git a/version4/src/main/java/part1/Client/serviceCenter/ZkWatcher/watchZK.java b/version4/src/main/java/part1/Client/serviceCenter/ZkWatcher/watchZK.java index e23df29..6aa7fe2 100644 --- a/version4/src/main/java/part1/Client/serviceCenter/ZkWatcher/watchZK.java +++ b/version4/src/main/java/part1/Client/serviceCenter/ZkWatcher/watchZK.java @@ -1,5 +1,6 @@ package part1.Client.serviceCenter.ZkWatcher; +import lombok.extern.slf4j.Slf4j; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.recipes.cache.ChildData; import org.apache.curator.framework.recipes.cache.CuratorCache; @@ -11,6 +12,7 @@ * @version 1.0 * @create 2024/6/4 1:00 */ +@Slf4j public class watchZK { // curator 提供的zookeeper客户端 private CuratorFramework client; @@ -44,9 +46,10 @@ public void event(Type type, ChildData childData, ChildData childData1) { if(pathList.length<=2) break; else { String serviceName=pathList[1]; - String address=pathList[2]; + String address=pathList[2].split("-")[0]; //将新注册的服务加入到本地缓存中 - cache.addServcieToCache(serviceName,address); + cache.addServiceToCache(serviceName,address); + log.info("节点监听-添加,路径集合:{}服务名:{}地址:{}",pathList,serviceName,address); } break; case "NODE_CHANGED": // 节点更新 @@ -66,7 +69,7 @@ public void event(Type type, ChildData childData, ChildData childData1) { else { String serviceName=pathList_d[1]; String address=pathList_d[2]; - //将新注册的服务加入到本地缓存中 + //将删除的服务从本地缓存中删除 cache.delete(serviceName,address); } break; diff --git a/version4/src/main/java/part1/Server/TestServer.java b/version4/src/main/java/part1/Server/TestServer.java index 747e8c6..9f4d025 100644 --- a/version4/src/main/java/part1/Server/TestServer.java +++ b/version4/src/main/java/part1/Server/TestServer.java @@ -4,8 +4,6 @@ import part1.Server.server.impl.NettyRPCRPCServer; import part1.Server.provider.ServiceProvider; import part1.Server.server.RpcServer; -import part1.common.service.Impl.UserServiceImpl; -import part1.common.service.UserService; /** * @author wxx @@ -14,14 +12,14 @@ */ public class TestServer { - public static void main(String[] args) throws InterruptedException { - UserService userService=new UserServiceImpl(); - - ServiceProvider serviceProvider=new ServiceProvider("127.0.0.1",9999); - - serviceProvider.provideServiceInterface(userService,true); - - RpcServer rpcServer=new NettyRPCRPCServer(serviceProvider); - rpcServer.start(9999); - } +// public static void main(String[] args) throws InterruptedException { +// UserService userService=new UserServiceImpl(); +// +// ServiceProvider serviceProvider=new ServiceProvider("127.0.0.1",9999); +// +// serviceProvider.provideServiceInterface(userService,true); +// +// RpcServer rpcServer=new NettyRPCRPCServer(serviceProvider); +// rpcServer.start(9999); +// } } diff --git a/version4/src/main/java/part1/Server/integration/EnableConsumer.java b/version4/src/main/java/part1/Server/integration/EnableConsumer.java new file mode 100644 index 0000000..a7bbfe6 --- /dev/null +++ b/version4/src/main/java/part1/Server/integration/EnableConsumer.java @@ -0,0 +1,21 @@ +package part1.Server.integration; + +import org.springframework.context.annotation.Import; +import part1.Server.integration.configuration.ConsumerPostProcessor; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @Author: yty + * @Description: 消费者项目启动注解 + * @DateTime: 2024/11/08 16:01 + **/ + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@Import(ConsumerPostProcessor.class) +public @interface EnableConsumer { +} diff --git a/version4/src/main/java/part1/Server/integration/EnableProvider.java b/version4/src/main/java/part1/Server/integration/EnableProvider.java new file mode 100644 index 0000000..bbcf93c --- /dev/null +++ b/version4/src/main/java/part1/Server/integration/EnableProvider.java @@ -0,0 +1,17 @@ +package part1.Server.integration; + + +import org.springframework.context.annotation.Import; +import part1.Server.integration.configuration.ProviderPostProcessor; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@Import(ProviderPostProcessor.class) +public @interface EnableProvider { + +} diff --git a/version4/src/main/java/part1/Server/integration/References.java b/version4/src/main/java/part1/Server/integration/References.java new file mode 100644 index 0000000..f779263 --- /dev/null +++ b/version4/src/main/java/part1/Server/integration/References.java @@ -0,0 +1,31 @@ +package part1.Server.integration; + +import org.springframework.stereotype.Component; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.FIELD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Component +public @interface References { + + /** + * 组号 + * @return + */ + String group() default "1"; + + /** + * 版本号 + * @return + */ + String version() default "1.0"; + + /** + * 负载均衡策略 + */ + String loadBalance() default "RoundLoadBalance"; +} diff --git a/version4/src/main/java/part1/Server/integration/RpcService.java b/version4/src/main/java/part1/Server/integration/RpcService.java new file mode 100644 index 0000000..6c3c2d9 --- /dev/null +++ b/version4/src/main/java/part1/Server/integration/RpcService.java @@ -0,0 +1,50 @@ +package part1.Server.integration; + + +import org.springframework.stereotype.Component; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +@Component +public @interface RpcService { + + + /** + * 组号 + * @return + */ + String group() default "1"; + + /** + * 版本号 + * @return + */ + String version() default "1.0"; + + /** + * 是否可以重试 + * @return + */ + boolean canRetry() default false; + + /** + * 负载均衡策略 + */ + String loadBalance() default "RoundLoadBalance"; + + /** + * 是否开启服务 + * @return + */ + boolean useAble() default true; + + /** + * 限流阈值-桶令牌算法 + */ + int bucketCAPACITY() default 10; +} diff --git a/version4/src/main/java/part1/Server/integration/configuration/ConsumerPostProcessor.java b/version4/src/main/java/part1/Server/integration/configuration/ConsumerPostProcessor.java new file mode 100644 index 0000000..07bace4 --- /dev/null +++ b/version4/src/main/java/part1/Server/integration/configuration/ConsumerPostProcessor.java @@ -0,0 +1,91 @@ +package part1.Server.integration.configuration; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.EnvironmentAware; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import part1.Client.proxy.ClientProxy; +import part1.Server.integration.References; + +import java.lang.reflect.Field; + +/** + * @Author: yty + * @Description: 消费者后置处理器 + * @DateTime: 2024/11/08 16:02 + **/ +@Slf4j +@Configuration +public class ConsumerPostProcessor implements InitializingBean, BeanPostProcessor, EnvironmentAware { + + // 代理对象 +// private static final ClientProxy clientProxy; +// +// static { +// try { +// clientProxy = new ClientProxy(); +// } catch (InterruptedException e) { +// throw new RuntimeException(e); +// } +// } + + + /** + * 读取配置文件后的操作 ——> 启动 RPC 服务 + * @throws Exception + */ + @Override + public void afterPropertiesSet() throws Exception { + } + + /** + * 获取代理对象,发生请求 + * @param bean + * @param beanName + * @return + * @throws BeansException + */ + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + // 获取所有字段 + final Field[] fields = bean.getClass().getDeclaredFields(); + // 遍历所有字段找到 RpcReference 注解的字段 + for (Field field : fields) { + if(field.isAnnotationPresent(References.class)){ + final References rpcReference = field.getAnnotation(References.class); + final Class aClass = field.getType(); + field.setAccessible(true); + Object object = null; + try { + ClientProxy clientProxy = new ClientProxy(); + //获取服务代理对象 + log.info("接口类型:{},接口参数:{}",aClass,rpcReference); + object = clientProxy.getProxy(aClass,rpcReference); + } catch (Exception e) { + e.printStackTrace(); + } + try { + // 将消费者的原接口 替换为 RPC的代理对象 + field.set(bean,object); + field.setAccessible(false); + log.info(beanName + " field:" + field.getName() + "注入成功"); + } catch (IllegalAccessException e) { + e.printStackTrace(); + log.info(beanName + " field:" + field.getName() + "注入失败"); + } + } + } + return bean; + } + + /** + * 读取配置文件 + * @param environment + */ + @Override + public void setEnvironment(Environment environment) { + } +} \ No newline at end of file diff --git a/version4/src/main/java/part1/Server/integration/configuration/ProviderPostProcessor.java b/version4/src/main/java/part1/Server/integration/configuration/ProviderPostProcessor.java new file mode 100644 index 0000000..ad07188 --- /dev/null +++ b/version4/src/main/java/part1/Server/integration/configuration/ProviderPostProcessor.java @@ -0,0 +1,78 @@ +package part1.Server.integration.configuration; + + +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.EnvironmentAware; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.env.Environment; +import part1.Server.integration.RpcService; +import part1.Server.provider.ServiceProvider; +import part1.Server.server.RpcServer; +import part1.Server.server.impl.NettyRPCRPCServer; + +/** + * @Author: yty + * @Description: 提供者后置处理器 + * @DateTime: 2024/11/07 23:14 + **/ +@Slf4j +@Configuration +public class ProviderPostProcessor implements InitializingBean,BeanPostProcessor, EnvironmentAware{ + + // TODO 写死本机 + private static final ServiceProvider serviceProvider = new ServiceProvider("127.0.0.1",9999); + + private final RpcServer rpcServer = new NettyRPCRPCServer(serviceProvider); + + /** + * 服务注册 + * @param bean + * @param beanName + * @return + * @throws BeansException + */ + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + Class beanClass = bean.getClass(); + // 找到bean上带有 RpcService 注解的类 + RpcService rpcService = beanClass.getAnnotation(RpcService.class); + if (rpcService == null){ + return bean; + } + String group = rpcService.group(); + String version = rpcService.version(); + log.info("获取提供方服务现实bean的实现类类{},组号{},版本号{}",beanClass,group,version); + serviceProvider.provideServiceInterface(bean, rpcService); + return bean; + } + + /** + * 读取配置文件后的操作 ——> 启动 RPC 服务 + * @throws Exception + */ + @Override + public void afterPropertiesSet() throws Exception { + Thread t = new Thread(() -> { + try { + log.info("服务端启动线程"); + rpcServer.start(9999); + } catch (Exception e) { + log.error("启动RPC失败", e); + } + }); + t.setDaemon(true); + t.start(); + + } + + /** + * 读取配置文件 + * @param environment + */ + @Override + public void setEnvironment(Environment environment) { + } +} \ No newline at end of file diff --git a/version4/src/main/java/part1/Server/netty/handler/NettyRPCServerHandler.java b/version4/src/main/java/part1/Server/netty/handler/NettyRPCServerHandler.java index 7b8824f..eb3c01a 100644 --- a/version4/src/main/java/part1/Server/netty/handler/NettyRPCServerHandler.java +++ b/version4/src/main/java/part1/Server/netty/handler/NettyRPCServerHandler.java @@ -3,6 +3,8 @@ import io.netty.channel.ChannelHandlerContext; import io.netty.channel.SimpleChannelInboundHandler; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import part1.Server.integration.References; import part1.Server.provider.ServiceProvider; import part1.Server.ratelimit.RateLimit; import part1.common.Message.RpcRequest; @@ -19,6 +21,7 @@ * Object类型也行,强制转型就行 */ @AllArgsConstructor +@Slf4j public class NettyRPCServerHandler extends SimpleChannelInboundHandler { private ServiceProvider serviceProvider; @Override @@ -33,27 +36,39 @@ public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws E ctx.close(); } private RpcResponse getResponse(RpcRequest rpcRequest){ - //得到服务名 - String interfaceName=rpcRequest.getInterfaceName(); - //接口限流降级 + log.info("服务端收到请求" + rpcRequest.toString()); + // 得到客户端接口,注解 + References references = rpcRequest.getReferences(); + String interfaceName = rpcRequest.getInterfaceName() + "." + references.version(); + // TODO 后续根据zookeeper配置中心信息 来决定其它调用配置(比如桶令牌的限流值) + // 接口限流降级 RateLimit rateLimit=serviceProvider.getRateLimitProvider().getRateLimit(interfaceName); if(!rateLimit.getToken()){ //如果获取令牌失败,进行限流降级,快速返回结果 - System.out.println("服务限流!!"); + log.info("服务限流!!"); return RpcResponse.fail(); } - //得到服务端相应服务实现类 Object service = serviceProvider.getService(interfaceName); + log.info("查询的接口名称" + interfaceName); + log.info("服务端相应服务实现类" + service.toString()); //反射调用方法 Method method=null; + boolean isSuccess = false; + Object invoke = null; try { - method= service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); - Object invoke=method.invoke(service,rpcRequest.getParams()); - return RpcResponse.sussess(invoke); + method = service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); + invoke = method.invoke(service,rpcRequest.getParams()); + isSuccess = true; + RpcResponse rpcResponse = new RpcResponse(); + rpcResponse.setCode(200); + rpcResponse.setDataType(invoke.getClass()); + rpcResponse.setData(invoke); + log.info("完成请求——请求返回结果(服务端返回)" + rpcResponse); + return rpcResponse; } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); - System.out.println("方法执行错误"); + log.info("方法执行错误"); return RpcResponse.fail(); } } diff --git a/version4/src/main/java/part1/Server/provider/ServiceProvider.java b/version4/src/main/java/part1/Server/provider/ServiceProvider.java index 30064d1..fb046af 100644 --- a/version4/src/main/java/part1/Server/provider/ServiceProvider.java +++ b/version4/src/main/java/part1/Server/provider/ServiceProvider.java @@ -1,5 +1,7 @@ package part1.Server.provider; +import lombok.extern.slf4j.Slf4j; +import part1.Server.integration.RpcService; import part1.Server.ratelimit.provider.RateLimitProvider; import part1.Server.serviceRegister.impl.ZKServiceRegister; import part1.Server.serviceRegister.ServiceRegister; @@ -13,6 +15,7 @@ * @version 1.0 * @create 2024/2/16 17:35 */ +@Slf4j public class ServiceProvider { private Map interfaceProvider; @@ -31,15 +34,18 @@ public ServiceProvider(String host,int port){ this.rateLimitProvider=new RateLimitProvider(); } - public void provideServiceInterface(Object service,boolean canRetry){ + public void provideServiceInterface(Object service, RpcService rpcService){ String serviceName=service.getClass().getName(); Class[] interfaceName=service.getClass().getInterfaces(); - + String version = rpcService.version(); + boolean canRetry = rpcService.canRetry(); for (Class clazz:interfaceName){ - //本机的映射表 - interfaceProvider.put(clazz.getName(),service); - //在注册中心注册服务 - serviceRegister.register(clazz.getName(),new InetSocketAddress(host,port),canRetry); + String serviceAndVersion = clazz.getName() + "." + version; + //本机的映射表(接口名+版本号 : 实现类) + interfaceProvider.put(serviceAndVersion,service); + log.info("本机映射表存储{}:{}", serviceAndVersion,service); + //在注册中心注册服务 (注册中心是用于注册 服务——服务地址,是用来给客户端返回服务地址的) + serviceRegister.register(serviceAndVersion,new InetSocketAddress(host,port),rpcService); } } diff --git a/version4/src/main/java/part1/Server/server/impl/NettyRPCRPCServer.java b/version4/src/main/java/part1/Server/server/impl/NettyRPCRPCServer.java index 514b857..44c616c 100644 --- a/version4/src/main/java/part1/Server/server/impl/NettyRPCRPCServer.java +++ b/version4/src/main/java/part1/Server/server/impl/NettyRPCRPCServer.java @@ -5,6 +5,7 @@ import io.netty.channel.nio.NioEventLoopGroup; import io.netty.channel.socket.nio.NioServerSocketChannel; import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; import part1.Server.netty.nettyInitializer.NettyServerInitializer; import part1.Server.provider.ServiceProvider; import part1.Server.server.RpcServer; @@ -15,6 +16,7 @@ * @create 2024/2/26 14:01 */ @AllArgsConstructor +@Slf4j public class NettyRPCRPCServer implements RpcServer { private ServiceProvider serviceProvider; @Override diff --git a/version4/src/main/java/part1/Server/serviceRegister/ServiceRegister.java b/version4/src/main/java/part1/Server/serviceRegister/ServiceRegister.java index 0f94e4d..212feaf 100644 --- a/version4/src/main/java/part1/Server/serviceRegister/ServiceRegister.java +++ b/version4/src/main/java/part1/Server/serviceRegister/ServiceRegister.java @@ -1,5 +1,7 @@ package part1.Server.serviceRegister; +import part1.Server.integration.RpcService; + import java.net.InetSocketAddress; /** @@ -9,7 +11,8 @@ */ // 服务注册接口 public interface ServiceRegister { - // 注册:保存服务与地址。 - void register(String serviceName, InetSocketAddress serviceAddress,boolean canRetry); + // 注册:保存服务与地址。 将服务信息都保存在注解中 + //void register(String serviceName, InetSocketAddress serviceAddress,boolean canRetry); + void register(String serviceName, InetSocketAddress serviceAddress, RpcService rpcService); } diff --git a/version4/src/main/java/part1/Server/serviceRegister/impl/ZKServiceRegister.java b/version4/src/main/java/part1/Server/serviceRegister/impl/ZKServiceRegister.java index 6d4bb6f..60f9c54 100644 --- a/version4/src/main/java/part1/Server/serviceRegister/impl/ZKServiceRegister.java +++ b/version4/src/main/java/part1/Server/serviceRegister/impl/ZKServiceRegister.java @@ -1,10 +1,13 @@ package part1.Server.serviceRegister.impl; +import lombok.extern.slf4j.Slf4j; import org.apache.curator.RetryPolicy; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.retry.ExponentialBackoffRetry; import org.apache.zookeeper.CreateMode; +import org.springframework.core.annotation.AnnotationUtils; +import part1.Server.integration.RpcService; import part1.Server.serviceRegister.ServiceRegister; import java.net.InetSocketAddress; @@ -13,6 +16,7 @@ * @version 1.0 * @create 2024/5/3 17:28 */ +@Slf4j public class ZKServiceRegister implements ServiceRegister { // curator 提供的zookeeper客户端 private CuratorFramework client; @@ -35,23 +39,23 @@ public ZKServiceRegister(){ } //注册服务到注册中心 @Override - public void register(String serviceName, InetSocketAddress serviceAddress,boolean canRetry) { + public void register(String serviceName, InetSocketAddress serviceAddress, RpcService rpcService) { try { // serviceName创建成永久节点,服务提供者下线时,不删服务名,只删地址 if(client.checkExists().forPath("/" + serviceName) == null){ client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/" + serviceName); } // 路径地址,一个/代表一个节点 - String path = "/" + serviceName +"/"+ getServiceAddress(serviceAddress); + String path = "/" + serviceName +"/"+ getServiceAddress(serviceAddress) + "-"+ AnnotationUtils.getAnnotationAttributes(rpcService);; // 临时节点,服务器下线就删除节点 client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path); - //如果这个服务是幂等性,就增加到节点中 - if (canRetry){ + // 取消RETRY节点,将幂等性等信息存到服务节点中 + if (rpcService.canRetry()){ path ="/"+RETRY+"/"+serviceName; client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path); } } catch (Exception e) { - System.out.println("此服务已存在"); + log.info(serviceName+"此服务已存在"); } } // 地址 -> XXX.XXX.XXX.XXX:port 字符串 diff --git a/version4/src/main/java/part1/common/Message/RpcRequest.java b/version4/src/main/java/part1/common/Message/RpcRequest.java index 2642f38..0fe22d4 100644 --- a/version4/src/main/java/part1/common/Message/RpcRequest.java +++ b/version4/src/main/java/part1/common/Message/RpcRequest.java @@ -4,6 +4,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import part1.Server.integration.References; import java.io.Serializable; @@ -20,6 +21,8 @@ public class RpcRequest implements Serializable { //服务类名,客户端只知道接口 private String interfaceName; + //客户端接口注解 + private References references; //调用的方法名 private String methodName; //参数列表 diff --git a/version4/src/main/java/part1/common/pojo/User.java b/version4/src/main/java/part1/common/pojo/User.java deleted file mode 100644 index d7cef8c..0000000 --- a/version4/src/main/java/part1/common/pojo/User.java +++ /dev/null @@ -1,25 +0,0 @@ -package part1.common.pojo; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 17:50 - */ -@Builder -@Data -@NoArgsConstructor -@AllArgsConstructor -public class User implements Serializable { - // 客户端和服务端共有的 - private Integer id; - private String userName; - private Boolean sex; -} - diff --git a/version4/src/main/java/part1/common/service/Impl/UserServiceImpl.java b/version4/src/main/java/part1/common/service/Impl/UserServiceImpl.java deleted file mode 100644 index 373243b..0000000 --- a/version4/src/main/java/part1/common/service/Impl/UserServiceImpl.java +++ /dev/null @@ -1,32 +0,0 @@ -package part1.common.service.Impl; - - -import part1.common.pojo.User; -import part1.common.service.UserService; - -import java.util.Random; -import java.util.UUID; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 16:28 - */ -public class UserServiceImpl implements UserService { - @Override - public User getUserByUserId(Integer id) { - System.out.println("客户端查询了"+id+"的用户"); - // 模拟从数据库中取用户的行为 - Random random = new Random(); - User user = User.builder().userName(UUID.randomUUID().toString()) - .id(id) - .sex(random.nextBoolean()).build(); - return user; - } - - @Override - public Integer insertUserId(User user) { - System.out.println("插入数据成功"+user.getUserName()); - return user.getId(); - } -} \ No newline at end of file diff --git a/version4/src/main/java/part1/common/service/UserService.java b/version4/src/main/java/part1/common/service/UserService.java deleted file mode 100644 index 0e539bd..0000000 --- a/version4/src/main/java/part1/common/service/UserService.java +++ /dev/null @@ -1,16 +0,0 @@ -package part1.common.service; - - -import part1.common.pojo.User; - -/** - * @author wxx - * @version 1.0 - * @create 2024/1/28 16:27 - */ -public interface UserService { - // 客户端通过这个接口调用服务端的实现类 - User getUserByUserId(Integer id); - //新增一个功能 - Integer insertUserId(User user); -} diff --git a/version1/src/main/resources/log4j.properties b/version4/target/classes/log4j.properties similarity index 100% rename from version1/src/main/resources/log4j.properties rename to version4/target/classes/log4j.properties diff --git a/version5/.idea/compiler.xml b/version5/.idea/compiler.xml deleted file mode 100644 index c8f73e3..0000000 --- a/version5/.idea/compiler.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/version5/.idea/encodings.xml b/version5/.idea/encodings.xml deleted file mode 100644 index 1da27bf..0000000 --- a/version5/.idea/encodings.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/version5/.idea/inspectionProfiles/Project_Default.xml b/version5/.idea/inspectionProfiles/Project_Default.xml deleted file mode 100644 index c8e8ddc..0000000 --- a/version5/.idea/inspectionProfiles/Project_Default.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - \ No newline at end of file diff --git a/version5/.idea/jarRepositories.xml b/version5/.idea/jarRepositories.xml deleted file mode 100644 index 5a2f139..0000000 --- a/version5/.idea/jarRepositories.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/version5/.idea/misc.xml b/version5/.idea/misc.xml deleted file mode 100644 index 4914f21..0000000 --- a/version5/.idea/misc.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - \ No newline at end of file diff --git a/version5/.idea/uiDesigner.xml b/version5/.idea/uiDesigner.xml deleted file mode 100644 index 2b63946..0000000 --- a/version5/.idea/uiDesigner.xml +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/version5/.idea/vcs.xml b/version5/.idea/vcs.xml deleted file mode 100644 index d843f34..0000000 --- a/version5/.idea/vcs.xml +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/version5/krpc-api/pom.xml b/version5/krpc-api/pom.xml deleted file mode 100644 index c0f741b..0000000 --- a/version5/krpc-api/pom.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - 4.0.0 - - com.kama - version5 - 1.0-SNAPSHOT - - - krpc-api - - - 17 - 17 - UTF-8 - - - \ No newline at end of file diff --git a/version5/krpc-api/src/main/java/com/kama/pojo/User.java b/version5/krpc-api/src/main/java/com/kama/pojo/User.java deleted file mode 100644 index 3713995..0000000 --- a/version5/krpc-api/src/main/java/com/kama/pojo/User.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.kama.pojo; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @ClassName User - * @Description User对象 - * @Author Tong - * @LastChangeDate 2024-12-05 0:53 - * @Version v5.0 - */ -@Builder -@Data -@NoArgsConstructor -@AllArgsConstructor -public class User implements Serializable { - // 客户端和服务端共有的 - private Integer id; - private String userName; - private Boolean gender; -} diff --git a/version5/krpc-api/src/main/java/com/kama/service/UserService.java b/version5/krpc-api/src/main/java/com/kama/service/UserService.java deleted file mode 100644 index 388978b..0000000 --- a/version5/krpc-api/src/main/java/com/kama/service/UserService.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.kama.service; - - -import com.kama.pojo.User; - -/** - * @InterfaceName UserService - * @Description 接口 - * @Author Tong - * @LastChangeDate 2024-12-05 0:52 - * @Version v1.0 - */ - -public interface UserService { - // 查询 - User getUserByUserId(Integer id); - // 新增 - Integer insertUserId(User user); -} diff --git a/version5/krpc-api/target/classes/com/kama/pojo/User$UserBuilder.class b/version5/krpc-api/target/classes/com/kama/pojo/User$UserBuilder.class deleted file mode 100644 index 261a629fcece9b13117c4a98d1c8c5a3d59a42ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1701 zcmbW1+fLg+5QhH^Aty`&AwcPY(l)e7ptuL<$%G3cA&^pf0i~*XwMkaN#IYlLgT$Nk zFlU|L z`p5c#Xh?>{s%e{YjbW%*+DjvabP^d2BhVOT8%{@W^A6X$&Vi$U@`PJZ-FnZon!;s> znN5a?+68sXmZBwGLxFB-$YP8k)gzZ}-VqGBi0O`WO}ph=<}^$oPr0;&?Q^5Zb;q#; zw~ZvG2+*HV29vn0>YHIOije?kxkQ%2n30t;dTB35irv+45BC|SJG?Ebj@{t$vnls! z=1Fc#kD>Pe5h78;JQ(6tr%AeGYo;x>d!4#)cX{3Nm2w)~+T*UNzQe`1+&3wQxmv#p z(S0!(RtBY6y54U&>KA5t1Gh`z&LzD*+;Cl;B!;QtpdeI7N;*Ln40*D-IB4ezW_FyO z+YlS3QZ21c=aRA_*KOg+O~<1%K1L}?PrAJOLCAfl>17kpGkA^{NxW2B{)(Y+!8Ywf zr!Dj#L~sf=ctbkw5yQ8rK%rp(-Q;%D5?-O^IPG57=+8B>a>;S`s4E7Te~s7&m(_?0 z5F)DFvUW@;|fNaK|dF#Gq~2ws5N!_dG%8Y9!*A#5;!h zK1~Ldngngs?A4}pw*y`9kY0uuU9}5-vXOg$6+NRI%G32O9OfuJCr^B*_25Rd>>vajm`7X5J&&uB~$af#Y8UMn(boT7*N4bpgv_gKZuKe;uF AmH+?% diff --git a/version5/krpc-api/target/classes/com/kama/pojo/User.class b/version5/krpc-api/target/classes/com/kama/pojo/User.class deleted file mode 100644 index 1dc838daf5345cfc1df510a88ee66eb1d9c110f0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3013 zcma)8U31$+6g_K8mh8xF;yP&!C4|%siJjC?zKWd$Xy}I_NlVkF^aH43i$skh1zRqZ z|G+!L51=o7fEn7(loaFghLKys&ZGs(F=}>k|BuftPVq zK;5*wD&riTo{2y^k)|+?S2au+cug`7cXJ8I7?mYgYDvmt2J$#AkR;`~FxFn$Xtb{z zn8u925YbZcK!a>g7@-O>ilTv8%rUtwv$eJ4)~Ofwp_<`dmJGasHw6ywnA_Hp>(or| zs_hZvv^>-CS^~>a89KQ|(hb*%SUQnLMTtbCXn0#7>&s!gr8TQ*n+^MWbECnyw2h#6 z1SXly{>q3JScUZ!WOH!YcC6L*&W6>z9Pnh8-J020H_1)j(5QG@HZ#f&;3b#Z3U+gB zP{K3oRGWaV+CAkFrYBKJqB=X+L$xOhLBj1V*|5AAgzIg|I@M&Td3gwQ-{KF4d}F7S zjbNhlnD!^TC*nXb-8H1wJhQgFV(x}&s249)SI#h&Dl4&Rwb~7jb>T0hv*CGec0VD_msx81B+XKlITNh#?GSq)Tp)oOVwmfT0~(=ZkDT3*xKU9r3^ zx86FKz_k>vHuv+~t}lq$iH_WI9BjgZ z;7K>Cj$<{K8fL3yQJNv?5%yUPHG$*%bQqML1`0m@d?Z9CX@c|ePyZd_+9Sk&;aK1luL<6P5nkCjd6noA@6xIkeuE~V zu?X}q-lxR~04SrvCn38Yul>&He&-_to!MXqIFIx@=LR~@^R*YOTxOgy%|xO20NSs8 zac6w*u>cXqEz_6s$#fU-!62UWi}FbMCC`WWXb{iHi}J|rlRSJk1w7&uV@@)gABu&a zp(^)_e?k8VYW#ljPv|SNg@+jRA34aa&hk=L=KjV|PI-cndobp5%0s-;K}?oaLMF?J zoGLMiC&=7GI;Z9m5ztgwBWS9u=QIh@Ly(r!J0Rsg1Byq=B9QlH5a^z~Kj1W$n8ql+ z!^bR@7+Q8Y8d?!7p`cp>- zi@F#r7={(cB`i}YzLIbes~p9UqBIv6Y8=OKl2$3|B6I(YBh{DfTO^**z*oF31f_xy z&j{~6$E0BtY6sB4D7~f-mWaT*$bKuq4D-@nYnbPXvae*MZ2V10nI7W=(0|l}{Ro;& zCQMu=EW1^2lX--b{U__tz&@d3Ep)y~#T15-EzsHT6@}RcNEhZFVBaat`dozozgHO9 zuxpURZ@aRtvhssgN{Y*Tis1^@c~`imz*UZP-aqH>OWfj9h6sK_z~q71KpkHr_di){ BMo0hv diff --git a/version5/krpc-api/target/classes/com/kama/service/UserService.class b/version5/krpc-api/target/classes/com/kama/service/UserService.class deleted file mode 100644 index b95b247b554fd4f1f796e1ce58b3e1db379a6635..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 257 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 TMjrrRCBK?z0DuG*%D4XkF)NE> diff --git a/version5/krpc-api/target/maven-archiver/pom.properties b/version5/krpc-api/target/maven-archiver/pom.properties deleted file mode 100644 index 243e555..0000000 --- a/version5/krpc-api/target/maven-archiver/pom.properties +++ /dev/null @@ -1,5 +0,0 @@ -#Generated by Maven -#Thu Dec 05 15:18:25 CST 2024 -groupId=com.kama -artifactId=krpc-api -version=1.0-SNAPSHOT diff --git a/version5/krpc-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/version5/krpc-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index bf00c34..0000000 --- a/version5/krpc-api/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,3 +0,0 @@ -com\kama\pojo\User$UserBuilder.class -com\kama\pojo\User.class -com\kama\service\UserService.class diff --git a/version5/krpc-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/version5/krpc-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index f327769..0000000 --- a/version5/krpc-api/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,2 +0,0 @@ -D:\java_stduy\version5\krpc-api\src\main\java\com\kama\pojo\User.java -D:\java_stduy\version5\krpc-api\src\main\java\com\kama\service\UserService.java diff --git a/version5/krpc-common/pom.xml b/version5/krpc-common/pom.xml deleted file mode 100644 index 9434747..0000000 --- a/version5/krpc-common/pom.xml +++ /dev/null @@ -1,32 +0,0 @@ - - - 4.0.0 - - com.kama - version5 - 1.0-SNAPSHOT - - - krpc-common - - - com.kama - krpc-api - 1.0-SNAPSHOT - - - cn.hutool - hutool-all - 5.8.10 - compile - - - - 17 - 17 - UTF-8 - - - \ No newline at end of file diff --git a/version5/krpc-common/src/main/java/common/exception/SerializeException.java b/version5/krpc-common/src/main/java/common/exception/SerializeException.java deleted file mode 100644 index 33a75a5..0000000 --- a/version5/krpc-common/src/main/java/common/exception/SerializeException.java +++ /dev/null @@ -1,17 +0,0 @@ -package common.exception; - -/** - * @ClassName SerializeException - * @Description ToDo - * @Author Tong - * @LastChangeDate 2024-12-02 19:18 - * @Version v1.0 - */ -public class SerializeException extends RuntimeException{ - public SerializeException(String message) { - super(message); - } - public SerializeException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/version5/krpc-common/src/main/java/common/message/MessageType.java b/version5/krpc-common/src/main/java/common/message/MessageType.java deleted file mode 100644 index 51f44c0..0000000 --- a/version5/krpc-common/src/main/java/common/message/MessageType.java +++ /dev/null @@ -1,13 +0,0 @@ -package common.message; - -import lombok.AllArgsConstructor; - -@AllArgsConstructor -public enum MessageType { - REQUEST(0), RESPONSE(1); - private int code; - - public int getCode() { - return code; - } -} diff --git a/version5/krpc-common/src/main/java/common/message/RpcRequest.java b/version5/krpc-common/src/main/java/common/message/RpcRequest.java deleted file mode 100644 index b44a931..0000000 --- a/version5/krpc-common/src/main/java/common/message/RpcRequest.java +++ /dev/null @@ -1,31 +0,0 @@ -package common.message; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @ClassName RpcRequest - * @Description 定义请求消息格式 - * @Author Tong - * @LastChangeDate 2024-11-29 10:12 - * @Version v5.0 - */ - -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class RpcRequest implements Serializable { - //接口名、方法名、参数列表参数类型 - private String interfaceName; - - private String methodName; - - private Object[] params; - - private Class[] paramsType; -} diff --git a/version5/krpc-common/src/main/java/common/message/RpcResponse.java b/version5/krpc-common/src/main/java/common/message/RpcResponse.java deleted file mode 100644 index 3d0fc81..0000000 --- a/version5/krpc-common/src/main/java/common/message/RpcResponse.java +++ /dev/null @@ -1,37 +0,0 @@ -package common.message; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.io.Serializable; - -/** - * @ClassName RpcResponse - * @Description 定义响应消息格式 - * @Author Tong - * @LastChangeDate 2024-11-29 10:14 - * @Version v5.0 - */ -@NoArgsConstructor -@AllArgsConstructor -@Data -@Builder -public class RpcResponse implements Serializable { - //状态信息 - private int code; - private String message; - //更新:加入传输数据的类型,以便在自定义序列化器中解析 - private Class dataType; - //具体数据 - private Object data; - - public static RpcResponse sussess(Object data) { - return RpcResponse.builder().code(200).dataType(data.getClass()).data(data).build(); - } - - public static RpcResponse fail(String msg) { - return RpcResponse.builder().code(500).message(msg).build(); - } -} diff --git a/version5/krpc-common/src/main/java/common/serializer/mycoder/MyDecoder.java b/version5/krpc-common/src/main/java/common/serializer/mycoder/MyDecoder.java deleted file mode 100644 index 16c2d26..0000000 --- a/version5/krpc-common/src/main/java/common/serializer/mycoder/MyDecoder.java +++ /dev/null @@ -1,58 +0,0 @@ -package common.serializer.mycoder; - - -import common.exception.SerializeException; -import common.message.MessageType; -import common.serializer.myserializer.Serializer; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.ByteToMessageDecoder; -import lombok.extern.slf4j.Slf4j; - -import java.util.Arrays; -import java.util.List; - -/** - * @ClassName MyDecoder - * @Description 解码器 - * @Author Tong - * @LastChangeDate 2024-11-29 10:32 - * @Version v5.0 - */ -@Slf4j -public class MyDecoder extends ByteToMessageDecoder { - @Override - protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List out) throws Exception { - //检查可读字节数 - if (in.readableBytes() < 6) { // messageType + serializerType + length - return; - } - //1.读取消息类型 - short messageType = in.readShort(); - // 现在还只支持request与response请求 - if (messageType != MessageType.REQUEST.getCode() && - messageType != MessageType.RESPONSE.getCode()) { - log.warn("暂不支持此种数据, messageType: {}", messageType); - return; - } - //2.读取序列化的方式&类型 - short serializerType = in.readShort(); - Serializer serializer = Serializer.getSerializerByCode(serializerType); - if (serializer == null) { - log.error("不存在对应的序列化器, serializerType: {}", serializerType); - throw new SerializeException("不存在对应的序列化器, serializerType: " + serializerType); - } - //3.读取序列化数组长度 - int length = in.readInt(); - if (in.readableBytes() < length) { - return; // 数据不完整,等待更多数据 - } - //4.读取序列化数组 - byte[] bytes = new byte[length]; - in.readBytes(bytes); - log.debug("Received bytes: {}", Arrays.toString(bytes)); - Object deserialize = serializer.deserialize(bytes, messageType); - - out.add(deserialize); - } -} diff --git a/version5/krpc-common/src/main/java/common/serializer/mycoder/MyEncoder.java b/version5/krpc-common/src/main/java/common/serializer/mycoder/MyEncoder.java deleted file mode 100644 index 862796f..0000000 --- a/version5/krpc-common/src/main/java/common/serializer/mycoder/MyEncoder.java +++ /dev/null @@ -1,50 +0,0 @@ -package common.serializer.mycoder; - - -import common.message.MessageType; -import common.message.RpcRequest; -import common.message.RpcResponse; -import common.serializer.myserializer.Serializer; -import io.netty.buffer.ByteBuf; -import io.netty.channel.ChannelHandlerContext; -import io.netty.handler.codec.MessageToByteEncoder; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; - -/** - * @ClassName MyEncoder - * @Description 编码器 - * @Author Tong - * @LastChangeDate 2024-11-29 10:32 - * @Version v5.0 - */ -@Slf4j -@AllArgsConstructor -public class MyEncoder extends MessageToByteEncoder { - private Serializer serializer; - - @Override - protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { - log.debug("Encoding message of type: {}", msg.getClass()); - //1.写入消息类型 - if (msg instanceof RpcRequest) { - out.writeShort(MessageType.REQUEST.getCode()); - } else if (msg instanceof RpcResponse) { - out.writeShort(MessageType.RESPONSE.getCode()); - } else { - log.error("Unknown message type: {}", msg.getClass()); - throw new IllegalArgumentException("Unknown message type: " + msg.getClass()); - } - //2.写入序列化方式 - out.writeShort(serializer.getType()); - //得到序列化数组 - byte[] serializeBytes = serializer.serialize(msg); - if (serializeBytes == null || serializeBytes.length == 0) { - throw new IllegalArgumentException("Serialized message is empty"); - } - //3.写入长度 - out.writeInt(serializeBytes.length); - //4.写入序列化数组 - out.writeBytes(serializeBytes); - } -} diff --git a/version5/krpc-common/src/main/java/common/serializer/myserializer/HessianSerializer.java b/version5/krpc-common/src/main/java/common/serializer/myserializer/HessianSerializer.java deleted file mode 100644 index c30c14d..0000000 --- a/version5/krpc-common/src/main/java/common/serializer/myserializer/HessianSerializer.java +++ /dev/null @@ -1,52 +0,0 @@ -package common.serializer.myserializer; - -import com.caucho.hessian.io.HessianInput; -import com.caucho.hessian.io.HessianOutput; -import common.exception.SerializeException; - - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; - -/** - * @ClassName HessianSerializer - * @Description Hessian序列化 - * @Author Tong - * @LastChangeDate 2024-11-29 11:49 - * @Version v5.0 - */ -public class HessianSerializer implements Serializer { - @Override - public byte[] serialize(Object obj) { - // 使用 ByteArrayOutputStream 和 HessianOutput 来实现对象的序列化 - try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) { - HessianOutput hessianOutput = new HessianOutput(byteArrayOutputStream); - hessianOutput.writeObject(obj); // 将对象写入输出流 - return byteArrayOutputStream.toByteArray(); // 返回字节数组 - } catch (IOException e) { - throw new SerializeException("Serialization failed"); - } - } - - @Override - public Object deserialize(byte[] bytes, int messageType) { - // 使用 ByteArrayInputStream 和 HessianInput 来实现反序列化 - try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes)) { - HessianInput hessianInput = new HessianInput(byteArrayInputStream); - return hessianInput.readObject(); // 读取并返回对象 - } catch (IOException e) { - throw new SerializeException("Deserialization failed"); - } - } - - @Override - public int getType() { - return 3; - } - - @Override - public String toString() { - return "Hessian"; - } -} \ No newline at end of file diff --git a/version5/krpc-common/src/main/java/common/serializer/myserializer/JsonSerializer.java b/version5/krpc-common/src/main/java/common/serializer/myserializer/JsonSerializer.java deleted file mode 100644 index fab6b97..0000000 --- a/version5/krpc-common/src/main/java/common/serializer/myserializer/JsonSerializer.java +++ /dev/null @@ -1,78 +0,0 @@ -package common.serializer.myserializer; - -import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; -import common.message.RpcRequest; -import common.message.RpcResponse; - - -/** - * @ClassName JsonSerializer - * @Description json序列化 - * @Author Tong - * @LastChangeDate 2024-11-29 10:33 - * @Version v5.0 - */ -public class JsonSerializer implements Serializer { - @Override - public byte[] serialize(Object obj) { - byte[] bytes = JSONObject.toJSONBytes(obj); - return bytes; - } - - @Override - public Object deserialize(byte[] bytes, int messageType) { - Object obj = null; - // 传输的消息分为request与response - switch (messageType){ - case 0: - RpcRequest request = JSON.parseObject(bytes, RpcRequest.class); - Object[] objects = new Object[request.getParams().length]; - // 把json字串转化成对应的对象, fastjson可以读出基本数据类型,不用转化 - // 对转换后的request中的params属性逐个进行类型判断 - for(int i = 0; i < objects.length; i++){ - Class paramsType = request.getParamsType()[i]; - //判断每个对象类型是否和paramsTypes中的一致 - if (!paramsType.isAssignableFrom(request.getParams()[i].getClass())){ - //如果不一致,就行进行类型转换 - objects[i] = JSONObject.toJavaObject((JSONObject) request.getParams()[i],request.getParamsType()[i]); - }else{ - //如果一致就直接赋给objects[i] - objects[i] = request.getParams()[i]; - } - } - request.setParams(objects); - obj = request; - break; - case 1: - RpcResponse response = JSON.parseObject(bytes, RpcResponse.class); - // 如果类型为空,说明返回错误 - if(response.getDataType()==null){ - obj = RpcResponse.fail("类型为空"); - break; - } - Class dataType = response.getDataType(); - //判断转化后的response对象中的data的类型是否正确 - if(!dataType.isAssignableFrom(response.getData().getClass())){ - response.setData(JSONObject.toJavaObject((JSONObject) response.getData(),dataType)); - } - obj = response; - break; - default: - System.out.println("暂时不支持此种消息"); - throw new RuntimeException(); - } - return obj; - } - - //1 代表json序列化方式 - @Override - public int getType() { - return 1; - } - - @Override - public String toString() { - return "Json"; - } -} diff --git a/version5/krpc-common/src/main/java/common/serializer/myserializer/KryoSerializer.java b/version5/krpc-common/src/main/java/common/serializer/myserializer/KryoSerializer.java deleted file mode 100644 index 9c6ae18..0000000 --- a/version5/krpc-common/src/main/java/common/serializer/myserializer/KryoSerializer.java +++ /dev/null @@ -1,81 +0,0 @@ -package common.serializer.myserializer; - -import com.esotericsoftware.kryo.Kryo; -import com.esotericsoftware.kryo.io.Input; -import com.esotericsoftware.kryo.io.Output; - -import com.kama.pojo.User; -import common.exception.SerializeException; - -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; - - -/** - * @ClassName KryoSerializer - * @Description kryo序列化 - * @Author Tong - * @LastChangeDate 2024-11-29 11:29 - * @Version v5.0 - */ - -public class KryoSerializer implements Serializer { - private Kryo kryo; - - public KryoSerializer() { - this.kryo = new Kryo(); - } - - @Override - public byte[] serialize(Object obj) { - if (obj == null) { - throw new IllegalArgumentException("Cannot serialize null object"); - } - - try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - Output output = new Output(byteArrayOutputStream)) { - - kryo.writeObject(output, obj); // 使用 Kryo 写入对象 - return output.toBytes(); // 返回字节数组 - - } catch (Exception e) { - throw new SerializeException("Serialization failed"); - } - } - - @Override - public Object deserialize(byte[] bytes, int messageType) { - if (bytes == null || bytes.length == 0) { - throw new IllegalArgumentException("Cannot deserialize null or empty byte array"); - } - - try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); - Input input = new Input(byteArrayInputStream)) { - - // 根据 messageType 来反序列化不同的类 - Class clazz = getClassForMessageType(messageType); - return kryo.readObject(input, clazz); // 使用 Kryo 反序列化对象 - - } catch (Exception e) { - throw new SerializeException("Deserialization failed"); - } - } - - @Override - public int getType() { - return 2; - } - - private Class getClassForMessageType(int messageType) { - if (messageType == 1) { - return User.class; // 假设我们在此反序列化成 User 类 - } else { - throw new SerializeException("Unknown message type: " + messageType); - } - } - - @Override - public String toString() { - return "Kryo"; - } -} \ No newline at end of file diff --git a/version5/krpc-common/src/main/java/common/serializer/myserializer/ObjectSerializer.java b/version5/krpc-common/src/main/java/common/serializer/myserializer/ObjectSerializer.java deleted file mode 100644 index eaf13c0..0000000 --- a/version5/krpc-common/src/main/java/common/serializer/myserializer/ObjectSerializer.java +++ /dev/null @@ -1,60 +0,0 @@ -package common.serializer.myserializer; - -import java.io.*; - -/** - * @ClassName ObjectSerializer - * @Description JDK序列化方式 - * @Author Tong - * @LastChangeDate 2024-11-29 10:34 - * @Version v5.0 - */ -public class ObjectSerializer implements Serializer { - //利用Java io 对象 -》字节数组 - @Override - public byte[] serialize(Object obj) { - byte[] bytes=null; - ByteArrayOutputStream bos=new ByteArrayOutputStream(); - try { - //是一个对象输出流,用于将 Java 对象序列化为字节流,并将其连接到bos上 - ObjectOutputStream oos = new ObjectOutputStream(bos); - oos.writeObject(obj); - //刷新 ObjectOutputStream,确保所有缓冲区中的数据都被写入到底层流中。 - oos.flush(); - //将bos其内部缓冲区中的数据转换为字节数组 - bytes = bos.toByteArray(); - oos.close(); - bos.close(); - } catch (IOException e) { - e.printStackTrace(); - } - return bytes; - } - - //字节数组 -》对象 - @Override - public Object deserialize(byte[] bytes, int messageType) { - Object obj = null; - ByteArrayInputStream bis = new ByteArrayInputStream(bytes); - try { - ObjectInputStream ois = new ObjectInputStream(bis); - obj = ois.readObject(); - ois.close(); - bis.close(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - return obj; - } - - //0 代表Java 原生序列器 - @Override - public int getType() { - return 0; - } - - @Override - public String toString() { - return "JDK"; - } -} \ No newline at end of file diff --git a/version5/krpc-common/src/main/java/common/serializer/myserializer/ProtostuffSerializer.java b/version5/krpc-common/src/main/java/common/serializer/myserializer/ProtostuffSerializer.java deleted file mode 100644 index dd97db2..0000000 --- a/version5/krpc-common/src/main/java/common/serializer/myserializer/ProtostuffSerializer.java +++ /dev/null @@ -1,83 +0,0 @@ -package common.serializer.myserializer; - - -import com.kama.pojo.User; -import common.exception.SerializeException; -import io.protostuff.LinkedBuffer; -import io.protostuff.ProtostuffIOUtil; -import io.protostuff.Schema; -import io.protostuff.runtime.RuntimeSchema; -/** - * @ClassName ProtostuffSerializer - * @Description protostuff序列化 - * @Author Tong - * @LastChangeDate 2024-11-29 11:55 - * @Version v5.0 - */ -public class ProtostuffSerializer implements Serializer { - - @Override - public byte[] serialize(Object obj) { - // 检查 null 对象 - if (obj == null) { - throw new IllegalArgumentException("Cannot serialize null object"); - } - // 获取对象的 schema - Schema schema = RuntimeSchema.getSchema(obj.getClass()); - - // 使用 LinkedBuffer 来创建缓冲区(默认大小 1024) - LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE); - // 序列化对象为字节数组 - byte[] bytes; - try { - bytes = ProtostuffIOUtil.toByteArray(obj, schema, buffer); - } finally { - buffer.clear(); - } - return bytes; - } - - @Override - public Object deserialize(byte[] bytes, int messageType) { - if (bytes == null || bytes.length == 0) { - throw new IllegalArgumentException("Cannot deserialize null or empty byte array"); - } - - // 根据 messageType 来决定反序列化的类,这里假设 `messageType` 是类的标识符 - Class clazz = getClassForMessageType(messageType); - - // 获取对象的 schema - Schema schema = RuntimeSchema.getSchema(clazz); - - // 创建一个空的对象实例 - Object obj; - try { - obj = clazz.getDeclaredConstructor().newInstance(); - } catch (Exception e) { - throw new SerializeException("Deserialization failed due to reflection issues"); - } - - // 反序列化字节数组为对象 - ProtostuffIOUtil.mergeFrom(bytes, obj, schema); - return obj; - } - - @Override - public int getType() { - return 4; - } - - // 用于根据 messageType 获取对应的类 - private Class getClassForMessageType(int messageType) { - if (messageType == 1) { - return User.class; // 假设我们在此反序列化成 User 类 - } else { - throw new SerializeException("Unknown message type: " + messageType); - } - } - - @Override - public String toString() { - return "Protostuff"; - } -} diff --git a/version5/krpc-common/src/main/java/common/serializer/myserializer/Serializer.java b/version5/krpc-common/src/main/java/common/serializer/myserializer/Serializer.java deleted file mode 100644 index eb4b097..0000000 --- a/version5/krpc-common/src/main/java/common/serializer/myserializer/Serializer.java +++ /dev/null @@ -1,35 +0,0 @@ -package common.serializer.myserializer; - - - - -import java.util.HashMap; -import java.util.Map; - -/** - * @InterfaceName Serializer - * @Description 序列化接口 - * @Author Tong - * @LastChangeDate 2024-11-29 10:33 - * @Version v5.0 - */ -public interface Serializer { - byte[] serialize(Object obj); - - Object deserialize(byte[] bytes, int messageType); - - int getType(); - - // 使用 Map 存储序列化器 - static Serializer getSerializerByCode(int code) { - // 静态映射,保证只初始化一次 - Map serializerMap = new HashMap<>(); - serializerMap.put(0, new ObjectSerializer()); - serializerMap.put(1, new JsonSerializer()); - serializerMap.put(2, new KryoSerializer()); - serializerMap.put(3, new HessianSerializer()); - serializerMap.put(4, new ProtostuffSerializer()); - - return serializerMap.get(code); // 如果不存在,则返回 null - } -} diff --git a/version5/krpc-common/src/main/java/common/spi/SpiLoader.java b/version5/krpc-common/src/main/java/common/spi/SpiLoader.java deleted file mode 100644 index e6a5ab9..0000000 --- a/version5/krpc-common/src/main/java/common/spi/SpiLoader.java +++ /dev/null @@ -1,111 +0,0 @@ -package common.spi; - - -import cn.hutool.core.io.resource.ResourceUtil; -import common.serializer.myserializer.Serializer; -import lombok.extern.slf4j.Slf4j; - -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStreamReader; -import java.net.URL; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @ClassName SpiLoader - * @Description spi实现 - * @Author Tong - * @LastChangeDate 2024-12-05 14:53 - * @Version v5.0 - */ -@Slf4j -public class SpiLoader { - - // 存储已加载的 SPI 实现类的映射 - private static final Map>> loadedSpiMap = new ConcurrentHashMap<>(); - - // 缓存实例,避免重复实例化 - private static final Map instanceCache = new ConcurrentHashMap<>(); - - // SPI 配置文件的路径 - private static final String SPI_CONFIG_DIR = "META-INF/serializer/"; - - /** - * 加载指定接口的 SPI 实现类 - * - * @param serviceInterface 接口类 - */ - public static void loadSpi(Class serviceInterface) { - String interfaceName = serviceInterface.getName(); - - // 如果已经加载过该接口的 SPI 实现,直接返回 - if (loadedSpiMap.containsKey(interfaceName)) { - return; - } - - Map> keyClassMap = new HashMap<>(); - - // 读取配置文件,获取所有实现类 - List resources = ResourceUtil.getResources(SPI_CONFIG_DIR + serviceInterface.getName()); - for (URL resource : resources) { - try (BufferedReader reader = new BufferedReader(new InputStreamReader(resource.openStream()))) { - String line; - while ((line = reader.readLine()) != null) { - if (!line.trim().isEmpty() && !line.startsWith("#")) { - String[] parts = line.split("="); - if (parts.length == 2) { - String key = parts[0].trim(); - String className = parts[1].trim(); - Class implClass = Class.forName(className); - if (serviceInterface.isAssignableFrom(implClass)) { - keyClassMap.put(key, (Class) implClass); - } - } - } - } - } catch (IOException | ClassNotFoundException e) { - log.error("Failed to load SPI resource: " + resource, e); - } - } - - // 将该接口的 SPI 实现类存入缓存 - loadedSpiMap.put(interfaceName, keyClassMap); - } - - /** - * 根据接口和 key 获取 SPI 实现类实例 - * - * @param serviceInterface 接口类 - * @param key 序列化器的 key - * @param 接口类型 - * @return 对应的 SPI 实现类实例 - */ - public static T getInstance(Class serviceInterface, String key) { - String interfaceName = serviceInterface.getName(); - Map> keyClassMap = loadedSpiMap.get(interfaceName); - - if (keyClassMap == null) { - throw new RuntimeException("SPI not loaded for " + interfaceName); - } - - Class implClass = keyClassMap.get(key); - if (implClass == null) { - throw new RuntimeException("No SPI implementation found for key " + key); - } - - // 从缓存中获取实例,如果不存在则创建 - String implClassName = implClass.getName(); - if (!instanceCache.containsKey(implClassName)) { - try { - instanceCache.put(implClassName, implClass.newInstance()); - } catch (InstantiationException | IllegalAccessException e) { - throw new RuntimeException("Failed to instantiate SPI implementation: " + implClassName, e); - } - } - - return (T) instanceCache.get(implClassName); - } -} diff --git a/version5/krpc-common/src/main/java/common/util/ConfigUtil.java b/version5/krpc-common/src/main/java/common/util/ConfigUtil.java deleted file mode 100644 index 8be9a00..0000000 --- a/version5/krpc-common/src/main/java/common/util/ConfigUtil.java +++ /dev/null @@ -1,48 +0,0 @@ -package common.util; - -import cn.hutool.core.util.StrUtil; -import cn.hutool.setting.dialect.Props; -import lombok.extern.slf4j.Slf4j; - -/** - * @ClassName ConfigUtil - * @Description 工具 - * @Author Tong - * @LastChangeDate 2024-12-05 11:12 - * @Version v5.0 - */ -@Slf4j -public class ConfigUtil { - - // 加载配置文件,使用默认环境 - public static T loadConfig(Class targetClass, String prefix) { - return loadConfig(targetClass, prefix, ""); - } - - // 加载配置文件,支持指定环境 - public static T loadConfig(Class targetClass, String prefix, String environment) { - StringBuilder configFileNameBuilder = new StringBuilder("application"); - - if (StrUtil.isNotBlank(environment)) { - configFileNameBuilder.append("-").append(environment); - } - configFileNameBuilder.append(".properties"); - - // 加载配置文件 - Props properties = new Props(configFileNameBuilder.toString()); - - if (properties.isEmpty()) { - log.warn("配置文件 '{}' 为空或加载失败!", configFileNameBuilder.toString()); - } else { - log.info("加载配置文件: '{}'", configFileNameBuilder.toString()); - } - - // 返回转化后的配置对象 - try { - return properties.toBean(targetClass, prefix); - } catch (Exception e) { - log.error("配置转换失败,目标类: {}", targetClass.getName(), e); - throw new RuntimeException("配置加载失败", e); - } - } -} diff --git a/version5/krpc-common/target/classes/common/exception/SerializeException.class b/version5/krpc-common/target/classes/common/exception/SerializeException.class deleted file mode 100644 index a4b8bf64d1b17c1e9ef67c41f9c1cf27c3ed86ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 561 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 K@E&Sl)SPHjX&R zV~7V7WQDmjY7*eo-M|hz_yO)wFyoXd+_P`O;xis|@I&0kEbH921hX7f{mS}X1vBE{ zI37^QPWu%KJP@y-aPSPaW z(?aHto1Ha@Qs+N$@KgMZSuDAg^Do!jvclnZd_OD3XB-qUMLMK9;^Je}3!<5Ea2Ag! zbW*dF^oc@$Q|0K0<%~afFe{s8J=rl7fJYsims&hPfJb#f$@(uGJcfm2OIdG4-91V- zo^Y@z(b*erxFO;7v7IkCcoI)33~srb-ds>AxzW>pM0F*M+)BjyetdKxMVyW@wUSVo zTG%bYMptMr3l|w*yzB>)%U;!Y%l@nGYMH%}TlUv0Zd9vM?oXk`@Y98}LTgwHLz1WP zV7nCTbGy*lND^{z(XV(HYFn#bbtT!jZ!svjZX14A@*x6?$faq zu5-6&!)Khs`^R+VZmGSbFwh(}?-w2V^!EW3LQ^EyQzp1gMcKrDy{HY|sI=@1Q?=aG z6m_O(bbvZ*UE9vHWw-g1{s|p{aN!Er5=wohWt?Y#(i$Sni+fLVoPGl-+ zO^!li8}sK<_Vvn2Eoq23w_INKBX7#apE#vcOpMClo>Ak+bS6ctb6S^Y)CuN$p;Gax zaUFRit1pG2zacFAP2u<+g4&(i!aq3k_BUn56OuS^GQ6l2ehGsThY|16jEtf9$$3NF zaxAZKofC#~FLL-5E>ZI|-)6b4_&o9%R4@Ls1FNuut{oiWV{ivYKZ?D7&Hvfh?p{1Y z*-3mfVh+#ZIgK}^@p=VMeUsqb+Xm?V6i_dok3-JMrNsAYm2mJTpC+F};#@d-6QhOkn;0uh z+{DR3-nfZVg4mHl?28c}O1v~8{o@Qs7(;OmTcIw=kjn#b zZtpqJCm6j!m-K-K+a8Fcy^Zr&YX*>*tY&59+1SeaahuSzN;jeOUegm|L;8ZKf za2pVX64tbHk&y^@**F)i**p|`4 z$<|u9T|7zmHL{(Jvt92;pF3Q}X1hq^YD=g4b~{KtNu>NrOK{XYBh8VyYh#5EVH!8a zzC`94%#IslUm&wI&YpfKex>m6IDh{X9bcv|@NK$iOni+4dE+beUWYT0H+FEYZa!Bu zX);&L=1sB5eucj4=*pY;*1@xu5X7Cdf_ZFHGI{@;!^@PixXR9}QnK(Cjv}OFBjTRp=(6l@ z(QP5)e1`!`q;6Y%ha-uYON;DMes1gBoZ(Zd(G)UUJ29P_`qe^H2A!mapSn6V4-+Iy zm=}7crj425o~aES14uBk0{mm!ZwyUs#xb#ozHB^8W{W CJAF9- diff --git a/version5/krpc-common/target/classes/common/serializer/mycoder/MyDecoder.class b/version5/krpc-common/target/classes/common/serializer/mycoder/MyDecoder.class deleted file mode 100644 index 44eb61ae71ab33ada344dd8f528898eff34d2ff2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3033 zcmb7GYf}?f7=8`}HVLaxG}3rMR8$aTy_G6KTS2U}L6jg=>1|04VPTV{n++Q6%}ZO` zO6|q_bjF!ZXVeeYYG)K^r~TNO{*How!gl(e-6e@!I`+fvo;~Nio#%bt_nbffnfwjF zZd~)D0EH4fGKx^lP^TG6l3P|r8B~)ootsM3i1Db>lCgNV(ZN$GHO}{OF=;XsH)~1F z+QU#-Q`_T*7d{Do86}VzDzcXP(*px!NSJ6z4=^k;xf)aZbuMO7wsN~rUM!;&Weh&C z9vL)D%U+B4P>v-MmdXfV8N>3Zkw_RxCE*04xIuMiMmU4i)pqzuTcn#|Wq4t^ke^IG zFC!=dmEzoLrTqvuD`cz`KD=FRkwcvaBW*rZVzq=S8EdeXVV!F;#Z67swUe~1M8*a~ z>BwYZDb$TPLwVRR<4Q^&*fFGpjd+}!Aup;KYNv0U`D=V^`qI7W3#X^={_yzL*!1O} zrpJD)uX48}w$fB}>U}>pV55W@8MWBNP&%ZJs*0{A;%1F7jyP#3|rABBRHKFUI@RaY2OFWgNvZhLRZ1B2E~Q z3Cd~ChD)9jyn#0*yd~ppyu+|K7e`o2i9%Onu~{h1(C(NY{fJ74$>1QaSIp+|el=><=3!lkUW7>1RyOm(D#TZ2X{Ra%TM{J4NI315n?c9Eevw=*p{Y7BG5X$MZD%huMl z{CaW)9itBUQq^I@7*3Dm9~^F<%R~GrMZuAI#QXB(XL>;1lxw0@)%A#Gaq4_uGi?38 zhXP}e+o=pqyESl1@+B(kIZ({ELkU+HD*s!Q`0Kzy_l8QkVgYnQj9_UDr5mIKi=JCokN*kk*xyi?gl$hy%5a+IJruzioTE_zJ|;V#WI3?Ljt%gYSB^vd8LI?L)KTc| h@L(C4{?t}HkI(4qrPa^r`HHp<3WwoaT*g%d{{^W>Sf>C0 diff --git a/version5/krpc-common/target/classes/common/serializer/mycoder/MyEncoder.class b/version5/krpc-common/target/classes/common/serializer/mycoder/MyEncoder.class deleted file mode 100644 index cbdc4b09db2e596ab663d69dd9d00a9822601e56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2549 zcma)8TXz#x6#h<{c9LNzP-r1gYM@1u(so2qpur2NsZ>)gO)p}-O{b^nw3C@Ia{>() z@v@eWzUfl`fX|{9!L@Mt;)B1*<#L~ybP`JH@*y+l?Ad#tefjox^4C9)p8$9jUnCJj zhl03KE8lFR%Ok}!LV5({+JEh_{1{DlxIDzLG4qC46a3SjYQf+00nvkyxp0BMisJA>z z@Y1U5QOWuO${HH8HDmQ5)d1VY{$xTqknVL~=8+iq0aT82%Q2$3!d8Yb};Lo(83 z=xdF73z&=f1g02{L?J9kjj;SQuT(`{!sQ(eMTwO}fQTtaNa1A-S8#O;CK5GN)}xul z{LVO0F@utVSy|CJs!W8ZRl`}f343z*O??aRu5{XDgiLl`#RA?{a9zWDSfuuDpUg?a z6s}jN%n9-#VeHWA?Up%eFb~LwVLsDDx=Eoq+}0<;_oXmU0+QexqRp%~EuS7IA_0bY zIE8zPmcuXCDofm(HI{6eOX4}xu;&e8MA|omaj|Miq_)LRK$A_vr0_dTvBB`aLnniZ zA5d&_q#CfGPi~E7KDA>q4BZj58l8_V<{5UEgki2v8`U5M1#1M4XfS;RE)j0?xabSR zSf*{3(IK85LDUOMnYduujd@f{Zp}0Kq$Mla9o->g@*raGyz2^Ict&-ai&b~o-_wPg zDsEvzL0!_sZHA#{OqO%gUFUi@)**95p!&9Tgc^#W(-0Q^P|d*H29(AQh3Tx zPHY?X#TNaoS#1$DTud0YT_TF6JMk_JLwhP^4B8Yy*b7LGQxonJrk+W-T^4*Z7G*X8ChUIHHC?C+z)KO^@DuQNy| zax?M>Z^kelPsRU4G8KRFJ$6g0o=br`2{!Te!e}bKiRpzOgLprp=Qz6Q*-y^_^wLE- zh%|;N%X74v#1JvjNpNIwgQR!qZu=5r_=+y9uj$VCm@LnPS;D{)?I>TESOyDL94k}} zDJx@@>T!eaVhd|jr*)FjAEm(q1Ak*kft^H!ByqBH=yx7fdQugsuCc&_I{XmVhEM&1 zoQymM8F^Q5N?#B~U#JyDp~@SIz9;C+xrVP}fj*GziT#TCpTMLm*5ay{Li7UnJ_NlJ U^tDF6JGe(Xl~$kNQ+$rpzak8`T>t<8 diff --git a/version5/krpc-common/target/classes/common/serializer/myserializer/HessianSerializer.class b/version5/krpc-common/target/classes/common/serializer/myserializer/HessianSerializer.class deleted file mode 100644 index e54e9e9af269116266f4e1335bcfbf6d8ec9bc62..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2191 zcmah~Sy$Ue7`qr$CeRu}fGmw$mbRv(4&8*Uf~alz7`Z9^LwV@~ zeZl91bIN;vROuZ_7NW@sFSC5Q-*WGKGy3P>w|@h81U-%r!YY&mB4`u1eW?GYYh}H< zuWjue8bw>6ZON>f_Od`YmEKVi6}aPoOiNokwvE+#T|eGx*tLe8x9f&pi9?kU+XY68 zRz)l7jpBi&9T-PPre4+P^}=1cK5@ixLngl|kW8(&A_oI5rgtRjb^;%vL!kY2-L#EX zb={s%pkxQHqAP)J^bl`bew_kJD!scVOYBP^DH%tKW$VaLF(A-+Nq+mFZoSs`%0?Xh zxRbzL+!MH=mrD6YtyU)iqa@H5%8 z86!jfsogbMu_iF`!Sizbp9%ClHI6(bf{deB6i~gcQSnINJ`0r!w$Mghs~iV59=0W)QCIO;AbpM3C7f;Y z#3~sAx7N+7vDv8X8TD=14FVnOR#7kS=sYm)J)>eDm`4J0>(^v>r!EqU`E^r(U_-g0 zEwWwNc?ZEeBQP#AU3aw@ynF9`H&o!Bf6@H*xN_qJ1i5zms6Y!dYS`L4luBG)7q3

MM-A1MR&ve$C&X#s(RN6={`fw2$sb5Ja#%cmD;K!Lk{-9Ed(clt%7 z9}g@fwQa9ZTYcZyKCZDukyG)K?Y3{&u7R&!P9SPq?)_rYD^2X(IyQRVYSfFybKX%N zNNi@NPjPGJ6rEXxV{cM9*_87ev}ct}QaQz7=A7t} zLdRGW6X#G6#UMuc=#3$TY0kh9Z}Jdr51l#e)HQ(^zw{E_$5%Ot9wG-ZKwLkOy+jUR zo)%g61J=fu8=vC^>x?3U9KImGc|Pi2Vx22i?y-`q4Q!Iv7OhKAE*Oq~lO+`)m9Mr? z(SN~N@l7;1R`r5T#7Lwx3~~DvzUH_>h3+zQ8zZisAzhemVtVrovxQ6(_p^$W;gf76 zbBcvzuSP-@`l;4s(>VE71t4g4M?; zWhcgon;>qSs8OOOuz*QNo@Ex+iJSNadCDK7Jlpt|F%~>|!m?~%o>lDNB}qx!cPNmn z6zZ`QYS>fd71^gfrJ{&9k~p@ORM88%xuU*e*ST8l;(J#s%y5 diff --git a/version5/krpc-common/target/classes/common/serializer/myserializer/JsonSerializer.class b/version5/krpc-common/target/classes/common/serializer/myserializer/JsonSerializer.class deleted file mode 100644 index a9726a38c614041f8cbb1d0707f5191a54544c8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2794 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 diff --git a/version5/krpc-common/target/classes/common/serializer/myserializer/ProtostuffSerializer.class b/version5/krpc-common/target/classes/common/serializer/myserializer/ProtostuffSerializer.class deleted file mode 100644 index 8cf83ad47d3f35ab97aa123e6f2aa99c8aa5e968..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3186 zcmai0TUQfT7~LlqCWI&&6&n=^3KfVLFSROIte_|gc)?38y*MO?Fff@(CleKWzyF1< zKK0F)KG+v@>8if9YxU3c54dXgnHiD^vUIV?IdkT_>~DXUGynYe)Hl|WKp*O+cuwwtX=$IwmVzRX%R)6CkQ;UqMql-CUc+xjLOCTCp7uu8-IHx#t? z6gFYAK%ykwF;lNr1-A6{hors3;Uu5%Lq=dn^Q%e2T9U<4`jSo(Z((N&yUa>xiH_RtsX>cBW*ts+Z)o zlb=fshXmT!oF;J)M^bnPM}2c=WWm%OSsb&is_WDWu1!Bj`et9T7Pjxmd6R9D4=FL1 z$8cQ3i4=w~EYR8TyN)zdY00}2bg5ef;@{WgFvw-tV{oM5J@!JwbiMU7oMHzAq{`KX z%-6}Q3np+{Ab+NwFvO=1KoRjg-HIE!(1QCT`A zIqukHfx*7n(GXj&Ekrd-&I_aoG{2;m^?b!%wDZ@Q_%tWeg%mDgQeb;oUy|gOO?1<6 z7d)1A%jFo@)|}^HY9uf%kZhEUhRXu|Z>X?3HOzNx%q}tu?JRLQT`SK?=bAoe@+3XU zPBw4o9A$hC4rA_uK`cin-{7GEsNsv1(aLE3$;b*^r-j*&Y(v#KbP`byQG0GtVQJ(& zAenQz8qBqhHQgEvE=tUK6N-a*jYLyF3v8Hi^}^DWUh$&TFvqTH9ss^c4aKGsytd%j zcNIGtZn3OGvw(?YX*4xv9k(F4+d=`=>yrevmBXzqCcL4f-@h-gIi%tDI4NvS5ywH0 zrmbs*PY#UGy2cse4-H;zwB0&mlq}t?IYhL*xx73VzE;Au{bEzICft}o39|lX?3z=M z<7^~>%zC*$pz_DtcGR|A&KkWkCEW$PSZ!~?{Ukoe7aG1)9q^SvPb1Zab;n+kdEbxU z6yv%YQ@jCw371bG=o>w+TSZe=dnRprsa6>dQ4s(Roir&bYSs}C&%+>zVHN@tW4!ui z3|9^(@D16#ZY^2%T`L>pGwag!P*w<}CM-)j9=)=v;d_DJR{~xy4h=u@W_rCSE8Y(p z-Mn%l5V*wA(!!PBI{dxDr#x4|H9qhN;ty^jxEcrnn=!+E$``;jT<4R(4cz3fQvMfF z8UluLe`CW_Xt&a>kI?o!w}Oq2k)GNd!DH;0&g~z3jNL=A!4>q}e1Hu@ac`H2KhMM- z(qAWfF-R+e1f$ldhhP9n?mG~}c5K8B?mGF`P1(H|Ko2GN^6Kj0RnzOC93hfkB=7-l zQHPiUylVF$W{J3i(jVbt&toS(!Kd_ejQ_sIZR&I(y747;Bc>szA)-Oo_&p#r6kecJ zgQSspl>FcYh4~4`QJwn>iQKba0|xpO0|UEOFfh%q(+oTMCl0RQFqg;*-W`fRK>JY3 zQ;gh7zyAoM&vTi0CiWO(nfOCm?oyXBPBH|Q2A_lhv@(BNNKXcbDRGQ4LzFs>qd0+6 z{ER)vTS=wrDhW79Tq@u=-zKpD!%NYHIvp3hfK|>fU=d5CBZEUQQKnuO{V0lJwAvO} zu_&oZz?ZTqb(<&Mh_$x9q(a=|N|L05$bQs~Rzs9$G NN^#f%mc@k@<+9?X7cZh+Km!881}i_pLK>svPTkX!&k;J?UkHX z{Ab~1>VD5J*-&-;&97?^GTT6L5sM`bBFmqKqlhdliQfFLkDK#>*< z53%9SCCIcB#U>unZ}6DbzaSt)bN>SD;}?V*#qd{%7f6tiJjYxZABuvDqzJj`BQq|t zOvs9lL|i08$eNFcE|Mi=-AB@doa1%~Kal%OoMCLyxCW8NG<`xVG-gQaDyoF;A&VB) j@q~6$o<=;yGqPrJg6G(#3|^2W(d;2FX~j?`EQHD*^SWh_ diff --git a/version5/krpc-common/target/classes/common/spi/SpiLoader.class b/version5/krpc-common/target/classes/common/spi/SpiLoader.class deleted file mode 100644 index f8829d46f18ea29ea6471440faa28517c171a97d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5133 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 lpYmN#^?ydnU&-fhrH2 diff --git a/version5/krpc-common/target/classes/common/util/ConfigUtil.class b/version5/krpc-common/target/classes/common/util/ConfigUtil.class deleted file mode 100644 index 7fb59017dc3665e25b24aa0326bc52ab7a038efb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2372 zcmbtV-A@!(6#rdVoMjzAmJda-0%Bp8kD=C9Ws$aQ)zYr`!H0!@=rCNC!P%L0b`~^- zhdwkmO?@>neKAd&rb%P8Z2+OP@BKRz=u`gz)AZb(k-Zh#J~W$|z4y%d_?_Q5_uSw9 zT=@mSDa=Puf>H$`6=m4PuxD1E(=|)C)7tsTS#Ed?yZTJq^!gb}+hb#4gc%T_-);q} ziV9RR)EiDFGc7IY*wbcul$Hz;%h9KN0mEQ>s^~mv>A74&5)6B;X{UFP#3Usj zQbNHVhP_2+zU@HXw5GTlMwDTQvE%ZU)87oz7&vn}w=RlvBNXRJ?+tw6~lz zLp0^MX)R|>ADh)uPCCt9LV1iK{`;qQHr5`j-@W~0b+M`K) z`bnSk_zKF16-$A$K_c6)TAY*{UW%CF>$Ca zQ_cT9`pAsy%hgX75oTs}4BjCSUqR$6G zZIgBRw0T2BC{h^kPh&CV$YF10pNFoOv%hPieFwtem?ocTTKm4k^lgTACOsvXEySqw zW3Uqhco)eRR#7z`tzJUSQ0Fr0@1e3Q+PH|9I_bIG6>SlJt7skXTExpsi1&sXLW}6Q zhuR;YMPC)t$9Sz2-=bOw629P6DH=lYjzzrru(wRe&%_t;PD9yaoC{$U7ssQ+4P{Fh z{gvQerj)PXZGs~RI!e%ieZ=m5RO0{|aS(^;66`?>PS9!)N5~>hx*bGZC$7`AbCoRm zDH)x#ufd`!P+D8GECjR&S%wHIA>TRJaEQ_#oI{p;ge200r6A3vrv{;CXjD-344n#E pE6yqe)MqnCe0y8vZZ6c4su+zd - - 4.0.0 - - com.kama - version5 - 1.0-SNAPSHOT - - - krpc-consumer - - - 17 - 17 - UTF-8 - - - - org.springframework.boot - spring-boot-starter-web - RELEASE - compile - - - com.kama - krpc-api - 1.0-SNAPSHOT - compile - - - com.kama - krpc-common - 1.0-SNAPSHOT - - - com.kama - krpc-core - 1.0-SNAPSHOT - - - cn.hutool - hutool-all - 5.8.10 - - - - \ No newline at end of file diff --git a/version5/krpc-consumer/src/main/java/com/kama/consumer/ConsumerTest.java b/version5/krpc-consumer/src/main/java/com/kama/consumer/ConsumerTest.java deleted file mode 100644 index c04606a..0000000 --- a/version5/krpc-consumer/src/main/java/com/kama/consumer/ConsumerTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.kama.consumer; - -import com.kama.client.proxy.ClientProxy; -import com.kama.pojo.User; - -import com.kama.service.UserService; -import lombok.extern.slf4j.Slf4j; - -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; - -/** - * @ClassName ConsumerExample - * @Description 客户端测试 - * @Author Tong - * @LastChangeDate 2024-12-05 16:20 - * @Version v5.0 - */ -@Slf4j -public class ConsumerTest { - - private static final int THREAD_POOL_SIZE = 20; - private static final ExecutorService executorService = Executors.newFixedThreadPool(THREAD_POOL_SIZE); - - public static void main(String[] args) throws InterruptedException { - ClientProxy clientProxy = new ClientProxy(); - UserService proxy = clientProxy.getProxy(UserService.class); - for (int i = 0; i < 120; i++) { - final Integer i1 = i; - if (i % 30 == 0) { - // Simulate delay for every 30 requests - Thread.sleep(10000); - } - - // Submit tasks to executor service (thread pool) - executorService.submit(() -> { - try { - User user = proxy.getUserByUserId(i1); - if (user != null) { - log.info("从服务端得到的user={}", user); - } else { - log.warn("获取的 user 为 null, userId={}", i1); - } - - Integer id = proxy.insertUserId(User.builder() - .id(i1) - .userName("User" + i1) - .gender(true) - .build()); - - if (id != null) { - log.info("向服务端插入user的id={}", id); - } else { - log.warn("插入失败,返回的id为null, userId={}", i1); - } - } catch (Exception e) { - log.error("调用服务时发生异常,userId={}", i1, e); - } - }); - } - - // Gracefully shutdown the executor service - executorService.shutdown(); - } - -} diff --git a/version5/krpc-consumer/src/main/java/com/kama/consumer/ConsumerTestConfig.java b/version5/krpc-consumer/src/main/java/com/kama/consumer/ConsumerTestConfig.java deleted file mode 100644 index b816281..0000000 --- a/version5/krpc-consumer/src/main/java/com/kama/consumer/ConsumerTestConfig.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.kama.consumer; - - -import com.kama.config.KRpcConfig; -import common.util.ConfigUtil; - -/** - * @ClassName ConsumerTestConfig - * @Description 测试配置顶 - * @Author Tong - * @LastChangeDate 2024-12-05 11:29 - * @Version v1.0 - */ -public class ConsumerTestConfig { - public static void main(String[] args) { - KRpcConfig rpc = ConfigUtil.loadConfig(KRpcConfig.class, "rpc"); - System.out.println(rpc); - } - -} diff --git a/version5/krpc-consumer/src/main/resources/application.properties b/version5/krpc-consumer/src/main/resources/application.properties deleted file mode 100644 index e784008..0000000 --- a/version5/krpc-consumer/src/main/resources/application.properties +++ /dev/null @@ -1,7 +0,0 @@ -rpc.name=krpc -rpc.version=1.0.0 -rpc.port=9999 -rpc.serializer=Hessian -rpc.host=localhost -rpc.registry=zookeeper -rpc.loadBalance=ConsistencyHash \ No newline at end of file diff --git a/version5/krpc-consumer/target/classes/application.properties b/version5/krpc-consumer/target/classes/application.properties deleted file mode 100644 index e784008..0000000 --- a/version5/krpc-consumer/target/classes/application.properties +++ /dev/null @@ -1,7 +0,0 @@ -rpc.name=krpc -rpc.version=1.0.0 -rpc.port=9999 -rpc.serializer=Hessian -rpc.host=localhost -rpc.registry=zookeeper -rpc.loadBalance=ConsistencyHash \ No newline at end of file diff --git a/version5/krpc-consumer/target/classes/com/kama/consumer/ConsumerTest.class b/version5/krpc-consumer/target/classes/com/kama/consumer/ConsumerTest.class deleted file mode 100644 index 03a4c00146356bb53eb0e9797fa1d705f3071b52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3941 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 diff --git a/version5/krpc-consumer/target/krpc-consumer-1.0-SNAPSHOT.jar b/version5/krpc-consumer/target/krpc-consumer-1.0-SNAPSHOT.jar deleted file mode 100644 index a2d7d283404a8cdefc8fe76221d6ec2b3b83ea01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3110 zcmb7G2|Scr8y{mCF-eRu)=Nc<*_shIu1ZCi8K$u%bu*2zWH8@wiRO}BO=Yd5uCiwh zxw;A^HxXm#wn7{q>#qci!dqKF|OB&w0-IKM#c{DJ2IIHd=U` z+n1NQ+cMxuwsNvW+uB=WDRXABAP>Ndr;$3r1b#;W9k$qvY-w+6ZRO~MAzM$9+uKM) zG^T4g5smC<=U<}Y?h>93vQc&&Ehr*-i!5Xy&m|phbbZZ%+Ou4$GLh;S{2Q_irYWzK zMxd&2l-sD2u%qwV-$KJ`&)N}!?5{424Gn1Ko)}? z?8^u;LfYJKBes)&=V6dGLxW(Ya7K~U&C?&kYT^NgGK$&JpK_Gki8_Z^Tt_ZmIS5}u zQjJ!M0q)fX<`^1^r63aA?9Q z{u+NLozigoeM0g>J4jU}Ecv{Wqm+^r!-E~YEdI}OO^Cpqq$3jn+9XFiW8;}P#wxrT z`o8x`>)yT}&Vi0syrF~BwAKAd*|rs9o6q?qQ&Xf=yCk{mEhm%Z%afMrUp=^b1v>i8 zPOrw*JRe;0DlERhzPUgBmQ#=+N02ez89;{zNm&%7>il4YNj0}3Orh@46>W=RvWYHc z$D)x(k6n4z2a8D`3Y#fNRomb5pill)2Hnv3U{^?mc^2%5wPA@3G~(GtOS(>=S|g`L z+8kSzSY+f*>|Dkm{k78haWkVTdo;|xLV5afErVxZs!>EUs?8i-yui zgcq6Lh54gty__arZ#e77$(o=}6F=LBkkdn-YYewqUW=8G4uc_(n^JZdFw0^#E6Q{@eV9Fy z_Ne$e-Q9ks?997^Q-mOvH1bp)?S1~%nN84w8l-54x@&;frY&#^I}2M4VmHiGt{H}o7) ziOR`IfN3R{-@F5_N8-=;RO(r#_P-u2Y(1_82~e*-^+A6kg_Fe5cfGnQsm7y}!d6e( zp}t+G_IB)Ua)05iGXwaBoYgtUJ}!T3rHy`L{IhxCT7)W7UTGaqpq`93`oxM%xR!l4 zRL$ydY&t2#rJCXFoc+?zK#*EM|HL-kD^QRo##SG0`}k8DBHW;3`(%C!;f$( zy5C7RLK+pi^NOx*s}h8LuK1%qa?OFB+(Yj*t#9#6ttVrReA~dJ$SqC12Fo|fO?i0L z>+$z;HKA3-#+ok#=8a9KO^vh&My#zT$OR=#Xxz#CmP-ZWrR%hpH%#IkXj3IWDs97e z>JUbsH8h)iDwLn<7=98}YSQqogeL8Do7qV*-tYgFM4n+?x5@R z`ZN4;)l0dOmvL?NKR!aGJpI`1dt+-(uWR^?3o#MdvpYbi!wk zS^fm!#r^BCgCEp5*iJq5Lhp4JiLuu_?@s%@U9>5L*&b<()d>YQLkQ4~|F2CU%6^U^ z4m={-4rNQ;VN>ihMn(~N{ex76Rs(02E!hQ!bH*9}j<2r9<0vczg&jCN4*zV>4tpDm z9wSwfJNWn7?Ayr$gLWunD~U+LNXU7qs;qgXKRm2*YN!A{&OVV3SMeSi?pA-P_Cn_G z4Kh*(1qowp2_SDufMJr~E?j`w08J6}#!~oPIFur{r3)FMv9RSutp)B2Zi~tq5rX*P z6c!t^O*rsP;B~h2_+F~Ra~^XVFz>c>F)}w2Kve-a*GrcsBC<=@7b1*E0AryF`ewE9 zHQv{$PK37&NPc2?Unf2hocLM_wRE;Af@Ws$(u<-oudMUyBknBJR*~~wapy%!`)w4V z){0P0{0qw0$~%v_wD!)U=0$aXH|CrYi&ktlpkJS05%dT|Y{eEP{ZG0=XwiA55T$_> R0RlmR%MA$PWm)0Z{{ZksFq8lQ diff --git a/version5/krpc-consumer/target/maven-archiver/pom.properties b/version5/krpc-consumer/target/maven-archiver/pom.properties deleted file mode 100644 index 96d4f06..0000000 --- a/version5/krpc-consumer/target/maven-archiver/pom.properties +++ /dev/null @@ -1,5 +0,0 @@ -#Generated by Maven -#Thu Dec 05 15:19:00 CST 2024 -groupId=com.kama -artifactId=krpc-consumer -version=1.0-SNAPSHOT diff --git a/version5/krpc-consumer/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/version5/krpc-consumer/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index e3ec4a4..0000000 --- a/version5/krpc-consumer/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,2 +0,0 @@ -com\kama\ConsumerTestConfig.class -com\kama\ConsumerApplication.class diff --git a/version5/krpc-consumer/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/version5/krpc-consumer/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 08a64ca..0000000 --- a/version5/krpc-consumer/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,2 +0,0 @@ -D:\java_stduy\version5\krpc-consumer\src\main\java\com\kama\ConsumerTestConfig.java -D:\java_stduy\version5\krpc-consumer\src\main\java\com\kama\ConsumerApplication.java diff --git a/version5/krpc-core/pom.xml b/version5/krpc-core/pom.xml deleted file mode 100644 index f0a7710..0000000 --- a/version5/krpc-core/pom.xml +++ /dev/null @@ -1,114 +0,0 @@ - - - 4.0.0 - - com.kama - version5 - 1.0-SNAPSHOT - - - krpc-core - - - 17 - 17 - UTF-8 - - - - com.kama - krpc-common - 1.0-SNAPSHOT - - - org.projectlombok - lombok - 1.18.30 - compile - - - io.netty - netty-all - 4.1.51.Final - compile - - - - org.apache.curator - curator-recipes - 5.1.0 - - - com.alibaba - fastjson - 1.2.83 - - - com.esotericsoftware - kryo - 4.0.2 - - - com.caucho - hessian - 4.0.66 - - - io.protostuff - protostuff-core - 1.7.4 - - - io.protostuff - protostuff-runtime - 1.7.4 - - - com.github.rholder - guava-retrying - 2.0.0 - - - org.jetbrains - annotations - 17.0.0 - compile - - - com.kama - krpc-api - 1.0-SNAPSHOT - - - cn.hutool - hutool-all - 5.8.10 - - - - org.junit.jupiter - junit-jupiter-api - 5.11.3 - test - - - org.junit.jupiter - junit-jupiter-engine - 5.11.3 - test - - - - org.junit.platform - junit-platform-launcher - 1.11.3 - test - - - junit - junit - - - \ No newline at end of file diff --git a/version5/krpc-core/src/main/java/com/kama/KRpcApplication.java b/version5/krpc-core/src/main/java/com/kama/KRpcApplication.java deleted file mode 100644 index 9529f74..0000000 --- a/version5/krpc-core/src/main/java/com/kama/KRpcApplication.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.kama; - - -import com.kama.config.KRpcConfig; -import com.kama.config.RpcConstant; -import common.util.ConfigUtil; -import lombok.extern.slf4j.Slf4j; - -/** - * @ClassName RpcApplication - * @Description 测试配置顶,学习更多参考Dubbo - * @Author Tong - * @LastChangeDate 2024-12-05 11:22 - * @Version v5.0 - */ -@Slf4j -public class KRpcApplication { - private static volatile KRpcConfig rpcConfigInstance; - - public static void initialize(KRpcConfig customRpcConfig) { - rpcConfigInstance = customRpcConfig; - log.info("RPC 框架初始化,配置 = {}", customRpcConfig); - } - - public static void initialize() { - KRpcConfig customRpcConfig; - try { - customRpcConfig = ConfigUtil.loadConfig(KRpcConfig.class, RpcConstant.CONFIG_FILE_PREFIX); - log.info("成功加载配置文件,配置文件名称 = {}", RpcConstant.CONFIG_FILE_PREFIX); // 添加成功加载的日志 - } catch (Exception e) { - // 配置加载失败,使用默认配置 - customRpcConfig = new KRpcConfig(); - log.warn("配置加载失败,使用默认配置"); - } - initialize(customRpcConfig); - } - - public static KRpcConfig getRpcConfig() { - if (rpcConfigInstance == null) { - synchronized (KRpcApplication.class) { - if (rpcConfigInstance == null) { - initialize(); // 确保在第一次调用时初始化 - } - } - } - return rpcConfigInstance; - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/client/cache/ServiceCache.java b/version5/krpc-core/src/main/java/com/kama/client/cache/ServiceCache.java deleted file mode 100644 index 8eba240..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/cache/ServiceCache.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.kama.client.cache; - -import lombok.extern.slf4j.Slf4j; - -import java.util.ArrayList; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @ClassName serviceCache - * @Description 建立本地缓存 - * @Author Tong - * @LastChangeDate 2024-12-02 10:34 - * @Version v5.0 - */ -@Slf4j -public class ServiceCache { - //key: serviceName 服务名 - //value: addressList 服务提供者列表 - private static Map> cache = new ConcurrentHashMap<>(); - - //添加服务 - public void addServiceToCache(String serviceName, String address) { - if (cache.containsKey(serviceName)) { - List addressList = cache.get(serviceName); - addressList.add(address); - log.info("有服务名情况,将name为{}和地址为{}的服务添加到本地缓存中", serviceName, address); - } else { - List addressList = new ArrayList<>(); - addressList.add(address); - cache.put(serviceName, addressList); - log.info("无服务名情况,将name为{}和地址为{}的服务添加到本地缓存中", serviceName, address); - } - } - - //修改服务地址 - public void replaceServiceAddress(String serviceName, String oldAddress, String newAddress) { - if (cache.containsKey(serviceName)) { - List addressList = cache.get(serviceName); - addressList.remove(oldAddress); - addressList.add(newAddress); - log.info("将服务{}的地址{}替换为{}", serviceName, oldAddress, newAddress); - } else { - log.error("旧地址{}不在服务{}的地址列表中", oldAddress, serviceName); - } - } - - //从缓存中取服务地址列表 - public List getServiceListFromCache(String serviceName) { - if (!cache.containsKey(serviceName)) { - log.warn("服务{}未找到", serviceName); - //返回个不可修改的空列表,避免调用的时候出现空指针异常 - return Collections.emptyList(); - } - return cache.get(serviceName); - } - - //从缓存中删除服务地址 - public void delete(String serviceName, String address) { - List addressList = cache.get(serviceName); - if (addressList != null && addressList.contains(address)) { - addressList.remove(address); - log.info("将name为{}和地址为{}的服务从本地缓存中删除", serviceName, address); - if (addressList.isEmpty()) { - cache.remove(serviceName); // 移除该服务的缓存条目 - log.info("服务{}的地址列表为空,已从缓存中清除", serviceName); - } - } else { - log.warn("删除失败,地址{}不在服务{}的地址列表中", address, serviceName); - } - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/client/circuitbreaker/CircuitBreaker.java b/version5/krpc-core/src/main/java/com/kama/client/circuitbreaker/CircuitBreaker.java deleted file mode 100644 index 53a6489..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/circuitbreaker/CircuitBreaker.java +++ /dev/null @@ -1,109 +0,0 @@ -package com.kama.client.circuitbreaker; - -import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @ClassName CircuitBreaker - * @Description 熔断器的状态 - * @Author Tong - * @LastChangeDate 2024-12-02 10:45 - * @Version v5.0 - */ -@Slf4j -public class CircuitBreaker { - //当前状态 - private CircuitBreakerState state = CircuitBreakerState.CLOSED; - private AtomicInteger failureCount = new AtomicInteger(0); - private AtomicInteger successCount = new AtomicInteger(0); - private AtomicInteger requestCount = new AtomicInteger(0); - //失败次数阈值 - private final int failureThreshold; - //半开启-》关闭状态的成功次数比例 - private final double halfOpenSuccessRate; - //恢复时间 - private final long retryTimePeriod; - //上一次失败时间 - private long lastFailureTime = 0; - - public CircuitBreaker(int failureThreshold, double halfOpenSuccessRate, long retryTimePeriod) { - this.failureThreshold = failureThreshold; - this.halfOpenSuccessRate = halfOpenSuccessRate; - this.retryTimePeriod = retryTimePeriod; - } - - //查看当前熔断器是否允许请求通过 - public synchronized boolean allowRequest() { - long currentTime = System.currentTimeMillis(); - log.info("熔断前检查, 当前失败次数:{}", failureCount); - switch (state) { - case OPEN: - if (currentTime - lastFailureTime > retryTimePeriod) { - state = CircuitBreakerState.HALF_OPEN; - resetCounts(); - log.info("熔断已解除,进入半开启状态,允许请求通过"); - return true; - } - log.warn("熔断生效中,拒绝请求!"); - return false; - case HALF_OPEN: - requestCount.incrementAndGet(); - log.info("当前为半开启状态,计数请求"); - return true; - case CLOSED: - default: - log.info("当前为正常状态,允许请求通过"); - return true; - } - } - - //记录成功 - public synchronized void recordSuccess() { - if (state == CircuitBreakerState.HALF_OPEN) { - successCount.incrementAndGet(); - if (successCount.get() >= halfOpenSuccessRate * requestCount.get()) { - state = CircuitBreakerState.CLOSED; - resetCounts(); - log.info("成功次数已达到阈值,熔断器切换至关闭状态"); - } - } else { - resetCounts(); - log.info("熔断器处于关闭状态,重置计数器"); - } - } - - //记录失败 - public synchronized void recordFailure() { - failureCount.incrementAndGet(); - log.error("记录失败,当前失败次数:{}", failureCount); - lastFailureTime = System.currentTimeMillis(); - - if (state == CircuitBreakerState.HALF_OPEN) { - state = CircuitBreakerState.OPEN; - lastFailureTime = System.currentTimeMillis(); - log.warn("半开启状态下发生失败,熔断器切换至开启状态"); - } else if (failureCount.get() >= failureThreshold) { - state = CircuitBreakerState.OPEN; - log.error("失败次数已超过阈值,熔断器切换至开启状态"); - } - } - - //重置次数 - private void resetCounts() { - failureCount.set(0); - successCount.set(0); - requestCount.set(0); - } - - public CircuitBreakerState getState() { - return state; - } -} - -enum CircuitBreakerState { - //关闭,开启,半开启 - CLOSED, OPEN, HALF_OPEN -} diff --git a/version5/krpc-core/src/main/java/com/kama/client/circuitbreaker/CircuitBreakerProvider.java b/version5/krpc-core/src/main/java/com/kama/client/circuitbreaker/CircuitBreakerProvider.java deleted file mode 100644 index f94bf5c..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/circuitbreaker/CircuitBreakerProvider.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.kama.client.circuitbreaker; - -import lombok.extern.slf4j.Slf4j; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @ClassName CircuitBreakerState - * @Description 提供熔断器 - * @Author Tong - * @LastChangeDate 2024-12-02 10:47 - * @Version v5.0 - */ -@Slf4j -public class CircuitBreakerProvider { - // 使用线程安全的 ConcurrentHashMap - private Map circuitBreakerMap = new ConcurrentHashMap<>(); - - public synchronized CircuitBreaker getCircuitBreaker(String serviceName) { - // 使用 computeIfAbsent,避免手动同步 - return circuitBreakerMap.computeIfAbsent(serviceName, key -> { - log.info("服务 [{}] 不存在熔断器,创建新的熔断器实例", serviceName); - // 创建并返回新熔断器 - return new CircuitBreaker(1, 0.5, 10000); - }); - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/client/netty/NettyClientHandler.java b/version5/krpc-core/src/main/java/com/kama/client/netty/NettyClientHandler.java deleted file mode 100644 index 15c98ff..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/netty/NettyClientHandler.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.kama.client.netty; - -import common.message.RpcResponse; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import io.netty.util.AttributeKey; -import lombok.extern.slf4j.Slf4j; - -/** - * @ClassName NettyClientHandler - * @Description 客户端处理器 - * @Author Tong - * @LastChangeDate 2024-12-02 10:15 - * @Version v5.0 - */ -@Slf4j -public class NettyClientHandler extends SimpleChannelInboundHandler { - - - @Override - protected void channelRead0(ChannelHandlerContext ctx, RpcResponse response) throws Exception { - // 接收到response, 给channel设计别名,让sendRequest里读取response - AttributeKey RESPONSE_KEY = AttributeKey.valueOf("RPCResponse"); - // 将响应存入 Channel 属性 - ctx.channel().attr(RESPONSE_KEY).set(response); - ctx.channel().close(); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - log.error("Channel exception occurred", cause); - ctx.close(); - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/client/netty/NettyClientInitializer.java b/version5/krpc-core/src/main/java/com/kama/client/netty/NettyClientInitializer.java deleted file mode 100644 index 3836d7e..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/netty/NettyClientInitializer.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.kama.client.netty; - - -import common.serializer.mycoder.MyDecoder; -import common.serializer.mycoder.MyEncoder; -import common.serializer.myserializer.Serializer; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.socket.SocketChannel; -import lombok.extern.slf4j.Slf4j; - -/** - * @ClassName NettyClientInitializer - * @Description 配置自定义的编码器以及Handler - * @Author Tong - * @LastChangeDate 2024-12-02 10:16 - * @Version v5.0 - */ -@Slf4j -public class NettyClientInitializer extends ChannelInitializer { - - - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ChannelPipeline pipeline = ch.pipeline(); - - // 使用自定义的编码器和解码器 - try { - // 根据传入的序列化器类型初始化编码器 - pipeline.addLast(new MyEncoder(Serializer.getSerializerByCode(3))); - pipeline.addLast(new MyDecoder()); - pipeline.addLast(new NettyClientHandler()); - - log.info("Netty client pipeline initialized with serializer type: {}",Serializer.getSerializerByCode(3).toString()); - } catch (Exception e) { - log.error("Error initializing Netty client pipeline", e); - throw e; // 重新抛出异常,确保管道初始化失败时处理正确 - } - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/client/proxy/ClientProxy.java b/version5/krpc-core/src/main/java/com/kama/client/proxy/ClientProxy.java deleted file mode 100644 index ef3f6e8..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/proxy/ClientProxy.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.kama.client.proxy; - -import com.kama.client.circuitbreaker.CircuitBreaker; -import com.kama.client.circuitbreaker.CircuitBreakerProvider; -import com.kama.client.retry.GuavaRetry; -import com.kama.client.rpcclient.RpcClient; -import com.kama.client.rpcclient.impl.NettyRpcClient; -import com.kama.client.servicecenter.ServiceCenter; -import com.kama.client.servicecenter.ZKServiceCenter; - - -import common.message.RpcRequest; -import common.message.RpcResponse; -import lombok.extern.slf4j.Slf4j; - -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; - -/** - * @ClassName ClientProxy - * @Description 动态代理 - * @Author Tong - * @LastChangeDate 2024-12-02 10:14 - * @Version v5.0 - */ -@Slf4j -public class ClientProxy implements InvocationHandler { - //传入参数service接口的class对象,反射封装成一个request - - private RpcClient rpcClient; - private ServiceCenter serviceCenter; - private CircuitBreakerProvider circuitBreakerProvider; - - public ClientProxy() throws InterruptedException { - serviceCenter = new ZKServiceCenter(); - rpcClient = new NettyRpcClient(serviceCenter); - circuitBreakerProvider = new CircuitBreakerProvider(); - } - - //jdk动态代理,每一次代理对象调用方法,都会经过此方法增强(反射获取request对象,socket发送到服务端) - @Override - public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { - //构建request - RpcRequest request = RpcRequest.builder() - .interfaceName(method.getDeclaringClass().getName()) - .methodName(method.getName()) - .params(args).paramsType(method.getParameterTypes()).build(); - //获取熔断器 - CircuitBreaker circuitBreaker = circuitBreakerProvider.getCircuitBreaker(method.getName()); - //判断熔断器是否允许请求经过 - if (!circuitBreaker.allowRequest()) { - log.warn("熔断器开启,请求被拒绝: {}", request); - //这里可以针对熔断做特殊处理,返回特殊值 - return null; - } - //数据传输 - RpcResponse response; - //后续添加逻辑:为保持幂等性,只对白名单上的服务进行重试 - // 如果启用重试机制,先检查是否需要重试 - if (serviceCenter.checkRetry(request.getInterfaceName())) { - //调用retry框架进行重试操作 - try { - log.info("尝试重试调用服务: {}", request.getInterfaceName()); - response = new GuavaRetry().sendServiceWithRetry(request, rpcClient); - } catch (Exception e) { - log.error("重试调用失败: {}", request.getInterfaceName(), e); - circuitBreaker.recordFailure(); - throw e; // 将异常抛给调用者 - } - } else { - //只调用一次 - response = rpcClient.sendRequest(request); - } - //记录response的状态,上报给熔断器 - if (response != null) { - if (response.getCode() == 200) { - circuitBreaker.recordSuccess(); - } else if (response.getCode() == 500) { - circuitBreaker.recordFailure(); - } - log.info("收到响应: {} 状态码: {}", request.getInterfaceName(), response.getCode()); - } - - return response != null ? response.getData() : null; - } - - public T getProxy(Class clazz) { - Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this); - return (T) o; - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/client/retry/GuavaRetry.java b/version5/krpc-core/src/main/java/com/kama/client/retry/GuavaRetry.java deleted file mode 100644 index 0d1dde1..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/retry/GuavaRetry.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.kama.client.retry; - -import com.kama.client.rpcclient.RpcClient; -import com.github.rholder.retry.*; - -import common.message.RpcRequest; -import common.message.RpcResponse; -import lombok.extern.slf4j.Slf4j; - - -import java.util.Objects; -import java.util.concurrent.TimeUnit; - -/** - * @ClassName guavaRetry - * @Description 重试策略 - * @Author Tong - * @LastChangeDate 2024-12-02 10:44 - * @Version v5.0 - */ -@Slf4j -public class GuavaRetry { - - public RpcResponse sendServiceWithRetry(RpcRequest request, RpcClient rpcClient) { - Retryer retryer = RetryerBuilder.newBuilder() - //无论出现什么异常,都进行重试 - .retryIfException() - //返回结果为 error时进行重试 - .retryIfResult(response -> Objects.equals(response.getCode(), 500)) - //重试等待策略:等待 2s 后再进行重试 - .withWaitStrategy(WaitStrategies.fixedWait(2, TimeUnit.SECONDS)) - //重试停止策略:重试达到 3 次 - .withStopStrategy(StopStrategies.stopAfterAttempt(3)) - .withRetryListener(new RetryListener() { - @Override - public void onRetry(Attempt attempt) { - log.info("重试第 {} 次", attempt.getAttemptNumber()); - } - }) - .build(); - try { - return retryer.call(() -> rpcClient.sendRequest(request)); - } catch (Exception e) { - log.error("重试失败: 请求 {} 执行时遇到异常", request.getMethodName(), e); - } - return RpcResponse.fail("重试失败,所有重试尝试已结束"); - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/client/rpcclient/RpcClient.java b/version5/krpc-core/src/main/java/com/kama/client/rpcclient/RpcClient.java deleted file mode 100644 index 80a4255..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/rpcclient/RpcClient.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.kama.client.rpcclient; - - -import common.message.RpcRequest; -import common.message.RpcResponse; - -/** - * @InterfaceName RpcClient - * @Description 定义底层通信方法 - * @Author Tong - * @LastChangeDate 2024-12-02 10:11 - * @Version v5.0 - */ - -public interface RpcClient { - RpcResponse sendRequest(RpcRequest request); -} diff --git a/version5/krpc-core/src/main/java/com/kama/client/rpcclient/impl/NettyRpcClient.java b/version5/krpc-core/src/main/java/com/kama/client/rpcclient/impl/NettyRpcClient.java deleted file mode 100644 index 7bd2e75..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/rpcclient/impl/NettyRpcClient.java +++ /dev/null @@ -1,103 +0,0 @@ -package com.kama.client.rpcclient.impl; - -import com.kama.client.netty.NettyClientInitializer; -import com.kama.client.rpcclient.RpcClient; -import com.kama.client.servicecenter.ServiceCenter; - -import common.message.RpcRequest; -import common.message.RpcResponse; -import io.netty.bootstrap.Bootstrap; -import io.netty.channel.Channel; -import io.netty.channel.ChannelFuture; -import io.netty.channel.EventLoopGroup; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioSocketChannel; -import io.netty.util.AttributeKey; -import lombok.extern.slf4j.Slf4j; - - -import java.net.InetSocketAddress; - -/** - * @ClassName NettyRpcClient - * @Description Netty客户端 - * @Author Tong - * @LastChangeDate 2024-12-02 11:03 - * @Version v5.0 - */ -@Slf4j -public class NettyRpcClient implements RpcClient { - - private static final Bootstrap bootstrap; - private static final EventLoopGroup eventLoopGroup; - - private ServiceCenter serviceCenter; - - public NettyRpcClient(ServiceCenter serviceCenter) throws InterruptedException { - this.serviceCenter = serviceCenter; - } - - //netty客户端初始化 - static { - eventLoopGroup = new NioEventLoopGroup(); - bootstrap = new Bootstrap(); - bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) - .handler(new NettyClientInitializer()); - } - - @Override - public RpcResponse sendRequest(RpcRequest request) { - //从注册中心获取host,post - InetSocketAddress address = serviceCenter.serviceDiscovery(request.getInterfaceName()); - if (address == null) { - log.error("服务发现失败,返回的地址为 null"); - return RpcResponse.fail("服务发现失败,地址为 null"); - } - String host = address.getHostName(); - int port = address.getPort(); - try { - // 连接到远程服务 - ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); - Channel channel = channelFuture.channel(); - // 发送数据 - channel.writeAndFlush(request); - //sync()堵塞获取结果 - channel.closeFuture().sync(); - // 阻塞的获得结果,通过给channel设计别名,获取特定名字下的channel中的内容(这个在hanlder中设置) - // AttributeKey是,线程隔离的,不会由线程安全问题。 - // 当前场景下选择堵塞获取结果 - // 其它场景也可以选择添加监听器的方式来异步获取结果 channelFuture.addListener... - AttributeKey key = AttributeKey.valueOf("RPCResponse"); - RpcResponse response = channel.attr(key).get(); - - if (response == null) { - log.error("服务响应为空,可能是请求失败或超时"); - return RpcResponse.fail("服务响应为空"); - } - - log.info("收到响应: {}", response); - return response; - } catch (InterruptedException e) { - log.error("请求被中断,发送请求失败: {}", e.getMessage(), e); - Thread.currentThread().interrupt(); - } catch (Exception e) { - log.error("发送请求时发生异常: {}", e.getMessage(), e); - } finally { - // 连接断开后,优雅地关闭 Netty 资源 - shutdown(); - } - return RpcResponse.fail("请求失败"); - } - - // 优雅关闭 Netty 资源 - private void shutdown() { - try { - if (eventLoopGroup != null) { - eventLoopGroup.shutdownGracefully().sync(); - } - } catch (InterruptedException e) { - log.error("关闭 Netty 资源时发生异常: {}", e.getMessage(), e); - Thread.currentThread().interrupt(); - } - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/client/rpcclient/impl/SimpleSocketRpcClient.java b/version5/krpc-core/src/main/java/com/kama/client/rpcclient/impl/SimpleSocketRpcClient.java deleted file mode 100644 index 589cc98..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/rpcclient/impl/SimpleSocketRpcClient.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.kama.client.rpcclient.impl; - -import com.kama.client.rpcclient.RpcClient; -import common.message.RpcRequest; -import common.message.RpcResponse; - - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.net.Socket; -import java.net.UnknownHostException; - -/** - * @ClassName SimpleSocketRpcClient - * @Description 实现简单客户都 - * @Author Tong - * @LastChangeDate 2024-12-02 10:12 - * @Version v5.0 - */ -public class SimpleSocketRpcClient implements RpcClient { - private String host; - private int port; - - public SimpleSocketRpcClient(String host, int port) { - this.host = host; - this.port = port; - } - - @Override - public RpcResponse sendRequest(RpcRequest request) { - // 定义响应对象 - RpcResponse response = null; - - // 创建 Socket 和流对象 - try (Socket socket = new Socket(host, port); - ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) { - - // 发送请求对象 - oos.writeObject(request); - oos.flush(); - - // 接收响应对象 - response = (RpcResponse) ois.readObject(); - - } catch (UnknownHostException e) { - System.err.println("未知的主机: " + host); - } catch (IOException e) { - System.err.println("I/O 错误: " + e.getMessage()); - } catch (ClassNotFoundException e) { - System.err.println("无法识别的类: " + e.getMessage()); - } - - return response; - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/client/servicecenter/ServiceCenter.java b/version5/krpc-core/src/main/java/com/kama/client/servicecenter/ServiceCenter.java deleted file mode 100644 index f1aa801..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/servicecenter/ServiceCenter.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.kama.client.servicecenter; - - -import java.net.InetSocketAddress; - -/** - * @InterfaceName ServiceCenter - * @Description 服务中心接口 - * @Author Tong - * @LastChangeDate 2024-12-02 10:31 - * @Version v5.0 - */ - -public interface ServiceCenter { - // 查询:根据服务名查找地址 - InetSocketAddress serviceDiscovery(String serviceName); - - //判断是否可重试 - boolean checkRetry(String serviceName); -} diff --git a/version5/krpc-core/src/main/java/com/kama/client/servicecenter/ZKServiceCenter.java b/version5/krpc-core/src/main/java/com/kama/client/servicecenter/ZKServiceCenter.java deleted file mode 100644 index 93f2701..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/servicecenter/ZKServiceCenter.java +++ /dev/null @@ -1,113 +0,0 @@ -package com.kama.client.servicecenter; - -import com.kama.client.cache.ServiceCache; -import com.kama.client.servicecenter.ZKWatcher.watchZK; -import com.kama.client.servicecenter.balance.LoadBalance; -import com.kama.client.servicecenter.balance.impl.ConsistencyHashBalance; -import com.kama.client.servicecenter.balance.impl.RandomLoadBalance; -import lombok.extern.slf4j.Slf4j; -import org.apache.curator.RetryPolicy; -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.retry.ExponentialBackoffRetry; - -import java.net.InetSocketAddress; -import java.util.List; -import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; - -/** - * @ClassName ZKServiceCenter - * @Description 从服务中心获取服务地址 - * @Author Tong - * @LastChangeDate 2024-12-02 10:33 - * @Version v5.0 - */ -@Slf4j -public class ZKServiceCenter implements ServiceCenter { - // curator 提供的zookeeper客户端 - private CuratorFramework client; - //zookeeper根路径节点 - private static final String ROOT_PATH = "MyRPC"; - private static final String RETRY = "CanRetry"; - //serviceCache - private ServiceCache cache; - - private final LoadBalance loadBalance = new ConsistencyHashBalance(); - - //负责zookeeper客户端的初始化,并与zookeeper服务端进行连接 - public ZKServiceCenter() throws InterruptedException { - // 指数时间重试 - RetryPolicy policy = new ExponentialBackoffRetry(1000, 3); - // zookeeper的地址固定,不管是服务提供者还是,消费者都要与之建立连接 - // sessionTimeoutMs 与 zoo.cfg中的tickTime 有关系, - // zk还会根据minSessionTimeout与maxSessionTimeout两个参数重新调整最后的超时值。默认分别为tickTime 的2倍和20倍 - // 使用心跳监听状态 - this.client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181") - .sessionTimeoutMs(40000).retryPolicy(policy).namespace(ROOT_PATH).build(); - this.client.start(); - log.info("Zookeeper 连接成功"); - //初始化本地缓存 - cache = new ServiceCache(); - //加入zookeeper事件监听器 - watchZK watcher = new watchZK(client, cache); - //监听启动 - watcher.watchToUpdate(ROOT_PATH); - } - - //根据服务名(接口名)返回地址 - @Override - public InetSocketAddress serviceDiscovery(String serviceName) { - try { - //先从本地缓存中找 - List addressList = cache.getServiceListFromCache(serviceName); - //如果找不到,再去zookeeper中找 - //这种i情况基本不会发生,或者说只会出现在初始化阶段 - if (addressList == null) { - addressList = client.getChildren().forPath("/" + serviceName); - // 如果本地缓存中没有该服务名的地址列表,则添加 - List cachedAddresses = cache.getServiceListFromCache(serviceName); - if (cachedAddresses == null || cachedAddresses.isEmpty()) { - // 假设 addServiceToCache 方法可以处理单个地址 - for (String address : addressList) { - cache.addServiceToCache(serviceName, address); - } - } - } - if (addressList.isEmpty()) { - log.warn("未找到服务:{}", serviceName); - return null; - } - // 负载均衡得到地址 - String address = loadBalance.balance(addressList); - return parseAddress(address); - } catch (Exception e) { - log.error("服务发现失败,服务名:{}", serviceName, e); - } - return null; - } - //保证线程安全使用CopyOnWriteArraySet - private Set retryServiceCache = new CopyOnWriteArraySet<>(); - //写一个白名单缓存,优化性能 - public boolean checkRetry(String serviceName) { - // 如果缓存为空,则从 Zookeeper 中加载白名单 - if (retryServiceCache.isEmpty()) { - try { - // 获取 Zookeeper 上的 /RETRY 路径下的所有子节点(服务名称) - List serviceList = client.getChildren().forPath("/" + RETRY); - // 将从 Zookeeper 获取到的服务名称列表添加到缓存中 - retryServiceCache.addAll(serviceList); - } catch (Exception e) { - log.error("检查重试失败,服务名:{}", serviceName, e); - } - } - // 判断服务是否在缓存的白名单中 - return retryServiceCache.contains(serviceName); - } - - // 字符串解析为地址 - private InetSocketAddress parseAddress(String address) { - String[] result = address.split(":"); - return new InetSocketAddress(result[0], Integer.parseInt(result[1])); - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/client/servicecenter/ZKWatcher/watchZK.java b/version5/krpc-core/src/main/java/com/kama/client/servicecenter/ZKWatcher/watchZK.java deleted file mode 100644 index 396d4e8..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/servicecenter/ZKWatcher/watchZK.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.kama.client.servicecenter.ZKWatcher; - -import com.kama.client.cache.ServiceCache; -import lombok.extern.slf4j.Slf4j; -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.recipes.cache.ChildData; -import org.apache.curator.framework.recipes.cache.CuratorCache; -import org.apache.curator.framework.recipes.cache.CuratorCacheListener; - - -/** - * @ClassName watchZK - * @Description 节点监听 - * @Author Tong - * @LastChangeDate 2024-12-02 10:37 - * @Version v5.0 - */ -@Slf4j -public class watchZK { - // curator 提供的zookeeper客户端 - private CuratorFramework client; - //本地缓存 - ServiceCache cache; - - - public watchZK(CuratorFramework client, ServiceCache cache) { - this.client = client; - this.cache = cache; - } - - /** - * 监听当前节点和子节点的 更新,创建,删除 - * - * @param path - */ - public void watchToUpdate(String path) throws InterruptedException { - CuratorCache curatorCache = CuratorCache.build(client, "/"); - curatorCache.listenable().addListener(new CuratorCacheListener() { - @Override - public void event(Type type, ChildData childData, ChildData childData1) { - // 第一个参数:事件类型(枚举) - // 第二个参数:节点更新前的状态、数据 - // 第三个参数:节点更新后的状态、数据 - // 创建节点时:节点刚被创建,不存在 更新前节点 ,所以第二个参数为 null - // 删除节点时:节点被删除,不存在 更新后节点 ,所以第三个参数为 null - // 节点创建时没有赋予值 create /curator/app1 只创建节点,在这种情况下,更新前节点的 data 为 null,获取不到更新前节点的数据 - switch (type.name()) { - case "NODE_CREATED": // 监听器第一次执行时节点存在也会触发次事件 - String[] pathList = pasrePath(childData1); - if (pathList.length <= 2) break; - else { - String serviceName = pathList[1]; - String address = pathList[2]; - //将新注册的服务加入到本地缓存中 - cache.addServiceToCache(serviceName, address); - log.info("节点创建:服务名称 {} 地址 {}", serviceName, address); - } - break; - case "NODE_CHANGED": // 节点更新 - if (childData.getData() != null) { - log.debug("修改前的数据: {}", new String(childData.getData())); - } else { - log.debug("节点第一次赋值!"); - } - String[] oldPathList = pasrePath(childData); - String[] newPathList = pasrePath(childData1); - cache.replaceServiceAddress(oldPathList[1], oldPathList[2], newPathList[2]); - log.info("节点更新:服务名称 {} 地址从 {} 更新为 {}", oldPathList[1], oldPathList[2], newPathList[2]); - break; - case "NODE_DELETED": // 节点删除 - String[] pathList_d = pasrePath(childData); - if (pathList_d.length <= 2) break; - else { - String serviceName = pathList_d[1]; - String address = pathList_d[2]; - //将新注册的服务加入到本地缓存中 - cache.delete(serviceName, address); - log.info("节点删除:服务名称 {} 地址 {}", serviceName, address); - } - break; - default: - break; - } - } - }); - //开启监听 - curatorCache.start(); - } - - //解析节点对应地址 - public String[] pasrePath(ChildData childData) { - //获取更新的节点的路径 - String path = new String(childData.getPath()); - log.info("节点路径:{}",path); - //按照格式 ,读取 - return path.split("/"); - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/client/servicecenter/balance/LoadBalance.java b/version5/krpc-core/src/main/java/com/kama/client/servicecenter/balance/LoadBalance.java deleted file mode 100644 index 1f1742c..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/servicecenter/balance/LoadBalance.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.kama.client.servicecenter.balance; - - -import java.util.List; - -/** - * @InterfaceName LoadBalance - * @Description 负载均衡接口 - * @Author Tong - * @LastChangeDate 2024-12-02 10:40 - * @Version v5.0 - */ - -public interface LoadBalance { - String balance(List addressList); - - void addNode(String node); - - void delNode(String node); -} diff --git a/version5/krpc-core/src/main/java/com/kama/client/servicecenter/balance/impl/ConsistencyHashBalance.java b/version5/krpc-core/src/main/java/com/kama/client/servicecenter/balance/impl/ConsistencyHashBalance.java deleted file mode 100644 index 119b9ea..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/servicecenter/balance/impl/ConsistencyHashBalance.java +++ /dev/null @@ -1,152 +0,0 @@ -package com.kama.client.servicecenter.balance.impl; - -import com.kama.client.servicecenter.balance.LoadBalance; -import lombok.extern.slf4j.Slf4j; - - -import java.util.*; -import java.util.concurrent.ConcurrentSkipListMap; -import java.util.concurrent.CopyOnWriteArrayList; - -/** - * @ClassName ConsistencyHashBalance - * @Description 一致性哈希算法负载均衡 - * @Author Tong - * @LastChangeDate 2024-12-02 10:42 - * @Version v5.0 - */ -@Slf4j -public class ConsistencyHashBalance implements LoadBalance { - - // 虚拟节点的个数 - private static final int VIRTUAL_NUM = 5; - - // 虚拟节点分配,key是hash值,value是虚拟节点服务器名称 - private SortedMap shards = new TreeMap(); - - // 真实节点列表 - private List realNodes = new LinkedList<>(); - - // 获取虚拟节点的个数 - public static int getVirtualNum() { - return VIRTUAL_NUM; - } - - // 初始化虚拟节点 - public void init(List serviceList) { - for (String server : serviceList) { - realNodes.add(server); - log.info("真实节点[{}] 被添加", server); - for (int i = 0; i < VIRTUAL_NUM; i++) { - String virtualNode = server + "&&VN" + i; - int hash = getHash(virtualNode); - shards.put(hash, virtualNode); - log.info("虚拟节点[{}] hash:{},被添加", virtualNode, hash); - } - } - } - - /** - * 获取被分配的节点名 - * - * @param node 请求的节点(通常是请求的唯一标识符) - * @return 负责该请求的真实节点名称 - */ - public String getServer(String node, List serviceList) { - if (shards.isEmpty()) { - init(serviceList); // 初始化,如果shards为空 - } - - int hash = getHash(node); - Integer key = null; - - SortedMap subMap = shards.tailMap(hash); - if (subMap.isEmpty()) { - key = shards.firstKey(); // 如果没有大于该hash的节点,则返回最小的hash值 - } else { - key = subMap.firstKey(); - } - - String virtualNode = shards.get(key); - return virtualNode.substring(0, virtualNode.indexOf("&&")); - } - - /** - * 添加节点 - * - * @param node 新加入的节点 - */ - public void addNode(String node) { - if (!realNodes.contains(node)) { - realNodes.add(node); - log.info("真实节点[{}] 上线添加", node); - for (int i = 0; i < VIRTUAL_NUM; i++) { - String virtualNode = node + "&&VN" + i; - int hash = getHash(virtualNode); - shards.put(hash, virtualNode); - log.info("虚拟节点[{}] hash:{},被添加", virtualNode, hash); - } - } - } - - /** - * 删除节点 - * - * @param node 被移除的节点 - */ - public void delNode(String node) { - if (realNodes.contains(node)) { - realNodes.remove(node); - log.info("真实节点[{}] 下线移除", node); - for (int i = 0; i < VIRTUAL_NUM; i++) { - String virtualNode = node + "&&VN" + i; - int hash = getHash(virtualNode); - shards.remove(hash); - log.info("虚拟节点[{}] hash:{},被移除", virtualNode, hash); - } - } - } - - /** - * FNV1_32_HASH算法 - */ - private static int getHash(String str) { - final int p = 16777619; - int hash = (int) 2166136261L; - for (int i = 0; i < str.length(); i++) - hash = (hash ^ str.charAt(i)) * p; - hash += hash << 13; - hash ^= hash >> 7; - hash += hash << 3; - hash ^= hash >> 17; - hash += hash << 5; - // 如果算出来的值为负数则取其绝对值 - if (hash < 0) - hash = Math.abs(hash); - return hash; - } - - @Override - public String balance(List addressList) { - // 如果 addressList 为空或 null,抛出 IllegalArgumentException - if (addressList == null || addressList.isEmpty()) { - throw new IllegalArgumentException("Address list cannot be null or empty"); - } - - // 使用UUID作为请求的唯一标识符来进行一致性哈希 - String random = UUID.randomUUID().toString(); - return getServer(random, addressList); - } - public SortedMap getShards() { - return shards; - } - - public List getRealNodes() { - return realNodes; - } - @Override - public String toString() { - return "ConsistencyHash"; - } -} - diff --git a/version5/krpc-core/src/main/java/com/kama/client/servicecenter/balance/impl/RandomLoadBalance.java b/version5/krpc-core/src/main/java/com/kama/client/servicecenter/balance/impl/RandomLoadBalance.java deleted file mode 100644 index 583030d..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/servicecenter/balance/impl/RandomLoadBalance.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.kama.client.servicecenter.balance.impl; - -import com.kama.client.servicecenter.balance.LoadBalance; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; -import java.util.Random; -import java.util.concurrent.CopyOnWriteArrayList; - -/** - * @ClassName RandomLoadBalance - * @Description 随机法 - * @Author Tong - * @LastChangeDate 2024-12-02 10:40 - * @Version v5.0 - */ -@Slf4j -public class RandomLoadBalance implements LoadBalance { - // 将Random声明为类级别的字段 - private final Random random = new Random(); - - private final List addressList = new CopyOnWriteArrayList<>(); - - @Override - public String balance(List addressList) { - if (addressList == null || addressList.isEmpty()) { - throw new IllegalArgumentException("Address list cannot be null or empty"); - } - - int choose = random.nextInt(addressList.size()); - log.info("负载均衡选择了第 {} 号服务器,地址是:{}", choose, addressList.get(choose)); - return addressList.get(choose); // 返回选择的服务器地址 - } - - @Override - public void addNode(String node) { - // 如果是动态添加节点,可以将节点加入到addressList中 - addressList.add(node); - log.info("节点 {} 已加入负载均衡", node); - } - - @Override - public void delNode(String node) { - // 如果是动态删除节点,可以将节点从addressList中移除 - addressList.remove(node); - log.info("节点 {} 已从负载均衡中移除", node); - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/client/servicecenter/balance/impl/RoundLoadBalance.java b/version5/krpc-core/src/main/java/com/kama/client/servicecenter/balance/impl/RoundLoadBalance.java deleted file mode 100644 index 15398a9..0000000 --- a/version5/krpc-core/src/main/java/com/kama/client/servicecenter/balance/impl/RoundLoadBalance.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.kama.client.servicecenter.balance.impl; - -import com.kama.client.servicecenter.balance.LoadBalance; -import lombok.extern.slf4j.Slf4j; - -import java.util.List; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.atomic.AtomicInteger; - -/** - * @ClassName RoundLoadBalance - * @Description 轮询法 - * @Author Tong - * @LastChangeDate 2024-12-02 10:41 - * @Version v5.0 - */ -@Slf4j -public class RoundLoadBalance implements LoadBalance { - - // 使用 AtomicInteger 保证线程安全 - private AtomicInteger choose = new AtomicInteger(0); - - private List addressList = new CopyOnWriteArrayList<>(); - - @Override - public String balance(List addressList) { - if (addressList == null || addressList.isEmpty()) { - throw new IllegalArgumentException("Address list cannot be null or empty"); - } - - // 获取当前索引并更新为下一个 - int currentChoose = choose.getAndUpdate(i -> (i + 1) % addressList.size()); - - String selectedServer = addressList.get(currentChoose); - log.info("负载均衡选择了服务器: {}", selectedServer); - return selectedServer; // 返回被选择的服务器地址 - } - - @Override - public void addNode(String node) { - // 如果是动态添加节点,可以将节点加入到 addressList 中 - addressList.add(node); - log.info("节点 {} 已加入负载均衡", node); - } - - @Override - public void delNode(String node) { - // 如果是动态删除节点,可以将节点从 addressList 中移除 - addressList.remove(node); - log.info("节点 {} 已从负载均衡中移除", node); - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/config/KRpcConfig.java b/version5/krpc-core/src/main/java/com/kama/config/KRpcConfig.java deleted file mode 100644 index 1c53401..0000000 --- a/version5/krpc-core/src/main/java/com/kama/config/KRpcConfig.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.kama.config; - -import com.kama.client.servicecenter.balance.impl.ConsistencyHashBalance; -import com.kama.server.serviceRegister.impl.ZKServiceRegister; -import common.serializer.myserializer.Serializer; -import lombok.*; - -/** - * @ClassName KRpcConfig - * @Description 配置文件 - * @Author Tong - * @LastChangeDate 2024-12-05 11:02 - * @Version v5.0 - */ -@AllArgsConstructor -@NoArgsConstructor -@Getter -@Setter -@Builder -@ToString -public class KRpcConfig { - //名称 - private String name = "krpc"; - //端口 - private Integer port = 9999; - //主机名 - private String host = "localhost"; - //版本号 - private String version = "1.0.0"; - //注册中心 - private String registry = new ZKServiceRegister().toString(); - //序列化器 - private String serializer = Serializer.getSerializerByCode(3).toString(); - //负载均衡 - private String loadBalance = new ConsistencyHashBalance().toString(); - -} diff --git a/version5/krpc-core/src/main/java/com/kama/config/RpcConstant.java b/version5/krpc-core/src/main/java/com/kama/config/RpcConstant.java deleted file mode 100644 index 6bda0b6..0000000 --- a/version5/krpc-core/src/main/java/com/kama/config/RpcConstant.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.kama.config; - - -/** - * @InterfaceName RpcConstants - * @Description - * @Author Tong - * @LastChangeDate 2024-12-05 11:17 - * @Version v5.0 - */ - -public interface RpcConstant { - - //默认的配置文件前缀 - String CONFIG_FILE_PREFIX = "rpc"; - - //默认的服务版本号 - String DEFAULT_VERSION_DEFAULT = "1.0.0"; - -} \ No newline at end of file diff --git a/version5/krpc-core/src/main/java/com/kama/server/netty/NettyRpcServerHandler.java b/version5/krpc-core/src/main/java/com/kama/server/netty/NettyRpcServerHandler.java deleted file mode 100644 index 0601b82..0000000 --- a/version5/krpc-core/src/main/java/com/kama/server/netty/NettyRpcServerHandler.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.kama.server.netty; - - -import common.message.RpcRequest; -import common.message.RpcResponse; -import io.netty.channel.ChannelFutureListener; -import io.netty.channel.ChannelHandlerContext; -import io.netty.channel.SimpleChannelInboundHandler; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import com.kama.server.provider.ServiceProvider; -import com.kama.server.ratelimit.RateLimit; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; - -/** - * @ClassName NettyRpcServerHandler - * @Description 服务端处理器 - * @Author Tong - * @LastChangeDate 2024-12-02 10:26 - * @Version v5.0 - */ -@AllArgsConstructor // 使用 Lombok 自动生成构造器 -@Slf4j -public class NettyRpcServerHandler extends SimpleChannelInboundHandler { - - private final ServiceProvider serviceProvider; // 确保通过构造器注入 ServiceProvider - - @Override - protected void channelRead0(ChannelHandlerContext ctx, RpcRequest request) throws Exception { - if (request == null) { - log.error("接收到非法请求,RpcRequest 为空"); - return; - } - RpcResponse response = getResponse(request); - ctx.writeAndFlush(response).addListener(ChannelFutureListener.CLOSE); - } - - @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { - log.error("处理请求时发生异常: ", cause); - ctx.close(); - } - - private RpcResponse getResponse(RpcRequest rpcRequest) { - //得到服务名 - String interfaceName = rpcRequest.getInterfaceName(); - - //接口限流降级 - RateLimit rateLimit = serviceProvider.getRateLimitProvider().getRateLimit(interfaceName); - if (!rateLimit.getToken()) { - //如果获取令牌失败,进行限流降级,快速返回结果 - log.warn("服务限流,接口: {}", interfaceName); - return RpcResponse.fail("服务限流,接口 " + interfaceName + " 当前无法处理请求。请稍后再试。"); - } - - //得到服务端相应服务实现类 - Object service = serviceProvider.getService(interfaceName); - //反射调用方法 - Method method; - try { - method = service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); - Object invoke = method.invoke(service, rpcRequest.getParams()); - return RpcResponse.sussess(invoke); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - log.error("方法执行错误,接口: {}, 方法: {}", interfaceName, rpcRequest.getMethodName(), e); - return RpcResponse.fail("方法执行错误"); - } - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/server/netty/NettyServerInitializer.java b/version5/krpc-core/src/main/java/com/kama/server/netty/NettyServerInitializer.java deleted file mode 100644 index 91c8f44..0000000 --- a/version5/krpc-core/src/main/java/com/kama/server/netty/NettyServerInitializer.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.kama.server.netty; - - -import common.serializer.mycoder.MyDecoder; -import common.serializer.mycoder.MyEncoder; -import common.serializer.myserializer.Serializer; -import io.netty.channel.ChannelInitializer; -import io.netty.channel.ChannelPipeline; -import io.netty.channel.socket.SocketChannel; -import lombok.AllArgsConstructor; -import com.kama.server.provider.ServiceProvider; - - -/** - * @ClassName NettyServerInitializer - * @Description 服务端初始化器 - * @Author Tong - * @LastChangeDate 2024-12-02 10:55 - * @Version v5.0 - */ -@AllArgsConstructor -public class NettyServerInitializer extends ChannelInitializer { - private ServiceProvider serviceProvider; - - @Override - protected void initChannel(SocketChannel ch) throws Exception { - ChannelPipeline pipeline = ch.pipeline(); - //使用自定义的编/解码器 - pipeline.addLast(new MyEncoder(Serializer.getSerializerByCode(3))); - pipeline.addLast(new MyDecoder()); - pipeline.addLast(new NettyRpcServerHandler(serviceProvider)); - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/server/provider/ServiceProvider.java b/version5/krpc-core/src/main/java/com/kama/server/provider/ServiceProvider.java deleted file mode 100644 index 4bbde28..0000000 --- a/version5/krpc-core/src/main/java/com/kama/server/provider/ServiceProvider.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.kama.server.provider; - - -import com.kama.server.ratelimit.provider.RateLimitProvider; - -import com.kama.server.serviceRegister.ServiceRegister; -import com.kama.server.serviceRegister.impl.ZKServiceRegister; - - -import java.net.InetSocketAddress; -import java.util.HashMap; -import java.util.Map; - - -/** - * @ClassName ServiceProvider - * @Description 本地注册中心 - * @Author Tong - * @LastChangeDate 2024-12-02 10:21 - * @Version v5.0 - */ -public class ServiceProvider { - private Map interfaceProvider; - - private int port; - private String host; - //注册服务类 - private ServiceRegister serviceRegister; - //限流器 - private RateLimitProvider rateLimitProvider; - - public ServiceProvider(String host, int port) { - //需要传入服务端自身的网络地址 - this.host = host; - this.port = port; - this.interfaceProvider = new HashMap<>(); - this.serviceRegister = new ZKServiceRegister(); - this.rateLimitProvider = new RateLimitProvider(); - } - - public void provideServiceInterface(Object service, boolean canRetry) { - String serviceName = service.getClass().getName(); - Class[] interfaceName = service.getClass().getInterfaces(); - - for (Class clazz : interfaceName) { - //本机的映射表 - interfaceProvider.put(clazz.getName(), service); - //在注册中心注册服务 - serviceRegister.register(clazz.getName(), new InetSocketAddress(host, port), canRetry); - } - } - - public Object getService(String interfaceName) { - return interfaceProvider.get(interfaceName); - } - - public RateLimitProvider getRateLimitProvider() { - return rateLimitProvider; - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/server/ratelimit/RateLimit.java b/version5/krpc-core/src/main/java/com/kama/server/ratelimit/RateLimit.java deleted file mode 100644 index 02a9998..0000000 --- a/version5/krpc-core/src/main/java/com/kama/server/ratelimit/RateLimit.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.kama.server.ratelimit; - - -/** - * @InterfaceName RateLimit - * @Description 限流接口 - * @Author Tong - * @LastChangeDate 2024-12-02 10:50 - * @Version v5.0 - */ - -public interface RateLimit { - //获取访问许可 - boolean getToken(); -} diff --git a/version5/krpc-core/src/main/java/com/kama/server/ratelimit/impl/TokenBucketRateLimitImpl.java b/version5/krpc-core/src/main/java/com/kama/server/ratelimit/impl/TokenBucketRateLimitImpl.java deleted file mode 100644 index df379d7..0000000 --- a/version5/krpc-core/src/main/java/com/kama/server/ratelimit/impl/TokenBucketRateLimitImpl.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.kama.server.ratelimit.impl; - -import com.kama.server.ratelimit.RateLimit; -import lombok.extern.slf4j.Slf4j; - - -/** - * @ClassName TokenBucketRateLimitImpl - * @Description 全局限流 - * @Author Tong - * @LastChangeDate 2024-12-02 10:53 - * @Version v5.0 - */ - -@Slf4j -public class TokenBucketRateLimitImpl implements RateLimit { - - // 令牌产生速率(单位:ms) - private final int rate; - // 桶容量 - private final int capacity; - // 当前桶容量 - private volatile int curCapacity; - // 上次请求时间戳 - private volatile long lastTimestamp; - - public TokenBucketRateLimitImpl(int rate, int capacity) { - this.rate = rate; - this.capacity = capacity; - this.curCapacity = capacity; - this.lastTimestamp = System.currentTimeMillis(); - } - - @Override - public boolean getToken() { - // 优化:同步仅限于关键部分,减少锁竞争 - synchronized (this) { - // 如果当前桶还有剩余,就直接返回 - if (curCapacity > 0) { - curCapacity--; - return true; - } - - long currentTimestamp = System.currentTimeMillis(); - // 如果距离上一次请求的时间大于 RATE 的时间间隔 - if (currentTimestamp - lastTimestamp >= rate) { - // 计算这段时间内生成的令牌数量 - int generatedTokens = (int) ((currentTimestamp - lastTimestamp) / rate); - if (generatedTokens > 1) { - // 只添加剩余令牌,确保不会超过桶的容量 - curCapacity = Math.min(capacity, curCapacity + generatedTokens - 1); - } - // 更新时间戳 - lastTimestamp = currentTimestamp; - return true; - } - return false; // 如果无法获取令牌,返回 false - } - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/server/ratelimit/provider/RateLimitProvider.java b/version5/krpc-core/src/main/java/com/kama/server/ratelimit/provider/RateLimitProvider.java deleted file mode 100644 index 9ba551c..0000000 --- a/version5/krpc-core/src/main/java/com/kama/server/ratelimit/provider/RateLimitProvider.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.kama.server.ratelimit.provider; - -import com.kama.server.ratelimit.RateLimit; -import com.kama.server.ratelimit.impl.TokenBucketRateLimitImpl; -import lombok.extern.slf4j.Slf4j; - - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * @ClassName RateLimitProvider - * @Description 提供限流器 - * @Author Tong - * @LastChangeDate 2024-12-02 10:54 - * @Version v5.0 - */ -@Slf4j -public class RateLimitProvider { - private final Map rateLimitMap = new ConcurrentHashMap<>(); - - // 默认的限流桶容量和令牌生成速率 - private static final int DEFAULT_CAPACITY = 100; - private static final int DEFAULT_RATE = 10; - - // 提供限流实例 - public RateLimit getRateLimit(String interfaceName) { - return rateLimitMap.computeIfAbsent(interfaceName, key -> { - RateLimit rateLimit = new TokenBucketRateLimitImpl(DEFAULT_CAPACITY, DEFAULT_RATE); - log.info("为接口 [{}] 创建了新的限流策略: {}", interfaceName, rateLimit); - return rateLimit; - }); - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/server/server/RpcServer.java b/version5/krpc-core/src/main/java/com/kama/server/server/RpcServer.java deleted file mode 100644 index beb6bb0..0000000 --- a/version5/krpc-core/src/main/java/com/kama/server/server/RpcServer.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.kama.server.server; - - -/** - * @InterfaceName RpcServer - * @Description 服务端接口 - * @Author Tong - * @LastChangeDate 2024-12-02 10:21 - * @Version v1.0 - */ - -public interface RpcServer { - void start(int port); - - void stop(); -} diff --git a/version5/krpc-core/src/main/java/com/kama/server/server/impl/NettyRpcServer.java b/version5/krpc-core/src/main/java/com/kama/server/server/impl/NettyRpcServer.java deleted file mode 100644 index ebab364..0000000 --- a/version5/krpc-core/src/main/java/com/kama/server/server/impl/NettyRpcServer.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.kama.server.server.impl; - -import io.netty.bootstrap.ServerBootstrap; -import io.netty.channel.ChannelFuture; -import io.netty.channel.nio.NioEventLoopGroup; -import io.netty.channel.socket.nio.NioServerSocketChannel; -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.kama.server.netty.NettyServerInitializer; -import com.kama.server.provider.ServiceProvider; -import com.kama.server.server.RpcServer; - -/** - * @ClassName NettyRpcServer - * @Description Netty服务端 - * @Author Tong - * @LastChangeDate 2024-12-02 10:25 - * @Version v5.0 - */ -@Slf4j -@AllArgsConstructor -public class NettyRpcServer implements RpcServer { - private final ServiceProvider serviceProvider; // 只需要 ServiceProvider - private ChannelFuture channelFuture; // ChannelFuture 在 start 方法内初始化 - public NettyRpcServer(ServiceProvider serviceProvider) { - this.serviceProvider = serviceProvider; - } - - @Override - public void start(int port) { - NioEventLoopGroup bossGroup = new NioEventLoopGroup(); - NioEventLoopGroup workGroup = new NioEventLoopGroup(); - log.info("Netty服务端启动了"); - - try { - ServerBootstrap serverBootstrap = new ServerBootstrap(); - serverBootstrap.group(bossGroup, workGroup) - .channel(NioServerSocketChannel.class) - .childHandler(new NettyServerInitializer(serviceProvider)); - - // 同步阻塞,绑定端口启动服务 - channelFuture = serverBootstrap.bind(port).sync(); - log.info("Netty服务端已绑定端口:{}", port); - - // 阻塞,等待服务关闭 - channelFuture.channel().closeFuture().sync(); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - log.error("Netty服务端启动中断:{}", e.getMessage(), e); - } finally { - shutdown(bossGroup, workGroup); // 集中管理线程组资源 - log.info("Netty服务端关闭了"); - } - } - - @Override - public void stop() { - if (channelFuture != null) { - try { - channelFuture.channel().close().sync(); - log.info("Netty服务端主通道已关闭"); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); - log.error("关闭Netty服务端主通道时中断:{}", e.getMessage(), e); - } - } else { - log.warn("Netty服务端主通道尚未启动,无法关闭"); - } - } - - private void shutdown(NioEventLoopGroup bossGroup, NioEventLoopGroup workGroup) { - if (bossGroup != null) { - bossGroup.shutdownGracefully().syncUninterruptibly(); - } - if (workGroup != null) { - workGroup.shutdownGracefully().syncUninterruptibly(); - } - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/server/server/impl/SimpleRpcServer.java b/version5/krpc-core/src/main/java/com/kama/server/server/impl/SimpleRpcServer.java deleted file mode 100644 index 792c4ec..0000000 --- a/version5/krpc-core/src/main/java/com/kama/server/server/impl/SimpleRpcServer.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.kama.server.server.impl; - -import lombok.AllArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.kama.server.provider.ServiceProvider; -import com.kama.server.server.RpcServer; -import com.kama.server.server.work.WorkThread; - -import java.io.IOException; -import java.net.ServerSocket; -import java.net.Socket; -import java.util.concurrent.atomic.AtomicBoolean; - -/** - * @ClassName SimpleRpcServer - * @Description 简单服务端 - * @Author Tong - * @LastChangeDate 2024-12-02 10:23 - * @Version v5.0 - */ -@AllArgsConstructor -@Slf4j -public class SimpleRpcServer implements RpcServer { - private ServiceProvider serviceProvider; - // 控制服务器运行状态 - private AtomicBoolean running = new AtomicBoolean(true); - private ServerSocket serverSocket; - - @Override - public void start(int port) { - try { - serverSocket = new ServerSocket(port); - log.info("服务器启动了,监听端口:{}", port); - while (running.get()) { - try { - Socket socket = serverSocket.accept(); - new Thread(new WorkThread(socket, serviceProvider)).start(); - } catch (IOException e) { - if (running.get()) { // 如果不是因为服务器被停止导致的异常 - log.error("接受连接时发生异常:{}", e.getMessage(), e); - } - } - } - } catch (IOException e) { - log.error("服务器启动失败:{}", e.getMessage(), e); - } finally { - stop(); - } - } - - @Override - public void stop() { - if (!running.get()) return; // 防止重复停止 - - running.set(false); - log.info("服务器正在关闭..."); - - // 关闭 ServerSocket - if (serverSocket != null && !serverSocket.isClosed()) { - try { - serverSocket.close(); - log.info("服务器已关闭"); - } catch (IOException e) { - log.error("关闭服务器时发生异常:{}", e.getMessage(), e); - } - } - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/server/server/work/WorkThread.java b/version5/krpc-core/src/main/java/com/kama/server/server/work/WorkThread.java deleted file mode 100644 index 447a600..0000000 --- a/version5/krpc-core/src/main/java/com/kama/server/server/work/WorkThread.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.kama.server.server.work; - - -import common.message.RpcRequest; -import common.message.RpcResponse; -import lombok.AllArgsConstructor; -import com.kama.server.provider.ServiceProvider; - -import java.io.IOException; -import java.io.ObjectInputStream; -import java.io.ObjectOutputStream; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.net.Socket; - -/** - * @ClassName WorkThread - * @Description - * @Author Tong - * @LastChangeDate 2024-12-02 10:22 - * @Version v5.0 - */ -@AllArgsConstructor -public class WorkThread implements Runnable { - private Socket socket; - private ServiceProvider serviceProvide; - - @Override - public void run() { - try { - ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); - ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); - //读取客户端传过来的request - RpcRequest rpcRequest = (RpcRequest) ois.readObject(); - //反射调用服务方法获取返回值 - RpcResponse rpcResponse = getResponse(rpcRequest); - //向客户端写入response - oos.writeObject(rpcResponse); - oos.flush(); - } catch (IOException | ClassNotFoundException e) { - e.printStackTrace(); - } - } - - private RpcResponse getResponse(RpcRequest rpcRequest) { - //得到服务名 - String interfaceName = rpcRequest.getInterfaceName(); - //得到服务端相应服务实现类 - Object service = serviceProvide.getService(interfaceName); - //反射调用方法 - Method method; - try { - method = service.getClass().getMethod(rpcRequest.getMethodName(), rpcRequest.getParamsType()); - Object invoke = method.invoke(service, rpcRequest.getParams()); - return RpcResponse.sussess(invoke); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - e.printStackTrace(); - return RpcResponse.fail("方法执行错误"); - } - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/server/serviceRegister/ServiceRegister.java b/version5/krpc-core/src/main/java/com/kama/server/serviceRegister/ServiceRegister.java deleted file mode 100644 index dd0398d..0000000 --- a/version5/krpc-core/src/main/java/com/kama/server/serviceRegister/ServiceRegister.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.kama.server.serviceRegister; - - -import java.net.InetSocketAddress; - -/** - * @InterfaceName ServiceRegister - * @Description 服务注册接口 - * @Author Tong - * @LastChangeDate 2024-12-02 10:27 - * @Version v5.0 - */ - -public interface ServiceRegister { - void register(String serviceName, InetSocketAddress serviceAddress, boolean canRetry); -} diff --git a/version5/krpc-core/src/main/java/com/kama/server/serviceRegister/impl/ZKServiceRegister.java b/version5/krpc-core/src/main/java/com/kama/server/serviceRegister/impl/ZKServiceRegister.java deleted file mode 100644 index ce952e6..0000000 --- a/version5/krpc-core/src/main/java/com/kama/server/serviceRegister/impl/ZKServiceRegister.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.kama.server.serviceRegister.impl; - -import lombok.extern.slf4j.Slf4j; -import org.apache.curator.RetryPolicy; -import org.apache.curator.framework.CuratorFramework; -import org.apache.curator.framework.CuratorFrameworkFactory; -import org.apache.curator.retry.ExponentialBackoffRetry; -import org.apache.zookeeper.CreateMode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import com.kama.server.serviceRegister.ServiceRegister; - -import java.net.InetSocketAddress; - -/** - * @ClassName ZKServiceRegister - * @Description zk服务注册中心 - * @Author Tong - * @LastChangeDate 2024-12-02 10:28 - * @Version v5.0 - */ -@Slf4j -public class ZKServiceRegister implements ServiceRegister { - private CuratorFramework client; - private static final String ROOT_PATH = "MyRPC"; - private static final String RETRY = "CanRetry"; - - public ZKServiceRegister() { - RetryPolicy policy = new ExponentialBackoffRetry(1000, 3); - this.client = CuratorFrameworkFactory.builder() - .connectString("127.0.0.1:2181") - .sessionTimeoutMs(40000) - .retryPolicy(policy) - .namespace(ROOT_PATH) - .build(); - this.client.start(); - log.info("Zookeeper 连接成功"); - } - - @Override - public void register(String serviceName, InetSocketAddress serviceAddress, boolean canRetry) { - try { - if (client.checkExists().forPath("/" + serviceName) == null) { - client.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/" + serviceName); - log.info("服务节点 {} 创建成功", "/" + serviceName); - } - - String path = "/" + serviceName + "/" + getServiceAddress(serviceAddress); - if (client.checkExists().forPath(path) == null) { - client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path); - log.info("服务地址 {} 注册成功", path); - } else { - log.info("服务地址 {} 已经存在,跳过注册", path); - } - - if (canRetry) { - path = "/" + RETRY + "/" + serviceName; - client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path); - log.info("重试标识 {} 注册成功", path); - } - } catch (Exception e) { - log.error("服务注册失败,服务名:{},错误信息:{}", serviceName, e.getMessage(), e); - } - } - - @Override - public String toString() { - return "zookeeper"; - } - - private String getServiceAddress(InetSocketAddress serverAddress) { - return serverAddress.getHostName() + ":" + serverAddress.getPort(); - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/test/balance/ConsistencyHashBalanceTest.java b/version5/krpc-core/src/main/java/com/kama/test/balance/ConsistencyHashBalanceTest.java deleted file mode 100644 index fa94dc6..0000000 --- a/version5/krpc-core/src/main/java/com/kama/test/balance/ConsistencyHashBalanceTest.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.kama.test.balance; - -import com.kama.client.servicecenter.balance.impl.ConsistencyHashBalance; -import org.junit.Before; -import org.junit.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.junit.Assert.*; - -/** - * @ClassName ConsistencyHashBalanceTest - * @Description 一致性哈希测试类 - * @Author Tong - * @LastChangeDate 2024-12-05 15:39 - * @Version v5.0 - */ -public class ConsistencyHashBalanceTest { - - private ConsistencyHashBalance balance; - - @Before - public void setUp() { - balance = new ConsistencyHashBalance(); - } - - @Test - public void testInit() { - // 模拟真实节点 - List nodes = Arrays.asList("server1", "server2", "server3"); - balance.init(nodes); - - // 验证虚拟节点的初始化是否正确 - assertTrue("shards should not be empty", balance.getShards().size() > 0); - assertTrue("realNodes should contain all nodes", balance.getRealNodes().containsAll(nodes)); - } - - @Test - public void testGetServer() { - // 模拟真实节点 - List nodes = Arrays.asList("server1", "server2", "server3"); - balance.init(nodes); - - // 使用 UUID 作为请求的唯一标识符进行负载均衡 - String server = balance.getServer("request-1", nodes); - assertNotNull("Server should not be null", server); - assertTrue("Server should be one of the real nodes", nodes.contains(server)); - - // 确保多个请求的分配在不同节点上(可根据测试的多次运行结果观察) - String server2 = balance.getServer("request-2", nodes); - assertNotEquals("Server should be different from the previous request", server, server2); - } - - @Test - public void testAddNode() { - // 模拟真实节点 - List nodes = Arrays.asList("server1", "server2"); - balance.init(nodes); - - // 新加入一个节点 - balance.addNode("server3"); - - // 验证新节点是否被加入 - assertTrue("server3 should be added", balance.getRealNodes().contains("server3")); - assertTrue("shards should contain virtual nodes for server3", balance.getShards().size() > 0); - } - - @Test - public void testDelNode() { - // 模拟真实节点 - List nodes = Arrays.asList("server1", "server2"); - balance.init(nodes); - - // 删除一个节点 - balance.delNode("server1"); - - // 验证该节点是否被移除 - assertFalse("server1 should be removed", balance.getRealNodes().contains("server1")); - assertFalse("shards should not contain virtual nodes for server1", balance.getShards().values().stream().anyMatch(vn -> vn.startsWith("server1"))); - } - - @Test(expected = IllegalArgumentException.class) - public void testBalanceWithEmptyList() { - // 测试地址列表为空时,抛出 IllegalArgumentException - balance.balance(Arrays.asList()); - } - - @Test(expected = IllegalArgumentException.class) - public void testBalanceWithNullList() { - // 测试地址列表为 null 时,抛出 IllegalArgumentException - balance.balance(null); - } - - @Test - public void testGetVirtualNum() { - // 测试虚拟节点的数量 - assertEquals("Virtual nodes count should be 5", 5, ConsistencyHashBalance.getVirtualNum()); - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/test/balance/RandomLoadBalanceTest.java b/version5/krpc-core/src/main/java/com/kama/test/balance/RandomLoadBalanceTest.java deleted file mode 100644 index 4f1aa33..0000000 --- a/version5/krpc-core/src/main/java/com/kama/test/balance/RandomLoadBalanceTest.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.kama.test.balance; - -import com.kama.client.servicecenter.balance.impl.RandomLoadBalance; -import org.junit.Before; -import org.junit.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertTrue; - -/** - * @ClassName RandomLoadBalanceTest - * @Description 随机负载均衡器测试 - * @Author Tong - * @LastChangeDate 2024-12-05 15:43 - * @Version v5.0 - */ -public class RandomLoadBalanceTest { - - private RandomLoadBalance loadBalance; - - @Before - public void setUp() { - // 在每个测试前初始化负载均衡器 - loadBalance = new RandomLoadBalance(); - } - - @Test - public void testBalance_WithNonEmptyList() { - // 准备一个非空的地址列表 - List addressList = Arrays.asList("server1", "server2", "server3"); - - // 使用 balance 方法选择一个服务器 - String selectedServer = loadBalance.balance(addressList); - - // 确保选择的服务器在列表中 - assertTrue(addressList.contains(selectedServer)); - } - - @Test(expected = IllegalArgumentException.class) - public void testBalance_WithEmptyList() { - // 测试空的节点列表,应该抛出 IllegalArgumentException 异常 - loadBalance.balance(Arrays.asList()); - } - - @Test(expected = IllegalArgumentException.class) - public void testBalance_WithNullList() { - // 测试 null 的节点列表,应该抛出 IllegalArgumentException 异常 - loadBalance.balance(null); - } - - @Test - public void testAddNode() { - // 测试添加节点到负载均衡器 - loadBalance.addNode("server4"); - - // 确保新添加的节点在负载均衡器中 - List addressList = Arrays.asList("server1", "server2", "server3", "server4"); - String selectedServer = loadBalance.balance(addressList); - assertTrue(addressList.contains(selectedServer)); - } - - @Test - public void testDelNode() { - // 测试从负载均衡器中移除节点 - loadBalance.addNode("server4"); - loadBalance.delNode("server4"); - - // 确保删除后的节点不再在负载均衡器中 - List addressList = Arrays.asList("server1", "server2", "server3"); - String selectedServer = loadBalance.balance(addressList); - assertFalse(addressList.contains("server4")); - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/test/balance/RoundLoadBalanceTest.java b/version5/krpc-core/src/main/java/com/kama/test/balance/RoundLoadBalanceTest.java deleted file mode 100644 index 796a60f..0000000 --- a/version5/krpc-core/src/main/java/com/kama/test/balance/RoundLoadBalanceTest.java +++ /dev/null @@ -1,93 +0,0 @@ -package com.kama.test.balance; - -import com.kama.client.servicecenter.balance.impl.RoundLoadBalance; -import org.junit.Before; -import org.junit.Test; - -import java.util.Arrays; -import java.util.List; - -import static org.junit.Assert.*; - -/** - * @ClassName RoundLoadBalanceTest - * @Description 轮询测试类 - * @Author Tong - * @LastChangeDate 2024-12-05 15:46 - * @Version v5.0 - */ -public class RoundLoadBalanceTest { - - private RoundLoadBalance loadBalance; - - @Before - public void setUp() { - // 在每个测试前初始化负载均衡器 - loadBalance = new RoundLoadBalance(); - } - - @Test - public void testBalance_WithNonEmptyList() { - // 准备一个非空的地址列表 - List addressList = Arrays.asList("server1", "server2", "server3"); - - // 执行 balance 方法并获取返回的服务器 - String selectedServer = loadBalance.balance(addressList); - - // 确保选择的服务器在列表中 - assertTrue(addressList.contains(selectedServer)); - } - - @Test(expected = IllegalArgumentException.class) - public void testBalance_WithEmptyList() { - // 测试空的节点列表,应该抛出 IllegalArgumentException 异常 - loadBalance.balance(Arrays.asList()); - } - - @Test(expected = IllegalArgumentException.class) - public void testBalance_WithNullList() { - // 测试 null 的节点列表,应该抛出 IllegalArgumentException 异常 - loadBalance.balance(null); - } - - @Test - public void testAddNode() { - // 测试添加节点到负载均衡器 - loadBalance.addNode("server4"); - - // 确保新添加的节点在负载均衡器中 - List addressList = Arrays.asList("server1", "server2", "server3", "server4"); - String selectedServer = loadBalance.balance(addressList); - assertTrue(addressList.contains(selectedServer)); - } - - @Test - public void testDelNode() { - // 测试从负载均衡器中移除节点 - loadBalance.addNode("server4"); - loadBalance.delNode("server4"); - - // 确保删除后的节点不再在负载均衡器中 - List addressList = Arrays.asList("server1", "server2", "server3"); - String selectedServer = loadBalance.balance(addressList); - assertFalse(addressList.contains("server4")); - } - - @Test - public void testBalance_RoundRobin() { - // 测试负载均衡是否按轮询顺序选择服务器 - List addressList = Arrays.asList("server1", "server2", "server3"); - - // 轮询选择服务器 - String firstSelection = loadBalance.balance(addressList); - String secondSelection = loadBalance.balance(addressList); - String thirdSelection = loadBalance.balance(addressList); - String fourthSelection = loadBalance.balance(addressList); // Should loop back to first - - // 确保选择的服务器是轮询顺序的 - assertNotEquals(firstSelection, secondSelection); - assertNotEquals(secondSelection, thirdSelection); - assertNotEquals(thirdSelection, fourthSelection); - assertEquals(firstSelection, fourthSelection); // Should be back to the first - } -} diff --git a/version5/krpc-core/src/main/java/com/kama/test/serializer/HessianSerializerTest.java b/version5/krpc-core/src/main/java/com/kama/test/serializer/HessianSerializerTest.java deleted file mode 100644 index 46c2854..0000000 --- a/version5/krpc-core/src/main/java/com/kama/test/serializer/HessianSerializerTest.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.kama.test.serializer; - - -import common.exception.SerializeException; -import common.serializer.myserializer.HessianSerializer; -import org.junit.Test; - -/** - * @ClassName HessianSerializerTest - * @Description Hessian测试类 - * @Author Tong - * @LastChangeDate 2024-12-05 15:21 - * @Version v5.0 - */ -import org.junit.Test; -import static org.junit.Assert.*; - -public class HessianSerializerTest { - - private HessianSerializer serializer = new HessianSerializer(); - - @Test - public void testSerializeAndDeserialize() { - // 创建一个测试对象 - String original = "Hello, Hessian!"; - - // 序列化 - byte[] serialized = serializer.serialize(original); - assertNotNull("序列化结果不应为 null", serialized); - - // 反序列化 - Object deserialized = serializer.deserialize(serialized, 3); - assertNotNull("反序列化结果不应为 null", deserialized); - - // 校验反序列化的结果 - assertEquals("反序列化的对象应该与原对象相同", original, deserialized); - } - - @Test - public void testDeserializeWithInvalidData() { - byte[] invalidData = new byte[]{1, 2, 3}; // 假数据 - - // 测试无效数据反序列化 - try { - serializer.deserialize(invalidData, 3); - fail("反序列化时应抛出异常"); - } catch (SerializeException e) { - assertEquals("Deserialization failed", e.getMessage()); - } - } -} - diff --git a/version5/krpc-core/src/main/java/com/kama/test/serializer/KryoSerializerTest.java b/version5/krpc-core/src/main/java/com/kama/test/serializer/KryoSerializerTest.java deleted file mode 100644 index b8532ae..0000000 --- a/version5/krpc-core/src/main/java/com/kama/test/serializer/KryoSerializerTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.kama.test.serializer; - - -import com.kama.pojo.User; -import common.exception.SerializeException; -import common.serializer.myserializer.KryoSerializer; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * @ClassName KryoSerializer - * @Description kryo测试类 - * @Author Tong - * @LastChangeDate 2024-12-05 15:31 - * @Version v5.0 - */ -public class KryoSerializerTest { - - private KryoSerializer serializer = new KryoSerializer(); - - @Test - public void testSerializeAndDeserialize() { - // 创建一个 User 对象 - User originalUser = User.builder() - .id(1) - .userName("TestUser") - .gender(true) - .build(); - - // 序列化 - byte[] serialized = serializer.serialize(originalUser); - assertNotNull("序列化结果不应为 null", serialized); - - // 反序列化 - Object deserialized = serializer.deserialize(serialized, 1); - assertNotNull("反序列化结果不应为 null", deserialized); - - // 校验反序列化的对象是否与原对象相同 - assertTrue("反序列化的对象应该是 User 类型", deserialized instanceof User); - User deserializedUser = (User) deserialized; - assertEquals("反序列化的 User 应该与原 User 相同", originalUser, deserializedUser); - } - - @Test - public void testSerializeNullObject() { - // 测试序列化 null 对象 - try { - serializer.serialize(null); - fail("序列化 null 对象时应抛出 IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertEquals("Cannot serialize null object", e.getMessage()); - } - } - - @Test - public void testDeserializeNullBytes() { - // 测试反序列化 null 或空字节数组 - try { - serializer.deserialize(null, 1); - fail("反序列化 null 字节数组时应抛出 IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertEquals("Cannot deserialize null or empty byte array", e.getMessage()); - } - } - - @Test - public void testDeserializeEmptyBytes() { - // 测试反序列化空字节数组 - try { - serializer.deserialize(new byte[0], 1); - fail("反序列化空字节数组时应抛出 IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertEquals("Cannot deserialize null or empty byte array", e.getMessage()); - } - } - - @Test - public void testDeserializeInvalidMessageType() { - // 测试反序列化未知的 messageType - byte[] serialized = serializer.serialize(new User(1, "TestUser", true)); - try { - serializer.deserialize(serialized, 99); // 使用无效的 messageType - fail("反序列化时应抛出 SerializeException"); - } catch (SerializeException e) { - assertEquals("Deserialization failed", e.getMessage()); - } - } -} \ No newline at end of file diff --git a/version5/krpc-core/src/main/java/com/kama/test/serializer/ProtostuffSerializerTest.java b/version5/krpc-core/src/main/java/com/kama/test/serializer/ProtostuffSerializerTest.java deleted file mode 100644 index ed9fce5..0000000 --- a/version5/krpc-core/src/main/java/com/kama/test/serializer/ProtostuffSerializerTest.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.kama.test.serializer; - - -import com.kama.pojo.User; -import common.exception.SerializeException; -import common.serializer.myserializer.ProtostuffSerializer; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * @ClassName ProtostuffSerializerTest - * @Description protostuff 序列化测试 - * @Author Tong - * @LastChangeDate 2024-12-05 15:32 - * @Version v5.0 - */ -public class ProtostuffSerializerTest { - - private ProtostuffSerializer serializer = new ProtostuffSerializer(); - - @Test - public void testSerializeAndDeserialize() { - // 创建一个 User 对象 - User originalUser = User.builder() - .id(1) - .userName("TestUser") - .gender(true) - .build(); - - // 序列化 - byte[] serialized = serializer.serialize(originalUser); - assertNotNull("序列化结果不应为 null", serialized); - - // 反序列化 - Object deserialized = serializer.deserialize(serialized, 1); - assertNotNull("反序列化结果不应为 null", deserialized); - - // 校验反序列化的对象是否与原对象相同 - assertTrue("反序列化的对象应该是 User 类型", deserialized instanceof User); - User deserializedUser = (User) deserialized; - assertEquals("反序列化的 User 应该与原 User 相同", originalUser, deserializedUser); - } - - @Test - public void testSerializeNullObject() { - // 测试序列化 null 对象 - try { - serializer.serialize(null); - fail("序列化 null 对象时应抛出 IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertEquals("Cannot serialize null object", e.getMessage()); - } - } - - @Test - public void testDeserializeNullBytes() { - // 测试反序列化 null 字节数组 - try { - serializer.deserialize(null, 1); - fail("反序列化 null 字节数组时应抛出 IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertEquals("Cannot deserialize null or empty byte array", e.getMessage()); - } - } - - @Test - public void testDeserializeEmptyBytes() { - // 测试反序列化空字节数组 - try { - serializer.deserialize(new byte[0], 1); - fail("反序列化空字节数组时应抛出 IllegalArgumentException"); - } catch (IllegalArgumentException e) { - assertEquals("Cannot deserialize null or empty byte array", e.getMessage()); - } - } - - @Test - public void testDeserializeInvalidMessageType() { - // 测试反序列化未知的 messageType - byte[] serialized = serializer.serialize(new User(1, "TestUser", true)); - try { - serializer.deserialize(serialized, 99); // 使用无效的 messageType - fail("反序列化时应抛出 SerializeException"); - } catch (SerializeException e) { - assertEquals("Unknown message type: 99", e.getMessage()); - } - } -} \ No newline at end of file diff --git a/version5/krpc-core/src/main/resources/META-INF/serializer/com.kama.common.serializer.myserializer.Serializer b/version5/krpc-core/src/main/resources/META-INF/serializer/com.kama.common.serializer.myserializer.Serializer deleted file mode 100644 index 90c3187..0000000 --- a/version5/krpc-core/src/main/resources/META-INF/serializer/com.kama.common.serializer.myserializer.Serializer +++ /dev/null @@ -1,5 +0,0 @@ -Hessian=com.kama.common.serializer.myserializer.HessianSerializer -protobuf=com.kama.common.serializer.myserializer.ProtobufSerializer -json=com.kama.common.serializer.myserializer.JsonSerializer -kryo=com.kama.common.serializer.myserializer.KryoSerializer -jdk=com.kama.common.serializer.myserializer.ObjectSerializer diff --git a/version5/krpc-core/target/classes/META-INF/serializer/com.kama.common.serializer.myserializer.Serializer b/version5/krpc-core/target/classes/META-INF/serializer/com.kama.common.serializer.myserializer.Serializer deleted file mode 100644 index 90c3187..0000000 --- a/version5/krpc-core/target/classes/META-INF/serializer/com.kama.common.serializer.myserializer.Serializer +++ /dev/null @@ -1,5 +0,0 @@ -Hessian=com.kama.common.serializer.myserializer.HessianSerializer -protobuf=com.kama.common.serializer.myserializer.ProtobufSerializer -json=com.kama.common.serializer.myserializer.JsonSerializer -kryo=com.kama.common.serializer.myserializer.KryoSerializer -jdk=com.kama.common.serializer.myserializer.ObjectSerializer diff --git a/version5/krpc-core/target/classes/com/kama/KRpcApplication.class b/version5/krpc-core/target/classes/com/kama/KRpcApplication.class deleted file mode 100644 index 0ec83d5467882dc1d049ad9d87dff4d8cf84de75..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1617 zcmaJ>-E$LF6#w0%WH;%Srb|CazeroKNr0|Y6g35fKouHvY{if9 zQDqQjcyJhB{F*`Q6GOp)YOOf(;0%8UY0H!E4&!+4Zb;U2^kw(nbI<*q-}#+$?xVkd z{uRJMFIS&@ zd~JR8R`Ou-!;f0gi7pA<3VN`evTDX*Xfdogn_)DSZ)7~}I)+uu1}we?+4PKrUWVTP zW-pQlcAgLlx#~|a1B%Qm3W($3^CK@=Y0di zfgsJC$t#s0%Np*|$nHda@Ck=AZ}`grADT{C}My?$+d@wTU* zgcQTJhBC+A(+g!$*BBBA%h*lI`A9x$_2$yXkKYmA6L?ggVlEz_XhG$F*VU0_JU(y^7+dXx>+0X*tEUi=!Ho`b|j?7Qk7DfYSD|rB2XhAp8=n3G(aoD3H@Sc(Rp1cL=aW$b1EMv!SNK6UX zUFv{`yNK@m3KHk;BkkEK+MW z`P|g+-ZHX`{h5c0kn@>`yC0D0Hu<%Z4hiy35Hs=j)$Sz)K+GdZkw=+MV!XP5lEMSdvEo diff --git a/version5/krpc-core/target/classes/com/kama/client/cache/ServiceCache.class b/version5/krpc-core/target/classes/com/kama/client/cache/ServiceCache.class deleted file mode 100644 index 84cacfec6ce39ddd148f83a722a6550eeeaba5c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3168 zcmb_f+jA3D82_ClZPH{*X@SOar<6A7g@AG?q!vn`+)Aki0tKpW(_32 z3^3Gj^Z~&-0}c-8$V>s9-VlBA!9T-k0zUcTn~vjmb~owv!oY*mna$aA{awEAJKNv> zop=o3Reb1#1y(z30`id0u&_t$6Ma!J9`POS?2*DrhWrLOE+-oqtR8Qu01gz`;S}J4 zz)&7mV!ktCO!S4LvJ_AH!eY2v@&zTePYz1~{=$%_butvSXq%^!a@2Q7?De~_07Z5z z6i|#3hQb-646d*ePl|FpaZu`KSmM!Fo1pop`m5$rJ> z(z1}-O=;-HK>;mXNk=y49B5_mzd!^}O@1;fcGH(`{&D>_-?dG^Yj~Z(E+_VI2oy>l zJ!g+_=Sm$2F>KB%l5;Do;lz_~CwLl-KA=N#sgW7Gpl!bv$GM3C2Tm|-)elYIzW?-x zZ}=K5*9Hb(#HCYQ{3<8jz?*iwB|tZSGpsWk6^M$7gx@>2 zMA*?qb!plh(m0$_RbDOwx#m7G(M?6si7>2mNKlT%#bipQ^0`;HK3g^$Op!1n;d748 zGo#Vp=%?@sC|$H+QHvaxT2rx3Nj)NVMyZGDT3C#RL{;YRMyD;=EmQPVv^>AY)855Y zFpaW*L@^5gbK=-Q@1-Dc(P~vnBzQnlxic}=LX;*X^ed&63M$8|sj1xs#x4|P#vTl% zGwJmAW+_$7+IU{2=q3s##qb$&!%$+0D)mOiuw?LS(y>0b_|9<0jFmHXD$%aoM$Wi& zF8AW505eYFi3 z#~xsL$?6(Q!s)+{ZV?e-ilwk$YTuImA zDr~@N)YIEel;a@P?qgV|VctY|%Lu=MURY_yDx*bM4IaF87OKYWI1<#dAW3JG(yzWU zm0QVMeHs?ahDus-4sRO@{7y>c(MZUoz)rIQ+ihhwqP>wcD6Vo6gVkK#cxKi6{Nlm{E)BMZHR=`XAtI60JVp>aob!f(V>?aeCVq=c?QX1jB zxig_0+fa^e2>lvcKKc%|tQv3bvc57!D>>VISpLR-7xfR|T~dWRewJqQ@bcvN-arY5 z+(?LbS}}&*BWC&|G}o#*Sfb(COboWrWmHdIZr2cVy=lK3PLF|;Bd~%kGvaoTV7!+L zybNu|>2;XTYOVVfyLiAI;Bi>bTU>UI?vN2sWWZrI9i%~H_$YxtmQ%l-tAEn0ekBU% zupKC*I9rA$Qhyg|9v~LGskH}fbmgDI0gX?!4lKu~Bd2?Z5oLumUyn;3Z(Mi1CmUr2 zu>6BIJKQcZ{e4rWa-o1lC5|z4JjC)zgei%nhp_WFVVcVP9|)R43*FRnp4t|C@E-s> Bk39eY diff --git a/version5/krpc-core/target/classes/com/kama/client/circuitbreaker/CircuitBreaker$1.class b/version5/krpc-core/target/classes/com/kama/client/circuitbreaker/CircuitBreaker$1.class deleted file mode 100644 index 9651ad6680772b58a7dc9cd7eb76a0bbfd55726a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 889 zcmbVK+iuf95Ix(Zb`o6bUZA1eN--rV7mEti2PhJRM2*M=$yIsi1KMm>%{GpW)=v2Y zeuZa1LI|OL03U^zbtiShcFxTF`u*bszz*)0FoT?pyn|U-3|k@|`9nV9 zz6h0!QeP-7#wzV;$%j(=wF!JVfkDbs$zUDxa4Zvs?Mn5aHGPDqMHEo9QF3qr4ud~c z2=5WYju(7TsTj2RdykwwqrjUe@Xjmn{;6Q*pjo6sTy!uGmm%MMQ|~Z5{vR!-poMv>IDkSB>u+%+1D>olg!Et|nGJ7R8PjqEK#ACaRSu>BqE@Vh<`-X*l_Y?B3Gq^%<_6)8Pv@-aa+>2Po3NE3H+t?s`7h8BjHivZzY-Qm$=?v5b mz@vWw)?1rywEr&1<4$&AgWN%=LhEM6RB(@MDa)HSZs8AP>EE9K diff --git a/version5/krpc-core/target/classes/com/kama/client/circuitbreaker/CircuitBreaker.class b/version5/krpc-core/target/classes/com/kama/client/circuitbreaker/CircuitBreaker.class deleted file mode 100644 index 6d1b74adb386cbdb006efcaa366fdde6aa1fdf4f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3249 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 diff --git a/version5/krpc-core/target/classes/com/kama/client/netty/NettyClientHandler.class b/version5/krpc-core/target/classes/com/kama/client/netty/NettyClientHandler.class deleted file mode 100644 index a6cecd45981413cbb45afa454f8b9348a1334d8f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2135 zcmbVNYjfK~6g_J@ksqRUZPKIR154qzQGvq&H*Athr1lMKs- ztytXiP897>wJdHbZKKyWd2R6a#Om0-)qSj5U6VTulWT@$cpD7K^5T9PX@*>Dx7Olr z-?m(yMHV>;vW$0diQ#(W+xHApdEj}D(eXXL%}*Gl*Q)9BomUJi<;IcvT2)Nd(v>#t zvGnR@l?y9^7_*0U5s@FD7&ZF&6Iqmbb`!_9Imz|bjje-+abW@KE$ zb%vQy?io@lrNnTrJPvIv(nT65&`rE2;e8pmP-2*l0$tokWV@W;PsMrK=^Sy*t1j*f zv~w~(z-@*J&9q(4FgGT>E#LDUUd>pT`u6B zjL-1}gB+H-#ntW#!=qU3hJd%hgRmTwTp)uth8ZMD20KZjD zDMC{7j!6aQIv&pjL)r;@o|OBS zMBPt?Sfh>|+{u}?pU1y~nbFu$7foYD| zoG(akkZCTR;xfaXQ%ohWe2NWzfhk5{ifExt?xTSDhs4QV7;rTVn5`@=|AEzC@Yyh{ w`53F&(0}9$X?zo~zeyNoDHZX{6c*m#{?C{fu2`%@9HsAg3%%6Y%{2PFqcqk)+sDzk;0Sq!sn~r94 z&ueN%Rkv+!Y58E@v`x>{E%RIMG7PSmv|VM0rqVk}#F3C7D@a0NnCg3k>OgCLQ*rmMey_3isOk+s!`*brVD5Gl9MrvR|V#m zgz5h<6nJ03YZ9(1xP}P^^)yJHBgY`=<#Iu9cnlk<2d5$(LYO;KEhb+A^BVVImZ1uE z%`l`08|_f9>6&4g-1b726$RJwz9ftT?#Vg3$q8%Iag&tE%ntt6sCtv+8%>%h2$;gf|qt ziR%m_2m05#X6bfCySsP54FWjsIVI0EZHhlmtZpj=(p(a6;cW@;D0mm|k%#US8Dgfr z?=Z}#dW}0ILA+dgM?#J$*^aaRjlt`l>DY1HB-Gbk*Kyl-qr}v{*B5!+Qt&=LU>M-S zh#~Xh6t=6b^H|@rIAtMIz48jyu+ESaNVeLXob(X1--F;g`4D#`Y%2H&A2VF+#%4n| zJjZP^B&Y*}iqdn_nPlG58x10Gw|IM1x_fSF`&`WEd)Wx^cLr*TcN!RzS-B zY9HuB7lbx(b%lB$c*heZvtsMskxTg(PYv90*OgwSzExeNi_0bF$Tj$eDd4`+(eWMr zmIZ?`Ni>Skzr=7^G(N3jw5E@V#scj$ni{kr!Mt{NZ?%*?=JI2M*2`)!)zjdJQ9%HIoI8DOYQ1~O} zMi+(gQ!Jn0Mif8bTu}&DmQJu5#nSIjC>;q8@DN!<{bVzcDTzxYy+)7Y1ofRte4iqn zIntWOBh26cv#R6gccVJifodWQ-Eu`g|8A=|lRom~ fYIOb?Hh#jKa78%N7!+uXB7H%-2;KEdfBx!UF>p>_ diff --git a/version5/krpc-core/target/classes/com/kama/client/proxy/ClientProxy.class b/version5/krpc-core/target/classes/com/kama/client/proxy/ClientProxy.class deleted file mode 100644 index 680b45a7c06728db595a361053a1462b56fbd9ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4534 zcmb7Idvp}l8UNj6lSwuMBt*akq(MNFAgl>}&!) zC}`^grM}P>D=k_qSZfIi3jx$V)mr<0_urlb`d82K_-EVG-<_Fk_64Wpob1fK_j}*( z`+fJ$NB=$lE`Zhedk{q^RuE88f>MFXUD}`)j%u+;cysqILw5v9SD7)>StC$fTi2za zOkk024TSr(0WGXYO(W)n6NWu#>W0pD!w&Dfqr)3FyW=1f6qlm{s)9)>CS!`g+*}E9 z+uFS+-0X_mBHslj`BFV8)Y_WMl&v;PX`_Ow0*2ag-8b1Bh)2WihU4tn7S}z!K~$nz z#^E}FTWhaLTV0oQaJq^axL%-~YCMqw3-aVl*pSvtYi9~9&-G6?Z9Qo^-L|3iGp^0v zu*n-TN`q#PVFwZN!h3^?Irxmgbe}DUPGCizDgT#(#vtb6Mg{X!%*O(O5X~I0V&MTJ zkq8|M^lBAr@OhSNT(h+S#-yqC?hKt?H8)??wd_bZ z5$#>JE8J>DB8J^qhPw$bmmWPd_TrnPhfj=N+&B8n$$wpZ>hj66W2YXz{OTKHPd<0) z!jXoW2Og@x7jdtGFRA!4G=hAtEP=p~X2%3>E)b3aNz^4FL08cu3#*c4)RLL)73f7o zL7xf}yS&25isn^dn;E0`8G8RV!?D={rWG)!Zf6;y0<%Ylk6b?a!apB7$luGuk6b!* zV(jIEqX%9Y_cx}(lFkOqSg)nvK7pECe6^*P@TMeNo~tm3IEv+uqaukx=6Aw~_4s|| zF4O7r&AQiZ4uzquF%M)5;eFw>PsFWQ!eBGlO+=f3s|~w#Bkq`1tPJ-P-ZNbuJ$CBy z>DR_xeo)0j*vrx|Y}+CRuPhM0{N2o-spI}`#Xc4L<&j{LZRnQWvr#jnN!zHvBlxO< zuc>$xj|t4ni)p&Urn{R!g^Xi5!)ewPvGfW6ti*)E|70+Zi)REM6wy-ihCopI1P-^t?;nC+0j-Edx!&!6bKx%B?{!2&q%TW-A z@PdLDReS^AB#=z(jZAzNBh?LR(WJ4tmm5^ulG%)Wibh$3FUg$TE4_GG#SwhlvvR%W zFi*34kPp|ghaFY%3SJeM%sO*Hv(?hv78}ayS{X}3q+@tZ!S_@g#|eQM6ZVcbQ~!)r z88e35*Opkq(PBEI)t#9%nL_iCJ|lC+<+j8IEnSnzdb<|ui4vwVW0Cgi`*=ga4^+H~ zAJV*BINGS`jwS2AoGyE4N2JTMi=uNmSv$i_%6xzG>>@CD*)gTnj2Z38fo^s+tvkvH z5NmZU+QsvQ9Q%_2r_W@^o0nJK@!XSZBS9=(vIzy}m|hbGxkzaz%q>Yb_z7M9lt7tnjF-jig0<(@mw=!R(=rsMZKPKvuB$RW1yq!J zrx6xq#_D)h_~tU^njMkHwE~8-7VPn3pClSC*c|_qovPj;0+$V2$?vpnW zJ_DrVwUXxTum@T=A@D_ik zQw}hX66RCG0^W3PLLILRZ*x|q7D~lwoZ&OYf2o%`FoN@*Zt*GS%DD2$In>;e!c8gg z_cs22E`^ngQdq^;wJEGm;r50AZJF&YwKkN5N>bSJ5~|)p*VLV%zzFUsh8ULSh5{*c zkH9FxVKm9*et%}57#9$y4|Yh(nwCPMq4YQwHYk#6k4qI&M({uYQuq(Qu=kWXp4pS!CDBWl9>z3YkmlnyEWt9Y#ByxF3T)!Hf$dm}2-cBzBe|Qf z7tMGY>)8u8un)Gd$F$;gv@!1OxQNa809)`ew&5SR)7_VQP)=SMi;K*Gy*!D(gLnBc zfV<%Dm3(^-KXUi)6Z{xI;cm&fpWehpjJiB|zaZrtl>Y~t z6wFny)lo1s^WX9#!xJ;6Ojp+`lr^3UA5p`{_?4Fn^r?i>f$D`Rd?)Y@7VRir*inBD z-)*~PnA2X6CxO{=k_c{E>QY206QwRrfcP{||?CK+XUF diff --git a/version5/krpc-core/target/classes/com/kama/client/retry/GuavaRetry$1.class b/version5/krpc-core/target/classes/com/kama/client/retry/GuavaRetry$1.class deleted file mode 100644 index 7b72bc512ee1601902a93ac2aaf6532514b4be52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1343 zcmah}TTc@~6#j-*wwDzuRJ?1&0xc*DiZ`}a4e>@QB$U)QlI?cbE^c?~?v{iYpMCPt zAK*KQ(Znb|_yhbQUjBsf%(mQw*oSVb9SqB6O)6Tu&f|xPpX=Bvgjf8WCxZ z;ab{ab&Z<=u@!9B4vGwsT)q-VANm!fR2;(qL#7))MLEJ^7$^zP(tKxiW=$&z%i^9M zLz?pae*Nax`?o(gH#09^WqxeFOJWEo6r5CX3a2{>EIX*Ts+w09PK|q=lJ5rrZ!}3? z%Hlz1vCwK%xfd#(Pv9)hDLAj<0x}GJyM>j6ONx|r!)fuwRffUbe7>}QTTfybmlR}G zj9`><{HvZJYP+j~VJx>Nv>bT0Yw3GD?I!B^ih>-&sBG7v)r4nPvi*R&vVf6X_mj(4 zNW`3|afbeq?ecc<%SP295B1wLoQmPua@}!8DQ_@4fB=Y1PC#y(n=}C-Fd;%N)4CO*)HbZuI)|uHr zYHgKX5XIiCm#Wm-YVF0AfHo|br%!+G(|>~$f9fy&x$S#qCdq_d2F#OZ_RN{@e3$q8 zzW1E-kN;l!8-NFKC5{HH(Gb(I7L5XlqsFX}EEuJHa%}Rb%(?=NgJ#Ke_Xw=%?l~Ms z6Ph)|b+kYi*p{`5$-L=KS004Zx zQWig>W4$t$@N^GP?LVHCW!JPyZ49DSM;mSvSZkEag*kz)CFPctFUTbA6s=Nn(r{$* zF&e>joVgal62}K)51B>z1mPCYGW&k z`>qucx zpj9Q!)08$HSC&-!W+Jk-O7v4iqdI$!jxXaOHt(b&ics^`D-X|*v{P*m*r#I%4-3Sy zMxh{J)QPg34FDQ1XNNqfQmU~P8x*DE7m1EAg;9%~C$qf^Xm{4d2x9Eg0;s>wRRwNZYnpm=6RXdmsj@L;CzpELA(x zbGQjvwtG0te_uJhcd>Nwb+zlvg-Ql828wt zrpEm2F)kBFHO%NJpeS&!Dxy_cs;yap7DtwHL7931-w<8D`EF!f1z_nY<7w_L%)*eB zBmUgghvRVIYN+U##W51VNk!aijKtbJv^u3c^xP4eSzDrFM|U{*0pTz`OOT+uU?PvR=gW3 z7>+|&u3wpA4*mGor_GWatrRDveMmLB*AgU^!-j3D_h2&SPMh?6t9LY5l``+Rv%al@m)`D)5xYQ8n4|>8Dn2Z7D>jS3uDD4WZO5lLLLyY@g=@?usBmB55y? zC6T-(r##)>VQ&eZr~@Hg*_gJ%_|BD=Fn-9h7qxn@uJ1u}?V;{<8P~|pj2Pu0Z5;)p zIGHoL>Sd&B*HTVy)`QXeM!j|nT;jQRISH(uNN@Ui(yLz~fwG<>0!_B`-vsWC!h({6 z-2ME6dpu)R?5sRss_I_9QmQ*upO9Zhx&Mtw)dBP|vCpzxho{7{&(hBNM*KF8_wc@k z-|6@Ozh|0P8q6%sS~D`4_F(1;V``}>|>mPlS(QCsT7id;zfsD!9Ljr$fr-dU5NUY}w(fTmXz4*^Meu*~|>VN+F zO)e0o=y@gjk&f5!dIEnHxW~V{)NsUdIqAbCp2s{^la7Weo3thu^W3=s1-vSPAie1FlV`!VKA~#Pn{n*1}WtxVRTRVAI1vX&~FJLX` zKsz>bv;{rbitW6o^rM&3eN??2k5gK?KR_4v(zBOvnp)^=5QrMRj30Z!P2eZ^DMRna zHv9}fr~X$csRH+Be!-bnIdccZ|7aklVNAn>22@tKz#KVN@kugp$62)_>(GeFwkhukvL8?{cI({tc1% d1O9}+c%!p8hmV;>@ZR1)DgW;RF5)sa{T~_^1nmF- diff --git a/version5/krpc-core/target/classes/com/kama/client/rpcclient/RpcClient.class b/version5/krpc-core/target/classes/com/kama/client/rpcclient/RpcClient.class deleted file mode 100644 index b6f7885f2c596cfa758563e38e66dfd3d2255d12..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 207 zcmZurI|{-;6r2||@dM%=Y_xG}308uYAjA`_n@32@?#685;Ve9WhY~jutZat)z|6ef zk0*c~CJ_R{QdupoQcI!AoJ}L@O7$$M)c)&57!nqRyh~9^lZn%%VAT+2j!l~It!3xc zc6Ib!+8UwRIhnEW1$`Q?|7NbT#&JxTo^4wzKIA16=D*=hw;2)$1AiGH|6_!(V~9Kk G7=HlVEjt7N diff --git a/version5/krpc-core/target/classes/com/kama/client/rpcclient/impl/NettyRpcClient.class b/version5/krpc-core/target/classes/com/kama/client/rpcclient/impl/NettyRpcClient.class deleted file mode 100644 index 9b54f6584288467ea4371775e9ac24f3d25a973c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4718 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 diff --git a/version5/krpc-core/target/classes/com/kama/client/servicecenter/ServiceCenter.class b/version5/krpc-core/target/classes/com/kama/client/servicecenter/ServiceCenter.class deleted file mode 100644 index fec34996abc937f64943bcb7df5ec7c2a3d613c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260 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 diff --git a/version5/krpc-core/target/classes/com/kama/client/servicecenter/ZKWatcher/watchZK$1.class b/version5/krpc-core/target/classes/com/kama/client/servicecenter/ZKWatcher/watchZK$1.class deleted file mode 100644 index c4bad2e2a388afa1fe2418ccaee97116a39c76fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3154 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 XL92{VFDWWt6db1!DQ=yno8bEw>M@x~ diff --git a/version5/krpc-core/target/classes/com/kama/client/servicecenter/balance/LoadBalance.class b/version5/krpc-core/target/classes/com/kama/client/servicecenter/balance/LoadBalance.class deleted file mode 100644 index 7da849a5594749914f21ecfe9709a9edcfd0bc4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 337 zcmZutu}%U(5Pb{63ZkL$4=ki{V`l`|yJXqp<0$w5K8iSZM?utT z=Iwj)cHSIM`vZU_?lgJ|&$il_Z`zQt!E>3+mgCM_w$gJnD+*LvHd#gPt?Mhw?FJTTYCTi diff --git a/version5/krpc-core/target/classes/com/kama/client/servicecenter/balance/impl/ConsistencyHashBalance.class b/version5/krpc-core/target/classes/com/kama/client/servicecenter/balance/impl/ConsistencyHashBalance.class deleted file mode 100644 index 66b6169bbb7e3ee7b5da2bbc531d3723a47c967d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5355 zcma)Adwdkt75-*-v$Jd_JT^oO28;>`Nr0^{1oF@jMS@9C5`sVlC%co)klmehcQz6c zs}%bHZL8K+D2k=FwAETs2?^M0TeYqB{j%?u4{ZPG-}Ps;-@P-tnIwz#kIddXbMCq4 zeCIpoo|~87J@p*`%{UW=4}KK^4J8OFn7vaU)}u*1orrGe+iApX1;HjWZQ3mg{7dS3 zRfH7GkwQ7!Oh$V$hS8}Hg`vVf1EtVZlxdiWSqfTXRw_EEr}StnX&Pxenl&=RX3U6j zY-FN+I(LZ~Q8P7^jJ8?nteLfqbZlguo*h`@eB<8P0X-AXDyZm~*t6Tp*hZYYHmaDT zVD7}14l_My#5<@djMuD#ky@}6r8i9&a=AReNPPwalVRb4Hw`-1(692c@YKbfS&C#c2OUZ+$vTq(y$mc z3Ib{QdTw5~2Y>pwWKvkV?TndD2#f1AG+-&U>G3!bTH@H{U0b(R#ALaKC_Y5Fq?Mp) z9abh0%_jRV+ZpY!5(y*I7{VnA=ASuyWz?lt2H#DNx{67K4>uhG2Py5+5>_K zww|^brefOKUG$}w?hax4*rMS|Tt$o%hAkL01rJxUu04!3Xj5^uhHJ1k&t$2rovb7n zR57e4bH;{#5$j3Yxe|=^I<%`;ui-j$C@7zZb%B`#dnm_1uk-@qBvdg#rehRBmx4ua z9X#~rfg_%fkU;~hcklW4vv*Gl&h;WPHz-);-R`XTPv5PsSNPPep+}HcHM7^GhU^i6 zYp;gQxKRe!q(9~E1~T_$>NrccYS@MkbE&PHNoJ;kIdWtjlHwRuRyuqe`nQ0FACRg*YHu?!99~kI$<*f zSY}B0TI|*EG3?`q7^`V3u?&#dZDD*IpHT5h4WGjPe9@CocItAq-p3>qqU{2SZWZ?^ zxKNVaNtk5PNa)GdOd^+JNxx=S%owswD;>gTXnt!vo-wl7>LlxHbxcpEExWqUs7~jS z$!aT8Z8!wG8~2KX=f1O~Yi}5z!viWlui*=LFmIzI-=;6 z#ri`UzKFvNp=~*V<&lw>l#aOJ7Ic4D!x20}c93%2Jg!7NSm7m}E9<0?Cks3|<%)!G zRKct%2U{4A;wvh?s^J*E#@aWvlCITbJY_~41DxutV6oSLwxpiTHr7oq;wrwO;NlN< z=5|r_O@^A+0@#xqia(q`P8nUEMJ6sMJ4pJSeMYEZZnbA?OcZW)#UNNkjU;! zhZ{~Y_0~EUmX=16!?Roz5${TmSfGu^H8JF=Zgk~ReMY87?@RIxkFc1Y?A0@-n7c0n z_JB#gwsm|k2;QgdpoL|Of3KObbL<&%DFvm&?nGJ?nI3H>im1)R&lFvYOPx};&~ZJ!a+4Dq&2nPgdmhUK$nW zaq)dTYTacl^z1oAH^ouhkbM=)P1a_*C@lV}+uSkK?xqD-NZpANQczb)b)sB2Kn0zw zo;W@Wt3SAbGK1abab7;%rJe#|8RwSbU%cDok(_R}pt44yY@FyUCzl}M4P|O3ZSp>Z z4>hqxKJ==Gsa!yd5W*;zsSA&fubPb&T_ znykMt3=^1}>0xWoh&s?yG5fAU)p^iM5m(Srx{h@=X=E35Sk_=}s7PLW;F+|rhcquD zzRe>)xjT^c!&T9yCzIXmz1gAujZ9W*YI?gAg5I7^8yQ&%jjW2-SR$wSSIle`Zzx#! z{-WH*@sW*uDep!KzK#Iqiw>G~a6TTx<9zo`j(vE7f4u5&{w+Cwl5<`*3iIR8IOe^I z&!;HS2|q``dG#lu)SrgB#MA{TRfsUQ9ofr>!rD4Ld41WsWU`}dN{k}))|2vR;=5gbEn zWyv_M^*gIND@)|Nacl@+UqCtb-V4Xxdq8*>khU!+xZveyK5F=^CAdqdv<_{k$9i6C zwqYrfe3!v;J9g39#~0@v$;6j+=cV0IP$QL4Rd15+6nX zD9k5mqk~yJ!W^%p534W-P4uam+_;h`U4=`~N^IJ&0c+VwUn}uiCnKFI;E=+1iH+by zN+RN;hRqT~KlSwBd-y(gTEd&r3uIgg^~{u52O*F(pJs-yQU}oa{^aa0or_Bu};>eh_49t|Ha0XsD7*>slsw zCb6vu5L^#md`Uq~Heyk6&{=-ag^+ zL3F#5jGJCLug5FS;_*0cam7cbI{eC1hx_Poj1I@?utA6W=~RN24UiQkT{dtNGfU)? zd%@xD#T>qZl;pkJ4e_hQEkMPck=;#^+nW6?3+hL)=P2e@)h`&u zoqHp@2b%Z!8Kr+!Rn0Ejb#pU+)LZxRC+JM($Vo^{4kJ`GhP#@pL_Ko?x`Lj86~T`z zv)<-^cyg?THVgGI`FIPf#4cQp5oX4%yyf4WNP>T7&;x{;Nx2P|vNSdoSY^ei1xAz%@d{;)a)?F?a_=6(~E6ySGF> zeG;F2ZVdO2;$Ua}(uPqyG?Ba!iOfE_a2MwB#@y zMU<3JRdVlHmHe7Yc-i7pK(&m&!V-VvOH)-m;8Eds?FivF^2`!TFOUnFT9MK*eEDfC m6Eyc8YZ2o1TfXz*Rs4>>A%6Wm|Ne@3{LHcMF8>}EC_rr7CB zr!(q^zh1>@N14%4XX>=pR-m-%lMntK1n5)$1IKfB7YGy`^04>j+;h+Oo$s7I`}aS0 ze+SSB!w(Ni1b9U}hEj&A3291-Xp)|e3??TO*rvu{ zlse;>3DvYCGX&x`r6RPbfNF;Drdc+0Id7UAq{qlk59-6FYAM~ODNV=KoaINA!)~95 z8Uz{2rBupPayfoT*%SeAOSBx1;|T%#MI1mKL**urb3ssZy_u{vZ7VV=;1I*%P1$0a zrlcjU+f3&(#HjaztYj_K(0vFoGnZcV=KTvEcFQ2)c5?is_V}whmIKgmw?e;fo_wN_3eY`d|_u%p;E1&+feD|Z( z>(@gUFNF$U&aYhkyf8CYnEmnLz0V3)Zx*gyUis?A!+T#}yyVBzI4R&65zpc|hUy|s zsN@7dtfnL_uMCbc1c_BqYQ&U#*xH{K@jRl$Gp!K)nyrpbSCU^Rx&*u+;ze{*4Y%h) zX{-8}LFw!uU=gkx?okVG^`7-sFH)aN-z%aIFB3uPqirQ}a?$Xk-6LRx;l%FV`Yo?| zSwcX0T13-TWP>LOvf1t~QL2wTZWuYD#i$vATd7TF*XdOx zEJ>d1m$EM1Q`>{@D8i0_0(InoEsa;V7k7FVH89U3rD%?quY-oOGu{0OBX7z|pUPzn zI&;0KOzk{9G|(9FfZ;8aU_YNG^bra0d2g>YTD~_@nhU{A6xq_zf+cw{R@*WZeRuYO7nsDGwIW;f1^Z z6K8HxATKzHAcX~GSwWwHS{yS->8Y%(DS&?Q6A{KG<|n&@0ciijz6*P+bM&ePeL z9obV+<|>pX+c=KUlP8g&h#p#NiS1ru`;rI4oa!sIf3*bLwK+I-UL83Ju|d= Gp#KXwV>O!q diff --git a/version5/krpc-core/target/classes/com/kama/client/servicecenter/balance/impl/RoundLoadBalance.class b/version5/krpc-core/target/classes/com/kama/client/servicecenter/balance/impl/RoundLoadBalance.class deleted file mode 100644 index a0c60f2047581b8df4cc2cbf2334ebc891d3efb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2805 zcma)8ZF3V<6n<_RyKS z0QBI)7$T@q5LNLQY8e{G_ykWI+$^RChR1~FGSqhKrta=#sOd-zDyU;fd7CP(ZlpEK z)GD?uOgGJ4tE6k`Uhk1LT~QQv3<_d0betjDkxdQOqXEklELYKp6$}~8Dy7GHiKjI~ zmq8q1Pw1M^Xf5pYFefIONb9Atkv?Ko%tFrMh5f#jm}#Sy#k(6g>X04En6{ zT zV!nf-I|oW-chZydq=E#)hI!4ih9QdF=(UTL5=n62v?j`~Zkcu1z>w_qkrM_1B{XiD zmYWzB3A17t3Cm6h88?P?NJ_=q8JatMc3wI2uC1HJOlq)+3cpE32T}|%UM?Gxy$+R& zVOOx-E3B7HDwN$w#ndE~H0?cRa(i;1ENrT|osmWEQt>o4GpI%3_L_xb*g+AxN~8e zcqC@0uFPKiX7;1+!klHW7gZdR!D?+$vL-|wUSepk^1C(jMcC=q^`Gy2KXdoex6(VO z;xPIt3r9agC8ATEjo}r%s^Ex6#*Qn6cv-MOOUrs^{r{8CA$H}A~R9(R! z!?vXz^QyyLpVx~fcPln=OosYUHfDE7=Af_lW+&mTiWFfjXq;l;8vCLCeVuoZI*rNly;K_VF4x8n^Ky{d?uASi6)b$b?qev_p#7eVQPX=U1!4Gx zMuV4z3p^PloZQN=av@MAo1%1>&QRA)Bi+9^VtK1#YvQ0TYtg)Lj&G5f(mC62S+3*S zynI-=qgKILUJJTE9JmT9Dkktw)uhzT32R)Wa~>t~;3M~XG+qk7{TuGmz{v+V#La>s zoMg_j#w+E_gMx=FRgOnV`0)0n|L8+L+BaO4AaWl!j67XRnMTkVl=oj?SL0wrOmM;4f_Nzk;1jyEji`PYpKzLII+X;H!x=u!d4?Bj^O$v4QTT zjdUv{JtCbxSU^PniSiR~r}R&O6REA_I}D9z6)2KVT<$tSw1tNgX{Zl`8X;SeFnpQv z?FZ_c8m?pDH|&%Guu!NKq?bvy2rQK8DYbr^Y^QOCKIh01Bg=a@j|*7!KWMk< ALjV8( diff --git a/version5/krpc-core/target/classes/com/kama/config/KRpcConfig$KRpcConfigBuilder.class b/version5/krpc-core/target/classes/com/kama/config/KRpcConfig$KRpcConfigBuilder.class deleted file mode 100644 index 444ef885ef6623441cdb7c5a55ea8c625d00859f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2349 zcmc&!ZEq7t5PsH}oMR45UYay1FHSJUHfh}V7fhhoC4exgL{O@#pEl>MedK&=-EAVJ zANv>jr9Y#UsF0|{58y{3X3m%T&|M;**Xyc4An(h85}56bqimbN^?OamJ!hkY^W-(u0mYq5cs=lq>Zu@d zo3$~=vGaW$8b0@djRiJX2Pz0%?X&Ge8%t~}1ghtTCOBl{M>a07u^6hrm7e>X3fO$f z#$`62@wDu=BwgN77FGn7kH1|JWnAH!RRn&oCNhohldv4+o-n1I{+Fe;GfU0<*v2(f z1r`T#Pf-sXX?}7|pR~|O--H5xy!S-YHK0DWb(e;s)Ny^awLjQZ!4tXbMPs5J>Fr4B z6@ACXyy?4imG#c?y-81AQ=pY`_u9LHw38r5eSK$?)4Tj01TIxiI!ZYgj2_K}z&!b; z9t}r%<^b=JWt1$&tnSeILTA3+^C36VNm^xTJVhq;DM8RJP ze%KH-0sDdPtDx=4FjO>?GpTSE+5%ToRn01vg}XEnC%Y0Ck1C55qOBagd5d-;V$yQV zoslGRj3jYlB#8$jNz@lf;yRK=TEzGesFBtnDcDkf4)HfBIn-(A-ypWVPP;vFz#2ZG zFJeoq)6R#Rv&YPo_qUb50vl9dH#TjTWJENJ2fw*!E zw2%!nKQR!Oo`IIKffgqQ;@&aPg>0bZiGjHJ40Jgg=;FjcJUtBbDL$i}yS9aC(tygp zDF0l4MicN1XKBsQny0l$Ynj%?=UC024MwE%|Bcq?_#(#c(46qURXTqx?h9N6PC{Od pk@NVHuyXhcUq`ZxZ%7s>!nd?;;d}a;rT+z#affcz!VlQQ(i>?h17-jK diff --git a/version5/krpc-core/target/classes/com/kama/config/KRpcConfig.class b/version5/krpc-core/target/classes/com/kama/config/KRpcConfig.class deleted file mode 100644 index e7ad52a3e0975a49f4b0986290ec6a5a32472346..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3648 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 R;7{}`OyB;DzvAzx`#-Kn)AaxV diff --git a/version5/krpc-core/target/classes/com/kama/server/netty/NettyServerInitializer.class b/version5/krpc-core/target/classes/com/kama/server/netty/NettyServerInitializer.class deleted file mode 100644 index 829a868c7d43baa64138f674ca40c5b8eace17e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1682 zcmb7ETT|0O6#h1?4NapU2wo5MbSj^~E zk6|P6vMc2Qm+790a`hj4ubDpI5=Jr3^POM_C6v5~Nroixr5)%cotNr}%G2nZEbpFY zWrIj2VGvCe)0h!4E8`mG7*c<6ZTM{wr$PA{`uPQxVeVAiBa0e=LFH8cad|n=Y23fX zmTDD;!edt%=KT`&=BMN(q%baGo;d1OoR%;pN>P(>9XA+ayd|2mq9)pl)oH5IN}eIy zXvqEy%~tlXv};zL>$^6!=wQY*bUUxpRM0sPhP{2OO0CyMM@uc*2u(8x#y-Pbk6|%P zwOgJZa0Y4pwPBV$%XO+EmT1ym=|{R|>&~9m)G&;7AS1x?^N;4NJxBKrE0l7!>$NSs zFSQ$WBzKw8mU8Z4#V|K4PUxuLscq~m@USsS)lAU~NmTKcrCkVNUR*lgq|;l7Bmtf# zkHHwWQ{k@=3!yKF79yVztK)p`7{dZyG!>(TI>t^5;|29Srs_xpigyGlV3GbK^d5u8 zPQ(~B@HlQ`0$JMKB5AyFHOcPKiGsjg+@nxMY?9Y~LU=&ZFiFz%QRma22fa)hfmTVa zBdI1oVCv+)2-yI`KK@9gif8^J$v4B-plh|&U^m)=a07lZecTl5W*4>15v~T zjz70{EVE+O%I1Uh=XS{xh|M@P$D0)hkBu+)AdVi1gn=Xsfw5A(YHnFo%WT^2j_sNa zx4z?Sa8e}glOBp-wVc4Iz~Hcf4{%nXuR~5?qVRvJJ9HAzd4U_9Qm*CM6{qTW2T@$&Qb8@X;+Vj> z0M11Nm+&F|S5k*q=xP_B_fef!rEuB67{&$SW!sytSk0!uiLvpvocW7n&Eg}8D+aE@ zWK0fns)Z!w7pKrdMrT1lim3OwmDn8XyOB|bKA6Q5A#pfH$V zmS$s{RdaK!O)e5<%;R$bvopCJRns~jtukZ8U0sL*lSh~c{5TR_epQ*D!W{!&;x2>1 zfC`MZE75));krOi(J9v~Z`) zkF50yR|X38l2uu@Tu0G*G2(4HOmwEJO#iEU(85W*r;pNp!E_`)US0zT>F$r!=Bg`?{*m7%s4Xhj{%&IkJgEV1ZN!U-9ED;Lmxz_<#0X|IcQ}e}ud| zg&gmZ`Uzn^z_rXCL?*innHk4ja4{N`&ca6Aji z@jUg8pa&Omj7>F7OP4ST6PIz{-}P-^5f4bwn!5UkK+P1|5a$o^b%05v5ThnwE&B?i zuaH>`{?~GmbR-u|N8e7z!qak44#s}QY&tq9Cv)-4??|QNWX`_EjW8aQKI7AGkXs=k z`StE$X81L3NARN*zr6cX`4GW@4;jWZ%ggZ!M-zEWV1@IixbFKfOH^6*>LnD(M|At% ztl<&9@x58YG9J^LIKJg$FtYvhcm=Dp^Mo=(+zWJkN1kBsd+zJ15r zrxF%l!7%-eIqF|WDTokmQ;*7iQn^i!zX;)1k|E!jm=9&z2dxZ}Z69iqU{v4*HehRI arcbk!sBENDP0m*nWr i;DhVe18HSrWB@7y+RVVf2sDnBfeplBU*LlU?kW8 diff --git a/version5/krpc-core/target/classes/com/kama/server/ratelimit/impl/TokenBucketRateLimitImpl.class b/version5/krpc-core/target/classes/com/kama/server/ratelimit/impl/TokenBucketRateLimitImpl.class deleted file mode 100644 index 83a936027befaf0dcc86197960989ff79def5dab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1290 zcmaJ>T~8ZF6g^|FS=(9jSxO9Xu&(Qz`Zjc{MJmk-^26@SH(hCZqDK)}$E0-~-F`z;J;xU4G=r0c~; z+BsxlSUWGchtW#UpT`FnHSwW^F^Ixrc7M5a19lK zu`p^m9e?NMp3?|hEfw9DZX8BO0=broyDovLO5+rBh50+RYU95*Ynr5OVHz_`>4z;kRAd z*+tjy4P|~kJd9j*-_zxk&YQPc4a44MIqd?Ua@NPS%6tWe^&lsf6G*$Phc2-k71}i8 zGjO=haTjo(rk${Vfv_izVcM6DQP9hveS(o=6o2G#3ZHQuN1qObL7*H;=;x4);4=MX zT<1x-3xylF$(@eWR7CQm$!My#FyBorO2pB4p8dG-hy61KUt-99Olxd2xiS6f2j*WY z^Q5S_nBP5rfm>&`!LxZ|)G)rsn9bvYMi@1|F}6=o(&Wpeu0hiL-^onBDrSCXLIW4k zWYQwOPV5$BVw>1WY&t1)9tFlsG5Q)ys9+RT-k4#@vs~v;W7HDMe8gg&;5N3fz}t7; ziBQ8Ny%z76@FhN{Tq#{>PnZQhmtp*cqKVYss2SolvTvwe%0!kf2$NV@EK;6sm#)z2 cUv4;ig2|sy)jbgjRUHC;Yy`i3x=(lC0-5CyYXATM diff --git a/version5/krpc-core/target/classes/com/kama/server/ratelimit/provider/RateLimitProvider.class b/version5/krpc-core/target/classes/com/kama/server/ratelimit/provider/RateLimitProvider.class deleted file mode 100644 index d8bfe2cab9c3779309b6b2e42a0492f9f63a4edd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2264 zcma)7-%lJ>6#gzt85jmwx0G6J>C)250y3>)YrBXpTadL2McA%lt?gy@vJA}5Y-VOj znx+pX#`vVZ*hGCaeKe^*8d^w<&&EHaK>R0+XJ&_GpoQ=KA z;9cC6QHO|xdId+&zz|*HD_k|WSyXS#FA2?MXc*Q_-5p_w^d|BW8X3;}Mio~#RLwHA zifs$iRnxWQ1a}rEd0B>pNE4c&NN7>eiZ+HJ%_^zOyu?*U*ek+TZSD#~FX^sYwyhPt zK+p_9Sr3{H5C+9F^D*+v(3aiFfPiF-&hm+U=;pMV%kKtl()yO}~tZVCLF_{SQ z7AmIZ>XxaF2a9Agj-f-saRsm91VhWN7!;IJFIQZVSxC)0bYO;bI7C&h>DuNuk2b#jIezQ@gWK_quYcNDUwgjx z)#k&;TR(pJ?+@Q?KKWwnmxo*5Ke`&f|DYMYNJ!{Y(2oIXsJ%`Z>UDF$Vz?4kFDOu` zWV`eXE0)O17=$X}f`W^9li~Q@5aV2PEt`6vsVLm)Q5epJ!=(-GIMfb%nMvZz>P3^g z6HXKTCJK_BcQY%1mgxp52jg6;nW^;Gasp(WYlbd5;8EP`RHIBv{j&t+OoPSrYfa*Vdwa~K?s#i<3^s_y0;I&dUsKG7%pY^ zPjCP0M%gMPTrK~Xmnw09?;4d{wdkfR>;>Dm2xnK!m}^bySs?Fdu0(eKm4E7kOyd}m83fsTQ!jbS9Rr3WwU#5+O&l$Q7Hl4656sy#8^qaDNhNCmzo$d_l^-uDOO{{A&YfoEus;4gGO zCcF-wKQA(9{(HVUs`h~|Vqz3&u&C^*8hE`+k-eeQxsH=_(Lz*SMc3qS=#HK18+eA- z>oKt7yVbWmMLBlSqj}no5wEg+&*X;m824h3O)EaY1ZB{OOihn&KRci)*8CK2{Elu< l2o_2_M(#c&tPaTn*Y{7#N=+_dWMC~WNh|`=EE=AgVL+<5B)@=>fms8@;R?<#ElN&x%gjk-WZ;7v mr3W&FjgbMU4Cn#|1}31%tPE@nARE{jIDjII44fcw1}*>>NF{^- diff --git a/version5/krpc-core/target/classes/com/kama/server/server/impl/NettyRpcServer.class b/version5/krpc-core/target/classes/com/kama/server/server/impl/NettyRpcServer.class deleted file mode 100644 index 2172d9fa733680c164d5b2537811c74249bc2435..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3723 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 MmeTkc$pDW33o5t4#Q*>R diff --git a/version5/krpc-core/target/classes/com/kama/server/server/work/WorkThread.class b/version5/krpc-core/target/classes/com/kama/server/server/work/WorkThread.class deleted file mode 100644 index de933d024b8e49dec1d5ade8837416a14cd71410..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2959 zcma)8TX)n{6#h#knPf;Z<>CeJ zisBtmAARBxSjvF1mdj`VgRd<713s$XNis8;T3D<$Ig@kt-sjujzMS*NKfnG4;3<5s zpiW@T32k1>n097l@`Ry#BSo)J^u|2L(DF+VN49bq+&T*xaA(xGQB>5w&dc%sR;!uxm@e*fK_o;B70cHDy$Z0B8bS6z^Vv_ z$O0j(z#0i*t;AW`IVzHxkV22BSdVsrgk&gST3}__YEH9eLjJP~HV`JM&f8WdZ@8{D zV`N4P`lxZTXt-X2F?m$QV|ZL(DPfKpZo#%(LtuAu@Sa-P)S_#Fs!!x56-lIM^OR$H zMj2si=u;G+bV#5}#b$I1)KBM%?yNv8DH+ZPtSB=)Fmmv;ZWKJzwiIj==kivqzg@JZDpCpb;7JABRqT+K14F)iMTGfLa7>H&sp)g$j;0$4bYPc?-RNa9_+j%5 zXPOJcTArlTQp~hAt(mOM>pdzffcerSbJ^65!;U>~PEjK*nW{M8#pe5Ud>594+sTpD6?k9t#q?8akR9!?=PMRZQSW zxs0pp0!u3P1@Y#OFDZ_fp#Q?l%0#)3i>$0E)wniBV zE#0?56_^6;RgA;-SW%x1=&2Nkg1MS18_4C187;S8*STp#D$nYznkthrKrVDmR_nOt zFnSe*1Z-KB1tw}$Ycz|Bex126vY06!zs`twZxhp$&v^lp#RKws4C}BfZaIvPz1p)$n;f9e*#e;Y3 z)C40mW)~gZ=r?7qG*|B}TcjV@z_X#B=i3?7@sIZ&UX|+PQNc0B`8Uwb_nZ9sli&3m z_uYm#n*JHF5|-R#zTL)(@U!(M+J-ilu#-4?JodZ!?!hL?r>T)d7AfpS7v8319~vl|#5ue} zjO)>cckv#rcd}mI#|O09O^YAmBl?)-^D#c596i8!e9G}NKD-m2RnQZs8t)jPtAA6q zL2f|2JBR3NmR{{0rbh=k^E{v75=MLDZSijYeyN04dh6TjZ(;J9980iTPTqohjaHhl z727Zyjwiw~7dpJrr#nMhw{c}VUEe|1cJgZ%o!-rNukYv~!t5fV4&8+bV|}9o#$1B7QVvQ^h~1ohPpA|<<$`Xa*Mbk|2q_XtH=yc*!FmX#ifvg zA?n4*L38>hPNlnUAeP>I1KI1Gs`I1OKtb^SC?nAkh*lsp`qwHm0^Sl25 D`b{FL diff --git a/version5/krpc-core/target/classes/com/kama/server/serviceRegister/ServiceRegister.class b/version5/krpc-core/target/classes/com/kama/server/serviceRegister/ServiceRegister.class deleted file mode 100644 index 64da4624d510167076ab8b7818c8a546061f5039..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 215 zcmZ8by9&ZU5S)#VL@NtFLK_ckgN2PC2!aO|cIRaYmnU4#e4K?J;75rU6%?D^cBKvtD zEN8p#T{>&3G=3`;JF)d3Yn`)OCyC{ziBIz*VJz#5)x0qU6Q+Nmi_ULIAoP57fP9Am LhTVqHV}R%hfTlh{ diff --git a/version5/krpc-core/target/classes/com/kama/server/serviceRegister/impl/ZKServiceRegister.class b/version5/krpc-core/target/classes/com/kama/server/serviceRegister/impl/ZKServiceRegister.class deleted file mode 100644 index 18c339c3eb801a0b1f6658ec8e21ea3179ece7fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4674 zcmbtYYgiQL6@I_vGRrceZWIgg0uhx z#DEh!ttmA2>B=BKpy>miM$5+TgkZPgCzHbrQtyx&3UHlaS8<8= z|Ity@U}>mv;vR;aipm}3Tj*a!b!A0Wg$pZ@D`Az4k0Fnt_HGO?Eb(jMFd^zQbTu4g z=q&cmfo%zE?(z_6z}PO~^=cVwu$ICZ<NjQHJ{Bmb3&H#C;6e zX52fpkm{#+JYJkC2qp!rC3ky32}KOs{o0^sKp9j#QLgXjy7{B}c_$C5QG=e1w!7V_2Dr%H84+56fu6ZsG~m3jaXUK?)FYuyQd}m555UL@Z9^r<=-Evy2vef??I5 zGQbC zW;{D(_|PRtp>xIHcZfoxxj2DBHoCD#!lz~QVDFtcK5siAXWFLn)1l}@%xFtr8|MKY zU}(LQkaXypK^3gN(QD~#)dJjSD2BkIJ{)KmHh5I&4RK0>&)~BXJ}2WbJkGGr2JjOJ zs(I#gFt|FJI(;p^uBJ9ZsL-A*sn!#oz3@v2$l&N>XtC)}G^Dxg5&^tZ&l#Kth*IKU z4BO_Fvy_gM*vJ)+wFKft-J%{5h@wRXb!{jdxD~)`1kvim0K@8;vC-IxbF(LozJGM8 z;LzcM*zxCM*QVzZbWmhxm|;^2>MwLobl&xd$oM>{Yc3CRBVHxz0|A|S1vU4$o-j8& zEp+i|{sC^pUsL^F(6iiNFhph!F;v~&iDZ{sphOVnfQ*BJEm=(+%}uRMo%LQPo=74P z8@m`gdqf~GbNNE-*hvckC%(W?W??k9A~t#H{cBIhUOOEdyYS)lle3eTXK##H+uSto zG&}Jn()+>4=KuY@NV?wND5>7buS4C2AAA6|d%&|wmM@XVRn@$vU=oSS)a+?2U+1YebL3?syN!oHOdSAxW}6_kB*#^NxE z^7}OzC-8Nu=v>z|idb<9fFHGOjdQT1+lf&^GRavNp2jH&-;nW5VLab7mNLXttI4xw zEo!t;V-)+Ik?}0PO;wNN9hy$+%ggnLY?jHU5|CtcQuRdxWHkW z+7jKRTL}$Oq%u02x;lHDc$F$eqY^e}8|s6NX2DqMRl~e(Xt0;-U7`+}9oMgfx)og& z&v9Y8(XUdbRe2Y4H}xP>Lp>xCpSTL_r7}_a>;o6MsmJFc(Qy_Y(UPR3Le1WiZaQ1U z>~xGyv(mObnGxhpwiv`{)Dn!LDLVd?EGesRXM-H{Cvjxd)Rs_3@ei~r5fd#5*XDhd zB&KJlp(SpY2zy*lnse6D*kygPxP01>?&rHz5sTafBVoA+IH_;YG$U&0N~Dz={aPTp zG!s8_;pg~;gkK7Zzs*oI#|<^SpQa^`W!@S?lEgi2M>xLFQrfJ910fzQ@>2gBiqzPU zv=rGT^EP%3N4WiEe0i#@w<(RQXjDQWpK5TL^M1|X@GvKSLm~ArarZlloF_qIA@~EO zHmha~atnQ`=w`BUVyYCMKP3Ex@^JwYsSYUNU52%{UrIc-&_E$IB?tA9mynKpF|pFL z=MXbA{pRDlc$wb4V#+qq^Lg9z_vovVvJ#ney+A9@k_HF;)|XC#U4zuKJZ&~}5?S8T ztB~F939NAEPvG9N39NH(n82n9l)i!T(km#RLM6i`>~PmiVW$JHo94bx*K%ajbu}qo zLtm?Fk&AV>7X@@JL=o=8CUSl=-EGGP?7~L;fL7;PPT+_55j`!VgS>_xlZy=FxM;b` zZj#d(0L!$jH&P>;#>asvJmSFHsItVLWF+{M@a)kkC=T32FtJQ^V2^NkUqTQ{Ls{wl z6VRp+1*+4Niu2OrN*}mY>HdULu_U2zSUixjSFu#+KNNpla|Tsp>hPTEIp5h<($4A^J diff --git a/version5/krpc-core/target/classes/com/kama/test/balance/ConsistencyHashBalanceTest.class b/version5/krpc-core/target/classes/com/kama/test/balance/ConsistencyHashBalanceTest.class deleted file mode 100644 index e75c2b623447c3eb2922522d5f0093c34eb862b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4410 zcmbVP`F9i775<(VM#$r!3}AxO#sW-Yn?)D{C5X`44vWDUgB-giN!zjXY!8fP#LURW z>5{Ie`;zW!O4oEr7uv)uY0~AK{*u$*`u{Zj-poiE*-qdTj-$1ndP`PO7CDw)ZqDTSqRd(4ik%yE9pCZ;=@ggGnEv8Ow3mj4){W?ZuAx)M z1K1>RpsqELeo)u4zJe)=2xze>fzk2$>HpWKyoLvx2q*-ex9|Icp=-7*WG#NS?dR3R9Kfd*x3=?83jT{bW7}RkPL&WWR z3%M&*x|+Ov}ldwoOpn zP-xzx<0u{%(23?!?Sz2Q1Sq7i19=?R@Pv*Nc(1?%4J=V0I%56)ux$%$PqI7e+BUP_ za-DqtLZF3X%}=%;-WyR zMv%bPq^YPigv=BY%&;P!5;(NRPRW{|mmZr#cHVQ#p}mSHmn^sH({RYDLOG-3{g@Tl zR7ZL8TGg~!I*%uf$FwDgjNMtg(m$@GMK!ER|GxtpXG4Q!IUub-|=%r4Q92 zL7I3>mQpYUa?N#COV1_C3+QOXUv}R0vau3ny{MxUS}(~kxl@>DxFdnVgcVPg-6dI4 zL@esCR55i#M4TcAGKH%GL(TS8o!`rcK~>OY9S&T!pe5604huZgR4j>P@4z*98hjlA zssdXYCDRb19zS5hlm#Ac(i5%bNGLb+1}~To>$r|(HVoC$1+q=z^HnFTu-v34OIFbg zB)iW?@KFsP)A4aU&tNpnH|b_(n$GfhGbkG(QcVCVD$(+m6=Dv|_ zQ|6q_Bsa$0qG?Z?o~7pTVq36iG5!Y|*X4a)wt0beUj|QAn7o(BgjJT)mTyt>u){nw zRjZ_88m(UdBa)>cc`&7HjD=TNd)UT#Ppoc?yc(MQU9Qx8?p-B&JW=Q|5hrM+vk;iY ztGvTvsF{Q->bamqlq08k3C10JLsW*!?J(1lIl%H$(!;f$5zd~BYM2G2_TtBkiqA=P z*G9KWN?xz<>X0QSTSDy^FO&t-9`+WhWwyeT*Nd_e-Y-n^RmxOzk90j4JKRVq)}(Eg z=SpU;+KT<@Js{AswWto-pGFWs={-zDM znZ}>-7Y(oIcoi$Wl^e`h&XRjo=Eg(&JYmk8#lZDg-yP-T?BB`Ujt@l!&X`WgmVWQJ z>t3x^@(Ft4Kqgk24o)#0lH&Kj8JT?Nv&j|^YaZpBqhPTmWpI(K+)4AXdRNEq@IpqF zratC4(i^o^QTrO+;Hz#8PwPR}@OObn-dU9WHR1<5XtaebhS61TWRB7t^P$e~Z*Z35 zuTU*$;1i5;@n3YOjcXU~fl&c5-bb_}=Z#Z)Z{v(HzGv?pOoXVy%}Z)?!kF5-?>43t z&ejm;PNX;E8YnL6f^YcQ*owQ>7Z9m)wt zO_hB{xzx(oF=8wD#EkMGY70?GPqUBAgf^qrkcn-oeCVKt8~nUf#IO1Do4WF&vGTN1 zF4j}~3^wA~gxd7mtNm?VZJrgaeC{+py#=4WjnDD(#nleav4D#S&7BF&st4U5=Co?e z9IK`{82hRX7!2E2U*=M>Elws>X?U5{q3Z7Uq0}GnNB$~a{=~Ig4B>0|D_2z4eI0+p HKd}9OvgckM diff --git a/version5/krpc-core/target/classes/com/kama/test/balance/RandomLoadBalanceTest.class b/version5/krpc-core/target/classes/com/kama/test/balance/RandomLoadBalanceTest.class deleted file mode 100644 index 6fc428a911e213473d07ff06cab3cd83f75520f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2086 zcmbVM?Q+{h6g_J@kv~LhM3XdWfV3pkAB{zm07)H8oi=IHx-P`Q9hV=BA}_9jEO{ik z(>wvsz+c{g8E6Ykc>o@Y;jW~}id`l%{E>F|?mhS1bMM~2|M}xD0AJuBiv*GqQZlA6 z&5%FVo@=V9Sv~df(J|LOhUsm?GQ1i?vQTVGNHc8fc3=HL>uaiR8rZS1>gCx@8&doGtqRm$c@-hDD@iLcCa+tHq~T6j72;mT?2Cl#K24)Z-zQUah;N1m%#` z{KcU&p(sw%^j z%e`*~4D$y=%QO1CZMX)3)-B8SG|#YwauhF8Wru%nJDeOB1$@}u-#szBXHDDM?GL<@ zpz=AA!r^Y%2l??*QmI^S(o5srmfvq8%BWL9#TaJKrg}0sO?P<=aeLCcMlAC&>f#;I z(fl~^80$2DG4M%I`^5nFO_TRDv+neUeR}P?FLXW-+7R01akS>pG(!o5sealKIkCGN z)SQ~CWe**l?-`<=3vYe$6(I+%(#%NE&|>tZsX;4=)-<)~dy94|{TcnIO0U3vp+y2! z`U*2}3ET9Qg9|kGYP4hclB@~e`4*DCO)mWjsq+e%-;f<)h#?7FAp(mr967|fO*Rpw z?qlvmm_H&#s6cu84f36&qO>|GO zMz@7HdBG$}B#9OAc`}~(DydzGC7zEZp7U`T9_nb&@=*l78G>g8IC~rHIx^UZ!Djy( zwi&_x6pFefV3o>Cd?HP%+nH7>=Sw_G%>x=Y8RD=)u`ARSo75AcQv#W{LPjf*%#{h5 z1KXs`k0Z)Ihm>m(<=H4MU&6 zXYgO&z!?S9(FgEJd1DTBqY5y?cLs=R4oI=ic-7t=d(UwxMgLqx3cVh2GZM z>}$5NqcXm&DSEeOD4W*6?9?o^v+m8NkU(@2X~+q@CF2C9BoqQXN9#L5{CMaV7bT>P z5txLvS`hpHxs(%l`#{MJ$JWigBu+|5h?+F}auUnEJGlUs9 zx}j8UTix$dIkjKY1?TyNC$({5%Xx3gjS$<)LYntv%;7wf_##TUxG=uY4|EU7V_Z(- z0xl*nFXIDTl5oOJ79dMVwk^|9b(5r~eZ0^am-CNP$fJfV zo0Mf&xBE`R)rJ}9tiHw@LY0JC?#u}uv>l$9+O-C@^DML_)!HJUi2PgVVLb&qyu4!n^kui@)Oi2;N{pq>Q?>vkV3wu~|Mzb9{~pxa6ju^C11y zvp9u&_?*e-NUnzaBwA;jDAZefz}}GHL#{~pA|P1dZXr%aFo}{RS&`57c;Q8=y%Z`u z6DmASgopgwY@@-?Rsg=@gQoi=`MS?&K9IR|NM>*Cu*}VX@{c~{Ns>++a;x^u{CB^d+xDixocR z>J!d9b!)76to#~haWl9E*BBwLL7tXvu@@!I1xDXzC2Ra&;|Y85&?OO(hZT5AHW7UF EFKUY%q5uE@ diff --git a/version5/krpc-core/target/classes/com/kama/test/serializer/HessianSerializerTest.class b/version5/krpc-core/target/classes/com/kama/test/serializer/HessianSerializerTest.class deleted file mode 100644 index 2dc41e73ea361f490166a85a2bcfe02cafd4b108..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1784 zcmb7EZEsU$7`~pi>uI|)R}OD7Sl2P;+OFLx^A!uo#)g};MQu~E?9;RMSk7qA!S zAB~BIAed+*0fRAt_>nBpQ48@0_&at6ze2sAw(E}DLgdRi&vQTb%XQsvfBoJ16TlgK z6o3nE2_6}J@G=Bf`E{;VxKUOwt*mNAi@|$ZH+1VPgF6x}NboTvi)OWI8fsmu>Aa$U zq1Dvt=Z?#QRA``#)_ozqMOGY&2V8qfw~@a0EjVj>)5?-Q z!-O+d&Z_A~IkiXhg1|Z=BaBgo{*vZEdpNQ@yBOVV^rEs+neQ@Q7Q>EuE$EL>})0Fro9##?xs+OMox8ER}^)))>%oZ0TyOkg`DlJf43 znsz2>&zcg8^Ja-W4yJWO%QmVjS}o64DkM?TW|3D4oMw#fU7^RiqEnKSqWxcDdQuEW z#hCTz&lsg`$`s6J*7UM&aLT9Rs7;rdbNEUOuH{)OyQ2e1=CtbaWjOM2!?5(KR?zD@ zahNd-(`x6JCNKvhW1=KQ(^~TlopqZwj~i4tBX!@xpW(#c`ZK6yxp4 zv5xm{WH%--gIPi#BZTvqBNWGo<2){qm-oq=;JDDnxY)z^fPA<~mhe9HExA4UB~M>| zsn47502T-@E3qcxzhWSxOvl&pMicL>k)t3+2uzZUMN&F&qa;mWh$eajC+Sti7-_^Y y-G&<`-7)y_0WP*vnCJoz61_CRWyp}H{c!z5rY;Hn60%?tlKvg&FOixHAN~u9rSNh9 diff --git a/version5/krpc-core/target/classes/com/kama/test/serializer/KryoSerializerTest.class b/version5/krpc-core/target/classes/com/kama/test/serializer/KryoSerializerTest.class deleted file mode 100644 index a50e04e9f348d5a1a5748e9943918d51f0607427..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3493 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 diff --git a/version5/krpc-core/target/krpc-core-1.0-SNAPSHOT.jar b/version5/krpc-core/target/krpc-core-1.0-SNAPSHOT.jar deleted file mode 100644 index 57e4489c74a986199b6696ee992ac0d369edfc7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 78697 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 diff --git a/version5/krpc-core/target/maven-archiver/pom.properties b/version5/krpc-core/target/maven-archiver/pom.properties deleted file mode 100644 index aa35714..0000000 --- a/version5/krpc-core/target/maven-archiver/pom.properties +++ /dev/null @@ -1,5 +0,0 @@ -#Generated by Maven -#Thu Dec 05 15:18:59 CST 2024 -groupId=com.kama -artifactId=krpc-core -version=1.0-SNAPSHOT diff --git a/version5/krpc-core/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/version5/krpc-core/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index 651c8de..0000000 --- a/version5/krpc-core/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,55 +0,0 @@ -com\kama\common\serializer\myserializer\HessianSerializer.class -com\kama\server\netty\NettyServerInitializer.class -com\kama\common\serializer\myserializer\ProtostuffSerializer.class -com\kama\server\server\impl\NettyRpcServer.class -com\kama\client\circuitbreaker\CircuitBreaker.class -com\kama\common\serializer\myserializer\Serializer.class -com\kama\server\ratelimit\RateLimit.class -com\kama\common\message\RpcRequest$RpcRequestBuilder.class -com\kama\client\circuitbreaker\CircuitBreaker$1.class -com\kama\client\servicecenter\ZKServiceCenter.class -com\kama\client\rpcclient\impl\SimpleSocketRpcClient.class -com\kama\server\serviceRegister\ServiceRegister.class -com\kama\client\retry\GuavaRetry$1.class -com\kama\RpcApplication.class -com\kama\common\serializer\mycoder\MyEncoder.class -com\kama\common\serializer\myserializer\JsonSerializer.class -com\kama\server\server\RpcServer.class -com\kama\server\server\work\WorkThread.class -com\kama\client\servicecenter\balance\impl\ConsistencyHashBalance.class -com\kama\client\netty\NettyClientHandler.class -com\kama\server\TestServer.class -com\kama\common\config\RpcConstant.class -com\kama\client\cache\ServiceCache.class -com\kama\server\provider\ServiceProvider.class -com\kama\common\message\RpcRequest.class -com\kama\server\ratelimit\impl\TokenBucketRateLimitImpl.class -com\kama\client\rpcclient\RpcClient.class -com\kama\common\serializer\mycoder\MyDecoder.class -com\kama\client\proxy\ClientProxy.class -com\kama\client\retry\GuavaRetry.class -com\kama\server\server\impl\SimpleRpcServer.class -com\kama\common\util\ConfigUtil.class -com\kama\server\ratelimit\provider\RateLimitProvider.class -com\kama\server\netty\NettyRpcServerHandler.class -com\kama\client\netty\NettyClientInitializer.class -com\kama\common\message\MessageType.class -com\kama\client\servicecenter\balance\impl\RandomLoadBalance.class -com\kama\client\servicecenter\ZKWatcher\watchZK$1.class -com\kama\client\servicecenter\balance\LoadBalance.class -com\kama\common\config\KRpcConfig.class -com\kama\common\serializer\myserializer\ObjectSerializer.class -com\kama\common\exception\SerializeException.class -com\kama\client\circuitbreaker\CircuitBreakerProvider.class -com\kama\common\message\RpcResponse$RpcResponseBuilder.class -com\kama\client\circuitbreaker\CircuitBreakerState.class -com\kama\server\serviceRegister\impl\ZKServiceRegister.class -com\kama\client\rpcclient\impl\NettyRpcClient.class -com\kama\common\spi\SpiLoader.class -com\kama\client\servicecenter\balance\impl\RoundLoadBalance.class -com\kama\client\servicecenter\ZKWatcher\watchZK.class -com\kama\common\config\KRpcConfig$KRpcConfigBuilder.class -com\kama\common\message\RpcResponse.class -com\kama\client\TestClient.class -com\kama\common\serializer\myserializer\KryoSerializer.class -com\kama\client\servicecenter\ServiceCenter.class diff --git a/version5/krpc-core/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/version5/krpc-core/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 7222e88..0000000 --- a/version5/krpc-core/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,54 +0,0 @@ -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\common\spi\SpiLoader.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\common\serializer\myserializer\ProtostuffSerializer.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\rpcclient\impl\SimpleSocketRpcClient.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\servicecenter\ZKServiceCenter.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\common\serializer\mycoder\MyEncoder.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\server\server\impl\SimpleRpcServer.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\test\balance\ConsistencyHashBalanceTest.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\server\netty\NettyRpcServerHandler.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\test\balance\RandomLoadBalanceTest.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\common\serializer\mycoder\MyDecoder.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\server\serviceRegister\ServiceRegister.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\netty\NettyClientInitializer.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\common\serializer\myserializer\Serializer.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\servicecenter\balance\impl\ConsistencyHashBalance.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\server\server\RpcServer.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\servicecenter\balance\impl\RoundLoadBalance.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\servicecenter\ZKWatcher\watchZK.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\common\message\RpcResponse.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\common\config\RpcConstant.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\RpcApplication.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\common\message\MessageType.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\TestClient.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\server\serviceRegister\impl\ZKServiceRegister.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\rpcclient\impl\NettyRpcClient.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\retry\GuavaRetry.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\server\server\work\WorkThread.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\common\config\KRpcConfig.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\circuitbreaker\CircuitBreaker.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\netty\NettyClientHandler.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\test\serializer\KryoSerializerTest.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\test\serializer\HessianSerializerTest.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\test\serializer\ProtostuffSerializerTest.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\servicecenter\balance\impl\RandomLoadBalance.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\common\serializer\myserializer\KryoSerializer.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\server\server\impl\NettyRpcServer.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\server\ratelimit\RateLimit.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\servicecenter\balance\LoadBalance.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\server\ratelimit\impl\TokenBucketRateLimitImpl.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\rpcclient\RpcClient.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\servicecenter\ServiceCenter.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\cache\ServiceCache.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\server\ratelimit\provider\RateLimitProvider.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\common\util\ConfigUtil.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\proxy\ClientProxy.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\common\serializer\myserializer\HessianSerializer.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\server\netty\NettyServerInitializer.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\server\TestServer.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\server\provider\ServiceProvider.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\common\serializer\myserializer\JsonSerializer.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\common\exception\SerializeException.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\common\message\RpcRequest.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\common\serializer\myserializer\ObjectSerializer.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\client\circuitbreaker\CircuitBreakerProvider.java -D:\java_stduy\version5\krpc-core\src\main\java\com\kama\test\balance\RoundLoadBalanceTest.java diff --git a/version5/krpc-provider/pom.xml b/version5/krpc-provider/pom.xml deleted file mode 100644 index db9168e..0000000 --- a/version5/krpc-provider/pom.xml +++ /dev/null @@ -1,52 +0,0 @@ - - - 4.0.0 - - com.kama - version5 - 1.0-SNAPSHOT - - - krpc-provider - - - 17 - 17 - UTF-8 - - - - com.kama - krpc-api - 1.0-SNAPSHOT - - - com.kama - krpc-core - 1.0-SNAPSHOT - - - com.kama - krpc-common - 1.0-SNAPSHOT - - - cn.hutool - hutool-all - 5.8.10 - - - org.springframework.boot - spring-boot-starter-web - RELEASE - compile - - - org.springframework.boot - spring-boot-starter - - - - \ No newline at end of file diff --git a/version5/krpc-provider/src/main/java/com/kama/provider/ProviderTest.java b/version5/krpc-provider/src/main/java/com/kama/provider/ProviderTest.java deleted file mode 100644 index f55742b..0000000 --- a/version5/krpc-provider/src/main/java/com/kama/provider/ProviderTest.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.kama.provider; - -import com.kama.KRpcApplication; -import com.kama.provider.impl.UserServiceImpl; -import com.kama.server.provider.ServiceProvider; -import com.kama.server.server.RpcServer; -import com.kama.server.server.impl.NettyRpcServer; -import com.kama.service.UserService; -import lombok.extern.slf4j.Slf4j; - -/** - * @ClassName ProviderExample - * @Description 测试服务端 - * @Author Tong - * @LastChangeDate 2024-12-05 0:34 - * @Version v5.0 - */ -@Slf4j -public class ProviderTest { - - public static void main(String[] args) throws InterruptedException { - KRpcApplication.initialize(); - // 创建 UserService 实例 - UserService userService = new UserServiceImpl(); - ServiceProvider serviceProvider = new ServiceProvider("127.0.0.1", 9999); - // 发布服务接口到 ServiceProvider - serviceProvider.provideServiceInterface(userService, true); // 可以设置是否支持重试 - - // 启动 RPC 服务器并监听端口 - RpcServer rpcServer = new NettyRpcServer(serviceProvider); - rpcServer.start(9999); // 启动 Netty RPC 服务,监听 9999 端口 - log.info("RPC 服务端启动,监听端口 9999"); - } - -} diff --git a/version5/krpc-provider/src/main/java/com/kama/provider/impl/UserServiceImpl.java b/version5/krpc-provider/src/main/java/com/kama/provider/impl/UserServiceImpl.java deleted file mode 100644 index 64246d3..0000000 --- a/version5/krpc-provider/src/main/java/com/kama/provider/impl/UserServiceImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.kama.provider.impl; - -import com.kama.pojo.User; -import com.kama.service.UserService; -import lombok.extern.slf4j.Slf4j; - -import java.util.Random; -import java.util.UUID; - -/** - * @ClassName UserServiceImpl - * @Description 接口实现类 - * @Author Tong - * @LastChangeDate 2024-12-04 23:55 - * @Version v5.0 - */ -@Slf4j -public class UserServiceImpl implements UserService { - - @Override - public User getUserByUserId(Integer id) { - log.info("客户端查询了ID={}的用户", id); - // 模拟从数据库中取用户的行为 - Random random = new Random(); - User user = User.builder() - .userName(UUID.randomUUID().toString()) // 使用随机生成的用户名 - .id(id) - .gender(random.nextBoolean()) // 随机生成性别 - .build(); - log.info("返回用户信息: {}", user); - return user; - } - - @Override - public Integer insertUserId(User user) { - log.info("插入数据成功,用户名={}", user.getUserName()); - // 假设插入数据返回用户ID - return user.getId(); - } -} - diff --git a/version5/krpc-provider/src/main/resources/application.properties b/version5/krpc-provider/src/main/resources/application.properties deleted file mode 100644 index 9312248..0000000 --- a/version5/krpc-provider/src/main/resources/application.properties +++ /dev/null @@ -1,7 +0,0 @@ -rpc.name=krpc -rpc.version=1.0.0 -rpc.port=9999 -rpc.serializer=Hessian -rpc.host=localhost -rpc.registry=zookeeper -rpc.loadBalance=ConsistencyHash diff --git a/version5/krpc-provider/target/classes/META-INF/application.properties b/version5/krpc-provider/target/classes/META-INF/application.properties deleted file mode 100644 index e69de29..0000000 diff --git a/version5/krpc-provider/target/classes/application.properties b/version5/krpc-provider/target/classes/application.properties deleted file mode 100644 index 9312248..0000000 --- a/version5/krpc-provider/target/classes/application.properties +++ /dev/null @@ -1,7 +0,0 @@ -rpc.name=krpc -rpc.version=1.0.0 -rpc.port=9999 -rpc.serializer=Hessian -rpc.host=localhost -rpc.registry=zookeeper -rpc.loadBalance=ConsistencyHash diff --git a/version5/krpc-provider/target/classes/com/kama/provider/ProviderTest.class b/version5/krpc-provider/target/classes/com/kama/provider/ProviderTest.class deleted file mode 100644 index cd2eb0aa73c6df6108cfc7b57027372f725be626..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1479 zcmaJ>ZBGV z38qH<+$N3ji-{)2HYqB`AJG3n`PhHZ^trM-OBdR?$(?)8J0l0`c z6EUU*vedO=0N)F{vKy&t534+MrI)v5~Cyd|k@uUz%*Z)#G_OSR^?a+Z4& zmgdtbkc|M;SfhG`tE=Cr+vz}BATfFB-1r2?q=^&`=x`1S^kfUofaXKxRZ96;9YqR< zEcD{Az@fU?28T*0)w1Kt7V!3MS|d5HvK$B;+#@$SHD_?vz{eKO;S*-3 z6+Yv*VW93Z;UyVv^Ai}_X=>VcYPEcBcNp|M9V{`ise)ILbF1Y=sct!oJ|zs=b^M~E zJiV_A)U7RpwEb3Oj&VYI@V@ zrEF)1&{wK1Zsd-&_;1MnbPC}K)u>B>!CgRYoA{`r2r#eSab;Eabj`q5B-m`IS=}pY zwHnH$NJ*e$%Ju6nhB+UsDp$^U`i{FAjCHk*YbzLFg~s>}3APApl&dzb`4DkF&z;S` z;JL7W4~zk;y=YhfMx3mZr+q`SH@ zsdaQ;A3YiW9X%U3vM{=iV{>B^zs89ee#KDwHX2gFd) W!>@4qHwksTwIpeK9X|y1x%zR$85<#>w z^j7ZOsa{*({CTZ<`|jhlJC7cGk(?gCa&`0D&o*!UL@#0NL%V>8geW=)<#sa+0nJ!4 z8IH$N%?Q%Ar5X8z=f;gG5nm9{RS&jgYr1@1F>+>6L?`?r4x(GYAqj_ZgfKTlGz+E^ z8H121X*xyAa5NTA{a>P=Ct%W*Nr-p~y#o3q9L3WNtqwrP>->CjnnAQ2=k6gw_O=Q* z`o|;;;5b9jHr=QgI_i>6wQ8}7h+|N|kc1N$X6Sh`G_qGBptDL*WfhOXFRErU*8Y7&&hIL0MR;AQIQylObb+XA*OxeKsyoRKhzDTWrO5xCc# z)Tp~(rMJfqZ&kkg-tFW^4}YkBx^}wv%GDrVW9X}XeY5iU-Rd{@tJm*UuidD8dHbI~ zzj8$@H?GqR@ODf}c!O6zoL6n$S-fEUJ|*ECW(ft|Cn@=zTUw%?eGzZsEdl2xq;Y{^ z|MuaTQL?saU1kW88Fwrhj(O`ir7J5dRK@L@2>}ZXhZ{{s(D=xE$Dby1%FI!FwWTye zoh=nJs&zrh=yXGDkX7^r#nSk>b{ViQX)6pd&rm&yS*RV_YDt;A%u~bD5cguQXJNWKDD*pgplX zt#8vwrZ1y!%iucLFSPOD9a{M_5Wz)SC0788c$ZEL@8Nw~x$=+jlR04GR|t{4L%*ZV zk3Z0PaUJ{5ZQ#HLddlc8BQ{jV$rEKfyMgD+7%StIS*|cW>?jQ1Ckw9E0fcDZML-V_ z#UG?yH+pdh{Y1jUID!%MV2pT_qZ)KQ*H94#qMr{4R}@3|5Fe4n5$uJ63}Ix*B3HwF zmd-xXk8%hzgzR+(1#QkYf$-l$klR+`TkfpORcSbjI);fjp*AwvM-KR3C=%Sj+;0$g aHkl`z?PO$$?tIAO5`9H_jZ>5wLjM69UHL)) diff --git a/version5/krpc-provider/target/krpc-provider-1.0-SNAPSHOT.jar b/version5/krpc-provider/target/krpc-provider-1.0-SNAPSHOT.jar deleted file mode 100644 index 95956acd740d33e4d37b9961ba3d7f5597026d4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5129 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 diff --git a/version5/krpc-provider/target/maven-archiver/pom.properties b/version5/krpc-provider/target/maven-archiver/pom.properties deleted file mode 100644 index d937b1d..0000000 --- a/version5/krpc-provider/target/maven-archiver/pom.properties +++ /dev/null @@ -1,5 +0,0 @@ -#Generated by Maven -#Thu Dec 05 20:00:58 CST 2024 -groupId=com.kama -artifactId=krpc-provider -version=1.0-SNAPSHOT diff --git a/version5/krpc-provider/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/version5/krpc-provider/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index af204cc..0000000 --- a/version5/krpc-provider/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,3 +0,0 @@ -com\kama\provider\impl\UserServiceImpl.class -com\kama\provider\impl\ProviderTestConfig.class -com\kama\provider\ProviderExample.class diff --git a/version5/krpc-provider/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/version5/krpc-provider/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 7d48ad0..0000000 --- a/version5/krpc-provider/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,3 +0,0 @@ -D:\java_stduy\version5\krpc-provider\src\main\java\com\kama\provider\ProviderExample.java -D:\java_stduy\version5\krpc-provider\src\main\java\com\kama\provider\impl\ProviderTestConfig.java -D:\java_stduy\version5\krpc-provider\src\main\java\com\kama\provider\impl\UserServiceImpl.java diff --git a/version5/pom.xml b/version5/pom.xml deleted file mode 100644 index ed2a11b..0000000 --- a/version5/pom.xml +++ /dev/null @@ -1,97 +0,0 @@ - - - 4.0.0 - - com.kama - version5 - 1.0-SNAPSHOT - pom - - krpc-core - krpc-consumer - krpc-provider - krpc-api - krpc-common - - - - 17 - 17 - UTF-8 - - - - - org.projectlombok - lombok - 1.18.30 - compile - - - - - org.springframework.boot - spring-boot-starter - 3.3.5 - - - - - io.netty - netty-all - 4.1.51.Final - compile - - - com.alibaba - fastjson - 1.2.83 - - - com.esotericsoftware - kryo - 4.0.2 - - - com.caucho - hessian - 4.0.66 - - - io.protostuff - protostuff-core - 1.7.4 - - - io.protostuff - protostuff-runtime - 1.7.4 - - - com.github.rholder - guava-retrying - 2.0.0 - - - - - - org.springframework.boot - spring-boot-dependencies - 3.3.5 - import - pom - - - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - \ No newline at end of file From a1aad652b00db0c14fb6962caaf873cdb5468750 Mon Sep 17 00:00:00 2001 From: Fez <2478375355@qq.com> Date: Tue, 10 Dec 2024 22:33:26 +0800 Subject: [PATCH 2/2] =?UTF-8?q?1.=E9=9B=86=E6=88=90Spring=E6=A0=B9?= =?UTF-8?q?=E6=8D=AE=E6=B3=A8=E8=A7=A3=E6=9D=A5=E9=85=8D=E7=BD=AE=E6=9C=8D?= =?UTF-8?q?=E5=8A=A1=202.=E8=B0=83=E7=94=A8=E6=96=B9=E5=8F=AF=E4=BB=A5?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E6=9C=8D=E5=8A=A1=E7=9A=84=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E5=85=B7=E4=BD=93=E5=AE=9E=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../target/classes/part1/Client/TestClient.class | Bin 0 -> 281 bytes .../part1/Client/cache/serviceCache.class | Bin 0 -> 2545 bytes .../Client/circuitBreaker/CircuitBreaker$1.class | Bin 0 -> 855 bytes .../Client/circuitBreaker/CircuitBreaker.class | Bin 0 -> 2690 bytes .../circuitBreaker/CircuitBreakerProvider.class | Bin 0 -> 1604 bytes .../circuitBreaker/CircuitBreakerState.class | Bin 0 -> 1226 bytes .../netty/handler/NettyClientHandler.class | Bin 0 -> 1965 bytes .../NettyClientInitializer.class | Bin 0 -> 1555 bytes .../classes/part1/Client/proxy/ClientProxy.class | Bin 0 -> 4830 bytes .../part1/Client/retry/guavaRetry$1.class | Bin 0 -> 1529 bytes .../classes/part1/Client/retry/guavaRetry.class | Bin 0 -> 3904 bytes .../part1/Client/rpcClient/RpcClient.class | Bin 0 -> 256 bytes .../Client/rpcClient/impl/NettyRpcClient.class | Bin 0 -> 3942 bytes .../rpcClient/impl/SimpleSocketRpcCilent.class | Bin 0 -> 1693 bytes .../Client/serviceCenter/ServiceCenter.class | Bin 0 -> 340 bytes .../Client/serviceCenter/ZKServiceCenter.class | Bin 0 -> 5771 bytes .../serviceCenter/ZkWatcher/watchZK$1.class | Bin 0 -> 3290 bytes .../Client/serviceCenter/ZkWatcher/watchZK.class | Bin 0 -> 2401 bytes .../serviceCenter/balance/LoadBalance.class | Bin 0 -> 407 bytes .../balance/impl/ConsistencyHashBalance.class | Bin 0 -> 4518 bytes .../balance/impl/RandomLoadBalance.class | Bin 0 -> 1535 bytes .../balance/impl/RoundLoadBalance.class | Bin 0 -> 1538 bytes .../target/classes/part1/Server/TestServer.class | Bin 0 -> 281 bytes .../Server/integration/EnableConsumer.class | Bin 0 -> 531 bytes .../Server/integration/EnableProvider.class | Bin 0 -> 531 bytes .../part1/Server/integration/References.class | Bin 0 -> 613 bytes .../part1/Server/integration/RpcService.class | Bin 0 -> 716 bytes .../configuration/ConsumerPostProcessor.class | Bin 0 -> 3434 bytes .../configuration/ProviderPostProcessor.class | Bin 0 -> 3827 bytes .../netty/handler/NettyRPCServerHandler.class | Bin 0 -> 4864 bytes .../NettyServerInitializer.class | Bin 0 -> 1714 bytes .../part1/Server/provider/ServiceProvider.class | Bin 0 -> 3133 bytes .../part1/Server/ratelimit/RateLimit.class | Bin 0 -> 147 bytes .../impl/TokenBucketRateLimitImpl.class | Bin 0 -> 970 bytes .../ratelimit/provider/RateLimitProvider.class | Bin 0 -> 1197 bytes .../classes/part1/Server/server/RpcServer.class | Bin 0 -> 200 bytes .../Server/server/impl/NettyRPCRPCServer.class | Bin 0 -> 2551 bytes .../Server/server/impl/SimpleRPCRPCServer.class | Bin 0 -> 1437 bytes .../part1/Server/server/work/WorkThread.class | Bin 0 -> 3188 bytes .../Server/serviceRegister/ServiceRegister.class | Bin 0 -> 330 bytes .../serviceRegister/impl/ZKServiceRegister.class | Bin 0 -> 4719 bytes .../part1/common/Message/MessageType.class | Bin 0 -> 1251 bytes .../Message/RpcRequest$RpcRequestBuilder.class | Bin 0 -> 2420 bytes .../part1/common/Message/RpcRequest.class | Bin 0 -> 4321 bytes .../Message/RpcResponse$RpcResponseBuilder.class | Bin 0 -> 2070 bytes .../part1/common/Message/RpcResponse.class | Bin 0 -> 4151 bytes .../common/serializer/myCode/MyDecoder.class | Bin 0 -> 2343 bytes .../common/serializer/myCode/MyEncoder.class | Bin 0 -> 1756 bytes .../serializer/mySerializer/JsonSerializer.class | Bin 0 -> 2761 bytes .../mySerializer/ObjectSerializer.class | Bin 0 -> 1921 bytes .../serializer/mySerializer/Serializer.class | Bin 0 -> 760 bytes 51 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 version4/target/classes/part1/Client/TestClient.class create mode 100644 version4/target/classes/part1/Client/cache/serviceCache.class create mode 100644 version4/target/classes/part1/Client/circuitBreaker/CircuitBreaker$1.class create mode 100644 version4/target/classes/part1/Client/circuitBreaker/CircuitBreaker.class create mode 100644 version4/target/classes/part1/Client/circuitBreaker/CircuitBreakerProvider.class create mode 100644 version4/target/classes/part1/Client/circuitBreaker/CircuitBreakerState.class create mode 100644 version4/target/classes/part1/Client/netty/handler/NettyClientHandler.class create mode 100644 version4/target/classes/part1/Client/netty/nettyInitializer/NettyClientInitializer.class create mode 100644 version4/target/classes/part1/Client/proxy/ClientProxy.class create mode 100644 version4/target/classes/part1/Client/retry/guavaRetry$1.class create mode 100644 version4/target/classes/part1/Client/retry/guavaRetry.class create mode 100644 version4/target/classes/part1/Client/rpcClient/RpcClient.class create mode 100644 version4/target/classes/part1/Client/rpcClient/impl/NettyRpcClient.class create mode 100644 version4/target/classes/part1/Client/rpcClient/impl/SimpleSocketRpcCilent.class create mode 100644 version4/target/classes/part1/Client/serviceCenter/ServiceCenter.class create mode 100644 version4/target/classes/part1/Client/serviceCenter/ZKServiceCenter.class create mode 100644 version4/target/classes/part1/Client/serviceCenter/ZkWatcher/watchZK$1.class create mode 100644 version4/target/classes/part1/Client/serviceCenter/ZkWatcher/watchZK.class create mode 100644 version4/target/classes/part1/Client/serviceCenter/balance/LoadBalance.class create mode 100644 version4/target/classes/part1/Client/serviceCenter/balance/impl/ConsistencyHashBalance.class create mode 100644 version4/target/classes/part1/Client/serviceCenter/balance/impl/RandomLoadBalance.class create mode 100644 version4/target/classes/part1/Client/serviceCenter/balance/impl/RoundLoadBalance.class create mode 100644 version4/target/classes/part1/Server/TestServer.class create mode 100644 version4/target/classes/part1/Server/integration/EnableConsumer.class create mode 100644 version4/target/classes/part1/Server/integration/EnableProvider.class create mode 100644 version4/target/classes/part1/Server/integration/References.class create mode 100644 version4/target/classes/part1/Server/integration/RpcService.class create mode 100644 version4/target/classes/part1/Server/integration/configuration/ConsumerPostProcessor.class create mode 100644 version4/target/classes/part1/Server/integration/configuration/ProviderPostProcessor.class create mode 100644 version4/target/classes/part1/Server/netty/handler/NettyRPCServerHandler.class create mode 100644 version4/target/classes/part1/Server/netty/nettyInitializer/NettyServerInitializer.class create mode 100644 version4/target/classes/part1/Server/provider/ServiceProvider.class create mode 100644 version4/target/classes/part1/Server/ratelimit/RateLimit.class create mode 100644 version4/target/classes/part1/Server/ratelimit/impl/TokenBucketRateLimitImpl.class create mode 100644 version4/target/classes/part1/Server/ratelimit/provider/RateLimitProvider.class create mode 100644 version4/target/classes/part1/Server/server/RpcServer.class create mode 100644 version4/target/classes/part1/Server/server/impl/NettyRPCRPCServer.class create mode 100644 version4/target/classes/part1/Server/server/impl/SimpleRPCRPCServer.class create mode 100644 version4/target/classes/part1/Server/server/work/WorkThread.class create mode 100644 version4/target/classes/part1/Server/serviceRegister/ServiceRegister.class create mode 100644 version4/target/classes/part1/Server/serviceRegister/impl/ZKServiceRegister.class create mode 100644 version4/target/classes/part1/common/Message/MessageType.class create mode 100644 version4/target/classes/part1/common/Message/RpcRequest$RpcRequestBuilder.class create mode 100644 version4/target/classes/part1/common/Message/RpcRequest.class create mode 100644 version4/target/classes/part1/common/Message/RpcResponse$RpcResponseBuilder.class create mode 100644 version4/target/classes/part1/common/Message/RpcResponse.class create mode 100644 version4/target/classes/part1/common/serializer/myCode/MyDecoder.class create mode 100644 version4/target/classes/part1/common/serializer/myCode/MyEncoder.class create mode 100644 version4/target/classes/part1/common/serializer/mySerializer/JsonSerializer.class create mode 100644 version4/target/classes/part1/common/serializer/mySerializer/ObjectSerializer.class create mode 100644 version4/target/classes/part1/common/serializer/mySerializer/Serializer.class diff --git a/version4/target/classes/part1/Client/TestClient.class b/version4/target/classes/part1/Client/TestClient.class new file mode 100644 index 0000000000000000000000000000000000000000..547fcc00f043cbe2fccb7d5dfb175d92f59143ac GIT binary patch literal 281 zcmZ`zJ#WH541EsyfDjtg1u?R<44jbIKwXfSA{dI;FX7Z43JD4a|BDHUfgjKxh44Y8 zPPL_Hzh^(oKex*jzzFRSHM9b}1c(X#L>Jn85NdDlD}p;M*NPA)x={1OHdWP9ra3FG zNtwxfB`a88oHlt5bxT3RU3QcC1QDWt7J70`ZAO)Ua`uuYb9F-I{xJcp*+f2U^OY*Zz*C=#@Xf8OQVPZqscj%0=Gq=XuUK?|C=B|MTDx zfCI=x(1b)aoB8=B%e=LmSVVsb|HzIfw11bh1 zs6#?V4#}|LFiwUsqT;Ox8jw)&wu+=cD5a++41sln7xasIe9AVn@gcpC5U5U?nVfD< zS=>Fodbh`&X7yYqp0q79mr3{z44OrIjT3!|K4z`zF>|KfClF}w7!wHg=hIGgGiMA> zO^zGZs6L+MN^CHn(z9c_Wy-m?7_=wMqCo3lLAUI^@&2r77@%&i?R4<1>!)h+m zg=Ic%6^YkWO`s-e>#2`;E1nE>Lxw$(PmkyptJ{V}N$M@5kkwO$NBM{gU*OO)QGQYu zDMBQlO_viza>mEyNn^&ay-HG{V^)6Blele-dL0!kDPQ+99D9lwRcRwj(gNY0RMzuS zB$=PGQpPb;I%mCiH4dUZ@?tbJV~d7O*sNky!#fz$a0>4V)UJ45^3ZS^V=B&QIE(iL z8Y?gL=#-gF8y1x*&3=}n_KR~5G`x=w1hmo@S4uOprEfmr8Xfxh`lm}XS4)?_UAn(e zx_qN_X?AJmM;>_m@XONeuNUWTYxof7R1n)ZQUV)RkQ}irecFYShN0m+co)r!zy7rJ z)qLsZoj-p0{;!8u+~kXMSDCFe^Mk+Q;=<<@wMv(6{CVvrm02lrLN89xPy$>2=PA+s zD>9rMzhI>JAZk_;IZ2|ae9qR*TyemdrWgH}>xLvc&hW+4H3B=<+VvUG3*d3SpHIfnhuEo)XyD z{^UWPa4%_fMZWWbte?$Q5MQpy%L^1F;8mXYSU$rr-rsaZHo5ZQ)9syQJi*IMnuW zaX){8YQDs<7LL!6p2B`}ncj7T#H^p-EVl#Bh1IeLD{54!7F`ZvDKEpzI5&GZC4vA% ztpgw=900C)UnYQq%kIN>JSCa-`b#>#k&6DOHvDkR0_Mx zEmDTrTb8re^GXdb-F26Ajg-?}kzT3rN0`blKfP@Ze;~Sm23o%HXDAX4KhSL52Uy41 JAeqKNJizM4`}18nr)3;ZS3*~ z{0h&2gb+gg06q#a>sC~GD@dN5IkPioc0BXz_m3k0o7ix08Fd>~T(QYo*6^x@YZ_eF z#|;ZNE!<*wZ45ghdhU$|j zmWj-sGL)OGZ3d&0j_Gnfkck-N??*zt;iH&53qcz3c$+J!@riSexT1Y3UtoG8gA=B? zibPN9q{Z3F_xAW9C-QC*#pzTgyM2*O(y@hA3u`Vs+;-vMoQpeXxM-rqu&h)3m?yjb zAPw_q(vu<{ca=(&i*+4#7Y&AuqJ96keSfxnfA$exo59^m5}`UVpH9V;p>|qiINB3Y z#;|^NLI(fr!6!f8Jmhh%OK&z?JHbDuKc+DaUv~!#?f*!%QZ<$dkBf=Z3fM271-*C2 zd}b#YhTRvn6puNdAMC<$2v58Pu`}Q+@Ay{ocFx+;i`J&2NAH{40Qc zct3$H=!&BoC*s(Qo+x?~P|+tRFG|rb#efupQVdBkEX7L+oJ1y0F%reg2~?shhEr0X zmf{sDMiV%LvvF+2xddIDmwsMN@bHBgUXy-wDaK+jbF%d;pf!1r=!s)Q| zLO~Q1loedv6$+aBr*y|{PIp+Qu-&v_I!4iS+Z~}#3MbvMY?_frj?mOa-L#61=*Sms zSHX_{OZpW(U35(=ZRBmE=s41p?&fo*k#6%;ukDHn;mE^$VGqL9s7;|i2s1vOdSx;Qi??2Lc-q=#MUR8Z*%*SR`k=ESgY%)H#+$F~gA?eO-V`3@rjdQ{(te$?>@fwO|b4y7H4iP-n^sXU1{q*Oe#pNyw6xSOJNR;T@nVnZ0E|)Cz}6-a7k>Is)GN*u(RCIlIdbMTEL5wE!hGi_jdxsryhz!wV>zL!@LJEg8pB z@j1j(^>aw18s|`+TBFWEyX(2xN0~x`vW~_zl%oP`@eH2jXDrRpKCDLz>d}e@bYcVc zd;3+&E*!u?YB`cYDBehh5%NYd5EX|wt_X7jcu#=W1jtMa4s*MV=mEEcsf$0N;`l6{ zxsS@x1yoh9nn!i&9wPIonMdtBR?lJ$=izy*-TfW+_wbPp<=Hwut$cbmaYtNGXg9t@ z75P~w`B^}nIz!Xd>uDxD!{yjK>QAdP>WpVVGO&k{gGp1p)NN&?Nq*qBVU%e*&qQ6| zoj1WCOa^h85f*s;Nha2Ku@(a+RIVLi)C!JrEe`b$bgJv)aT+~Fgnq;ydpRXy84e+S zi#;4gB_v-rT&FJQLzoTMCqMrJtDmHrq1;APMkJFLW^#ayh*Iun3J#P!18xMpcjGJ1}lNqhb2l5A}FXEstymn^9#A=DD#MoG5+ z{x;V6RvM@hw^(-m@)GLpqz7nYhqROG4x;X43|++B&EE-(FvDlj=aKBAKUac2g3#~i zt|j@r`vYEwIFtD6q-WNNEQV;HV^S~Gdo{xc2IzbcRT#oL43{{n3mhqg*B%&`IhDrC lXf%9>gOJC)>`ow4a=0uw9AZpzS0@_@%#FhT1^HJM`wQ3#Y$*T$ literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Client/circuitBreaker/CircuitBreakerProvider.class b/version4/target/classes/part1/Client/circuitBreaker/CircuitBreakerProvider.class new file mode 100644 index 0000000000000000000000000000000000000000..fe223a2f76ccc5649e97554b65615b78287782ea GIT binary patch literal 1604 zcmb7ETTfF#5dO9;J+wVQ!6GW&@Pci*)C($FKm_l!fR;e;Z7CaADCab%TN2-VFvcHX zOw=EsF)=}-Ad(m#eDYWLAowSYaked?6(68UchAnw%=gXg%zXdz`3rz9jQP=oP6IJN zTlO@@Zx>s-P*a6p+$^~_u@CzV444?iH51oygCV-}2R3li#4X%r zX!BNUu8Dg{F`V5wug%~oYg@cVrshOiQEs=gP-uui+O`yzR&GcZ?j6qV9ThSkb0iWoxS?TVzarx0)@B7>3D_!;Y;kT(&jRlVWc*Y4<^b!Rp6?s8(K zK+AY-=4!hLEi~SmXi71fbyRP(AE1*9&GcuwG-*9dl0LZU3kXJ6z@lq#O|HQG5uSGi z?IX16X$b`2fr+E^Wft`b;TWA-a2zK{L;Lzh!_ZCpWb^|(ZL6qq;WUqz!E6YWdn+zn0Y0KBvY zQGI1sLN;-0g}(hUG%>BIlJ_r!5%LrsIjt z?m) zhhWG&6Tx1my~TaP1j45*r@_qKvzSHsBj>lc9 zzvb+DJm~rqIa-jX605d*##|eaQYVhpbEmpSH?3Knu5XJCN7izDxEmH^IdzQ7-plFK zkSh$vIh#qxBp&Fvftxzg$mkf8Llzl^)Sugu`Wa%j+wn+7u23AvtOV literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Client/netty/handler/NettyClientHandler.class b/version4/target/classes/part1/Client/netty/handler/NettyClientHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..cbfc833d733b5541e0745cb3fa6f1c8c99ff54e3 GIT binary patch literal 1965 zcmbVMU02gU5WU+L0&Ng1@}($;#ZNv&s|Z@q({k{6o33pzO?uLe!f)``_@d&2 z$7g?($Jr(=#Ui2)$!2GE?wy^vlOI37egm+8%{Y26(}i>#vzSZ3z4k*k_HQLDO6O)RQgL`}KJaB5J7 zE-wscnD{#d5xf=q45Nox`_i(FM^buL!I$EN*r!Vl9xd5^wNbX!6XKTsPQOCf@uz#H zs7i~jtYL|vZ&S#!TYSYmUJ+7w)RkV*IFjLhsVo^*PhFAhE`P@jn>!_AyX?8|RnO~{ z?J&7tBRLEldxBy4e<)rSc7-YH_}zJ{76l<0e^-#Mw=hV%0oIx)`BKIoO(3OT|9V>XKVO7T?Jl2rW@dQsbtm$}$bsZac zuHl7_tO^|uCgRUJ)iHoUhS`6b9ENn;oSaY+hW^7oHU-0Qz6sJMTL$eNw|(*Q4a0n@ zrOA1cwo_W1I_ybXEXnd(6S>i`W5<|SLO%^rss;16C_)_m6C(YqIL#Zw-4@BU=hOmz z)JfPwP3)sCn(vyRc^POeK#NE_OxsmMFmXcaYrYaOk+ig+IZ8B~RVt^A(z$oEdB&$j+uv{X`7+KWa#_6s=cZ7mLVIb24u7nxqXcr}$p8kX` z%C0+1EV%WVx^I|ZMvx#vmDG4}zL}KXOiHK3Cn>38iLU~EPpDMaLgEEl6>)reCjA}p cPe`0p?087m4oy89p(ldt1QtOGQ}uQF7rFlU%K!iX literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Client/netty/nettyInitializer/NettyClientInitializer.class b/version4/target/classes/part1/Client/netty/nettyInitializer/NettyClientInitializer.class new file mode 100644 index 0000000000000000000000000000000000000000..180dc86763b062f813a7b2c9a230b7c866e8c582 GIT binary patch literal 1555 zcma)6TT|0O6#h1C2~CSsP`n_@olq_j0YzYV;iAs8m6Sr$?3c6W`_5(e*Y9sX0IXnLLjlt{^kGJYu3}b2Q9}mP8q%1{ zVIB)A7Byrst-{cd3)aUP`mv0o=wZK{4Iu*K6}8B-gaw(p}%A~qH@|e65bnr zWD_z_a!qa@aL)?%5={GbtHrQcYI4tCGPZ3?IKJTs-#?4KuPC;~ZR?Zpj7k7UE*xX*O{*zvN{wMWen116+)jnrs&(ve|I{PSN>|Q~f^5c} z64T!b^i|zc&lG!B(4pbv0xzEM4?K^X7|7!RRv8|}$}9E0(5XgC|;#nSRczzwe9U=J^5+;p?B+%VC zU{|S3#ga`bW*&EOk6}F_csR@*?dfFcfEgxYOtP&1cnt>KFl_D|8&|W%FsaYRyB;6M z6rXBv}TIuU|+~kaErb@Avl2BWalFX4B-y#(m`)1NO1TwddUJRa~Dt;%Jb>(NFAmw zkv_ac=I|Un=TNH`=vDCc>R*;{?SC*wU|xc46+`rPf;6baJVCr`#9YSxP}OL}ELD*P z!iPzziWhXRMktSmp<23N7$qyi$N_~N3Nt30LL06oo4^(YrOAqzKp<^MF^OP8tDQ_Hn<1Os?d)tI zRMb{m6~&_-rL`(pm0FL|(rlpE*4tX|`~J=H@elAv_2c(_XZDzE68P}L&b-I-KF9Yt z-e>mJ|Gn@MfbIB)hHaQs5!X6FKC$DdNNcF^c3ce^OlvrX z;~F+&M#Bl*FQ#(z9x**BrtcM__le{07o!Kn<3YjY0~$VvhidRJKBVHq8rEV`JU&u` zQ~0QckKwc+__%m{LQFp?#C%G{BN{%9&j^N}t-|Mo`j6J&3?38Pj|wXu7ki&q@q~si z;EO80q~ffC@^~_)V0mBCiAB=!@$E+=eaTqNayk`MJ1Mg}Zd(ag!TP?G;ker(-aL}u zi45duc%U|IIn%ajb@PbjCMFX>H6gTsxVF4CIA&?jmcgpoD@=*L6%mg&8+aoS+3og1h5J zI!%Tv=dVS>LQZAWPT1})y0fMAkb+Qma*W2*_1OulKQlFIIYY*1oGbLRX~Yj1jxFZ? zV#uAa(+X}0;+%4l$7g(h(;3HSggJYUn^sB~npSa+V(r9qa*})pTZ;6$YxJmPx}8NU zL?OYSn0G8vqba__%u|nLh3B6 zlx~(D^Z8TPDJfh*Q_=1`#fY5Y#E8X;1yod^I@Wy|E6sFh_OV(>9Z5oMmIWhKL3xK z(ANf&8OOAGY!T@7UZIkJY!%U6f@ z$Fq1&$3^jY9vi<7Cr~Y;R$$!3l?&<^2aIWL`!kjc5!yOa<`(O($IvHJmyvJEiJ(c5{%M7jCP7^ zKpoB4ae0R}$U-SAQ&(T_Sz&W$Bpn1O2ws^&2EiW8HKC25ak z#(CW&Vp0$*E5#H}$VDX=}SA={&w@fe;U2$L1kTtF`P&taWX!hzt$;lNdzgMbHSjXhBH<5M?ek~{%Esm{X zKBehbRLXLEOD-5XrXW49ewCZ_N)Ruu`QKh_L+!*k8?D=mHOYN@lrSr0FN%M8D#J!~ zXE6s~_yY8$OT=uxT0Ms8CY>36FcEt1E0G^H#R4Q)w0Hi=PBin|a~s(GKt+@22>6v< zCK@97W_%FIt+^yoC_5Xpc;$3xh zdF0>CQ$TGwMS#pfw)6lDsfvh;r^ztHceE{wO`#XDdAPi7FnkHO_CJS~<*i(;C+^|P zXbXW*hPcqqg)N7}?Xy@NZkxr{Ed{{5@HkA^h6&UNAv;2t?q=NHBS8pzvht=!MH4Gc zkHRE?Wjxu2F~U(!FmvG~sK!ZkFITF|I01>_CqRt2PB6?B8RpHB8OfGMF5$L|Xc3{y di=WR*xz$7&HfLoxim&snarFfMlX?o({|A>Ee%Am1 literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Client/retry/guavaRetry$1.class b/version4/target/classes/part1/Client/retry/guavaRetry$1.class new file mode 100644 index 0000000000000000000000000000000000000000..74be38df27e50156bb73705f509a9b29dcd3a758 GIT binary patch literal 1529 zcmah}+fEZv6kUfFrj!9{xp@I8P@sS?;9ZK9i=bdpLP?E})Apnt($0)CrzE_Y_zV7k zZ$9v#CYGp)AK-_GUt!#5rU)p)Br|94GyAgk+WVaEzrK6}a1&3O(TYSEZ5V6DI3^Ta z3nPfJ5GLh1)dCIEQkn_jx?FFB$?KMa+Y0U|xXaKaN`@PsX6R4bx+7+^rLw_Ip*dVQ zyIQfT@93LSOp@uGVHzUEFqk;Ub}Y*fT(SzBp*?Mw{Asn4#oa59XLBre1=d(*10HIg$>=&D_n4g+!V|7Ff$A%(s`?*6%A3U z<}{~dl?&Xd*R~)8uh=3f!7941P;KWsFm#_RVb?w^WAt3_xvgw6MX;MQM$yzo)geaa z=d!cuZDLw0>t<1VmfPlekxZSB-47-U2xqLSljkdjWVrpPZBsHV?JS%5vgI0P(PvA+ zJr%P^s)*o%iYVq3+*gsp1BRX>BpKn5%VO1#v{C0gR?~(nICW_@cCfdnVjc?$7F8_a zp;VTsv>$tKf4+Zx@aCP06+BY#Sj8&VXvEH(u=or$^C-8^0>j9E8+ZZ@L*JRv89H5V z7Bbw~G4lL54McrJiig8Yc`BBvt#jAai(K2Z^PBu-mAfMO*A&|M`WYb;UrLVEO-_s9 z+Lq~ZYIz_bJ9VtY%q}rmp&wRNFm(ANU|8A)u`Y;vu2~2%k4b9OoX*IOe zpvr^+$b@0fCx#&m97`JilQd3Xu2P37sr6#u<4ZDkixIWERl`9Yi*QK2+@>D4FM+^aI_}0j z8t&C#=~#wQ9qq_1Kps-<#&i@guEWL=4M#N;1&n^jkzQ}n@_p$Gw0fmnZ_$=cAh3R* zWO+ePI(kpnzNCk%G#P=G?Y3hFI|Sx+b{!N*^}2Z}uz0|BA-zrE2a9AEIOFziWU|mI?(4ngV55MF(z9axa6_yPgA*6KCati4^CvvhB*sjBG znit6uSl5761Sh1XPSR8MCG2#8>Xb**-nd)LOE2w(%7^+%kIa{!X}6Q5s_pvbyuG~v znpm+Nl&~-xSh=HvRw;B!7#9;791SjmNWdJF!MK}0V0qSr45UYYttna)qj{^No>Mw{ z5^iY_ISsHymO3Z5=rupg1#64IhDOm68>H*7zjr+{S*6Ip{^Aw{CdynUO6j~jRbPa1d%Pcwtg%+whP)X}3*JY(QlJZIo}ykO!*ih0Sz z%LZP-t8}$mUlX`E;xoIt0!!;8fq~bRl5gN;29AL@@s@$N@s5Uf4ZMf>$hR2xP$y8`GG5Lgv+}K!4}HIXE}aC&5^C7V|jkZ}LoFI5t?l z!knbcG>{S(@M+J_u4y)KOG!;lp9ed~SZa3$ft)B&;qK1<2C@@(({7TJgV|DktOxq7rTXiZ)Y;iEH)XH zaGymi<|>3_k>WtZ2`WF+4s~XXbLe(;Q>B*@)VxG#SH>k`X5!UI>gdCERPt+ z;#oO1sMMHc6ZHbsyyGEBU{6(tS<5VaaSkTY3NnZ$K#qg`bpN!8`yHmTa=$id70YsH zjI)gj>$51RYjiEtG%AMd?kya$tRgoX>(t5wms<7I@VS96@U?;Ms-0eo>)6kyrPw-lfc8& zww*%qxHfnH0`Vg^P3YjWB|J2-fqNq&z@^y8H-S!ck&2f^GnuJhL_^)1 ze@4?3=2eh7txhUvX@~X`TBo2_u%KlMMg~4bW zBg~r#Q9<9z8-4um#wKzi&{zqz+lpv_oiR5q6w$CPg;0G2y=Nv z6FZ31F}Mt=mAjTzMXWVVY&K1bVCwLa5|QDmJlNJ9+IfV;ZJIM-jwaa{r-@Q(r1CbZD@y5m)c(5*~_eg^1$0lAe&MF0Q* literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Client/rpcClient/impl/NettyRpcClient.class b/version4/target/classes/part1/Client/rpcClient/impl/NettyRpcClient.class new file mode 100644 index 0000000000000000000000000000000000000000..5c75dbb5ae2e9c7dd848231d7c277ad3590955d8 GIT binary patch literal 3942 zcma)9`&%4m6@F(~m}Pg8;Ub2 zUd0PhjN?TWKZ|0MZ`aRNyd)K#kjpPrye#*#Dqe}A%_qL9;+HC3Q&5w&G791;%g!X7 z?9k4W$&{7J2z#%B`a#Qb9oN?L3f84eE146nJC-a_llzP3WL_ywi=3OXto#AnDo|o$ zS;83Bb2*Vsc2%%YXoVx})21OhDJpCQZK=F&yZ0wMvnDCYiqqu4LS72jwVOH9-KSuC z%k7J`9#s(Tw9-Ps9Vs&>`U<0i!akx8W=SCmhMqmD+opUEh+%iwbQEl>yu;2Lfsy8D zKAY^5$n+O!G%nipgdy^-Y2_%}&@0?wD}7kE^-)1bNs2ilm+lv*3c_&}bQL`?tkF>` zm+Tdeqh~~t8Uvoat-<|EaX5KiBP5;y(%l8OVAG)ui(}B~$HM2Jh#H6}XspUiwwe(! zrl6_JQgF>|vcq+4bFkowN5vSKBDU~NQLyQD%vC%SPwJ=jWLD2*l07mD>_XlZ=@NX> zM7xO7#$~j6P)cq+ou(bcxGCkSX4X=(a0e`7M7SOPDH+4Vmc%~pb9n{~(4AaHp5-l@ zXG)KP)s;yxmMIcUH?sv~4L9&lwyrWnhXzjygGCVpC1`(TJWB0P!TRcP3p!q-r2FTsX%L-cV5u<}Xj7em4pIYY2lZQ)%$XmZRkDkghj#@6Ko zNtPLT{XMtA#x6)54rLXzROG-iBb9arr;nJ9VNn4){(VciF#X78CI}!p*y8St0rIaCT3(UM-&HkV~Ky!e3dcPvjuTzs9IF2 z%hHpu&RMNsS4$a_MOUyes_3ACHC2xIZNLyKsH~O%0DfiVIZ|D3&KRYPb1Hl7Lhs6LwqwxY7p~zh{FdFl z)ZHcbmzP!feU;A20lSn%L8cz`d2ZJtY~(M5?NG3TKPnpKVCV0UMmc1?og;*MNKSq3 zHRRicuX5kbw{Fry+@oz%P};VBgwSP=cMsQ<+p3x)v|iIDR>wi6yQb5ES1%hcH;_aW)OaS3bpaNNvK;V5t&5&G@>E2eTYzS zMskd&am{C0F^!c9`0TOX5kl{_Ni_6v`O-t-D~NAj6`sVM)3}Q>tu|3Rja7W8OVn+h z#_AA`CF-WJMuB&JEWY*{5_{A{T|%8kV~Etd6^_uRJ&^^beVKP9XjsX%MC6jxJc;$n zB|6qmvFr3U42jf!G;rO9yBUEk#Qy*zkRty59N&XPe}u@p#Qa&JHcqT22+S0rxlYMh zbmB8~dFT!i&p|v!YA0$bb%P`1^5+{{yu72xT;K`Fg)ay+=t&K=~g{s#S4J#bYWSSMhCr(5d)N zF{mkWMeto5r>xALVJ|~~_V|Wt*mzY&b`v9e&sE$zgJwQ$zKS@*a|QQKV#}v!j<-yr smHQ0Zc*-DeJ0|mu!Q$FTPl2_(p&4;(Mia5zg%%>yN{;XGEQIg>A7mSeb^rhX literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Client/rpcClient/impl/SimpleSocketRpcCilent.class b/version4/target/classes/part1/Client/rpcClient/impl/SimpleSocketRpcCilent.class new file mode 100644 index 0000000000000000000000000000000000000000..b69db85733e6ba07fe4b594e7a24aff6a5d0ac62 GIT binary patch literal 1693 zcmb7ETT|Oc7(MHoVx!=MkOT+P=F+sb2~kPX8&F6~a6@B5ifLLNg}enNwxmjO+qeFu zbS8nBGSlgEe@lNure{~S5e<`R?U`Ne_nkf8WzX(kuYdmozlD+C3S|kVIpV^g3Je$G%k6tW^iRj^FF~p4F03Wba9fBm>N1?JbBX z@V!VfP$AN>1s}gj zCX`7;fgArNE5W8-Or65oFOCdi*Y_CD2!}nm{uV0TCZf-_W7~P&vIBi82EG<3wf%nR z$Od~YaOKn!xTBpK$5CXYLo|6R#lg)yeCg6OJJ&6I~LVR%~b|hR5d;A zQAFb;N;OyDa*8MApg5+EY0?hGGWK)m#&THO#q^Vq7#9^P|3kMQ?Nd^`3!Nc&au`n+ zIzY3)fNu`34du8U+K$9^K68_x(2?PvGUGd#QA*P@b%klJXSmwooaJ1uA41e;Um;VU zd4=q68hDlC1Rq6^EJv~;sm4k64lUP`ZFrYo>Q~lbg#J>2GE4#}s_0;3Fq<2=If(i< z=?b(pj*#1_zhuyt$Q~l!IznOR_5qAToY^=+QGJ&VF}9GKn>~OzcYw2%+yTb_M0p`! z$-ijPKOtU_6Jto1|2EkOKgU|u&OFX&KB KxXUqvd;b7)@S_3% literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Client/serviceCenter/ServiceCenter.class b/version4/target/classes/part1/Client/serviceCenter/ServiceCenter.class new file mode 100644 index 0000000000000000000000000000000000000000..e7b41a33ae38d4646a26c7f099b6d9818334ec68 GIT binary patch literal 340 zcmY*VK~BRk5FD4b0SXB51`g>3gTyT-RD^`o0!nV&jI&DJCU&viNPLY058zRVjZ#r@ zS!rfxXU6{i`TPQKi?akL2~Gvh1Nqiyx;H_)mi&jnbvj?ER>@k~N*2)@TV>OpvJ~Yb zkHYCS#k;cf6hg)>3yMouz9_F6isXa9WM}-ujKHy8l3wQ&yMW7dzEM8jNbQ=&S-D^n zRgug$I;Zz7g_uoW`NscY28G*tO%JAKw~L}LJtNCuS6y3ywD+9VhFQ5w?-lZ&p6l-4 o_x!dZ9mfI!1O6FcFcdhzknxDoNMH;wmEdqs9r1=Mb!tq00o&JIo&W#< literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Client/serviceCenter/ZKServiceCenter.class b/version4/target/classes/part1/Client/serviceCenter/ZKServiceCenter.class new file mode 100644 index 0000000000000000000000000000000000000000..3aeb2eb0278eb441cb5a9c18fec6a8b3780cfcd4 GIT binary patch literal 5771 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 literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Client/serviceCenter/ZkWatcher/watchZK.class b/version4/target/classes/part1/Client/serviceCenter/ZkWatcher/watchZK.class new file mode 100644 index 0000000000000000000000000000000000000000..7032b83e08d31cd3c674e7c8cdcca8912cda9d03 GIT binary patch literal 2401 zcmbVOYg-dX7(J5NstWPwtx4OQDHEhPvwfCYLRHe<3Fvw3DW+WxEF zyw#`vfc_{S-`U+j2)Bpk!_4fvGw(Tj=FB_!@9jTt0Lo?xAysx{&2$?NXSU6zJCWazURwrF|`6r#7h#jUz9t+wQzBh81BKNe3N`N%8< zk-1KQmc}hLmmyPbap_H&B|nqtM@?7AC$=R@YKnrHwVSqglcAD3AIj~;N3xJ&b?>NghX zBZd}*S9hw*T!}!FD93>RcEwq3Rk=raXLIFk{)C$i-mIAwPuk5|(I?pAUR}}I_m(y* zRNL2z;l|MdNnzP7;f6AY+tQI)zx%5tTAuART@8y2$rg8|SoX0Oj#0iRaouiI?{JS7 z$2JclowPa=7_Oa&ac3O~s&mT{uA7~loMbqY8}sw@7&I|U4h_5$%_%AMiqn>sn6uUX z8sY9tC|wPl#d`+c$FzZAoHH6U zwy@}&U)+V8S5BAhmM5w^zG1ljKZT-#u+=8hFuXa&Y5Qu)euHhE$WjMvS1~Ztq4n(W z4OhNw*sdpSwk77awjV;%GeV}3cnA9p`TZ)0jiKar6<^Jzx2di zkIFN{%#rDP^ynN?a(zvBK><+*bk{s#aid*#TMe7?j~-O|4y+x+ib?k|pW_zYHosB5 zBCz0UVz|FZL&x zN>8PT+CD!zgaoEA9nQ>zGn1*)FOm8SOsUa5eULbPLa_+_fjUEdibhH5)vu5K9?jk! Fc?Zu+dIA6d literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Client/serviceCenter/balance/LoadBalance.class b/version4/target/classes/part1/Client/serviceCenter/balance/LoadBalance.class new file mode 100644 index 0000000000000000000000000000000000000000..f4aeffc1a5c50c66428da7030256a8442fdf822a GIT binary patch literal 407 zcmZvYO-{ow5QX2gX-!*x!h##HpqpAqERc#=P>EIeks`5o<56%G66Cl&919M>p-`tu z7FA(k*)wn6H=gM)bj?-%GGk$c1xZqX(X47z5&aTzb<&0cqF(0eXn zGz)3^zARUqg&~2^lMMp>h|otQ(LkaBVJMf9)5DQSBaEfAlO}+qjt^3zpEUKSTcQ(Z AC;$Ke literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Client/serviceCenter/balance/impl/ConsistencyHashBalance.class b/version4/target/classes/part1/Client/serviceCenter/balance/impl/ConsistencyHashBalance.class new file mode 100644 index 0000000000000000000000000000000000000000..ccad7f500890d5d957daa60fd347b7b72cc57707 GIT binary patch literal 4518 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 J;>?GS{1-G!NWcI9 literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Client/serviceCenter/balance/impl/RandomLoadBalance.class b/version4/target/classes/part1/Client/serviceCenter/balance/impl/RandomLoadBalance.class new file mode 100644 index 0000000000000000000000000000000000000000..f28f54b6ab1c93829d314773f28525f147f38ee9 GIT binary patch literal 1535 zcmbVMTTc^F5dKbE*tV=(S}0z?D@wVP6#)f{s8mt3AQ4026Ce;5)HK@13aSu9tA7!-0SjH^gW7?yBN!U#k4ux{!ODgJoJ3_~Dg zX`G=ht($zZn9Feck(x2c5=mQG)tFIjUF^%ofHS8T7?SC{YCFA3%Fwy#CXp6+M?Xl!vORS-G^OYNMVx$smKRUk@ioFTTG)?$8}T3bb^NHn~^ zk`V%{pWx1%rA?`}n&U*5x)GYzXHC^9+LU5&FQWrt4rD12%Srb#n#v%RU2yNpbdSp< zD^IDZ8aKS?@U&I5vwTb!w;0=Z0X?EaG9ri)nZ4bTa9zd?+>|kjl!RL{Zext0+4ZYP zI9k*VjoS=OTVLOAt*>vqd$F~={Oj4v&DS4)u0EG>2Y1Cn4G(R;eY5dud1L8=jC;5* zAuVG9?F>WzJww}ty9GVS%=0XbMb9DND&~-(c89z-Sb>86lv+mbg36Xm{=^wK2{;fR z7Y46aUJn)v4$qONRiyJKZ%}kgnWA}hXll8d6Jw|5^W4-J5(i!9zUeBrlmc5Q;a`q} zj^(`!hQ|1QM*@ht%yt(Jd_naZB(er0p%TKa zCDcS@Qc5^dLM{75VSYDN#D!=;(5)(pUV;{BJ3Z)fT1tWwXrc5$bfFa|sn94+;}m^< z;}$K2d8auZZN%0i2yV+S?v9(Mj4 Nt@-e1U2a9)e*g~4Ya9Ro literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Client/serviceCenter/balance/impl/RoundLoadBalance.class b/version4/target/classes/part1/Client/serviceCenter/balance/impl/RoundLoadBalance.class new file mode 100644 index 0000000000000000000000000000000000000000..8d045a465d485c0cf0cf3b103092477339a7097b GIT binary patch literal 1538 zcmbVMTTc@~7(G)83uQ&D0^YBvr6?<25fGJnL+d4CNO*JUPGHG)x7lt@^vNfU8h?OB zV|ddyH3~ta@!8)Y2LFWd%x)Fhl4yL`nfbo?=6q+)ob1=1A3g&(jLQkMqPq#Jv9B5X z(bEJ22Q>61P>=3L98~imH5_il5j7u8;28Q;?QsqL8U{2BYB(X#kel+nq7)D#3E@(i=L?Q;-7C3P)-$c)C_5mal?wzqQ`u?rmT8m%+cC0s zF&OBI5(JnuMg!k=CwZXRv@Bm1i>gAPwfc-ednMJ|h2L~Lt7->p;fL6u^|B16JnNe2 zn|aAA@P++rmb4k9;Kp=b!gL(#99qQI!@x0hSNHRkrC(!WnR{LxMVw)^oh0j?#1G#PYciQ zFV4*TxclJyqgUTP+|zLeXVq|yN_>Czc;Vs9!jqRe&f|iH5giw?TgN42DP1)(<@#T5 zRG?j*n3g#{ch5hdE%TQ^OQogg@S=T(s?qLr|8l;!i-F8@!z-~*Tl4_7XI!K00-8^n zd3vM4EEJ?`3G83#0c&2ZEG!RhPL0%BVrjcE@FIf?tV`7v5@2n3kxD}JL_yJWT=Jfj zig#t3NVWm&;BTW90&DoilqvX2iE~YlaBOGP$GqU2NY6o}WA71r!zhLhmE#Po;)xcl z=Sq(%u>l(y32ee<)P*QdIjhG5}n#cvWOo#v{09(4i*hHnx7i2Ct4G$gfIG^)*6 zG$j*U&!Tx2dbdi=V^s`a(DIsCbs>i&yMz1_WWRy@`^jB#X^;Aqxv(>~U@JLo<6gv5 zWwtZ3gPD540NBYdhFwf{VmDVxfFog!*IBxE0}E7#r9R?MAAvpCyM(%jg#xL+qjmf{ JT35&@{RlJ=s0(dJgxc%dg5ZwJr6RZaxWve@Ce-} zaYDP=61gmX#57&0%%Ts6->-_eInL;_5;qNa?+4Hy8x8_SpKYLpI%9O>9$pZ#A~YBs FL|2Z2JGB4+ literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Server/integration/EnableConsumer.class b/version4/target/classes/part1/Server/integration/EnableConsumer.class new file mode 100644 index 0000000000000000000000000000000000000000..49bd6f659b43660a76f7deb9bf7b10dbf33b60d5 GIT binary patch literal 531 zcmah`%}N6?5T0o3YW=JB85>X+|%Nu}(S7Bmu|0k|SefBB_1=*++-0v8FAcTBtZ@^X5NP-^Mzeu)yoz z-v-^Aj)24El0Z>}j+rOR@lK2hA0JFoWKtz~^w~@HEJZR)Nte;j3G` zdpAifmF^e4RFONA1Ec~;YGy_>eRwGw=_sFd-+B2qb3WM+v&<43wEoop&RIZxp5onb zjG+^7G~ZeXb{>9HfPfVqtNf?HRb@I?VU5=o?|O`_BWyqoHp}t}1i}_x0pJ`O9@IV9^I%^@k+-ipwTgE7^6?N&`(IGV^t^t z2mRbQo#4IBG^3ZsSf`w}CKGVnD>*V&CX(t0kbQK>8f)4Ds)dSkHgEnz^=+)f2@Aab z-A&NF?g%(sE(sJx=$Lu39Ph-K@bSSUMJ82(2cNxU&r&3_l(dOPq!N6w^ejVb9KO26 zyLXe+Qt5utOBJ~@IY26qq-JJB(}$O`k&g0N_nnt-Gsks^S!Rh1T7T+)=PaN;Pw{p* z#?T2knr|%xI}g7pK)?!*RsK`psxqCcu*PePcRj||5jLO(n`QY30$~fbVQ1Ebu=@qr CMxvkq literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Server/integration/References.class b/version4/target/classes/part1/Server/integration/References.class new file mode 100644 index 0000000000000000000000000000000000000000..33a1bf93f23a1230563be630549e84291aec0641 GIT binary patch literal 613 zcmah`$xg#C6dbpdutV7wArK%0959u*abhVFQdyK1B*e)ruTe^BM~+j(uW{f5_$b5+ z2a*F42itn%nYYaQ{CfWYaEvt%%N|xdtO`^DYtmR?es90gQv)R zQ0^ z+vQcE#HY+#FAwp|sBko#MF~6xMvA~F17k&CoW&DNE@2W={O)j~X-+Wngc6~O+3cFb MdmwRBg7a3HUT!E}Mbv%w~4Bq+iVk zKY$;~c$WlrA4quEZ0?!goICg2zyE&!0dS1n0PO%f0p1HV6K9J|V155!aHXb7rphF8 z> zD7K7AU^TRbxfs-?pvb8^PO0RD!1B0=ugUki!)~u1o!xr%%d?h1Yh()-(-)nx)k>Jf zBXUz6(_#5)fvvDGUQg(!&NUlW&&~z5Ym=$_d1RzqLY{|gPE}g4>+ZwcX-X3^KAL63 z@O*SOJQdh^nB@!@vVsUPavW#0>Rm>RW;Qb; z0VYm@Ko`>(zRuo)lbu@;B)FpETy;u=Fq~QOTnnhuU!?rgBgPR8iBC z!xDBLD=@9qjz~Cp6g6HEGdZ|g=;ct?>tAadUn0n34W@GlC1&%O!%>N262~PTmpCEN z>UcGQ;)v(h%)qH`o;F9kT21-=0@(rEwZlQ`^zLq+HR<7z7^V@YgRnBYS(6y)v)IVvop#c z^MY{9_bMs~JRL;Qs)m&MUS0X2t%7kC3gmYltEjq0p^Ka9O_L$5yoXWSmSaC2`4QOG zGcs+>S*ByTHS?j#X;lgPQ86BfpYJblzfllsG8*rRrEpAN`_yr>{nIgE4MxmK${Kd8fZ14; zauSL3rWYMr-_#X}5NNB~%9#=Q(MKu-URS~Jn5H=&XY(oqD( zDAqi36|nBbd^ujf#F@^NQ55??-yoe|Hy&D*Bm1m+L@m-dV(@Pyh9sU~0ZIIpRY9gp z{7zuyJ{2DJrp7Fvagq&;=K4T|JKZ_k_uLuYrohIYnD2Fc^Hr^Q)bo#!k-jpOJ7=bp z`!)3o6gI87?>1_RqSZJ);iVfz6T{a$PTs z$jrlRUB){r>sV-73#uj^H0!J1!0ouh!0&OA=`!#n{vdGcvbEXd7E^5CDLif989Zy? zIh-``JYLXc7Zvt$wP4^@+$OO0!YilePyOjXXV1@n{9^gU6C2|7{HZ4|y!AQP5-%Ef z2`?LX1*Zf$nxtAN3Ing|$X~_f&r{L?*JYdq0dY1AQpHIiuY<{ejnhF!Ej-GTszSPK8QDKLwIE-s5YE7(% z8+v-L)@(ZLpjkd+z6zoS(3yS`V)Wh#b{gV0wFNdWp_b}VsbXtdv0+KV9AH}`AUjXo z<8>XgkM>OHezG#kN$R!bj_p=GfqT;)lfIhrc;)MrNHnTWU-DAzO~b_JyQYUEo%95m zcdE%5MosvDZ|PU5mB$jeGwtN6k!7uVUAcT?*m#=+NsgEHxu~dnzMj$d|d zoU_4lypt=Fzd}pY|6TOksv%lNDKoh9?fM2<8fYEeSk9C(UvF(|-J0#ncD4Nx-;^?4*-d3xlEq8| zZSUb+Jj?zQnR2cq8<6GplH^`al=J7&e&`G2%Z0z8P&7*IrQDaeE`w4*PaC+toIj&? zON9njmgM?UzJXOG*-B#?oJWzy9UB_xEOv3w;N5z$nnMFW_!6ZSoWZ8p{)bnyxFKcn zR92k1xMlt4%-U|)aF~Jsf5BgQC7CGO6X<3NwjzgZysUef=Q8d=KL#;?9k`EH_hSr0 z{AAuv`<+A>hRdA*58wp$;3W1EZdmUw{w1Tik+VHB>AOYD)@EAb%JAtXk! z{DWZMMe=7UjQ{drmsmE6hv=}qg)xHBY2J=88!>OUaNVM1m-BWaN>_Khxo}W{{TL^J uMr_jy@T3P8O6cY&2Xt1v@gKP9910p$q{^t1ct4}81qbnS{_5g-82BG7pr82w literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Server/integration/configuration/ProviderPostProcessor.class b/version4/target/classes/part1/Server/integration/configuration/ProviderPostProcessor.class new file mode 100644 index 0000000000000000000000000000000000000000..7d3ec55e073a61ff1ef78b487fc5c9ddb18a90ee GIT binary patch literal 3827 zcma)9{Z|y%8GdHjWndWuK|nA@lNebSb=7K;0wF z;@c{oS5Q^3^9q`VZ6}{`3sZ+rWrpp1-f(&pG`NN{Z|00q$DTJQ4M#!ea8Y->gPANB z3@1|z7yR#tAa!eJssN>{driyq`iLgA=cI!8fIVr@|FCHpBXhG8 zhBKy56gWeeIlXXFcTD*XC*$6<=_=@}^kQ0`k#}^@w5?3ewx-PdT==yb&ZzBr9On$z zwI$pg#qz{aW6E}nA%ZgXg88g(M!`d=;Zyp&o+;>7KJ(Xpx^?`!!GRn;n1O60&Cqu5e0}Afnn1+yXicu+% zckH>M0+oB=k|YJKmE@i+t`fXutF;kMbW8DPYFB`9*{luK*nX|@8(>0mm{g!2We)f^K z2R4AtOh4mg^pa?1Ae!$z8ulQqAYDr=b%m z4d2HP6x>%~AX;DL#9|g`cmd}$bmNB_dgO5*b}1PA^uogO#ml!YUi#N3Z{51Qc;xGT&QH)y}?7zYnMxc>nE9hBJKQgFy`?`tYXcy}{Xdd{<*vzbz}V^tmH zih}O{uN0uqh)XW?Gup$R7&j!<)vK6GF zenRg%L`*vYii+RfqdX9=oGPR*$HPtXaQsNlg-0@XI7G9B=a+cIKD> zV{3Sgs@_4~R-Aph@rp#0+XIf|`GQ*x>pY~yjQrp_SIu_Ilfig#edlHK>YH~F{)@m~B z)~Hv|Wy3xuCEf460 zLe}&Qo~rMY?c4ZSFCGPVf3_U%VWQWg3OhNvm+uZar+BOGkh72PCOP@|u7)D#C!byX z>PMU-pgFw&CB1~$_=l)kK>SZgT<3HQd-;@GJ0Nxu4}Xz_p$6oEytZmFbJM`XrbRWqS{F`dx&R{Xhw)fa6TSj z32_n?4&ie?_EG+FIl`zC%+Uw%AkjDCQ9Ojt)5}g;=;o?;=;VoigfaEfnnWGQKTP>P z&eTEq586~bqEfk^6T;X%^oH3uDr>H4hZe2p-c={$b0}H$*b}`6i zQnsbcc@vF+I5yE>GflQJGKr}*&<|tU#Jw5BG5T0_zm?-JF!I3P5o(A(rEFOCA2=Q{ zrj!U$FoZ91T_Q-x2O48i#hjAeeIZ1@TQ;p_5v?(#KSpA6XTu`eVtAiFaAc*uYY`n) zxb8b@MLV`qPx7dPOoCh{@i60flq-FldxQzvUxL#?R)+~sK<*BK3D+u9Q^iOfYVc$U z&|#k>(%H1_&$#O&)GcBAc+=ekw16ESp-Q6W$<1ew!Y$P9pw1{~V)znH@GX2~`Tngh XrQjXBhu;v|6u)K5^8`N)6Vv|#V|p!O literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Server/netty/handler/NettyRPCServerHandler.class b/version4/target/classes/part1/Server/netty/handler/NettyRPCServerHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..8dc2646e9dfec5e67f943885ba0b2bbec7ef2aa6 GIT binary patch literal 4864 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 literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Server/provider/ServiceProvider.class b/version4/target/classes/part1/Server/provider/ServiceProvider.class new file mode 100644 index 0000000000000000000000000000000000000000..94a1aa8d9f51de81a006035552f3a347ed55b760 GIT binary patch literal 3133 zcma)8TUQfT6#h;Um}D{(iJ(TUO1*JW;*~0(R;gAhq6I}!dl`};42C3~476TotEKj; zy-Al3KD2$Q5A9m^0#;qiAJG4yt3RPnwcnYUge0JKW#yc+&)IvQZ(ry9_3yn00Jh;f z74pa3=GL3sbE+|1SjQS z1~DS%vtgt#D%Gch$b^x_+X^fd%a9Ah#+W=FSMZLCcX3X^c>#YalN5+_XRKr_mm1nO z66?++lZMqUP-CWT!y3}##!)LXZYB&%pt^fRAJ=1Jwwa0@*0baa^_j`EZjV`p!1mJ9 z4wp>n>13?Ww#;<0y=dpi;D`~o+jmn(Ae*sl0nx?fa3;rPq=?ZI<>fiU8aLxcuaPu! zgeK6^oz*RSbF7aCh7~J2ceac8rA?M@8{OupY0uiUwN#1ZNJ)-Z)-yZSTP{RRl^tf< zw08?EYM6_)tFfP^bY>ECN_DrHHhRWJ2Mz0(KA7STy&cz6{kmmJ+S?4+!)8ukeJPj% z1Zg2n$)hHK1&0lLIFmT4Tl%O$Z%}x#$L=wA<>M#NRt(bfeCbUx*h$)MX40|VY}`}P zE)A*i{JJ-t=;uA;5U7Z!^z+Q0nj+&nQ+h5(WQxaM8bo zP*q4xmyVpC4+c}h1sja(>0ZOO&N0VMF=D0uKbOtNptf8~N0Us?x;fh2{i;4&kDp~3 zI3Z+Nv7!`QP;gN}C+$ocw&zBHb;SYjGP<$ox`KCVDK#hGSXvE@rJj1mG!1sdQ(mI_ z8)PumzRZ{vHx8IG6Kg$u`Lt@0)vaL@j%#Q_vxWvVGRCtte^Ad2(_js2uvTE}Q>)J$ z&8A|f4tZDPi&n!1Y!ujBBKj=GXlOx9!vx+_@VdtxLm4xWe$aX!sbH6nvuLQ+%f31*{fW`sn7*k8a+3bmRMnw%v6ag$V_pYxn|J$>eBG8+NRVLtiF-*0A>`5|)w6Nsnz-a81LP_)5dq_=bsHV&IeN zSi!d%u49VjJPX{-1%cHiD&{ZH5PEZ5x16VOC$=- zw~7pfhQeM$wmD_NT49p0!YcJ_)<`D=HvUiAyXw6dQ9Nj8@EWdwE>EA=d%t90&;tfvhnLGrp(KH1B^Ks3-Qe7yRf zcFS;u*rUly19<$xZyGqPERsK|W|FrSOjx_Q(%_tn71%1Zu$ zN-UMN#g$L?3J{O8UQe1$#aXk%I5Qi9Gqb)qSCE(GM7}MguE5V9u&L<|L{sxLd`-)z z;cvQ+z`z|;Orw%Zh0EYHLR_j`hNq$Z>S)}`aRuL1z;ZsdRzSXtp2I3ciE$0_#fWel zPgl8jU^`k#@iy80h(oRP&I?+dfd6XEwJG( z7Vz6!!MR4DwK5uLQ=-a))}X&NR2QlX{)l)~sS9msQ|}`};0vQF;4p(l zZQ-UrP#Fz3-^F4-PW*-?k*Gs04S*-1X!t&s4RGb--+u?odEN5?Ooqfyk8esp1R(v; zf-uK*2x2{IXhf8D)zhGMS~|c843Q&8d#`ctI(;wwa)uropjX<+6DDUL{~dgq(%6Ep zrmzdU9bZjh4_=~Eg1Cykl<@PON$f)>5kzs3UAmdkt>;5@KMv4ouTak-^1FHuQm@P3 zMgCWLwg$e(1g0uDq@Y{DVFf)3j&Ky51jF+WQG1cuMS(s13mnC3Ze&RN_yZgV(tRs@ zxJ}aM_@mOnyxp-=q99wrrZ7><_)Fatf`ruDOY?=3lrhdSIV$LItz6?yN2BI4cp8H^ ihU1=ay>r5Bimdz-tA58486tj5Il7P{r20wuaN(yuKPNFSUEe<` hD>b=9975Q~8oNHQ_70RW+XBa8q5 literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Server/ratelimit/impl/TokenBucketRateLimitImpl.class b/version4/target/classes/part1/Server/ratelimit/impl/TokenBucketRateLimitImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..93caa1e690fe10d56996a2af751a62b860828923 GIT binary patch literal 970 zcmbVKT~8B16g|^!yL4%#w0wi|p&(t5)r4q_#t4ljC9M+Lkl=%H*iK;SZrdzd5`KV* zKfpH=pM2y+kZ64H2l(jkF~&2cQD1m*C%Jd-oqNwcXLi2-`uYvPDsEe_FlXU9ZlsXH zyfzEk+|*_6-%`p0n6=#McH<}=vW{Xd4Z}% zGHA1ILm>IkYkJWmfy82|RM;j)u~k_sROo~k>dqz->J14s=3~A8!Fo3Nm-wic<_MJbSc@ovMnzN zW-BV%Z`C(tC<7I#km!ATD(Yeg#1{)M1WYOlRWlOEP>S2A$aas9Rc&=bS3UJKCb(1 zrSbaz>8&0gMk){(?5VBs&s99%*B8!v*uX5`fdzqn81&@M=U{32^y^wd*Hf5&CalXL zPd~({fjAd1ZhwZbzaVyw_~aRksWT+(sdFShc3XyNCy=Dgb3~4Vh6p>%Xar*zr3Gd# zfEbN2A|zLa!}M-~yBH?9PsJE&Fp%{WuChS$_(5>ZW6%DC1K1dJ21dOXd1 zT%E#r{q`M-f1_XsCNtyR`it}%R{2K#6?-+pNFO?}2m{Dh<8Vjg=59;NnoEW}!(d5Pe6CwcFueNr zcKt%Falhi0w32=$Uu!QMsFLVx+=xR{j;fi7? zoZ60;f|l~cYiamNcT4KDxM)xvj3UV}dO6BX-mDU=gJImXvFO0XQ-+m3!;=c>>+~HVErJC7Xf{Za93#sHEII*++$mV@9FhG~SlHy88Wj zz5pySiZO^WBt(_h&J)6PJv$I48}=7-+G(e6?AcY)SknrXH^TRH^T0wLKP``!0bH$YVed$_7H=NGKw70f}Pt K1PT2{LGlHgfGns0 literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Server/server/impl/NettyRPCRPCServer.class b/version4/target/classes/part1/Server/server/impl/NettyRPCRPCServer.class new file mode 100644 index 0000000000000000000000000000000000000000..1474c29f31fc05503a6ba007224edbfca71a3e3b GIT binary patch literal 2551 zcma)7Yf~Fl7=8{USrWD_2HQd}SbCuWY1h_z0eZ(m(Lj-4v0kd1%{EzBcH?FP#c`&i zAL>jUFF(L9e$p8~bm}Fw?Tq@_-(mG%sL$D5LV(b5COK!%d!F|>@9n(jkAEKi3g8rO zDma&d!1*LD;9?s_Q+NfJ6pW>izOv+)Z9ak_dhu7ON zgPbIrRq#d%PvdF|dvIRCTncaEnpA#E!P^Sn5oopDqCh(9dPS{b-#9g|W!+-Y^hN}B zR7`KlGR$euU9t+MCvY@d);<4(mg9!$Y2|1mST_Kv8?X383dAxK{Z~1Sx&@PrS<5k} zs*8Eko7M9+B|O;B?W?+H$#o4+R;WE5mXTYY+hf|HCuOz+Jxhqo>wjVX5rFJ!z}xj>kt<6OIAf- zaD4z|fEWjBv21Ho(z==HQU1d4NUgFfgCHgZl6kjM8TZ^Oy~%7g%b|Z$mV0T*bo{LA zmIEXilFP2Q5UFj;`MR+%sh5K=F`FzICRo9{0v(g4Uvdl6x~DIi^nkX;D!$9ZS~D^M ziPM&2`DXda0aS^$c^&l3Cle$=TyFf&zW@G_A(FsbeaJF{I$S ziudro!0sTke|`P=<2&E{{r%m?U)_Ct=es{2-d3Qi$iomgSm)g`{VEEeX(#K*RSPPv zv0(aIWJs8sTp){TLB$R54h*lW?XcK_ae|SvbldunsSX?uIU2+&dhm>NYD7f|mWp{S zD6my5!jbH*g0hMaK*wjT*J}N@b)e z$A!FXM~2_na#W*a*@erxQ?O-+9B*QORAv#TIdzzZM&elBatZ>6*g)6(S*_`aGVF8o zrDs#suS3XYu;R#jl=&ZI`fzUfM->KEK)XPiMZZ&Yo2Mf%fV zLDjcx&2Sx~>UnH@THT)=LBRz5ZdNL@M{Inc#+V4#BV)2?vSrFQOW;VeOm5U1K`&px zJ$xVcqJ=ZB44>c@d51a2C_g|%3l0L}6Rs6XzkCF7?LJy2qj~BFw5DS<#2+C+xiTE< zjtw5Gp)H-PA@w^FkI;T?;3uf}v8{&fbKSAMHSBnR4)&RNcl-gK5_o{L94ML_tf6y` z>Ya1nqEB+wu(MH?9!{(+yA!|Nqgh?Jjs-sMa=t|q7uZ|mdXiFAp>SPe7Zk*@=$`~}_2RX~HV>r&hw&7D~c#gsCAnOT!wc;fA_oDS*9vxHg zyijn8KX85_r{Klyc!_|xAOrJ(modbVsUf#q^M8*+OWD|Ae>qm4;Ru(+R N(5_Cd&IGoe{SRI{ruYB= literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Server/server/impl/SimpleRPCRPCServer.class b/version4/target/classes/part1/Server/server/impl/SimpleRPCRPCServer.class new file mode 100644 index 0000000000000000000000000000000000000000..032682c93005d87969def77367465381a04242dc GIT binary patch literal 1437 zcmb7ENlz3(6#fc^X{K#NK)?-maTwIb1vd~E+|U^$4AF3Gnu@f{ba#3h)IZ?C#KfzK z7f*UK7==UpJ44lqj6V8}u##s{vhSV@@;GBsTjF@P{c>@;=Tr_Y=U}Hr_i=HbdqF~XR zl>!Izp%cYN?IPtevcp6k>HRt`8WL!##6$|DvSWR>IgJL&zBTXpa(tmYBcmy2rbJ15 zK5(7VZ71^7eodIJ1n#_~bzA;*n`sd&z-2pq0IPvY73%3;Yas!>i(jPjQpSDA%@I+Pd_Xeq{yJ6~`@&6!!( zc{?YtsUYLIV0OZZoU)8%#4xE!9E1XmS(S?Pu;+X6h(In|AN`-%R90p&ScqJC)l*69 z{*&Ahl_;KfJzq7+u+Wb#1EUr$;|g>B<@uB9;}_Luuc}X9S0BIn{Qi-Fs}`=|x`i>^ z;2E@=lH=dCr{*H*%nIzQtNdD~?g!DleTPGWve1FeD%edm=f}mEM=i6=zZlnu z1&mOENKqn+oj`1`d2z z1_pY03k@7ZmbxZEAPDS3j-xtXzur@}#6^SVnAWU&H4jU##abk`AlW8~8R4v0n7I|S h=K9|u^Sg(3?Lj4ys9#)7oo4ZqPX{Z&=S2rU@&mr2RhR$( literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Server/server/work/WorkThread.class b/version4/target/classes/part1/Server/server/work/WorkThread.class new file mode 100644 index 0000000000000000000000000000000000000000..73f08f565379d69ebff579f458c8b047075afdbd GIT binary patch literal 3188 zcma)8X?N6Q6n@gqG;Ii7fC>eKmbLBBjwlpqk;TeV?PjNfh+8^M+t8WGkYvi@iaUxs zpt$3P%LhPZigJ#}&;AF$a_~>6&zods5-ioz(>Ig*-h1EY-uvA9=J&sT`4zwhd@p0D z3M-LNFpLKjNZ2c5pLlstK@|JN@{o)J3UwY9+mDFlQ5lcPcwB*o5d~F93Kydabc`uj zg>fO95R0MUAST7Hl!7!e3QS~W9Fk$luoXBMsX`7@l{l>62#$*VW5UG~GM<$2l#Hh( zRM=*6Qgg+nd!aXMH?Dxo*X?p4@WZ zOL`Vf%dK37Yjew936XA77}xX~8NEN39?`8~Z6rm>yk0Y@rS@u;A>MsqxoO%GmU?gu zGd?hKP)|AoIVYQQ5{{*7Y2n^9sI=q;rJhVsN3pWWA^lKJw;5iOk34Cn(`F{#r`xtR zuE&RpDs(!>HL$a0#wNHGvsidKG?A!S@1aO(neq6}BS}5$7-oih5obbxTpiAtNGVfy z*t90&`?w5GFr-nc&rLX5arVTdt*u;$m*6R;tB>h*T^`!HKrx?el2~2KUT`fjMJa&bBI(+ z>&}EZDq(Tp2+KQy1rd8)E;A3vc-H0TaT(7^sP*;+HH)Y4K<2b!i;*#$trEI?xB=RR z(|uEl3Sue=GiN3BU4|fIO{p5~A}_@0re{V9s#t@yGM-oQ0$xzresuc7q+T6iPu%UftZB(1>Zdb#R^Dhbfs?nx>K5M_nXcxGnW}H zs*pu0-b75rTX3`Kk87zN$t0UBpb{%NDOA0OOia4G8rCe5y{OH?%lJaY zm-vcf;@X*?ul;!X+KKbm&z=19)YWk&uMNcjl1wP zZ1B54P&K$CI9^Rh0V+yZ81NI=V5=@Fxe0E#og#)*Azup$9>SAj&SA@N^ny}-aFF=Z zMRNJ1I%(jaG-PM4O<)`%&m(wG*QAQ6=%xoP^E9y;_PpF6jv3mCKe+I$am#u zG#p1It=x8E+l3-^gKxc`IUE*YWKSzDN1oeihRG)}K(8NBJ}&y;l+S zUn`~|_pQsL@;6lVx3*0~>5Rl0B6-Y-<)NNOWiOvKm*^kZgig%$pVjo-#^0?_xGqHv zZpAVzCz>Y8SKI}g!f|GC6}E)7Kg@JoBY4-Ag9&%@ubZJ& zbMGEn2s9noiCu19fF+RrX1by>cFWi!qesTQGVX&UqZfTVE-KL%^TPXRz)KOuW%L8o zv`%A1YwR-0TGw4h-6e|3++tR^sjhe7HhQW>Xf-a;L@7l1T4*6osS^CFrJ$CkgRZ0d F{{b9`TI&D+ literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/Server/serviceRegister/ServiceRegister.class b/version4/target/classes/part1/Server/serviceRegister/ServiceRegister.class new file mode 100644 index 0000000000000000000000000000000000000000..8df473203a1012674f0d477e89783d0e21680787 GIT binary patch literal 330 zcmY+A!Ab)$5QhJ0Yqz#mJopd_Vi3IT$%`OVD_!V4W`{MkX3He@;XL>NK9o3XQ^i9j z{QnI9e97n6`v-t)Obbj391%vsjgN_iusoZs?ADsK4UMUi_|TL)CvY-%TB_E)aJs2$ z;TX%=#!9*}70Z^z_>i~}n|vG0V&gj3J1)BYqeGj3QPJoY*a&#^hisIONB;e2mLsq6z_6LD)!C z;hk{&NCw~{C07nBI1<209Q5O;oG0aQdl2u!9di5KLA(cdR^h#PUl8xd2Nc{DL>=x3 zkm3jZ_)q{J#@+JDN937fLEM9n`f*&ry^`n0{J1ZOkK+>oY{w`4_>`PKEsuXDfY0K7 z1rG%9IecC&p9tU!cu>I?6?{pcJZ{GXLOr$<(~|Mgorkm@I~FsXHi61$+%zm#fJ@xf z6MA&a(4r|vcWp--b@U12i0zDPU73|VxdmRWitO7rcw2wR;9g1lkbYR#;<^>n23*Iq zVmz>{%eIoPZn;BxJY@(}M7jqf`~7%`Y9$j}`mI9(zAk%&2QKR|Eu$|rF>E-4 z`f!{plsT%$hjho3@7YD4J7y*YuI)+aj@zsa7|vnC(UP3Zs1Y$@X42)mIgyBK2X2zP zMaxp@ezA_370Yn7Foyvc>F9qe_>YPgFw2-J2(fSYkP#&g8!qVBY&7N4 z7*kMAB|5i09F`el=LJo9VkrHY5l4Y!>vPq`aL36^eQ*JLc@2C%7GTES) z0y4!z;9z|zQ+nvk)|X3WSYG#e1c^O~eP;l|;w8kFvDWS1lJ)QD&3O z;Q}rz^+dw3MyPBl9*ast;iBKQb6{La#)W{+m#?M^ns1RXRCv^OWP%geauH!NNrRTF zjM9WI{k$aQyS&2%9WE~6yc3wU++?k-|yHigP0jTL${ax z9UBUFVOFPNR}~pAUzN1NHD>kx?#MuRV6eMyP+&uGP?b7QlHnqfi(6UgkEP1T^n1i~ z$E5gdIOhd)N#4cq$h&Tb6elS$9xEi$sO=b4S z&DLJ8t3SZ(;OSlTy}?G`v_@@)Gj-c*C*4dxtMIMgmidHV17WtaG8Hcjvw~#BNyq!t zkohPPH+lc+V#{R1b8E@AuckmhEL(Hg)cC1p(%|bW4?eC&xM{9M_R-9jdVrYq1H9*i0d}pdDAEi@U2bEb&Hk^Q{^h_TWtv zNMJ9*+@oOPB+4l&L`8Do%5clV4Ug)!hAFHk<b8fUOs-~rr_ zqr0UbK6Nb=?yRZYN zh=)gM=x2$C7wGdBiHHB9RrrVnY4&zh^4vkZnR`C&ti?^};S-IVb%lKD_0S@p`mj$r zickG`3;9M!V;OueW9VfZ?^H0b4uf*3oOi&};5msy_Td>P;s9rfuACpJn5SDq#yX8@ zG*QLJyjxPM<>W#v@)wH^T*Z9fN4<;&;kl{O+gic9@8DV)Zo^kO2e>-QACyj^>i^5PR=@xN literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/common/Message/MessageType.class b/version4/target/classes/part1/common/Message/MessageType.class new file mode 100644 index 0000000000000000000000000000000000000000..ee9f611a1f5144af0131e664a19c992d5f2c5a52 GIT binary patch literal 1251 zcma)*ZBNrs6vzK}ywT-r zkXWzlYpW}Ioq?O)j>W*12$J7?+8_$U_{)n>;s=J)vDyq1h2n)0_+q$Mx?#K4N~g7L z`5VTzL%S;>Y4sJuT%oaN92jNCaGPa4@NKtQEnY-Sw&9tEvuXIYKt^2d8ZE+S|79{{ zmaSmd+gUSwiU};A&Y?7|pes=-6saIQ*tKaoUb9_0m}j{9A8|`d#Z3k^Z@HaTzPnwj z>v;Z-?HUe4Qn#C~5p;Z#!V6)1qGmb~l(r&3rAK0&P_^^VJWq{Ob+6-_)-zjFkxmpg zTQqq}R8hlaag7EvJi=p!(erMGh9NxB(2uN!F;vB8Ttgqy8Zt;T^qsawXk?I0$8%}t zfkLrI|LXRhWd@{fwzpo3j?r#cd&2&7_biq227B|OFe=-^4Bht>{V9B5NT>qHk}#Ty z3DH1iSe%%A8A)8hAgE{Ljgb|PdI`eT1n$e=%97f2yL9fh^dn3>{F-l(nE0Yy4x%2_?w>0SGq;blTaVt6tl^s%; zyg-&yj#iq?9YZONd_?^HUko*53=&r;>N3PgR746@r6lAtzy!VhRIuA2;0_Wfpctua zP|3tI{S|yGn~} literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/common/Message/RpcRequest$RpcRequestBuilder.class b/version4/target/classes/part1/common/Message/RpcRequest$RpcRequestBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..712f1e2860dbe101fceb4ddbc9e738546294a5e1 GIT binary patch literal 2420 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 literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/common/Message/RpcResponse$RpcResponseBuilder.class b/version4/target/classes/part1/common/Message/RpcResponse$RpcResponseBuilder.class new file mode 100644 index 0000000000000000000000000000000000000000..f83201ba2f17592de887636d90fa2dd77dbf1bdc GIT binary patch literal 2070 zcmbVN>rN9<5dKbYyDh7ff)oU_C~8|S6%hrwh@eQNRRe^CpWAj*mbAOgc5C8WX;L7O z#0T)9jC1xZWlKRwe{jz1%$#p7-%R=Q_t$R#FOiR60P|t=;}t(%^J9S@ixS>M5W@t|Q(Zod z<~94!EPYiiwW`^gMOkE%o({Pk?iPN_izV3T7HTlp)?DJ+ZSZzS49;k`VcM#9C!kxb zV1X0OFp<0&foPO%Q?#3glwMph=8;{qVHLGaoljfTGYd1^S;0dj6x_q0f;fg04CB6n zF+5;M+%#DH?G{7)a?sYOdM9tj6WMi0@>N|?ki{o{Y%@fr67J5fF!W3%&NtL?%F#v( z6&YDd!7N@d%-xiwH;Gne(Tkh~Ukr=MY-jsC8Zn6;#W~Tm-66GB(+py5+B;XRJ-7%a zRBjqX-zeY0>&;de0ege~$U%z%UG?jSh%!u3M02M}Ifj|5DhS@X0?tmWf-$Fp44#vUcV*pWWatc`gLIRc-K6F; zshB2$r;x60y-0hg#T;#qi+4o1a@yCvJ2`75`m(SG#i7j;zFr<%HHi+B&iw^9Yd0c5oAt#;qMfoQ6kvt>wj5kR>Cn zfdB>ipbuI~Y14MdbcX4drXMmxnIWQ6W;*Q`VE8}M$M=3Lh2Ob%C9P#;;)%z;_uPBV z`Q3BRYp*~3|6l(G-~fKtgA|_bK@z1N+=^A9$}&`BSab1=%vA?9nM08YlT=xk;aM4; zli_&>=LP8n8D5m(B@z9uP%q2yiY#As@Vy=kB6RV6nSUU|4_&A7?Mv;IWMFE39lgwN;FgJ{v+BQfoWzi)2MuZFiz6e_E$mGZ>AF?1q!KY>50ud;ovSPo9E zuPz4FGyY;pU#C*=OK1IRQP$CBYCZ^8DodyQs=pe9K~;S5lwT|<>>b(Can54HrT1(> zVQAt1F;y%V!@~;QBm2(MfN-TqJ8s#^Z4Zsi#{3jTDYj$c65D9FlILXRHaLVa zjhr&I6;KIgXIy7F2u%=pA7)e!*HNsP6!cPuwAx0Q`wbx$ z?kMmG>#?F>SHcxtv62;go5k6yw_|I~meMlC*=P8zjbu}R*KaWudKW^!@btXDrlZd` z#KyroFZktSVjjsAzqVomYM(kiJAaHBTMcUKrI5Uq1EPiI@*cj1H$40T-|#SsH$6wmcV_Mfi4`PRQK zyz`$6Z~yz=i-n-Kij|3lfc>sie8KdlF=I%3UoJi* zt%JHkiRUfMkT#wZ-hT4LbNv>TQ&dZFGeyx<6tb`LUhE~C?)g5v%hZeCbD-lr*@HSL z_qK;L(@~jii$_QtTONKNeeKGF9h6PRo#5GQdmSv;-VQR<0Yu?jn2RjPa~78-bcou6 z+^@AWMxq&#L==)JImN{a^EkN)a+CqzDx_2v-=H*w`7RMtxF4sYWD;wQm4xhTPn>I6 zX^M1)kR~+}IyIVyNJA7fkA`Uw4(;EiXkI(9b1 z2l6&W2J(rlEi#FZkiLZ8tes87gfe-DLYcgqbwtRGgq$ophC#9F0uKB33x*7S4 zIIFKYfY||_N8w7;7Pd5i%+jl8UGx+b$NvhFUjSkeO6mXr literal 0 HcmV?d00001 diff --git a/version4/target/classes/part1/common/serializer/myCode/MyDecoder.class b/version4/target/classes/part1/common/serializer/myCode/MyDecoder.class new file mode 100644 index 0000000000000000000000000000000000000000..593de604c7aebf8ab2d073ad10aa21e2621c6e26 GIT binary patch literal 2343 zcma)8TXPd-7=FGq=_cv6)Rs^Jf`}Z_a#%q`Z7E1ffNBb*31Gp~HrXZ%$!^$ekl>Y! z!#HCZZ}7x8R z97Yre!gv!0Lx^K6%;S)x5+NMMksywSF^;#o@HUbPCW1H?Mi|GX!lXP-D3}Uk1r7v} zlFzh)lVSAZlzcfY)!ymCG|nhEtKeOM&V8n3y88t>VuPmy{9|_35Ll5kE#p|FIAb_z zeWpN8U((L#g;Tm?%J&A-@8-?2z)-TJJMJzmV;76IrIif|70k|O=#pNEm0fWKdY^PJ&{Z_bWj$x4t0iJ4 zQUX0KH0sQ7iy^SjcI(KIeA=Al#2t(Oaa9{qT2@ynkVul=Op zoQm@(5Cj!Puw~Y?0H3N@u30pi&M=x1r@gRU%~}}ftIn9>zGz9UNH+CA%UP*^U={!6%L4Q?~{_!maC$Iiz;^GBL$aK zRB@Rzu-rKn*w&m)j-(t$PB$ml8@;qWQE&6cR10WJ8*cTk)*=P^TR}et(m>N|`=qml z97E5h^0vdl$9dzB~F}7q|yQ#+Xw9#(rj)eXSntKM-LpX;8Y?t zdHh%^(T;Jo>>5QbntB^D;z^drWswZMNGtWs+S#;Sl0pS`NhJ2zXw^&WEv|lgZy^-- zHmAUz*!W<3?9CCE>$Rou7`ieQ3D>wqusq=8!epnci=B-RE;&|QEqbYBSXqG`&x-M> zup1pocL8ab6Bl&tdPV{(V}nmAP;!8h%&1lU=4$Hkc+F+bGV57}(gs&Uc<>Bf#A^Of z%8w76JgnvUJl`}v1)qVT1&BM|^*WxN9UeW5a5p~Ft>dk zzPpHdKaC2$~=O1JfT1&a1Wv3&S>ZF=zfUsbYIs3)Zcj5y;q4S zzXXSa+oQpG^qi*NL#&uyKyTl3^XPks{^@9N0V_$*BSM4G&S)^=zmHWN7!K`-hVEm) zhto0#KV%MZ^zvNATvqdpGU7GZ#KboiVgx^E*U@cH<1TV+Ze!Ac38PoPR`c z054+~g7g%o#48B#&&+>VOKY#v+Fo+H;rk1l#ot&f6o&gcS$;Zy1HgOyDJWJ7YAZDDq8Xl;#uhg)rV+;>9e68Ud20akI!>i73 z!e>~@*SRm3Oxvr~JlE_VnYE@B-7~w(6^23K+TMX+D5vs{XSzblrfDB@*A-PW+nyhD z_n<2LtmjH`B3JTH`7hk8a`(vG+J7o+vP7Qyjl)CXn`=!e)*6Q^=`uqi8^#~aJFeJl z)b@p6;`>#4@lxKid9}=m0PQ=*ggkZvhRiusR6MiL%!R;x;t;px3B!BiCx=>aq~3pr z2pxG1$uM;$BZiSEuZksMjaAkdhAqkMX9ZsG@X&K7wx~jz>kDktlLHLb3+7D!-j!83I;Z@rD5B^4vGx3XS)S;A}I`5%IOluHIxkO zV#`1odj@_$(ZG**VqgvxDpOyeD3?BIw7;+n^O3Abhf0B@>;qw&9nd9D6`&&nhVgDS zquf*8yH=|iNKs>$XxE*BZ~KlbE$IthBN_EvZR?t0=t#(Hl?PO<@l?7;FQJiq+K={! zV$kX;aMh)^Qaw(cZc(*6J)LifHS1JSt(e={%~>Ue8~yTlTeF_qghW$N!%mB*((4SD zqvZAXBWbPdyo3?M{lwx_;<d zdo;H&viAptkK;0p8R#@#q46q#`j8rN8n^HfmI&rU+{6Yxp>CPO6Qt;t`dME;C~~-2&B-wlRUgK5N1ds2?yh#?VYU zVdO^jM2aVk16EQ`jp;d4z84Pz&Pmf2*g25Zb52JzX{FOvCTbf5rOb0iE}EW=FTV8K zR%Y=vCQw^K3baNBru8#=G^J;zqK6aHM$(D3jrY=$!=T}u zv?hl2oSrruBggZ)3BzY$S!BHTU|S_UD&5!9_ULSufiCqS_N8>&rlZ2-@1TH^GfvMK zwj;2%Jmf*cw)H6^I+9I}co0e{^qgVPk*0B<(qeD|H95o1S{a*0*F8a zC+pIlLGP`#yfzG@Sf6H}SvQuhP2E(qB<|?RQ-gZeg^^S)&$cT_kU=gnHq!ek!|~LU z8H`;qm#PrOtb8MPApQO&(NKjoS`9! z34zsRBziQX0_!WPrWmUnEhyH~8ZxkGxuV|w_~9Y1 zRvNN6tsw`Na?Rtt^a`cHL0ZEM&S-cWXEn^?oPu{WoX5KYD+`xDEPR>&bN*uC^J|4q zFBGnR^Vi(PLjL2zg=-4l)9^k%5LmJ3^~g-dG1JC@vq>ZCm{vw$N0|pDf@ntD`4U576=y&#=|1d^0fClCTg8T5Qo?wR(OiyOm=-mJ6*JZp@f%wJ zG?;deZJSdWIZFF-R$8FhpG*(ec1%EH#@Sj6vG0vk&acc<%$Jm+0^dn#=y2wi;%tpn z2vdFq>KMWP(y$3k>Sjt{17j&8QCW+Yrj(o;QdY*~55DAqLJvGZi$Cb%y)^G@+W4&P z7|c(#HN⁡zeXy(czq#apF$S(9;}fO)gc-k2%4z5|m=glo_IwnVE{UjbSaq{E)KU z_~{LB=ltUOG~c4!1^3{l>k!}bp$gA%4Y`L)u$s@B2f!Mt0iV}lJyBA4kb5=vy7uau zsG3Lh;O6i6>Zwq<0}ZIfQdi9y4_Z`1A#A|2R98#fbJ)l=LVS?v=O)mGO+2ENs$K-? zJaA78t-8X!z@Jnt|HAx9_b;_K2Ixa@9--R^bOyqKJd|5EQPUZ$-W6&Ig@d=g#u0g1 z+Y;K|se~05!RI{GJnAlEZ8%7n6yxD-XbaeRenjTb;J=N36cTd}uZ9ERU>;9}14DB- z(cV~JvR~gB3WxG&_!a6rmh!gOeRZw!ym7%~OW4IVN^1)3@z0u3#RcBQD0#T zuCUraVjHfb12?b(zhEbRr}Q7#&7|(Z--zKKbm0!V-HJ^@rOs|jZ-&DAG3wY#YP91t zHEp9uyZ8a>z;+hs3UNF5Z(WF5Bh)J;Sh7;J@3}RWrMgF{t@OW&b|eF;@d8g}M4qkP zl=O7Sr#-yufqEaS6m&k2YfM3xxQ|{1FW!ZA7r{Hw9!R1n=)R8#j~~*XfP$A4>=l#( s|2349S084 zwJ=ak0$qzyR%yHE`}XlOv4*RGUH^X5Zih1T#muu>tb@YHrV|```wwm3ZaRVE6LVi+gq*VFQSw3M9(WRgGh!-E1798%TT6dmP1Xa)3Fbno#QsOP!;A~6SS)_TAWW3 zkS$|?l{XHYAiBy<;AOMwb^W@t?n?D1o~_+2(b7T|QwlSot}IN9pVUiXs&9`#l14%J z%);l`weSU|EbQS+3ttK9SpQa{mKMGi({$ey2TUX+kl!d|`##S}C=TCRuu)TZIrIvp zTx-~!&XyOfd)?N4tZOLEo&VL|Y=m?4h=oGwKS7#**bw(qw1$k^^XzFp@@n!PJQUOFd` z5Pw-rCZFVfKm2&^f=0(HxXkYxQTVabIkS&AUg569S#eGmPN9C|Lc=u2f$-484A)lV zfUCI19g9dfExh~}Qb_acZMAs@ZTA$ZtuyGm#Z#o0^sGL6f`P1l0;70>7dB-z$d&mE zOtGH8ntMz*6GhzS$21iNUSK%j5(8vt8O1op$aR9DCvk)P^W3dt2x z9;fX(US)<0q;&(YaYb@H;<9=jHyKgmtsIdwMkt|xS;n5DXBOJu1lA1{4cszNGPqL) z<_8E!i4^aP0A>DRL;^hF%>ka36%!xcojt{+CH)MU-K>6!k)?DteS#OaWE_=*$0YUe zaH9B_5Ekhan0hpi_arEg7MO;{6fB0Eq}L1yUnk|8BwFBaj-=-)grxoe27N|w2X8X% zxiIy`urB2|^>Uc76uOMJD1^q}d?-gMjJ||riX|dUi3kOxLlH{Mofgc5Pf4iF-cnz(vp@me3pYFP%T6`6>$g>Qc(&>sVY@Ht({fs5ZjUMB89)i zB{w80@dNl#i03556-UeJ01oiP#%>jYwvGE$m^nVM@la4nbrPs? z@Kp<%PH&{XD0i%)q5IJrX+JycoOcEFW1U^ZgHI|^q0V%Y3e4CW3DySshJM>Q?;dsj zuOTRT(@ayf7V0!rLwz!xu%A8D*}^lO&XHh~asPUpq&s~Z5BSxA!lwSu? zkiFq1oz7{QD?*ts1+XkG2DkWDDvU~kDmiWr>r1L)V1t?4bGn8){R-}&0Rx-#W1