├── MyRPCFromZero.iml ├── target └── classes │ ├── log4j.properties │ └── com │ └── ganghuan │ ├── myRPCVersion0 │ ├── common │ │ ├── User.class │ │ └── User$UserBuilder.class │ ├── client │ │ └── RPCClient.class │ ├── server │ │ ├── RPCServer.class │ │ └── UserServiceImpl.class │ └── service │ │ └── UserService.class │ ├── myRPCVersion1 │ ├── common │ │ ├── User.class │ │ ├── RPCRequest.class │ │ ├── RPCResponse.class │ │ ├── User$UserBuilder.class │ │ ├── RPCRequest$RPCRequestBuilder.class │ │ └── RPCResponse$RPCResponseBuilder.class │ ├── client │ │ ├── IOClient.class │ │ ├── ClientProxy.class │ │ └── RPCClient.class │ ├── server │ │ ├── RPCServer.class │ │ └── UserServiceImpl.class │ └── service │ │ └── UserService.class │ ├── myRPCVersion2 │ ├── common │ │ ├── Blog.class │ │ ├── User.class │ │ ├── RPCRequest.class │ │ ├── RPCResponse.class │ │ ├── Blog$BlogBuilder.class │ │ ├── User$UserBuilder.class │ │ ├── RPCRequest$RPCRequestBuilder.class │ │ └── RPCResponse$RPCResponseBuilder.class │ ├── client │ │ ├── IOClient.class │ │ ├── RPCClient.class │ │ └── RPCClientProxy.class │ ├── server │ │ ├── RPCServer.class │ │ ├── TestServer.class │ │ ├── WorkThread.class │ │ ├── BlogServiceImpl.class │ │ ├── ServiceProvider.class │ │ ├── UserServiceImpl.class │ │ ├── SimpleRPCRPCServer.class │ │ └── ThreadPoolRPCRPCServer.class │ └── service │ │ ├── BlogService.class │ │ └── UserService.class │ ├── myRPCVersion3 │ ├── common │ │ ├── Blog.class │ │ ├── User.class │ │ ├── RPCRequest.class │ │ ├── RPCResponse.class │ │ ├── Blog$BlogBuilder.class │ │ ├── User$UserBuilder.class │ │ ├── RPCRequest$RPCRequestBuilder.class │ │ └── RPCResponse$RPCResponseBuilder.class │ ├── client │ │ ├── RPCClient.class │ │ ├── TestClient.class │ │ ├── NettyRPCClient.class │ │ ├── RPCClientProxy.class │ │ ├── SimpleRPCClient.class │ │ ├── NettyClientHandler.class │ │ ├── NettyClientInitializer.class │ │ └── NettyClientInitializer$1.class │ ├── server │ │ ├── RPCServer.class │ │ ├── TestServer.class │ │ ├── WorkThread.class │ │ ├── NettyRPCServer.class │ │ ├── ServiceProvider.class │ │ ├── SimpleRPCRPCServer.class │ │ ├── NettyRPCServerHandler.class │ │ ├── NettyServerInitializer.class │ │ ├── ThreadPoolRPCRPCServer.class │ │ └── NettyServerInitializer$1.class │ └── service │ │ ├── BlogService.class │ │ ├── UserService.class │ │ ├── BlogServiceImpl.class │ │ └── UserServiceImpl.class │ ├── myRPCVersion4 │ ├── common │ │ ├── Blog.class │ │ ├── User.class │ │ ├── RPCRequest.class │ │ ├── RPCResponse.class │ │ ├── Blog$BlogBuilder.class │ │ ├── User$UserBuilder.class │ │ ├── RPCRequest$RPCRequestBuilder.class │ │ └── RPCResponse$RPCResponseBuilder.class │ ├── codec │ │ ├── MyDecode.class │ │ ├── MyEncode.class │ │ ├── MessageType.class │ │ ├── Serializer.class │ │ ├── JsonSerializer.class │ │ └── ObjectSerializer.class │ ├── client │ │ ├── RPCClient.class │ │ ├── TestClient.class │ │ ├── NettyRPCClient.class │ │ ├── RPCClientProxy.class │ │ ├── SimpleRPCClient.class │ │ ├── NettyClientHandler.class │ │ └── NettyClientInitializer.class │ ├── server │ │ ├── RPCServer.class │ │ ├── TestServer.class │ │ ├── WorkThread.class │ │ ├── NettyRPCServer.class │ │ ├── ServiceProvider.class │ │ ├── SimpleRPCRPCServer.class │ │ ├── NettyRPCServerHandler.class │ │ ├── NettyServerInitializer.class │ │ └── ThreadPoolRPCRPCServer.class │ └── service │ │ ├── BlogService.class │ │ ├── UserService.class │ │ ├── BlogServiceImpl.class │ │ └── UserServiceImpl.class │ ├── myRPCVersion5 │ ├── common │ │ ├── Blog.class │ │ ├── User.class │ │ ├── RPCRequest.class │ │ ├── RPCResponse.class │ │ ├── Blog$BlogBuilder.class │ │ ├── User$UserBuilder.class │ │ ├── RPCRequest$RPCRequestBuilder.class │ │ └── RPCResponse$RPCResponseBuilder.class │ ├── codec │ │ ├── MyDecode.class │ │ ├── MyEncode.class │ │ ├── MessageType.class │ │ ├── Serializer.class │ │ ├── JsonSerializer.class │ │ └── ObjectSerializer.class │ ├── client │ │ ├── RPCClient.class │ │ ├── TestClient.class │ │ ├── NettyRPCClient.class │ │ ├── RPCClientProxy.class │ │ ├── SimpleRPCClient.class │ │ ├── NettyClientHandler.class │ │ └── NettyClientInitializer.class │ ├── server │ │ ├── RPCServer.class │ │ ├── TestServer.class │ │ ├── WorkThread.class │ │ ├── NettyRPCServer.class │ │ ├── ServiceProvider.class │ │ ├── SimpleRPCRPCServer.class │ │ ├── NettyRPCServerHandler.class │ │ ├── NettyServerInitializer.class │ │ └── ThreadPoolRPCRPCServer.class │ ├── service │ │ ├── BlogService.class │ │ ├── UserService.class │ │ ├── BlogServiceImpl.class │ │ └── UserServiceImpl.class │ └── register │ │ ├── ServiceRegister.class │ │ └── ZkServiceRegister.class │ └── myRPCVersion6 │ ├── common │ ├── Blog.class │ ├── User.class │ ├── RPCRequest.class │ ├── RPCResponse.class │ ├── Blog$BlogBuilder.class │ ├── User$UserBuilder.class │ ├── RPCRequest$RPCRequestBuilder.class │ └── RPCResponse$RPCResponseBuilder.class │ ├── codec │ ├── MyDecode.class │ ├── MyEncode.class │ ├── MessageType.class │ ├── Serializer.class │ ├── JsonSerializer.class │ └── ObjectSerializer.class │ ├── client │ ├── RPCClient.class │ ├── TestClient.class │ ├── NettyRPCClient.class │ ├── RPCClientProxy.class │ ├── SimpleRPCClient.class │ ├── NettyClientHandler.class │ └── NettyClientInitializer.class │ ├── server │ ├── RPCServer.class │ ├── TestServer.class │ ├── TestServer2.class │ ├── WorkThread.class │ ├── NettyRPCServer.class │ ├── ServiceProvider.class │ ├── SimpleRPCRPCServer.class │ ├── NettyRPCServerHandler.class │ ├── NettyServerInitializer.class │ └── ThreadPoolRPCRPCServer.class │ ├── service │ ├── BlogService.class │ ├── UserService.class │ ├── BlogServiceImpl.class │ └── UserServiceImpl.class │ ├── loadbalance │ ├── LoadBalance.class │ ├── RoundLoadBalance.class │ └── RandomLoadBalance.class │ └── register │ ├── ServiceRegister.class │ └── ZkServiceRegister.class ├── src └── main │ ├── resources │ └── log4j.properties │ └── java │ └── com │ └── ganghuan │ ├── myRPCVersion2 │ ├── server │ │ ├── RPCServer.java │ │ ├── BlogServiceImpl.java │ │ ├── UserServiceImpl.java │ │ ├── ServiceProvider.java │ │ ├── TestServer.java │ │ ├── SimpleRPCRPCServer.java │ │ └── ThreadPoolRPCRPCServer.java │ ├── service │ │ ├── BlogService.java │ │ └── UserService.java │ ├── common │ │ ├── Blog.java │ │ ├── User.java │ │ ├── RPCRequest.java │ │ └── RPCResponse.java │ └── client │ │ ├── RPCClient.java │ │ ├── IOClient.java │ │ └── RPCClientProxy.java │ ├── myRPCVersion3 │ ├── server │ │ ├── RPCServer.java │ │ ├── ServiceProvider.java │ │ ├── TestServer.java │ │ ├── SimpleRPCRPCServer.java │ │ ├── NettyRPCServer.java │ │ ├── NettyServerInitializer.java │ │ ├── ThreadPoolRPCRPCServer.java │ │ ├── NettyRPCServerHandler.java │ │ └── WorkThread.java │ ├── service │ │ ├── BlogService.java │ │ ├── UserService.java │ │ ├── BlogServiceImpl.java │ │ └── UserServiceImpl.java │ ├── client │ │ ├── RPCClient.java │ │ ├── NettyClientHandler.java │ │ ├── RPCClientProxy.java │ │ ├── TestClient.java │ │ ├── NettyClientInitializer.java │ │ ├── SimpleRPCClient.java │ │ └── NettyRPCClient.java │ └── common │ │ ├── Blog.java │ │ ├── User.java │ │ ├── RPCRequest.java │ │ └── RPCResponse.java │ ├── myRPCVersion4 │ ├── server │ │ ├── RPCServer.java │ │ ├── TestServer.java │ │ ├── ServiceProvider.java │ │ ├── SimpleRPCRPCServer.java │ │ ├── NettyServerInitializer.java │ │ ├── NettyRPCServer.java │ │ ├── ThreadPoolRPCRPCServer.java │ │ ├── NettyRPCServerHandler.java │ │ └── WorkThread.java │ ├── service │ │ ├── BlogService.java │ │ ├── UserService.java │ │ ├── BlogServiceImpl.java │ │ └── UserServiceImpl.java │ ├── client │ │ ├── RPCClient.java │ │ ├── NettyClientHandler.java │ │ ├── NettyClientInitializer.java │ │ ├── RPCClientProxy.java │ │ ├── TestClient.java │ │ ├── SimpleRPCClient.java │ │ └── NettyRPCClient.java │ ├── codec │ │ ├── MessageType.java │ │ ├── Serializer.java │ │ ├── MyEncode.java │ │ ├── ObjectSerializer.java │ │ └── MyDecode.java │ └── common │ │ ├── Blog.java │ │ ├── User.java │ │ ├── RPCRequest.java │ │ └── RPCResponse.java │ ├── myRPCVersion5 │ ├── server │ │ ├── RPCServer.java │ │ ├── TestServer.java │ │ ├── NettyServerInitializer.java │ │ ├── SimpleRPCRPCServer.java │ │ ├── ServiceProvider.java │ │ ├── NettyRPCServer.java │ │ ├── ThreadPoolRPCRPCServer.java │ │ └── NettyRPCServerHandler.java │ ├── service │ │ ├── BlogService.java │ │ ├── UserService.java │ │ ├── BlogServiceImpl.java │ │ └── UserServiceImpl.java │ ├── client │ │ ├── RPCClient.java │ │ ├── NettyClientHandler.java │ │ ├── NettyClientInitializer.java │ │ ├── RPCClientProxy.java │ │ ├── TestClient.java │ │ └── SimpleRPCClient.java │ ├── codec │ │ ├── MessageType.java │ │ ├── Serializer.java │ │ ├── MyEncode.java │ │ ├── ObjectSerializer.java │ │ └── MyDecode.java │ ├── register │ │ └── ServiceRegister.java │ └── common │ │ ├── Blog.java │ │ ├── User.java │ │ ├── RPCRequest.java │ │ └── RPCResponse.java │ ├── myRPCVersion6 │ ├── server │ │ ├── RPCServer.java │ │ ├── TestServer.java │ │ ├── TestServer2.java │ │ ├── NettyServerInitializer.java │ │ ├── SimpleRPCRPCServer.java │ │ ├── ServiceProvider.java │ │ ├── NettyRPCServer.java │ │ ├── ThreadPoolRPCRPCServer.java │ │ └── NettyRPCServerHandler.java │ ├── service │ │ ├── BlogService.java │ │ ├── UserService.java │ │ ├── BlogServiceImpl.java │ │ └── UserServiceImpl.java │ ├── loadbalance │ │ ├── LoadBalance.java │ │ ├── RoundLoadBalance.java │ │ └── RandomLoadBalance.java │ ├── client │ │ ├── RPCClient.java │ │ ├── NettyClientHandler.java │ │ ├── NettyClientInitializer.java │ │ ├── RPCClientProxy.java │ │ ├── TestClient.java │ │ └── SimpleRPCClient.java │ ├── codec │ │ ├── MessageType.java │ │ ├── Serializer.java │ │ ├── MyEncode.java │ │ ├── ObjectSerializer.java │ │ └── MyDecode.java │ ├── register │ │ └── ServiceRegister.java │ └── common │ │ ├── Blog.java │ │ ├── User.java │ │ ├── RPCRequest.java │ │ └── RPCResponse.java │ ├── myRPCVersion0 │ ├── service │ │ └── UserService.java │ ├── common │ │ └── User.java │ ├── server │ │ ├── UserServiceImpl.java │ │ └── RPCServer.java │ └── client │ │ └── RPCClient.java │ └── myRPCVersion1 │ ├── service │ └── UserService.java │ ├── common │ ├── User.java │ ├── RPCRequest.java │ └── RPCResponse.java │ ├── client │ ├── RPCClient.java │ ├── IOClient.java │ └── ClientProxy.java │ └── server │ ├── UserServiceImpl.java │ └── RPCServer.java ├── .idea ├── vcs.xml ├── .gitignore ├── misc.xml ├── compiler.xml └── jarRepositories.xml └── pom.xml /MyRPCFromZero.iml: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /target/classes/log4j.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/log4j.properties -------------------------------------------------------------------------------- /src/main/resources/log4j.properties: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/src/main/resources/log4j.properties -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion0/common/User.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion0/common/User.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion1/common/User.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion1/common/User.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/common/Blog.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/common/Blog.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/common/User.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/common/User.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/common/Blog.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/common/Blog.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/common/User.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/common/User.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/common/Blog.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/common/Blog.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/common/User.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/common/User.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/common/Blog.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/common/Blog.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/common/User.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/common/User.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/common/Blog.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/common/Blog.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/common/User.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/common/User.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion1/client/IOClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion1/client/IOClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/client/IOClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/client/IOClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/codec/MyDecode.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/codec/MyDecode.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/codec/MyEncode.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/codec/MyEncode.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/codec/MyDecode.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/codec/MyDecode.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/codec/MyEncode.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/codec/MyEncode.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/codec/MyDecode.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/codec/MyDecode.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/codec/MyEncode.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/codec/MyEncode.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion0/client/RPCClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion0/client/RPCClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion0/server/RPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion0/server/RPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion1/client/ClientProxy.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion1/client/ClientProxy.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion1/client/RPCClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion1/client/RPCClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion1/common/RPCRequest.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion1/common/RPCRequest.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion1/common/RPCResponse.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion1/common/RPCResponse.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion1/server/RPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion1/server/RPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/client/RPCClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/client/RPCClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/common/RPCRequest.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/common/RPCRequest.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/common/RPCResponse.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/common/RPCResponse.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/server/RPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/server/RPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/server/TestServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/server/TestServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/server/WorkThread.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/server/WorkThread.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/client/RPCClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/client/RPCClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/client/TestClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/client/TestClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/common/RPCRequest.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/common/RPCRequest.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/common/RPCResponse.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/common/RPCResponse.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/server/RPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/server/RPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/server/TestServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/server/TestServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/server/WorkThread.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/server/WorkThread.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/client/RPCClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/client/RPCClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/client/TestClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/client/TestClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/codec/MessageType.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/codec/MessageType.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/codec/Serializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/codec/Serializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/common/RPCRequest.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/common/RPCRequest.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/common/RPCResponse.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/common/RPCResponse.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/server/RPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/server/RPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/server/TestServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/server/TestServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/server/WorkThread.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/server/WorkThread.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/client/RPCClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/client/RPCClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/client/TestClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/client/TestClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/codec/MessageType.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/codec/MessageType.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/codec/Serializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/codec/Serializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/common/RPCRequest.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/common/RPCRequest.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/common/RPCResponse.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/common/RPCResponse.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/server/RPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/server/RPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/server/TestServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/server/TestServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/server/WorkThread.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/server/WorkThread.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/client/RPCClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/client/RPCClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/client/TestClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/client/TestClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/codec/MessageType.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/codec/MessageType.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/codec/Serializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/codec/Serializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/common/RPCRequest.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/common/RPCRequest.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/common/RPCResponse.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/common/RPCResponse.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/server/RPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/server/RPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/server/TestServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/server/TestServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/server/TestServer2.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/server/TestServer2.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/server/WorkThread.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/server/WorkThread.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion0/service/UserService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion0/service/UserService.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion1/service/UserService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion1/service/UserService.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/service/BlogService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/service/BlogService.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/service/UserService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/service/UserService.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/service/BlogService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/service/BlogService.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/service/UserService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/service/UserService.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/codec/JsonSerializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/codec/JsonSerializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/service/BlogService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/service/BlogService.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/service/UserService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/service/UserService.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/codec/JsonSerializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/codec/JsonSerializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/service/BlogService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/service/BlogService.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/service/UserService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/service/UserService.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/codec/JsonSerializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/codec/JsonSerializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/service/BlogService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/service/BlogService.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/service/UserService.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/service/UserService.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion0/common/User$UserBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion0/common/User$UserBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion0/server/UserServiceImpl.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion0/server/UserServiceImpl.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion1/common/User$UserBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion1/common/User$UserBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion1/server/UserServiceImpl.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion1/server/UserServiceImpl.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/client/RPCClientProxy.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/client/RPCClientProxy.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/common/Blog$BlogBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/common/Blog$BlogBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/common/User$UserBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/common/User$UserBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/server/BlogServiceImpl.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/server/BlogServiceImpl.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/server/ServiceProvider.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/server/ServiceProvider.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/server/UserServiceImpl.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/server/UserServiceImpl.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/client/NettyRPCClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/client/NettyRPCClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/client/RPCClientProxy.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/client/RPCClientProxy.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/client/SimpleRPCClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/client/SimpleRPCClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/common/Blog$BlogBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/common/Blog$BlogBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/common/User$UserBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/common/User$UserBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/server/NettyRPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/server/NettyRPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/server/ServiceProvider.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/server/ServiceProvider.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/service/BlogServiceImpl.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/service/BlogServiceImpl.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/service/UserServiceImpl.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/service/UserServiceImpl.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/client/NettyRPCClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/client/NettyRPCClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/client/RPCClientProxy.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/client/RPCClientProxy.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/client/SimpleRPCClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/client/SimpleRPCClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/codec/ObjectSerializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/codec/ObjectSerializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/common/Blog$BlogBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/common/Blog$BlogBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/common/User$UserBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/common/User$UserBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/server/NettyRPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/server/NettyRPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/server/ServiceProvider.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/server/ServiceProvider.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/service/BlogServiceImpl.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/service/BlogServiceImpl.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/service/UserServiceImpl.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/service/UserServiceImpl.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/client/NettyRPCClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/client/NettyRPCClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/client/RPCClientProxy.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/client/RPCClientProxy.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/client/SimpleRPCClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/client/SimpleRPCClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/codec/ObjectSerializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/codec/ObjectSerializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/common/Blog$BlogBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/common/Blog$BlogBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/common/User$UserBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/common/User$UserBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/server/NettyRPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/server/NettyRPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/server/ServiceProvider.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/server/ServiceProvider.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/service/BlogServiceImpl.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/service/BlogServiceImpl.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/service/UserServiceImpl.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/service/UserServiceImpl.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/client/NettyRPCClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/client/NettyRPCClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/client/RPCClientProxy.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/client/RPCClientProxy.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/client/SimpleRPCClient.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/client/SimpleRPCClient.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/codec/ObjectSerializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/codec/ObjectSerializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/common/Blog$BlogBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/common/Blog$BlogBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/common/User$UserBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/common/User$UserBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/loadbalance/LoadBalance.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/loadbalance/LoadBalance.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/server/NettyRPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/server/NettyRPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/server/ServiceProvider.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/server/ServiceProvider.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/service/BlogServiceImpl.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/service/BlogServiceImpl.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/service/UserServiceImpl.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/service/UserServiceImpl.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/server/SimpleRPCRPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/server/SimpleRPCRPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/client/NettyClientHandler.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/client/NettyClientHandler.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/server/SimpleRPCRPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/server/SimpleRPCRPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/client/NettyClientHandler.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/client/NettyClientHandler.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/server/SimpleRPCRPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/server/SimpleRPCRPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/client/NettyClientHandler.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/client/NettyClientHandler.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/register/ServiceRegister.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/register/ServiceRegister.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/server/SimpleRPCRPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/server/SimpleRPCRPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/client/NettyClientHandler.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/client/NettyClientHandler.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/register/ServiceRegister.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/register/ServiceRegister.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/server/SimpleRPCRPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/server/SimpleRPCRPCServer.class -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion2/server/RPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion2.server; 2 | 3 | public interface RPCServer { 4 | void start(int port); 5 | void stop(); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/server/RPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.server; 2 | 3 | public interface RPCServer { 4 | void start(int port); 5 | void stop(); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/server/RPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.server; 2 | 3 | public interface RPCServer { 4 | void start(int port); 5 | void stop(); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/server/RPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.server; 2 | 3 | public interface RPCServer { 4 | void start(int port); 5 | void stop(); 6 | } 7 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/server/RPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.server; 2 | 3 | public interface RPCServer { 4 | void start(int port); 5 | void stop(); 6 | } 7 | -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/server/NettyRPCServerHandler.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/server/NettyRPCServerHandler.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/server/NettyRPCServerHandler.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/server/NettyRPCServerHandler.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/register/ZkServiceRegister.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/register/ZkServiceRegister.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/server/NettyRPCServerHandler.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/server/NettyRPCServerHandler.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/loadbalance/RoundLoadBalance.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/loadbalance/RoundLoadBalance.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/register/ZkServiceRegister.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/register/ZkServiceRegister.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/server/NettyRPCServerHandler.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/server/NettyRPCServerHandler.class -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/server/ThreadPoolRPCRPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/server/ThreadPoolRPCRPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/client/NettyClientInitializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/client/NettyClientInitializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/server/NettyServerInitializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/server/NettyServerInitializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/server/ThreadPoolRPCRPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/server/ThreadPoolRPCRPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/client/NettyClientInitializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/client/NettyClientInitializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/server/NettyServerInitializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/server/NettyServerInitializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/server/ThreadPoolRPCRPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/server/ThreadPoolRPCRPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/client/NettyClientInitializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/client/NettyClientInitializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/server/NettyServerInitializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/server/NettyServerInitializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/server/ThreadPoolRPCRPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/server/ThreadPoolRPCRPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/client/NettyClientInitializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/client/NettyClientInitializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/loadbalance/RandomLoadBalance.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/loadbalance/RandomLoadBalance.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/server/NettyServerInitializer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/server/NettyServerInitializer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/server/ThreadPoolRPCRPCServer.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/server/ThreadPoolRPCRPCServer.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/client/NettyClientInitializer$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/client/NettyClientInitializer$1.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/server/NettyServerInitializer$1.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/server/NettyServerInitializer$1.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion1/common/RPCRequest$RPCRequestBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion1/common/RPCRequest$RPCRequestBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/common/RPCRequest$RPCRequestBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/common/RPCRequest$RPCRequestBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/common/RPCRequest$RPCRequestBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/common/RPCRequest$RPCRequestBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/common/RPCRequest$RPCRequestBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/common/RPCRequest$RPCRequestBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/common/RPCRequest$RPCRequestBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/common/RPCRequest$RPCRequestBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/common/RPCRequest$RPCRequestBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/common/RPCRequest$RPCRequestBuilder.class -------------------------------------------------------------------------------- /.idea/.gitignore: -------------------------------------------------------------------------------- 1 | # Default ignored files 2 | /shelf/ 3 | /workspace.xml 4 | # Datasource local storage ignored files 5 | /dataSources/ 6 | /dataSources.local.xml 7 | # Editor-based HTTP Client requests 8 | /httpRequests/ 9 | -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion1/common/RPCResponse$RPCResponseBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion1/common/RPCResponse$RPCResponseBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion2/common/RPCResponse$RPCResponseBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion2/common/RPCResponse$RPCResponseBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion3/common/RPCResponse$RPCResponseBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion3/common/RPCResponse$RPCResponseBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion4/common/RPCResponse$RPCResponseBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion4/common/RPCResponse$RPCResponseBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion5/common/RPCResponse$RPCResponseBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion5/common/RPCResponse$RPCResponseBuilder.class -------------------------------------------------------------------------------- /target/classes/com/ganghuan/myRPCVersion6/common/RPCResponse$RPCResponseBuilder.class: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/he2121/MyRPCFromZero/HEAD/target/classes/com/ganghuan/myRPCVersion6/common/RPCResponse$RPCResponseBuilder.class -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion2/service/BlogService.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion2.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion2.common.Blog; 5 | 6 | public interface BlogService { 7 | Blog getBlogById(Integer id); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/service/BlogService.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion3.common.Blog; 5 | 6 | public interface BlogService { 7 | Blog getBlogById(Integer id); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/service/BlogService.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion4.common.Blog; 5 | 6 | public interface BlogService { 7 | Blog getBlogById(Integer id); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/service/BlogService.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion5.common.Blog; 5 | 6 | public interface BlogService { 7 | Blog getBlogById(Integer id); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/service/BlogService.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion6.common.Blog; 5 | 6 | public interface BlogService { 7 | Blog getBlogById(Integer id); 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion0/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion0.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion0.common.User; 5 | 6 | public interface UserService { 7 | // 客户端通过这个接口调用服务端的实现类 8 | User getUserByUserId(Integer id); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/loadbalance/LoadBalance.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.loadbalance; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * 给服务器地址列表,根据不同的负载均衡策略选择一个 7 | */ 8 | public interface LoadBalance { 9 | String balance(List addressList); 10 | } -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/client/RPCClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.client; 2 | 3 | 4 | import com.ganghuan.myRPCVersion3.common.RPCRequest; 5 | import com.ganghuan.myRPCVersion3.common.RPCResponse; 6 | 7 | public interface RPCClient { 8 | RPCResponse sendRequest(RPCRequest request); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/client/RPCClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.client; 2 | 3 | 4 | import com.ganghuan.myRPCVersion4.common.RPCRequest; 5 | import com.ganghuan.myRPCVersion4.common.RPCResponse; 6 | 7 | public interface RPCClient { 8 | RPCResponse sendRequest(RPCRequest request); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/client/RPCClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.client; 2 | 3 | 4 | import com.ganghuan.myRPCVersion5.common.RPCRequest; 5 | import com.ganghuan.myRPCVersion5.common.RPCResponse; 6 | 7 | public interface RPCClient { 8 | RPCResponse sendRequest(RPCRequest request); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/client/RPCClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.client; 2 | 3 | 4 | import com.ganghuan.myRPCVersion6.common.RPCRequest; 5 | import com.ganghuan.myRPCVersion6.common.RPCResponse; 6 | 7 | public interface RPCClient { 8 | RPCResponse sendRequest(RPCRequest request); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion2/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion2.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion2.common.User; 5 | 6 | public interface UserService { 7 | // 客户端通过这个接口调用服务端的实现类 8 | User getUserByUserId(Integer id); 9 | 10 | Integer insertUserId(User user); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion3.common.User; 5 | 6 | public interface UserService { 7 | // 客户端通过这个接口调用服务端的实现类 8 | User getUserByUserId(Integer id); 9 | 10 | Integer insertUserId(User user); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion4.common.User; 5 | 6 | public interface UserService { 7 | // 客户端通过这个接口调用服务端的实现类 8 | User getUserByUserId(Integer id); 9 | 10 | Integer insertUserId(User user); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion5.common.User; 5 | 6 | public interface UserService { 7 | // 客户端通过这个接口调用服务端的实现类 8 | User getUserByUserId(Integer id); 9 | 10 | Integer insertUserId(User user); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/codec/MessageType.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.codec; 2 | 3 | import lombok.AllArgsConstructor; 4 | 5 | @AllArgsConstructor 6 | public enum MessageType { 7 | REQUEST(0),RESPONSE(1); 8 | private int code; 9 | public int getCode() { 10 | return code; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/codec/MessageType.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.codec; 2 | 3 | import lombok.AllArgsConstructor; 4 | 5 | @AllArgsConstructor 6 | public enum MessageType { 7 | REQUEST(0),RESPONSE(1); 8 | private int code; 9 | public int getCode() { 10 | return code; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/codec/MessageType.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.codec; 2 | 3 | import lombok.AllArgsConstructor; 4 | 5 | @AllArgsConstructor 6 | public enum MessageType { 7 | REQUEST(0),RESPONSE(1); 8 | private int code; 9 | public int getCode() { 10 | return code; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion1/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion1.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion1.common.User; 5 | 6 | public interface UserService { 7 | // 客户端通过这个接口调用服务端的实现类 8 | User getUserByUserId(Integer id); 9 | // 给这个服务增加一个功能 10 | Integer insertUserId(User user); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion6.common.User; 5 | 6 | public interface UserService { 7 | // 客户端通过这个接口调用服务端的实现类 8 | User getUserByUserId(Integer id); 9 | 10 | Integer insertUserId(User user); 11 | 12 | String hello(); 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/register/ServiceRegister.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.register; 2 | 3 | import java.net.InetSocketAddress; 4 | 5 | // 服务注册接口,两大基本功能,注册:保存服务与地址。 查询:根据服务名查找地址 6 | public interface ServiceRegister { 7 | void register(String serviceName, InetSocketAddress serverAddress); 8 | InetSocketAddress serviceDiscovery(String serviceName); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/register/ServiceRegister.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.register; 2 | 3 | import java.net.InetSocketAddress; 4 | 5 | // 服务注册接口,两大基本功能,注册:保存服务与地址。 查询:根据服务名查找地址 6 | public interface ServiceRegister { 7 | void register(String serviceName, InetSocketAddress serverAddress); 8 | InetSocketAddress serviceDiscovery(String serviceName); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/service/BlogServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion4.common.Blog; 5 | 6 | public class BlogServiceImpl implements BlogService { 7 | @Override 8 | public Blog getBlogById(Integer id) { 9 | Blog blog = Blog.builder().id(id).title("我的博客").useId(22).build(); 10 | System.out.println("客户端查询了"+id+"博客"); 11 | return blog; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/service/BlogServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion5.common.Blog; 5 | 6 | public class BlogServiceImpl implements BlogService { 7 | @Override 8 | public Blog getBlogById(Integer id) { 9 | Blog blog = Blog.builder().id(id).title("我的博客").useId(22).build(); 10 | System.out.println("客户端查询了"+id+"博客"); 11 | return blog; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/service/BlogServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion6.common.Blog; 5 | 6 | public class BlogServiceImpl implements BlogService { 7 | @Override 8 | public Blog getBlogById(Integer id) { 9 | Blog blog = Blog.builder().id(id).title("我的博客").useId(22).build(); 10 | System.out.println("客户端查询了"+id+"博客"); 11 | return blog; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/loadbalance/RoundLoadBalance.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.loadbalance; 2 | 3 | import java.util.List; 4 | 5 | /** 6 | * 轮询负载均衡 7 | */ 8 | public class RoundLoadBalance implements LoadBalance{ 9 | private int choose = -1; 10 | @Override 11 | public String balance(List addressList) { 12 | choose++; 13 | choose = choose%addressList.size(); 14 | return addressList.get(choose); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion2/common/Blog.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion2.common; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | 10 | @Data 11 | @Builder 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class Blog implements Serializable { 15 | private Integer id; 16 | private Integer useId; 17 | private String title; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/common/Blog.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.common; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | 10 | @Data 11 | @Builder 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class Blog implements Serializable { 15 | private Integer id; 16 | private Integer useId; 17 | private String title; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/common/Blog.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.common; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | 10 | @Data 11 | @Builder 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class Blog implements Serializable { 15 | private Integer id; 16 | private Integer useId; 17 | private String title; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/common/Blog.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.common; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | 10 | @Data 11 | @Builder 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class Blog implements Serializable { 15 | private Integer id; 16 | private Integer useId; 17 | private String title; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/common/Blog.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.common; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | 10 | @Data 11 | @Builder 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class Blog implements Serializable { 15 | private Integer id; 16 | private Integer useId; 17 | private String title; 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion0/common/User.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion0.common; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | 10 | @Builder 11 | @Data 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class User implements Serializable { 15 | // 客户端和服务端共有的 16 | private Integer id; 17 | private String userName; 18 | private Boolean sex; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion1/common/User.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion1.common; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | 10 | @Builder 11 | @Data 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class User implements Serializable { 15 | // 客户端和服务端共有的 16 | private Integer id; 17 | private String userName; 18 | private Boolean sex; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion2/common/User.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion2.common; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | 10 | @Data 11 | @Builder 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class User implements Serializable { 15 | // 客户端和服务端共有的,模拟RPC中传输的信息 16 | private Integer id; 17 | private String userName; 18 | private Boolean sex; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion2/server/BlogServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion2.server; 2 | 3 | 4 | import com.ganghuan.myRPCVersion2.common.Blog; 5 | import com.ganghuan.myRPCVersion2.service.BlogService; 6 | 7 | public class BlogServiceImpl implements BlogService { 8 | @Override 9 | public Blog getBlogById(Integer id) { 10 | Blog blog = Blog.builder().id(id).title("我的博客").useId(22).build(); 11 | System.out.println("客户端查询了"+id+"博客"); 12 | return blog; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/common/User.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.common; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | 10 | @Data 11 | @Builder 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class User implements Serializable { 15 | // 客户端和服务端共有的,模拟RPC中传输的信息 16 | private Integer id; 17 | private String userName; 18 | private Boolean sex; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/common/User.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.common; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | 10 | @Data 11 | @Builder 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class User implements Serializable { 15 | // 客户端和服务端共有的,模拟RPC中传输的信息 16 | private Integer id; 17 | private String userName; 18 | private Boolean sex; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/common/User.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.common; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | 10 | @Data 11 | @Builder 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class User implements Serializable { 15 | // 客户端和服务端共有的,模拟RPC中传输的信息 16 | private Integer id; 17 | private String userName; 18 | private Boolean sex; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/common/User.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.common; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | import lombok.NoArgsConstructor; 7 | 8 | import java.io.Serializable; 9 | 10 | @Data 11 | @Builder 12 | @NoArgsConstructor 13 | @AllArgsConstructor 14 | public class User implements Serializable { 15 | // 客户端和服务端共有的,模拟RPC中传输的信息 16 | private Integer id; 17 | private String userName; 18 | private Boolean sex; 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/service/BlogServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion3.common.Blog; 5 | import com.ganghuan.myRPCVersion3.service.BlogService; 6 | 7 | public class BlogServiceImpl implements BlogService { 8 | @Override 9 | public Blog getBlogById(Integer id) { 10 | Blog blog = Blog.builder().id(id).title("我的博客").useId(22).build(); 11 | System.out.println("客户端查询了"+id+"博客"); 12 | return blog; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 10 | 11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/loadbalance/RandomLoadBalance.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.loadbalance; 2 | 3 | import java.util.List; 4 | import java.util.Random; 5 | 6 | /** 7 | * 随机负载均衡 8 | */ 9 | public class RandomLoadBalance implements LoadBalance{ 10 | @Override 11 | public String balance(List addressList) { 12 | 13 | Random random = new Random(); 14 | int choose = random.nextInt(addressList.size()); 15 | System.out.println("负载均衡选择了" + choose + "服务器"); 16 | return addressList.get(choose); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/service/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion4.common.User; 5 | 6 | public class UserServiceImpl implements UserService { 7 | @Override 8 | public User getUserByUserId(Integer id) { 9 | // 模拟从数据库中取用户的行为 10 | User user = User.builder().id(id).userName("he2121").sex(true).build(); 11 | System.out.println("客户端查询了"+id+"用户"); 12 | return user; 13 | } 14 | 15 | @Override 16 | public Integer insertUserId(User user) { 17 | System.out.println("插入数据成功:"+user); 18 | return 1; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/service/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion5.common.User; 5 | 6 | public class UserServiceImpl implements UserService { 7 | @Override 8 | public User getUserByUserId(Integer id) { 9 | // 模拟从数据库中取用户的行为 10 | User user = User.builder().id(id).userName("he2121").sex(true).build(); 11 | System.out.println("客户端查询了"+id+"用户"); 12 | return user; 13 | } 14 | 15 | @Override 16 | public Integer insertUserId(User user) { 17 | System.out.println("插入数据成功:"+user); 18 | return 1; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion2/common/RPCRequest.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion2.common; 2 | 3 | import lombok.Builder; 4 | import lombok.Data; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * 在上个例子中,我们的Request仅仅只发送了一个id参数过去,这显然是不合理的, 10 | * 因为服务端不会只有一个服务一个方法,因此不会知道调用那个方法 11 | * 因此一个RPC请求中,client发送应该是需要调用的Service接口名,方法名,参数,参数类型 12 | * 这样服务端就能根据这些信息根据反射调用相应的方法 13 | */ 14 | @Data 15 | @Builder 16 | public class RPCRequest implements Serializable { 17 | // 服务类名,客户端只知道接口名,在服务端中用接口名指向实现类 18 | private String interfaceName; 19 | // 方法名 20 | private String methodName; 21 | // 参数列表 22 | private Object[] params; 23 | // 参数类型 24 | private Class[] paramsTypes; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion2/server/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion2.server; 2 | 3 | 4 | import com.ganghuan.myRPCVersion2.common.User; 5 | import com.ganghuan.myRPCVersion2.service.UserService; 6 | 7 | public class UserServiceImpl implements UserService { 8 | @Override 9 | public User getUserByUserId(Integer id) { 10 | // 模拟从数据库中取用户的行为 11 | User user = User.builder().id(id).userName("he2121").sex(true).build(); 12 | System.out.println("客户端查询了"+id+"用户"); 13 | return user; 14 | } 15 | 16 | @Override 17 | public Integer insertUserId(User user) { 18 | System.out.println("插入数据成功:"+user); 19 | return 1; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/common/RPCRequest.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.common; 2 | 3 | import lombok.Builder; 4 | import lombok.Data; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * 在上个例子中,我们的Request仅仅只发送了一个id参数过去,这显然是不合理的, 10 | * 因为服务端不会只有一个服务一个方法,因此不会知道调用那个方法 11 | * 因此一个RPC请求中,client发送应该是需要调用的Service接口名,方法名,参数,参数类型 12 | * 这样服务端就能根据这些信息根据反射调用相应的方法 13 | */ 14 | @Data 15 | @Builder 16 | public class RPCRequest implements Serializable { 17 | // 服务类名,客户端只知道接口名,在服务端中用接口名指向实现类 18 | private String interfaceName; 19 | // 方法名 20 | private String methodName; 21 | // 参数列表 22 | private Object[] params; 23 | // 参数类型 24 | private Class[] paramsTypes; 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/service/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion3.common.User; 5 | import com.ganghuan.myRPCVersion3.service.UserService; 6 | 7 | public class UserServiceImpl implements UserService { 8 | @Override 9 | public User getUserByUserId(Integer id) { 10 | // 模拟从数据库中取用户的行为 11 | User user = User.builder().id(id).userName("he2121").sex(true).build(); 12 | System.out.println("客户端查询了"+id+"用户"); 13 | return user; 14 | } 15 | 16 | @Override 17 | public Integer insertUserId(User user) { 18 | System.out.println("插入数据成功:"+user); 19 | return 1; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion0/server/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion0.server; 2 | 3 | import com.ganghuan.myRPCVersion0.common.User; 4 | import com.ganghuan.myRPCVersion0.service.UserService; 5 | 6 | import java.util.Random; 7 | import java.util.UUID; 8 | 9 | public class UserServiceImpl implements UserService { 10 | @Override 11 | public User getUserByUserId(Integer id) { 12 | System.out.println("客户端查询了"+id+"的用户"); 13 | // 模拟从数据库中取用户的行为 14 | Random random = new Random(); 15 | User user = User.builder().userName(UUID.randomUUID().toString()) 16 | .id(id) 17 | .sex(random.nextBoolean()).build(); 18 | return user; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion1/common/RPCRequest.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion1.common; 2 | 3 | import lombok.Builder; 4 | import lombok.Data; 5 | 6 | import java.io.Serializable; 7 | 8 | /** 9 | * 在上个例子中,我们的Request仅仅只发送了一个id参数过去,这显然是不合理的, 10 | * 因为服务端不会只有一个服务一个方法,因此只传递参数服务端不会知道调用那个方法 11 | * 因此一个RPC请求中,client发送应该是需要调用的Service接口名,方法名,参数,参数类型 12 | * 这样服务端就能根据这些信息根据反射调用相应的方法 13 | * 使用java自带的序列化方式(实现接口) 14 | */ 15 | @Data 16 | @Builder 17 | public class RPCRequest implements Serializable { 18 | // 服务类名,客户端只知道接口名,在服务端中用接口名指向实现类 19 | private String interfaceName; 20 | // 方法名 21 | private String methodName; 22 | // 参数列表 23 | private Object[] params; 24 | // 参数类型 25 | private Class[] paramsTypes; 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/service/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.service; 2 | 3 | 4 | import com.ganghuan.myRPCVersion6.common.User; 5 | 6 | public class UserServiceImpl implements UserService { 7 | @Override 8 | public User getUserByUserId(Integer id) { 9 | // 模拟从数据库中取用户的行为 10 | User user = User.builder().id(id).userName("he2121").sex(true).build(); 11 | System.out.println("客户端查询了"+id+"用户"); 12 | return user; 13 | } 14 | 15 | @Override 16 | public Integer insertUserId(User user) { 17 | System.out.println("插入数据成功:"+user); 18 | return 1; 19 | } 20 | 21 | @Override 22 | public String hello() { 23 | return "Hello World!"; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/common/RPCRequest.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.common; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | 7 | import java.io.Serializable; 8 | 9 | /** 10 | * 在上个例子中,我们的Request仅仅只发送了一个id参数过去,这显然是不合理的, 11 | * 因为服务端不会只有一个服务一个方法,因此不会知道调用那个方法 12 | * 因此一个RPC请求中,client发送应该是需要调用的Service接口名,方法名,参数,参数类型 13 | * 这样服务端就能根据这些信息根据反射调用相应的方法 14 | */ 15 | @Data 16 | @Builder 17 | @AllArgsConstructor 18 | public class RPCRequest implements Serializable { 19 | // 服务类名,客户端只知道接口名,在服务端中用接口名指向实现类 20 | private String interfaceName; 21 | // 方法名 22 | private String methodName; 23 | // 参数列表 24 | private Object[] params; 25 | // 参数类型 26 | private Class[] paramsTypes; 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/common/RPCRequest.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.common; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | 7 | import java.io.Serializable; 8 | 9 | /** 10 | * 在上个例子中,我们的Request仅仅只发送了一个id参数过去,这显然是不合理的, 11 | * 因为服务端不会只有一个服务一个方法,因此不会知道调用那个方法 12 | * 因此一个RPC请求中,client发送应该是需要调用的Service接口名,方法名,参数,参数类型 13 | * 这样服务端就能根据这些信息根据反射调用相应的方法 14 | */ 15 | @Data 16 | @Builder 17 | @AllArgsConstructor 18 | public class RPCRequest implements Serializable { 19 | // 服务类名,客户端只知道接口名,在服务端中用接口名指向实现类 20 | private String interfaceName; 21 | // 方法名 22 | private String methodName; 23 | // 参数列表 24 | private Object[] params; 25 | // 参数类型 26 | private Class[] paramsTypes; 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/common/RPCRequest.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.common; 2 | 3 | import lombok.AllArgsConstructor; 4 | import lombok.Builder; 5 | import lombok.Data; 6 | 7 | import java.io.Serializable; 8 | 9 | /** 10 | * 在上个例子中,我们的Request仅仅只发送了一个id参数过去,这显然是不合理的, 11 | * 因为服务端不会只有一个服务一个方法,因此不会知道调用那个方法 12 | * 因此一个RPC请求中,client发送应该是需要调用的Service接口名,方法名,参数,参数类型 13 | * 这样服务端就能根据这些信息根据反射调用相应的方法 14 | */ 15 | @Data 16 | @Builder 17 | @AllArgsConstructor 18 | public class RPCRequest implements Serializable { 19 | // 服务类名,客户端只知道接口名,在服务端中用接口名指向实现类 20 | private String interfaceName; 21 | // 方法名 22 | private String methodName; 23 | // 参数列表 24 | private Object[] params; 25 | // 参数类型 26 | private Class[] paramsTypes; 27 | } 28 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion1/client/RPCClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion1.client; 2 | 3 | import com.ganghuan.myRPCVersion1.common.User; 4 | import com.ganghuan.myRPCVersion1.service.UserService; 5 | 6 | public class RPCClient { 7 | public static void main(String[] args) { 8 | 9 | ClientProxy clientProxy = new ClientProxy("127.0.0.1", 8899); 10 | UserService proxy = clientProxy.getProxy(UserService.class); 11 | 12 | // 服务的方法1 13 | User userByUserId = proxy.getUserByUserId(10); 14 | System.out.println("从服务端得到的user为:" + userByUserId); 15 | // 服务的方法2 16 | User user = User.builder().userName("张三").id(100).sex(true).build(); 17 | Integer integer = proxy.insertUserId(user); 18 | System.out.println("向服务端插入数据:"+integer); 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion2/common/RPCResponse.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion2.common; 2 | 3 | 4 | 5 | import lombok.Builder; 6 | import lombok.Data; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * 上个例子中response传输的是User对象,显然在一个应用中我们不可能只传输一种类型的对象 12 | * 由此需要传输对象抽象成为Object 13 | * Rpc需要经过网络传输,有可能失败,类似于http,引入状态码和状态信息表示服务调用成功还是失败 14 | */ 15 | @Data 16 | @Builder 17 | public class RPCResponse implements Serializable { 18 | 19 | private int code; 20 | private String message; 21 | 22 | private Object data; 23 | 24 | public static RPCResponse success(Object data) { 25 | return RPCResponse.builder().code(200).data(data).build(); 26 | } 27 | public static RPCResponse fail() { 28 | return RPCResponse.builder().code(500).message("服务器发生错误").build(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/common/RPCResponse.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.common; 2 | 3 | 4 | 5 | import lombok.Builder; 6 | import lombok.Data; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * 上个例子中response传输的是User对象,显然在一个应用中我们不可能只传输一种类型的对象 12 | * 由此需要传输对象抽象成为Object 13 | * Rpc需要经过网络传输,有可能失败,类似于http,引入状态码和状态信息表示服务调用成功还是失败 14 | */ 15 | @Data 16 | @Builder 17 | public class RPCResponse implements Serializable { 18 | 19 | private int code; 20 | private String message; 21 | 22 | private Object data; 23 | 24 | public static RPCResponse success(Object data) { 25 | return RPCResponse.builder().code(200).data(data).build(); 26 | } 27 | public static RPCResponse fail() { 28 | return RPCResponse.builder().code(500).message("服务器发生错误").build(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/codec/Serializer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.codec; 2 | 3 | 4 | public interface Serializer { 5 | // 把对象序列化成字节数组 6 | byte[] serialize(Object obj); 7 | // 从字节数组反序列化成消息, 使用java自带序列化方式不用messageType也能得到相应的对象(序列化字节数组里包含类信息) 8 | // 其它方式需指定消息格式,再根据message转化成相应的对象 9 | Object deserialize(byte[] bytes, int messageType); 10 | // 返回使用的序列器,是哪个 11 | // 0:java自带序列化方式, 1: json序列化方式 12 | int getType(); 13 | // 根据序号取出序列化器,暂时有两种实现方式,需要其它方式,实现这个接口即可 14 | static Serializer getSerializerByCode(int code){ 15 | switch (code){ 16 | case 0: 17 | return new ObjectSerializer(); 18 | case 1: 19 | return new JsonSerializer(); 20 | default: 21 | return null; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/codec/Serializer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.codec; 2 | 3 | 4 | public interface Serializer { 5 | // 把对象序列化成字节数组 6 | byte[] serialize(Object obj); 7 | // 从字节数组反序列化成消息, 使用java自带序列化方式不用messageType也能得到相应的对象(序列化字节数组里包含类信息) 8 | // 其它方式需指定消息格式,再根据message转化成相应的对象 9 | Object deserialize(byte[] bytes, int messageType); 10 | // 返回使用的序列器,是哪个 11 | // 0:java自带序列化方式, 1: json序列化方式 12 | int getType(); 13 | // 根据序号取出序列化器,暂时有两种实现方式,需要其它方式,实现这个接口即可 14 | static Serializer getSerializerByCode(int code){ 15 | switch (code){ 16 | case 0: 17 | return new ObjectSerializer(); 18 | case 1: 19 | return new JsonSerializer(); 20 | default: 21 | return null; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/codec/Serializer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.codec; 2 | 3 | 4 | public interface Serializer { 5 | // 把对象序列化成字节数组 6 | byte[] serialize(Object obj); 7 | // 从字节数组反序列化成消息, 使用java自带序列化方式不用messageType也能得到相应的对象(序列化字节数组里包含类信息) 8 | // 其它方式需指定消息格式,再根据message转化成相应的对象 9 | Object deserialize(byte[] bytes, int messageType); 10 | // 返回使用的序列器,是哪个 11 | // 0:java自带序列化方式, 1: json序列化方式 12 | int getType(); 13 | // 根据序号取出序列化器,暂时有两种实现方式,需要其它方式,实现这个接口即可 14 | static Serializer getSerializerByCode(int code){ 15 | switch (code){ 16 | case 0: 17 | return new ObjectSerializer(); 18 | case 1: 19 | return new JsonSerializer(); 20 | default: 21 | return null; 22 | } 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion1/common/RPCResponse.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion1.common; 2 | 3 | 4 | 5 | import lombok.Builder; 6 | import lombok.Data; 7 | 8 | import java.io.Serializable; 9 | 10 | /** 11 | * 上个例子中response传输的是User对象,显然在一个应用中我们不可能只传输一种类型的数据 12 | * 由此我们将传输对象抽象成为Object 13 | * Rpc需要经过网络传输,有可能失败,类似于http,引入状态码和状态信息表示服务调用成功还是失败 14 | */ 15 | @Data 16 | @Builder 17 | public class RPCResponse implements Serializable { 18 | // 状态信息 19 | private int code; 20 | private String message; 21 | // 具体数据 22 | private Object data; 23 | 24 | public static RPCResponse success(Object data) { 25 | return RPCResponse.builder().code(200).data(data).build(); 26 | } 27 | public static RPCResponse fail() { 28 | return RPCResponse.builder().code(500).message("服务器发生错误").build(); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion1/server/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion1.server; 2 | 3 | import com.ganghuan.myRPCVersion1.common.User; 4 | import com.ganghuan.myRPCVersion1.service.UserService; 5 | 6 | import java.util.Random; 7 | import java.util.UUID; 8 | 9 | public class UserServiceImpl implements UserService { 10 | @Override 11 | public User getUserByUserId(Integer id) { 12 | System.out.println("客户端查询了"+id+"的用户"); 13 | // 模拟从数据库中取用户的行为 14 | Random random = new Random(); 15 | User user = User.builder().userName(UUID.randomUUID().toString()) 16 | .id(id) 17 | .sex(random.nextBoolean()).build(); 18 | return user; 19 | } 20 | @Override 21 | public Integer insertUserId(User user) { 22 | System.out.println("插入数据成功:"+user); 23 | return 1; 24 | } 25 | } 26 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/server/TestServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.server; 2 | 3 | 4 | import com.ganghuan.myRPCVersion4.service.BlogService; 5 | import com.ganghuan.myRPCVersion4.service.BlogServiceImpl; 6 | import com.ganghuan.myRPCVersion4.service.UserService; 7 | import com.ganghuan.myRPCVersion4.service.UserServiceImpl; 8 | 9 | public class TestServer { 10 | public static void main(String[] args) { 11 | UserService userService = new UserServiceImpl(); 12 | BlogService blogService = new BlogServiceImpl(); 13 | 14 | ServiceProvider serviceProvider = new ServiceProvider(); 15 | serviceProvider.provideServiceInterface(userService); 16 | serviceProvider.provideServiceInterface(blogService); 17 | 18 | RPCServer RPCServer = new NettyRPCServer(serviceProvider); 19 | RPCServer.start(8899); 20 | } 21 | } -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/server/TestServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.server; 2 | 3 | 4 | import com.ganghuan.myRPCVersion5.service.BlogService; 5 | import com.ganghuan.myRPCVersion5.service.BlogServiceImpl; 6 | import com.ganghuan.myRPCVersion5.service.UserService; 7 | import com.ganghuan.myRPCVersion5.service.UserServiceImpl; 8 | 9 | public class TestServer { 10 | public static void main(String[] args) { 11 | UserService userService = new UserServiceImpl(); 12 | BlogService blogService = new BlogServiceImpl(); 13 | // 这里重用了服务暴露类,顺便在注册中心注册,实际上应分开,每个类做各自独立的事 14 | ServiceProvider serviceProvider = new ServiceProvider("127.0.0.1", 8899); 15 | serviceProvider.provideServiceInterface(userService); 16 | serviceProvider.provideServiceInterface(blogService); 17 | 18 | RPCServer RPCServer = new NettyRPCServer(serviceProvider); 19 | RPCServer.start(8899); 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/server/TestServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.server; 2 | 3 | 4 | import com.ganghuan.myRPCVersion6.service.BlogService; 5 | import com.ganghuan.myRPCVersion6.service.BlogServiceImpl; 6 | import com.ganghuan.myRPCVersion6.service.UserService; 7 | import com.ganghuan.myRPCVersion6.service.UserServiceImpl; 8 | 9 | public class TestServer { 10 | public static void main(String[] args) { 11 | UserService userService = new UserServiceImpl(); 12 | BlogService blogService = new BlogServiceImpl(); 13 | // 这里重用了服务暴露类,顺便在注册中心注册,实际上应分开,每个类做各自独立的事 14 | ServiceProvider serviceProvider = new ServiceProvider("127.0.0.1", 8899); 15 | serviceProvider.provideServiceInterface(userService); 16 | serviceProvider.provideServiceInterface(blogService); 17 | 18 | RPCServer RPCServer = new NettyRPCServer(serviceProvider); 19 | RPCServer.start(8899); 20 | } 21 | } -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/server/TestServer2.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.server; 2 | 3 | 4 | import com.ganghuan.myRPCVersion6.service.BlogService; 5 | import com.ganghuan.myRPCVersion6.service.BlogServiceImpl; 6 | import com.ganghuan.myRPCVersion6.service.UserService; 7 | import com.ganghuan.myRPCVersion6.service.UserServiceImpl; 8 | 9 | public class TestServer2 { 10 | public static void main(String[] args) { 11 | UserService userService = new UserServiceImpl(); 12 | BlogService blogService = new BlogServiceImpl(); 13 | 14 | ServiceProvider serviceProvider = new ServiceProvider("127.0.0.1", 8900); 15 | // System.out.println("hahah"); 16 | serviceProvider.provideServiceInterface(userService); 17 | serviceProvider.provideServiceInterface(blogService); 18 | RPCServer RPCServer = new NettyRPCServer(serviceProvider); 19 | 20 | RPCServer.start(8900); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/client/NettyClientHandler.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.client; 2 | 3 | import com.ganghuan.myRPCVersion4.common.RPCResponse; 4 | import io.netty.channel.ChannelHandlerContext; 5 | import io.netty.channel.SimpleChannelInboundHandler; 6 | import io.netty.util.AttributeKey; 7 | 8 | public class NettyClientHandler extends SimpleChannelInboundHandler { 9 | @Override 10 | protected void channelRead0(ChannelHandlerContext ctx, RPCResponse msg) throws Exception { 11 | // 接收到response, 给channel设计别名,让sendRequest里读取response 12 | AttributeKey key = AttributeKey.valueOf("RPCResponse"); 13 | ctx.channel().attr(key).set(msg); 14 | ctx.channel().close(); 15 | } 16 | 17 | @Override 18 | public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { 19 | cause.printStackTrace(); 20 | ctx.close(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/client/NettyClientHandler.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.client; 2 | 3 | import com.ganghuan.myRPCVersion5.common.RPCResponse; 4 | import io.netty.channel.ChannelHandlerContext; 5 | import io.netty.channel.SimpleChannelInboundHandler; 6 | import io.netty.util.AttributeKey; 7 | 8 | public class NettyClientHandler extends SimpleChannelInboundHandler { 9 | @Override 10 | protected void channelRead0(ChannelHandlerContext ctx, RPCResponse msg) throws Exception { 11 | // 接收到response, 给channel设计别名,让sendRequest里读取response 12 | AttributeKey key = AttributeKey.valueOf("RPCResponse"); 13 | ctx.channel().attr(key).set(msg); 14 | ctx.channel().close(); 15 | } 16 | 17 | @Override 18 | public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { 19 | cause.printStackTrace(); 20 | ctx.close(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/client/NettyClientHandler.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.client; 2 | 3 | import com.ganghuan.myRPCVersion6.common.RPCResponse; 4 | import io.netty.channel.ChannelHandlerContext; 5 | import io.netty.channel.SimpleChannelInboundHandler; 6 | import io.netty.util.AttributeKey; 7 | 8 | public class NettyClientHandler extends SimpleChannelInboundHandler { 9 | @Override 10 | protected void channelRead0(ChannelHandlerContext ctx, RPCResponse msg) throws Exception { 11 | // 接收到response, 给channel设计别名,让sendRequest里读取response 12 | AttributeKey key = AttributeKey.valueOf("RPCResponse"); 13 | ctx.channel().attr(key).set(msg); 14 | ctx.channel().close(); 15 | } 16 | 17 | @Override 18 | public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { 19 | cause.printStackTrace(); 20 | ctx.close(); 21 | } 22 | } 23 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/client/NettyClientInitializer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.client; 2 | 3 | import com.ganghuan.myRPCVersion5.codec.JsonSerializer; 4 | import com.ganghuan.myRPCVersion5.codec.MyDecode; 5 | import com.ganghuan.myRPCVersion5.codec.MyEncode; 6 | import io.netty.channel.ChannelInitializer; 7 | import io.netty.channel.ChannelPipeline; 8 | import io.netty.channel.socket.SocketChannel; 9 | 10 | /** 11 | * 同样的与服务端解码和编码格式 12 | */ 13 | public class NettyClientInitializer extends ChannelInitializer { 14 | @Override 15 | protected void initChannel(SocketChannel ch) throws Exception { 16 | ChannelPipeline pipeline = ch.pipeline(); 17 | // 使用自定义的编解码器 18 | pipeline.addLast(new MyDecode()); 19 | // 编码需要传入序列化器,这里是json,还支持ObjectSerializer,也可以自己实现其他的 20 | pipeline.addLast(new MyEncode(new JsonSerializer())); 21 | pipeline.addLast(new NettyClientHandler()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/client/NettyClientInitializer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.client; 2 | 3 | import com.ganghuan.myRPCVersion6.codec.JsonSerializer; 4 | import com.ganghuan.myRPCVersion6.codec.MyDecode; 5 | import com.ganghuan.myRPCVersion6.codec.MyEncode; 6 | import io.netty.channel.ChannelInitializer; 7 | import io.netty.channel.ChannelPipeline; 8 | import io.netty.channel.socket.SocketChannel; 9 | 10 | /** 11 | * 同样的与服务端解码和编码格式 12 | */ 13 | public class NettyClientInitializer extends ChannelInitializer { 14 | @Override 15 | protected void initChannel(SocketChannel ch) throws Exception { 16 | ChannelPipeline pipeline = ch.pipeline(); 17 | // 使用自定义的编解码器 18 | pipeline.addLast(new MyDecode()); 19 | // 编码需要传入序列化器,这里是json,还支持ObjectSerializer,也可以自己实现其他的 20 | pipeline.addLast(new MyEncode(new JsonSerializer())); 21 | pipeline.addLast(new NettyClientHandler()); 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion2/server/ServiceProvider.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion2.server; 2 | 3 | 4 | 5 | import java.util.HashMap; 6 | import java.util.HashSet; 7 | import java.util.Map; 8 | import java.util.Set; 9 | 10 | /** 11 | * 存放服务接口名与服务端对应的实现类 12 | * 服务启动时要暴露其相关的实现类 13 | * 根据request中的interface调用服务端中相关实现类 14 | */ 15 | public class ServiceProvider { 16 | /** 17 | * 一个实现类可能实现多个接口 18 | */ 19 | private Map interfaceProvider; 20 | 21 | public ServiceProvider(){ 22 | this.interfaceProvider = new HashMap<>(); 23 | } 24 | 25 | public void provideServiceInterface(Object service){ 26 | Class[] interfaces = service.getClass().getInterfaces(); 27 | 28 | for(Class clazz : interfaces){ 29 | interfaceProvider.put(clazz.getName(),service); 30 | } 31 | 32 | } 33 | 34 | public Object getService(String interfaceName){ 35 | return interfaceProvider.get(interfaceName); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/server/ServiceProvider.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.server; 2 | 3 | 4 | 5 | import java.util.HashMap; 6 | import java.util.HashSet; 7 | import java.util.Map; 8 | import java.util.Set; 9 | 10 | /** 11 | * 存放服务接口名与服务端对应的实现类 12 | * 服务启动时要暴露其相关的实现类 13 | * 根据request中的interface调用服务端中相关实现类 14 | */ 15 | public class ServiceProvider { 16 | /** 17 | * 一个实现类可能实现多个接口 18 | */ 19 | private Map interfaceProvider; 20 | 21 | public ServiceProvider(){ 22 | this.interfaceProvider = new HashMap<>(); 23 | } 24 | 25 | public void provideServiceInterface(Object service){ 26 | Class[] interfaces = service.getClass().getInterfaces(); 27 | 28 | for(Class clazz : interfaces){ 29 | interfaceProvider.put(clazz.getName(),service); 30 | } 31 | 32 | } 33 | 34 | public Object getService(String interfaceName){ 35 | return interfaceProvider.get(interfaceName); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/server/ServiceProvider.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.server; 2 | 3 | 4 | 5 | import java.util.HashMap; 6 | import java.util.HashSet; 7 | import java.util.Map; 8 | import java.util.Set; 9 | 10 | /** 11 | * 存放服务接口名与服务端对应的实现类 12 | * 服务启动时要暴露其相关的实现类 13 | * 根据request中的interface调用服务端中相关实现类 14 | */ 15 | public class ServiceProvider { 16 | /** 17 | * 一个实现类可能实现多个服务接口, 18 | */ 19 | private Map interfaceProvider; 20 | 21 | public ServiceProvider(){ 22 | this.interfaceProvider = new HashMap<>(); 23 | } 24 | 25 | public void provideServiceInterface(Object service){ 26 | Class[] interfaces = service.getClass().getInterfaces(); 27 | 28 | for(Class clazz : interfaces){ 29 | interfaceProvider.put(clazz.getName(),service); 30 | } 31 | 32 | } 33 | 34 | public Object getService(String interfaceName){ 35 | return interfaceProvider.get(interfaceName); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/common/RPCResponse.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.common; 2 | 3 | 4 | 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | 9 | import java.io.Serializable; 10 | 11 | /** 12 | * 上个例子中response传输的是User对象,显然在一个应用中我们不可能只传输一种类型的对象 13 | * 由此需要传输对象抽象成为Object 14 | * Rpc需要经过网络传输,有可能失败,类似于http,引入状态码和状态信息表示服务调用成功还是失败 15 | */ 16 | @Data 17 | @Builder 18 | @AllArgsConstructor 19 | public class RPCResponse implements Serializable { 20 | 21 | private int code; 22 | private String message; 23 | // 更新,这里我们需要加入这个,不然用其它序列化方式(除了java Serialize)得不到data的type 24 | private Class dataType; 25 | private Object data; 26 | 27 | public static RPCResponse success(Object data) { 28 | return RPCResponse.builder().code(200).data(data).dataType(data.getClass()).build(); 29 | } 30 | public static RPCResponse fail() { 31 | return RPCResponse.builder().code(500).message("服务器发生错误").build(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/common/RPCResponse.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.common; 2 | 3 | 4 | 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | 9 | import java.io.Serializable; 10 | 11 | /** 12 | * 上个例子中response传输的是User对象,显然在一个应用中我们不可能只传输一种类型的对象 13 | * 由此需要传输对象抽象成为Object 14 | * Rpc需要经过网络传输,有可能失败,类似于http,引入状态码和状态信息表示服务调用成功还是失败 15 | */ 16 | @Data 17 | @Builder 18 | @AllArgsConstructor 19 | public class RPCResponse implements Serializable { 20 | 21 | private int code; 22 | private String message; 23 | // 更新,这里我们需要加入这个,不然用其它序列化方式(除了java Serialize)得不到data的type 24 | private Class dataType; 25 | private Object data; 26 | 27 | public static RPCResponse success(Object data) { 28 | return RPCResponse.builder().code(200).data(data).dataType(data.getClass()).build(); 29 | } 30 | public static RPCResponse fail() { 31 | return RPCResponse.builder().code(500).message("服务器发生错误").build(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/common/RPCResponse.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.common; 2 | 3 | 4 | 5 | import lombok.AllArgsConstructor; 6 | import lombok.Builder; 7 | import lombok.Data; 8 | 9 | import java.io.Serializable; 10 | 11 | /** 12 | * 上个例子中response传输的是User对象,显然在一个应用中我们不可能只传输一种类型的对象 13 | * 由此需要传输对象抽象成为Object 14 | * Rpc需要经过网络传输,有可能失败,类似于http,引入状态码和状态信息表示服务调用成功还是失败 15 | */ 16 | @Data 17 | @Builder 18 | @AllArgsConstructor 19 | public class RPCResponse implements Serializable { 20 | 21 | private int code; 22 | private String message; 23 | // 更新,这里我们需要加入这个,不然用其它序列化方式(除了java Serialize)得不到data的type 24 | private Class dataType; 25 | private Object data; 26 | 27 | public static RPCResponse success(Object data) { 28 | return RPCResponse.builder().code(200).data(data).dataType(data.getClass()).build(); 29 | } 30 | public static RPCResponse fail() { 31 | return RPCResponse.builder().code(500).message("服务器发生错误").build(); 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/client/NettyClientHandler.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.client; 2 | 3 | import com.ganghuan.myRPCVersion3.common.RPCResponse; 4 | import io.netty.channel.ChannelHandler; 5 | import io.netty.channel.ChannelHandlerContext; 6 | import io.netty.channel.SimpleChannelInboundHandler; 7 | import io.netty.util.AttributeKey; 8 | import io.netty.util.concurrent.EventExecutorGroup; 9 | 10 | public class NettyClientHandler extends SimpleChannelInboundHandler { 11 | @Override 12 | protected void channelRead0(ChannelHandlerContext ctx, RPCResponse msg) throws Exception { 13 | // 接收到response, 给channel设计别名,让sendRequest里读取response 14 | AttributeKey key = AttributeKey.valueOf("RPCResponse"); 15 | ctx.channel().attr(key).set(msg); 16 | ctx.channel().close(); 17 | } 18 | 19 | @Override 20 | public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { 21 | cause.printStackTrace(); 22 | ctx.close(); 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion2/server/TestServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion2.server; 2 | 3 | 4 | import com.ganghuan.myRPCVersion2.service.BlogService; 5 | import com.ganghuan.myRPCVersion2.service.UserService; 6 | 7 | import java.util.HashMap; 8 | import java.util.Map; 9 | 10 | public class TestServer { 11 | public static void main(String[] args) { 12 | UserService userService = new UserServiceImpl(); 13 | BlogService blogService = new BlogServiceImpl(); 14 | 15 | // Map serviceProvide = new HashMap<>(); 16 | // serviceProvide.put("com.ganghuan.myRPCVersion2.service.UserService",userService); 17 | // serviceProvide.put("com.ganghuan.myRPCVersion2.service.BlogService",blogService); 18 | ServiceProvider serviceProvider = new ServiceProvider(); 19 | serviceProvider.provideServiceInterface(userService); 20 | serviceProvider.provideServiceInterface(blogService); 21 | 22 | RPCServer RPCServer = new ThreadPoolRPCRPCServer(serviceProvider); 23 | RPCServer.start(8899); 24 | } 25 | } -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/server/NettyServerInitializer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.server; 2 | 3 | import com.ganghuan.myRPCVersion5.codec.JsonSerializer; 4 | import com.ganghuan.myRPCVersion5.codec.MyDecode; 5 | import com.ganghuan.myRPCVersion5.codec.MyEncode; 6 | import io.netty.channel.ChannelInitializer; 7 | import io.netty.channel.ChannelPipeline; 8 | import io.netty.channel.socket.SocketChannel; 9 | import lombok.AllArgsConstructor; 10 | 11 | /** 12 | * 初始化,主要负责序列化的编码解码, 需要解决netty的粘包问题 13 | */ 14 | @AllArgsConstructor 15 | public class NettyServerInitializer extends ChannelInitializer { 16 | private ServiceProvider serviceProvider; 17 | @Override 18 | protected void initChannel(SocketChannel ch) throws Exception { 19 | ChannelPipeline pipeline = ch.pipeline(); 20 | // 使用自定义的编解码器 21 | pipeline.addLast(new MyDecode()); 22 | // 编码需要传入序列化器,这里是json,还支持ObjectSerializer,也可以自己实现其他的 23 | pipeline.addLast(new MyEncode(new JsonSerializer())); 24 | pipeline.addLast(new NettyRPCServerHandler(serviceProvider)); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/server/NettyServerInitializer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.server; 2 | 3 | import com.ganghuan.myRPCVersion6.codec.JsonSerializer; 4 | import com.ganghuan.myRPCVersion6.codec.MyDecode; 5 | import com.ganghuan.myRPCVersion6.codec.MyEncode; 6 | import io.netty.channel.ChannelInitializer; 7 | import io.netty.channel.ChannelPipeline; 8 | import io.netty.channel.socket.SocketChannel; 9 | import lombok.AllArgsConstructor; 10 | 11 | /** 12 | * 初始化,主要负责序列化的编码解码, 需要解决netty的粘包问题 13 | */ 14 | @AllArgsConstructor 15 | public class NettyServerInitializer extends ChannelInitializer { 16 | private ServiceProvider serviceProvider; 17 | @Override 18 | protected void initChannel(SocketChannel ch) throws Exception { 19 | ChannelPipeline pipeline = ch.pipeline(); 20 | // 使用自定义的编解码器 21 | pipeline.addLast(new MyDecode()); 22 | // 编码需要传入序列化器,这里是json,还支持ObjectSerializer,也可以自己实现其他的 23 | pipeline.addLast(new MyEncode(new JsonSerializer())); 24 | pipeline.addLast(new NettyRPCServerHandler(serviceProvider)); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion2/client/RPCClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion2.client; 2 | 3 | 4 | import com.ganghuan.myRPCVersion2.common.Blog; 5 | import com.ganghuan.myRPCVersion2.common.User; 6 | import com.ganghuan.myRPCVersion2.service.BlogService; 7 | import com.ganghuan.myRPCVersion2.service.UserService; 8 | 9 | public class RPCClient { 10 | public static void main(String[] args) { 11 | 12 | RPCClientProxy rpcClientProxy = new RPCClientProxy("127.0.0.1", 8899); 13 | UserService userService = rpcClientProxy.getProxy(UserService.class); 14 | 15 | User userByUserId = userService.getUserByUserId(10); 16 | System.out.println("从服务端得到的user为:" + userByUserId); 17 | 18 | User user = User.builder().userName("张三").id(100).sex(true).build(); 19 | Integer integer = userService.insertUserId(user); 20 | System.out.println("向服务端插入数据:"+integer); 21 | 22 | BlogService blogService = rpcClientProxy.getProxy(BlogService.class); 23 | Blog blogById = blogService.getBlogById(10000); 24 | System.out.println("从服务端得到的blog为:" + blogById); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/server/TestServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.server; 2 | 3 | 4 | import com.ganghuan.myRPCVersion3.service.BlogService; 5 | import com.ganghuan.myRPCVersion3.service.BlogServiceImpl; 6 | import com.ganghuan.myRPCVersion3.service.UserService; 7 | import com.ganghuan.myRPCVersion3.service.UserServiceImpl; 8 | 9 | public class TestServer { 10 | public static void main(String[] args) { 11 | UserService userService = new UserServiceImpl(); 12 | BlogService blogService = new BlogServiceImpl(); 13 | 14 | // Map serviceProvide = new HashMap<>(); 15 | // serviceProvide.put("com.ganghuan.myRPCVersion2.service.UserService",userService); 16 | // serviceProvide.put("com.ganghuan.myRPCVersion2.service.BlogService",blogService); 17 | ServiceProvider serviceProvider = new ServiceProvider(); 18 | serviceProvider.provideServiceInterface(userService); 19 | serviceProvider.provideServiceInterface(blogService); 20 | 21 | RPCServer RPCServer = new NettyRPCServer(serviceProvider); 22 | RPCServer.start(8899); 23 | } 24 | } -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion0/client/RPCClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion0.client; 2 | 3 | import com.ganghuan.myRPCVersion0.common.User; 4 | 5 | import java.io.IOException; 6 | import java.io.ObjectInputStream; 7 | import java.io.ObjectOutputStream; 8 | import java.net.Socket; 9 | import java.util.Random; 10 | 11 | public class RPCClient { 12 | public static void main(String[] args) { 13 | try { 14 | // 建立Socket连接 15 | Socket socket = new Socket("127.0.0.1", 8899); 16 | ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 17 | ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); 18 | // 传给服务器id 19 | objectOutputStream.writeInt(new Random().nextInt()); 20 | objectOutputStream.flush(); 21 | // 服务器查询数据,返回对应的对象 22 | User user = (User) objectInputStream.readObject(); 23 | System.out.println("服务端返回的User:"+user); 24 | 25 | } catch (IOException | ClassNotFoundException e) { 26 | e.printStackTrace(); 27 | System.out.println("客户端启动失败"); 28 | } 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/server/SimpleRPCRPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.server; 2 | 3 | import java.io.IOException; 4 | import java.net.ServerSocket; 5 | import java.net.Socket; 6 | 7 | /** 8 | * 这个实现类代表着java原始的BIO监听模式,来一个任务,就new一个线程去处理 9 | * 处理任务的工作见WorkThread中 10 | */ 11 | public class SimpleRPCRPCServer implements RPCServer { 12 | // 存着服务接口名-> service对象的map 13 | private ServiceProvider serviceProvider; 14 | 15 | public SimpleRPCRPCServer(ServiceProvider serviceProvide){ 16 | this.serviceProvider = serviceProvide; 17 | } 18 | 19 | public void start(int port) { 20 | try { 21 | ServerSocket serverSocket = new ServerSocket(port); 22 | System.out.println("服务端启动了"); 23 | // BIO的方式监听Socket 24 | while (true){ 25 | Socket socket = serverSocket.accept(); 26 | // 开启一个新线程去处理 27 | new Thread(new WorkThread(socket,serviceProvider)).start(); 28 | } 29 | } catch (IOException e) { 30 | e.printStackTrace(); 31 | System.out.println("服务器启动失败"); 32 | } 33 | } 34 | 35 | public void stop(){ 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/server/SimpleRPCRPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.server; 2 | 3 | import java.io.IOException; 4 | import java.net.ServerSocket; 5 | import java.net.Socket; 6 | 7 | /** 8 | * 这个实现类代表着java原始的BIO监听模式,来一个任务,就new一个线程去处理 9 | * 处理任务的工作见WorkThread中 10 | */ 11 | public class SimpleRPCRPCServer implements RPCServer { 12 | // 存着服务接口名-> service对象的map 13 | private ServiceProvider serviceProvider; 14 | 15 | public SimpleRPCRPCServer(ServiceProvider serviceProvide){ 16 | this.serviceProvider = serviceProvide; 17 | } 18 | 19 | public void start(int port) { 20 | try { 21 | ServerSocket serverSocket = new ServerSocket(port); 22 | System.out.println("服务端启动了"); 23 | // BIO的方式监听Socket 24 | while (true){ 25 | Socket socket = serverSocket.accept(); 26 | // 开启一个新线程去处理 27 | new Thread(new WorkThread(socket,serviceProvider)).start(); 28 | } 29 | } catch (IOException e) { 30 | e.printStackTrace(); 31 | System.out.println("服务器启动失败"); 32 | } 33 | } 34 | 35 | public void stop(){ 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/server/SimpleRPCRPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.server; 2 | 3 | import java.io.IOException; 4 | import java.net.ServerSocket; 5 | import java.net.Socket; 6 | 7 | /** 8 | * 这个实现类代表着java原始的BIO监听模式,来一个任务,就new一个线程去处理 9 | * 处理任务的工作见WorkThread中 10 | */ 11 | public class SimpleRPCRPCServer implements RPCServer { 12 | // 存着服务接口名-> service对象的map 13 | private ServiceProvider serviceProvider; 14 | 15 | public SimpleRPCRPCServer(ServiceProvider serviceProvide){ 16 | this.serviceProvider = serviceProvide; 17 | } 18 | 19 | public void start(int port) { 20 | try { 21 | ServerSocket serverSocket = new ServerSocket(port); 22 | System.out.println("服务端启动了"); 23 | // BIO的方式监听Socket 24 | while (true){ 25 | Socket socket = serverSocket.accept(); 26 | // 开启一个新线程去处理 27 | new Thread(new WorkThread(socket,serviceProvider)).start(); 28 | } 29 | } catch (IOException e) { 30 | e.printStackTrace(); 31 | System.out.println("服务器启动失败"); 32 | } 33 | } 34 | 35 | public void stop(){ 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/server/SimpleRPCRPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.server; 2 | 3 | import java.io.IOException; 4 | import java.net.ServerSocket; 5 | import java.net.Socket; 6 | 7 | /** 8 | * 这个实现类代表着java原始的BIO监听模式,来一个任务,就new一个线程去处理 9 | * 处理任务的工作见WorkThread中 10 | */ 11 | public class SimpleRPCRPCServer implements RPCServer { 12 | // 存着服务接口名-> service对象的map 13 | private ServiceProvider serviceProvider; 14 | 15 | public SimpleRPCRPCServer(ServiceProvider serviceProvide){ 16 | this.serviceProvider = serviceProvide; 17 | } 18 | 19 | public void start(int port) { 20 | try { 21 | ServerSocket serverSocket = new ServerSocket(port); 22 | System.out.println("服务端启动了"); 23 | // BIO的方式监听Socket 24 | while (true){ 25 | Socket socket = serverSocket.accept(); 26 | // 开启一个新线程去处理 27 | new Thread(new WorkThread(socket,serviceProvider)).start(); 28 | } 29 | } catch (IOException e) { 30 | e.printStackTrace(); 31 | System.out.println("服务器启动失败"); 32 | } 33 | } 34 | 35 | public void stop(){ 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion2/server/SimpleRPCRPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion2.server; 2 | 3 | import java.io.IOException; 4 | import java.net.ServerSocket; 5 | import java.net.Socket; 6 | import java.util.Map; 7 | 8 | /** 9 | * 这个实现类代表着java原始的BIO监听模式,来一个任务,就new一个线程去处理 10 | * 处理任务的工作见WorkThread中 11 | */ 12 | public class SimpleRPCRPCServer implements RPCServer { 13 | // 存着服务接口名-> service对象的map 14 | private ServiceProvider serviceProvider; 15 | 16 | public SimpleRPCRPCServer(ServiceProvider serviceProvide){ 17 | this.serviceProvider = serviceProvide; 18 | } 19 | 20 | public void start(int port) { 21 | try { 22 | ServerSocket serverSocket = new ServerSocket(port); 23 | System.out.println("服务端启动了"); 24 | // BIO的方式监听Socket 25 | while (true){ 26 | Socket socket = serverSocket.accept(); 27 | // 开启一个新线程去处理 28 | new Thread(new WorkThread(socket,serviceProvider)).start(); 29 | } 30 | } catch (IOException e) { 31 | e.printStackTrace(); 32 | System.out.println("服务器启动失败"); 33 | } 34 | } 35 | 36 | public void stop(){ 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/client/NettyClientInitializer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.client; 2 | 3 | import com.ganghuan.myRPCVersion4.codec.JsonSerializer; 4 | import com.ganghuan.myRPCVersion4.codec.MyDecode; 5 | import com.ganghuan.myRPCVersion4.codec.MyEncode; 6 | import io.netty.channel.ChannelInitializer; 7 | import io.netty.channel.ChannelPipeline; 8 | import io.netty.channel.socket.SocketChannel; 9 | import io.netty.handler.codec.LengthFieldBasedFrameDecoder; 10 | import io.netty.handler.codec.LengthFieldPrepender; 11 | import io.netty.handler.codec.serialization.ClassResolver; 12 | import io.netty.handler.codec.serialization.ObjectDecoder; 13 | import io.netty.handler.codec.serialization.ObjectEncoder; 14 | 15 | /** 16 | * 同样的与服务端解码和编码格式 17 | */ 18 | public class NettyClientInitializer extends ChannelInitializer { 19 | @Override 20 | protected void initChannel(SocketChannel ch) throws Exception { 21 | ChannelPipeline pipeline = ch.pipeline(); 22 | // 使用自定义的编解码器 23 | pipeline.addLast(new MyDecode()); 24 | // 编码需要传入序列化器,这里是json,还支持ObjectSerializer,也可以自己实现其他的 25 | pipeline.addLast(new MyEncode(new JsonSerializer())); 26 | pipeline.addLast(new NettyClientHandler()); 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/codec/MyEncode.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.codec; 2 | 3 | import com.ganghuan.myRPCVersion4.common.RPCRequest; 4 | import com.ganghuan.myRPCVersion4.common.RPCResponse; 5 | import io.netty.buffer.ByteBuf; 6 | import io.netty.channel.ChannelHandlerContext; 7 | import io.netty.handler.codec.MessageToByteEncoder; 8 | import lombok.AllArgsConstructor; 9 | 10 | /** 11 | * 依次按照自定义的消息格式写入,传入的数据为request或者response 12 | * 需要持有一个serialize器,负责将传入的对象序列化成字节数组 13 | */ 14 | @AllArgsConstructor 15 | public class MyEncode extends MessageToByteEncoder { 16 | private Serializer serializer; 17 | 18 | @Override 19 | protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { 20 | // 写入消息类型 21 | if(msg instanceof RPCRequest){ 22 | out.writeShort(MessageType.REQUEST.getCode()); 23 | } 24 | else if(msg instanceof RPCResponse){ 25 | out.writeShort(MessageType.RESPONSE.getCode()); 26 | } 27 | // 写入序列化方式 28 | out.writeShort(serializer.getType()); 29 | // 得到序列化数组 30 | byte[] serialize = serializer.serialize(msg); 31 | // 写入长度 32 | out.writeInt(serialize.length); 33 | // 写入序列化字节数组 34 | out.writeBytes(serialize); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/codec/MyEncode.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.codec; 2 | 3 | import com.ganghuan.myRPCVersion5.common.RPCRequest; 4 | import com.ganghuan.myRPCVersion5.common.RPCResponse; 5 | import io.netty.buffer.ByteBuf; 6 | import io.netty.channel.ChannelHandlerContext; 7 | import io.netty.handler.codec.MessageToByteEncoder; 8 | import lombok.AllArgsConstructor; 9 | 10 | /** 11 | * 依次按照自定义的消息格式写入,传入的数据为request或者response 12 | * 需要持有一个serialize器,负责将传入的对象序列化成字节数组 13 | */ 14 | @AllArgsConstructor 15 | public class MyEncode extends MessageToByteEncoder { 16 | private Serializer serializer; 17 | 18 | @Override 19 | protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { 20 | // 写入消息类型 21 | if(msg instanceof RPCRequest){ 22 | out.writeShort(MessageType.REQUEST.getCode()); 23 | } 24 | else if(msg instanceof RPCResponse){ 25 | out.writeShort(MessageType.RESPONSE.getCode()); 26 | } 27 | // 写入序列化方式 28 | out.writeShort(serializer.getType()); 29 | // 得到序列化数组 30 | byte[] serialize = serializer.serialize(msg); 31 | // 写入长度 32 | out.writeInt(serialize.length); 33 | // 写入序列化字节数组 34 | out.writeBytes(serialize); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/codec/MyEncode.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.codec; 2 | 3 | import com.ganghuan.myRPCVersion6.common.RPCRequest; 4 | import com.ganghuan.myRPCVersion6.common.RPCResponse; 5 | import io.netty.buffer.ByteBuf; 6 | import io.netty.channel.ChannelHandlerContext; 7 | import io.netty.handler.codec.MessageToByteEncoder; 8 | import lombok.AllArgsConstructor; 9 | 10 | /** 11 | * 依次按照自定义的消息格式写入,传入的数据为request或者response 12 | * 需要持有一个serialize器,负责将传入的对象序列化成字节数组 13 | */ 14 | @AllArgsConstructor 15 | public class MyEncode extends MessageToByteEncoder { 16 | private Serializer serializer; 17 | 18 | @Override 19 | protected void encode(ChannelHandlerContext ctx, Object msg, ByteBuf out) throws Exception { 20 | // 写入消息类型 21 | if(msg instanceof RPCRequest){ 22 | out.writeShort(MessageType.REQUEST.getCode()); 23 | } 24 | else if(msg instanceof RPCResponse){ 25 | out.writeShort(MessageType.RESPONSE.getCode()); 26 | } 27 | // 写入序列化方式 28 | out.writeShort(serializer.getType()); 29 | // 得到序列化数组 30 | byte[] serialize = serializer.serialize(msg); 31 | // 写入长度 32 | out.writeInt(serialize.length); 33 | // 写入序列化字节数组 34 | out.writeBytes(serialize); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/client/RPCClientProxy.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.client; 2 | 3 | 4 | import com.ganghuan.myRPCVersion3.common.RPCRequest; 5 | import com.ganghuan.myRPCVersion3.common.RPCResponse; 6 | import lombok.AllArgsConstructor; 7 | 8 | import java.lang.reflect.InvocationHandler; 9 | import java.lang.reflect.Method; 10 | import java.lang.reflect.Proxy; 11 | 12 | @AllArgsConstructor 13 | public class RPCClientProxy implements InvocationHandler { 14 | private RPCClient client; 15 | 16 | // jdk 动态代理, 每一次代理对象调用方法,会经过此方法增强(反射获取request对象,socket发送至客户端) 17 | @Override 18 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 19 | // request的构建,使用了lombok中的builder,代码简洁 20 | RPCRequest request = RPCRequest.builder().interfaceName(method.getDeclaringClass().getName()) 21 | .methodName(method.getName()) 22 | .params(args).paramsTypes(method.getParameterTypes()).build(); 23 | //数据传输 24 | RPCResponse response = client.sendRequest(request); 25 | //System.out.println(response); 26 | return response.getData(); 27 | } 28 | T getProxy(Class clazz){ 29 | Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this); 30 | return (T)o; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/client/RPCClientProxy.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.client; 2 | 3 | 4 | import com.ganghuan.myRPCVersion4.common.RPCRequest; 5 | import com.ganghuan.myRPCVersion4.common.RPCResponse; 6 | import lombok.AllArgsConstructor; 7 | 8 | import java.lang.reflect.InvocationHandler; 9 | import java.lang.reflect.Method; 10 | import java.lang.reflect.Proxy; 11 | 12 | @AllArgsConstructor 13 | public class RPCClientProxy implements InvocationHandler { 14 | private RPCClient client; 15 | 16 | // jdk 动态代理, 每一次代理对象调用方法,会经过此方法增强(反射获取request对象,socket发送至客户端) 17 | @Override 18 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 19 | // request的构建,使用了lombok中的builder,代码简洁 20 | RPCRequest request = RPCRequest.builder().interfaceName(method.getDeclaringClass().getName()) 21 | .methodName(method.getName()) 22 | .params(args).paramsTypes(method.getParameterTypes()).build(); 23 | //数据传输 24 | RPCResponse response = client.sendRequest(request); 25 | //System.out.println(response); 26 | return response.getData(); 27 | } 28 | T getProxy(Class clazz){ 29 | Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this); 30 | return (T)o; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/client/RPCClientProxy.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.client; 2 | 3 | 4 | import com.ganghuan.myRPCVersion5.common.RPCRequest; 5 | import com.ganghuan.myRPCVersion5.common.RPCResponse; 6 | import lombok.AllArgsConstructor; 7 | 8 | import java.lang.reflect.InvocationHandler; 9 | import java.lang.reflect.Method; 10 | import java.lang.reflect.Proxy; 11 | 12 | @AllArgsConstructor 13 | public class RPCClientProxy implements InvocationHandler { 14 | private RPCClient client; 15 | 16 | // jdk 动态代理, 每一次代理对象调用方法,会经过此方法增强(反射获取request对象,socket发送至客户端) 17 | @Override 18 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 19 | // request的构建,使用了lombok中的builder,代码简洁 20 | RPCRequest request = RPCRequest.builder().interfaceName(method.getDeclaringClass().getName()) 21 | .methodName(method.getName()) 22 | .params(args).paramsTypes(method.getParameterTypes()).build(); 23 | //数据传输 24 | RPCResponse response = client.sendRequest(request); 25 | //System.out.println(response); 26 | return response.getData(); 27 | } 28 | T getProxy(Class clazz){ 29 | Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this); 30 | return (T)o; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/client/TestClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.client; 2 | 3 | import com.ganghuan.myRPCVersion5.common.Blog; 4 | import com.ganghuan.myRPCVersion5.common.User; 5 | import com.ganghuan.myRPCVersion5.service.BlogService; 6 | import com.ganghuan.myRPCVersion5.service.UserService; 7 | 8 | public class TestClient { 9 | public static void main(String[] args) { 10 | // 构建一个使用java Socket/ netty/....传输的客户端 11 | RPCClient rpcClient = new NettyRPCClient(); 12 | // 把这个客户端传入代理客户端 13 | RPCClientProxy rpcClientProxy = new RPCClientProxy(rpcClient); 14 | // 代理客户端根据不同的服务,获得一个代理类, 并且这个代理类的方法以或者增强(封装数据,发送请求) 15 | UserService userService = rpcClientProxy.getProxy(UserService.class); 16 | // 调用方法 17 | User userByUserId = userService.getUserByUserId(10); 18 | System.out.println("从服务端得到的user为:" + userByUserId); 19 | 20 | User user = User.builder().userName("张三").id(100).sex(true).build(); 21 | Integer integer = userService.insertUserId(user); 22 | System.out.println("向服务端插入数据:"+integer); 23 | 24 | BlogService blogService = rpcClientProxy.getProxy(BlogService.class); 25 | 26 | Blog blogById = blogService.getBlogById(10000); 27 | System.out.println("从服务端得到的blog为:" + blogById); 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/client/RPCClientProxy.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.client; 2 | 3 | 4 | import com.ganghuan.myRPCVersion6.common.RPCRequest; 5 | import com.ganghuan.myRPCVersion6.common.RPCResponse; 6 | import lombok.AllArgsConstructor; 7 | 8 | import java.lang.reflect.InvocationHandler; 9 | import java.lang.reflect.Method; 10 | import java.lang.reflect.Proxy; 11 | 12 | @AllArgsConstructor 13 | public class RPCClientProxy implements InvocationHandler { 14 | private RPCClient client; 15 | 16 | // jdk 动态代理, 每一次代理对象调用方法,会经过此方法增强(反射获取request对象,socket发送至客户端) 17 | @Override 18 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 19 | // request的构建,使用了lombok中的builder,代码简洁 20 | RPCRequest request = RPCRequest.builder().interfaceName(method.getDeclaringClass().getName()) 21 | .methodName(method.getName()) 22 | .params(args).paramsTypes(method.getParameterTypes()).build(); 23 | //数据传输 24 | RPCResponse response = client.sendRequest(request); 25 | //System.out.println(response); 26 | return response.getData(); 27 | } 28 | T getProxy(Class clazz){ 29 | Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this); 30 | return (T)o; 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/client/TestClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.client; 2 | 3 | import com.ganghuan.myRPCVersion3.common.Blog; 4 | import com.ganghuan.myRPCVersion3.common.User; 5 | import com.ganghuan.myRPCVersion3.service.BlogService; 6 | import com.ganghuan.myRPCVersion3.service.UserService; 7 | 8 | public class TestClient { 9 | public static void main(String[] args) { 10 | // 构建一个使用java Socket/ netty/....传输的客户端 11 | RPCClient rpcClient = new NettyRPCClient("127.0.0.1", 8899); 12 | // 把这个客户端传入代理客户端 13 | RPCClientProxy rpcClientProxy = new RPCClientProxy(rpcClient); 14 | // 代理客户端根据不同的服务,获得一个代理类, 并且这个代理类的方法以或者增强(封装数据,发送请求) 15 | UserService userService = rpcClientProxy.getProxy(UserService.class); 16 | // 调用方法 17 | User userByUserId = userService.getUserByUserId(10); 18 | System.out.println("从服务端得到的user为:" + userByUserId); 19 | 20 | User user = User.builder().userName("张三").id(100).sex(true).build(); 21 | Integer integer = userService.insertUserId(user); 22 | System.out.println("向服务端插入数据:"+integer); 23 | 24 | BlogService blogService = rpcClientProxy.getProxy(BlogService.class); 25 | 26 | Blog blogById = blogService.getBlogById(10000); 27 | System.out.println("从服务端得到的blog为:" + blogById); 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/client/TestClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.client; 2 | 3 | import com.ganghuan.myRPCVersion4.common.Blog; 4 | import com.ganghuan.myRPCVersion4.common.User; 5 | import com.ganghuan.myRPCVersion4.service.BlogService; 6 | import com.ganghuan.myRPCVersion4.service.UserService; 7 | 8 | public class TestClient { 9 | public static void main(String[] args) { 10 | // 构建一个使用java Socket/ netty/....传输的客户端 11 | RPCClient rpcClient = new NettyRPCClient("127.0.0.1", 8899); 12 | // 把这个客户端传入代理客户端 13 | RPCClientProxy rpcClientProxy = new RPCClientProxy(rpcClient); 14 | // 代理客户端根据不同的服务,获得一个代理类, 并且这个代理类的方法以或者增强(封装数据,发送请求) 15 | UserService userService = rpcClientProxy.getProxy(UserService.class); 16 | // 调用方法 17 | User userByUserId = userService.getUserByUserId(10); 18 | System.out.println("从服务端得到的user为:" + userByUserId); 19 | 20 | User user = User.builder().userName("张三").id(100).sex(true).build(); 21 | Integer integer = userService.insertUserId(user); 22 | System.out.println("向服务端插入数据:"+integer); 23 | 24 | BlogService blogService = rpcClientProxy.getProxy(BlogService.class); 25 | 26 | Blog blogById = blogService.getBlogById(10000); 27 | System.out.println("从服务端得到的blog为:" + blogById); 28 | 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion1/client/IOClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion1.client; 2 | 3 | import com.ganghuan.myRPCVersion1.common.RPCRequest; 4 | import com.ganghuan.myRPCVersion1.common.RPCResponse; 5 | 6 | import java.io.IOException; 7 | import java.io.ObjectInputStream; 8 | import java.io.ObjectOutputStream; 9 | import java.net.Socket; 10 | 11 | public class IOClient { 12 | // 这里负责底层与服务端的通信,发送的Request,接受的是Response对象 13 | // 客户端发起一次请求调用,Socket建立连接,发起请求Request,得到响应Response 14 | // 这里的request是封装好的(上层进行封装),不同的service需要进行不同的封装, 客户端只知道Service接口,需要一层动态代理根据反射封装不同的Service 15 | public static RPCResponse sendRequest(String host, int port, RPCRequest request){ 16 | try { 17 | Socket socket = new Socket(host, port); 18 | 19 | ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 20 | ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); 21 | 22 | System.out.println(request); 23 | objectOutputStream.writeObject(request); 24 | objectOutputStream.flush(); 25 | 26 | RPCResponse response = (RPCResponse) objectInputStream.readObject(); 27 | 28 | return response; 29 | } catch (IOException | ClassNotFoundException e) { 30 | System.out.println(); 31 | return null; 32 | } 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion1/client/ClientProxy.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion1.client; 2 | 3 | import com.ganghuan.myRPCVersion1.common.RPCRequest; 4 | import com.ganghuan.myRPCVersion1.common.RPCResponse; 5 | import lombok.AllArgsConstructor; 6 | 7 | import java.lang.reflect.InvocationHandler; 8 | import java.lang.reflect.Method; 9 | import java.lang.reflect.Proxy; 10 | 11 | @AllArgsConstructor 12 | public class ClientProxy implements InvocationHandler { 13 | // 传入参数Service接口的class对象,反射封装成一个request 14 | private String host; 15 | private int port; 16 | 17 | 18 | // jdk 动态代理, 每一次代理对象调用方法,会经过此方法增强(反射获取request对象,socket发送至客户端) 19 | @Override 20 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 21 | // request的构建,使用了lombok中的builder,代码简洁 22 | RPCRequest request = RPCRequest.builder().interfaceName(method.getDeclaringClass().getName()) 23 | .methodName(method.getName()) 24 | .params(args).paramsTypes(method.getParameterTypes()).build(); 25 | //数据传输 26 | RPCResponse response = IOClient.sendRequest(host, port, request); 27 | //System.out.println(response); 28 | return response.getData(); 29 | } 30 | T getProxy(Class clazz){ 31 | Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this); 32 | return (T)o; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/server/NettyServerInitializer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.server; 2 | 3 | import com.ganghuan.myRPCVersion4.codec.JsonSerializer; 4 | import com.ganghuan.myRPCVersion4.codec.MyDecode; 5 | import com.ganghuan.myRPCVersion4.codec.MyEncode; 6 | import io.netty.channel.ChannelInitializer; 7 | import io.netty.channel.ChannelPipeline; 8 | import io.netty.channel.socket.SocketChannel; 9 | import io.netty.handler.codec.LengthFieldBasedFrameDecoder; 10 | import io.netty.handler.codec.LengthFieldPrepender; 11 | import io.netty.handler.codec.serialization.ClassResolver; 12 | import io.netty.handler.codec.serialization.ObjectDecoder; 13 | import io.netty.handler.codec.serialization.ObjectEncoder; 14 | import lombok.AllArgsConstructor; 15 | 16 | /** 17 | * 初始化,主要负责序列化的编码解码, 需要解决netty的粘包问题 18 | */ 19 | @AllArgsConstructor 20 | public class NettyServerInitializer extends ChannelInitializer { 21 | private ServiceProvider serviceProvider; 22 | @Override 23 | protected void initChannel(SocketChannel ch) throws Exception { 24 | ChannelPipeline pipeline = ch.pipeline(); 25 | // 使用自定义的编解码器 26 | pipeline.addLast(new MyDecode()); 27 | // 编码需要传入序列化器,这里是json,还支持ObjectSerializer,也可以自己实现其他的 28 | pipeline.addLast(new MyEncode(new JsonSerializer())); 29 | pipeline.addLast(new NettyRPCServerHandler(serviceProvider)); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion2/client/IOClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion2.client; 2 | 3 | 4 | import com.ganghuan.myRPCVersion2.common.RPCRequest; 5 | import com.ganghuan.myRPCVersion2.common.RPCResponse; 6 | 7 | import java.io.IOException; 8 | import java.io.ObjectInputStream; 9 | import java.io.ObjectOutputStream; 10 | import java.net.Socket; 11 | 12 | public class IOClient { 13 | // 客户端发起一次请求调用,Socket建立连接,发起请求Request,得到响应Response 14 | // 这里的request是封装好的,不同的service需要进行不同的封装, 客户端只知道Service接口,需要一层动态代理根据反射封装不同的Service 15 | public static RPCResponse sendRequest(String host, int port, RPCRequest request){ 16 | try { 17 | Socket socket = new Socket(host, port); 18 | 19 | ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 20 | ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); 21 | 22 | System.out.println(request); 23 | objectOutputStream.writeObject(request); 24 | objectOutputStream.flush(); 25 | 26 | RPCResponse response = (RPCResponse) objectInputStream.readObject(); 27 | 28 | //System.out.println(response.getData()); 29 | return response; 30 | } catch (IOException | ClassNotFoundException e) { 31 | System.out.println(); 32 | return null; 33 | } 34 | 35 | } 36 | 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/client/TestClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.client; 2 | 3 | import com.ganghuan.myRPCVersion6.common.Blog; 4 | import com.ganghuan.myRPCVersion6.common.User; 5 | import com.ganghuan.myRPCVersion6.service.BlogService; 6 | import com.ganghuan.myRPCVersion6.service.UserService; 7 | 8 | public class TestClient { 9 | public static void main(String[] args) { 10 | // 构建一个使用java Socket/ netty/....传输的客户端 11 | RPCClient rpcClient = new NettyRPCClient(); 12 | // 把这个客户端传入代理客户端 13 | RPCClientProxy rpcClientProxy = new RPCClientProxy(rpcClient); 14 | // 代理客户端根据不同的服务,获得一个代理类, 并且这个代理类的方法以或者增强(封装数据,发送请求) 15 | UserService userService = rpcClientProxy.getProxy(UserService.class); 16 | // 调用方法 17 | User userByUserId = userService.getUserByUserId(10); 18 | System.out.println("从服务端得到的user为:" + userByUserId); 19 | 20 | User user = User.builder().userName("张三").id(100).sex(true).build(); 21 | Integer integer = userService.insertUserId(user); 22 | System.out.println("向服务端插入数据:"+integer); 23 | 24 | BlogService blogService = rpcClientProxy.getProxy(BlogService.class); 25 | 26 | Blog blogById = blogService.getBlogById(10000); 27 | System.out.println("从服务端得到的blog为:" + blogById); 28 | // 测试json调用空参数方法 29 | System.out.println(userService.hello()); 30 | 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion2/client/RPCClientProxy.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion2.client; 2 | 3 | 4 | import com.ganghuan.myRPCVersion2.common.RPCRequest; 5 | import com.ganghuan.myRPCVersion2.common.RPCResponse; 6 | import lombok.AllArgsConstructor; 7 | 8 | import java.lang.reflect.InvocationHandler; 9 | import java.lang.reflect.Method; 10 | import java.lang.reflect.Proxy; 11 | 12 | @AllArgsConstructor 13 | public class RPCClientProxy implements InvocationHandler { 14 | // 传入参数Service接口的class对象,反射封装成一个request 15 | private String host; 16 | private int port; 17 | 18 | 19 | // jdk 动态代理, 每一次代理对象调用方法,会经过此方法增强(反射获取request对象,socket发送至客户端) 20 | @Override 21 | public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 22 | // request的构建,使用了lombok中的builder,代码简洁 23 | RPCRequest request = RPCRequest.builder().interfaceName(method.getDeclaringClass().getName()) 24 | .methodName(method.getName()) 25 | .params(args).paramsTypes(method.getParameterTypes()).build(); 26 | //数据传输 27 | RPCResponse response = IOClient.sendRequest(host, port, request); 28 | //System.out.println(response); 29 | return response.getData(); 30 | } 31 | T getProxy(Class clazz){ 32 | Object o = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[]{clazz}, this); 33 | return (T)o; 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/client/NettyClientInitializer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.client; 2 | 3 | import io.netty.channel.ChannelInitializer; 4 | import io.netty.channel.ChannelPipeline; 5 | import io.netty.channel.socket.SocketChannel; 6 | import io.netty.handler.codec.LengthFieldBasedFrameDecoder; 7 | import io.netty.handler.codec.LengthFieldPrepender; 8 | import io.netty.handler.codec.serialization.ClassResolver; 9 | import io.netty.handler.codec.serialization.ObjectDecoder; 10 | import io.netty.handler.codec.serialization.ObjectEncoder; 11 | 12 | /** 13 | * 同样的与服务端解码和编码格式 14 | */ 15 | public class NettyClientInitializer extends ChannelInitializer { 16 | @Override 17 | protected void initChannel(SocketChannel ch) throws Exception { 18 | ChannelPipeline pipeline = ch.pipeline(); 19 | // 消息格式 [长度][消息体] 20 | pipeline.addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,0,4,0,4)); 21 | // 计算当前待大宋消息的长度,写入到前4个字节中 22 | pipeline.addLast(new LengthFieldPrepender(4)); 23 | pipeline.addLast(new ObjectEncoder()); 24 | 25 | pipeline.addLast(new ObjectDecoder(new ClassResolver() { 26 | @Override 27 | public Class resolve(String className) throws ClassNotFoundException { 28 | return Class.forName(className); 29 | } 30 | })); 31 | 32 | pipeline.addLast(new NettyClientHandler()); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/codec/ObjectSerializer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.codec; 2 | 3 | import java.io.*; 4 | 5 | public class ObjectSerializer implements Serializer{ 6 | 7 | // 利用java IO 对象 -> 字节数组 8 | @Override 9 | public byte[] serialize(Object obj) { 10 | byte[] bytes = null; 11 | ByteArrayOutputStream bos = new ByteArrayOutputStream(); 12 | try { 13 | ObjectOutputStream oos = new ObjectOutputStream(bos); 14 | oos.writeObject(obj); 15 | oos.flush(); 16 | bytes = bos.toByteArray(); 17 | oos.close(); 18 | bos.close(); 19 | } catch (IOException e) { 20 | e.printStackTrace(); 21 | } 22 | 23 | return bytes; 24 | } 25 | 26 | // 字节数组 -> 对象 27 | @Override 28 | public Object deserialize(byte[] bytes, int messageType) { 29 | Object obj = null; 30 | ByteArrayInputStream bis = new ByteArrayInputStream(bytes); 31 | try { 32 | ObjectInputStream ois = new ObjectInputStream(bis); 33 | obj = ois.readObject(); 34 | ois.close(); 35 | bis.close(); 36 | } catch (IOException | ClassNotFoundException e) { 37 | e.printStackTrace(); 38 | } 39 | return obj; 40 | } 41 | 42 | // 0 代表java原生序列化器 43 | @Override 44 | public int getType() { 45 | return 0; 46 | } 47 | } 48 | 49 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/codec/ObjectSerializer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.codec; 2 | 3 | import java.io.*; 4 | 5 | public class ObjectSerializer implements Serializer { 6 | 7 | // 利用java IO 对象 -> 字节数组 8 | @Override 9 | public byte[] serialize(Object obj) { 10 | byte[] bytes = null; 11 | ByteArrayOutputStream bos = new ByteArrayOutputStream(); 12 | try { 13 | ObjectOutputStream oos = new ObjectOutputStream(bos); 14 | oos.writeObject(obj); 15 | oos.flush(); 16 | bytes = bos.toByteArray(); 17 | oos.close(); 18 | bos.close(); 19 | } catch (IOException e) { 20 | e.printStackTrace(); 21 | } 22 | 23 | return bytes; 24 | } 25 | 26 | // 字节数组 -> 对象 27 | @Override 28 | public Object deserialize(byte[] bytes, int messageType) { 29 | Object obj = null; 30 | ByteArrayInputStream bis = new ByteArrayInputStream(bytes); 31 | try { 32 | ObjectInputStream ois = new ObjectInputStream(bis); 33 | obj = ois.readObject(); 34 | ois.close(); 35 | bis.close(); 36 | } catch (IOException | ClassNotFoundException e) { 37 | e.printStackTrace(); 38 | } 39 | return obj; 40 | } 41 | 42 | // 0 代表java原生序列化器 43 | @Override 44 | public int getType() { 45 | return 0; 46 | } 47 | } 48 | 49 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/codec/ObjectSerializer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.codec; 2 | 3 | import java.io.*; 4 | 5 | public class ObjectSerializer implements Serializer { 6 | 7 | // 利用java IO 对象 -> 字节数组 8 | @Override 9 | public byte[] serialize(Object obj) { 10 | byte[] bytes = null; 11 | ByteArrayOutputStream bos = new ByteArrayOutputStream(); 12 | try { 13 | ObjectOutputStream oos = new ObjectOutputStream(bos); 14 | oos.writeObject(obj); 15 | oos.flush(); 16 | bytes = bos.toByteArray(); 17 | oos.close(); 18 | bos.close(); 19 | } catch (IOException e) { 20 | e.printStackTrace(); 21 | } 22 | 23 | return bytes; 24 | } 25 | 26 | // 字节数组 -> 对象 27 | @Override 28 | public Object deserialize(byte[] bytes, int messageType) { 29 | Object obj = null; 30 | ByteArrayInputStream bis = new ByteArrayInputStream(bytes); 31 | try { 32 | ObjectInputStream ois = new ObjectInputStream(bis); 33 | obj = ois.readObject(); 34 | ois.close(); 35 | bis.close(); 36 | } catch (IOException | ClassNotFoundException e) { 37 | e.printStackTrace(); 38 | } 39 | return obj; 40 | } 41 | 42 | // 0 代表java原生序列化器 43 | @Override 44 | public int getType() { 45 | return 0; 46 | } 47 | } 48 | 49 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/codec/MyDecode.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.codec; 2 | 3 | import io.netty.buffer.ByteBuf; 4 | import io.netty.channel.ChannelHandlerContext; 5 | import io.netty.handler.codec.ByteToMessageDecoder; 6 | import lombok.AllArgsConstructor; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * 按照自定义的消息格式解码数据 12 | */ 13 | @AllArgsConstructor 14 | public class MyDecode extends ByteToMessageDecoder { 15 | 16 | 17 | @Override 18 | protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { 19 | // 1. 读取消息类型 20 | short messageType = in.readShort(); 21 | // 现在还只支持request与response请求 22 | if(messageType != MessageType.REQUEST.getCode() && 23 | messageType != MessageType.RESPONSE.getCode()){ 24 | System.out.println("暂不支持此种数据"); 25 | return; 26 | } 27 | // 2. 读取序列化的类型 28 | short serializerType = in.readShort(); 29 | // 根据类型得到相应的序列化器 30 | Serializer serializer = Serializer.getSerializerByCode(serializerType); 31 | if(serializer == null)throw new RuntimeException("不存在对应的序列化器"); 32 | // 3. 读取数据序列化后的字节长度 33 | int length = in.readInt(); 34 | // 4. 读取序列化数组 35 | byte[] bytes = new byte[length]; 36 | in.readBytes(bytes); 37 | // 用对应的序列化器解码字节数组 38 | Object deserialize = serializer.deserialize(bytes, messageType); 39 | out.add(deserialize); 40 | } 41 | } -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/codec/MyDecode.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.codec; 2 | 3 | import io.netty.buffer.ByteBuf; 4 | import io.netty.channel.ChannelHandlerContext; 5 | import io.netty.handler.codec.ByteToMessageDecoder; 6 | import lombok.AllArgsConstructor; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * 按照自定义的消息格式解码数据 12 | */ 13 | @AllArgsConstructor 14 | public class MyDecode extends ByteToMessageDecoder { 15 | 16 | 17 | @Override 18 | protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { 19 | // 1. 读取消息类型 20 | short messageType = in.readShort(); 21 | // 现在还只支持request与response请求 22 | if(messageType != MessageType.REQUEST.getCode() && 23 | messageType != MessageType.RESPONSE.getCode()){ 24 | System.out.println("暂不支持此种数据"); 25 | return; 26 | } 27 | // 2. 读取序列化的类型 28 | short serializerType = in.readShort(); 29 | // 根据类型得到相应的序列化器 30 | Serializer serializer = Serializer.getSerializerByCode(serializerType); 31 | if(serializer == null)throw new RuntimeException("不存在对应的序列化器"); 32 | // 3. 读取数据序列化后的字节长度 33 | int length = in.readInt(); 34 | // 4. 读取序列化数组 35 | byte[] bytes = new byte[length]; 36 | in.readBytes(bytes); 37 | // 用对应的序列化器解码字节数组 38 | Object deserialize = serializer.deserialize(bytes, messageType); 39 | out.add(deserialize); 40 | } 41 | } -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/codec/MyDecode.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.codec; 2 | 3 | import io.netty.buffer.ByteBuf; 4 | import io.netty.channel.ChannelHandlerContext; 5 | import io.netty.handler.codec.ByteToMessageDecoder; 6 | import lombok.AllArgsConstructor; 7 | 8 | import java.util.List; 9 | 10 | /** 11 | * 按照自定义的消息格式解码数据 12 | */ 13 | @AllArgsConstructor 14 | public class MyDecode extends ByteToMessageDecoder { 15 | 16 | 17 | @Override 18 | protected void decode(ChannelHandlerContext ctx, ByteBuf in, List out) throws Exception { 19 | // 1. 读取消息类型 20 | short messageType = in.readShort(); 21 | // 现在还只支持request与response请求 22 | if(messageType != MessageType.REQUEST.getCode() && 23 | messageType != MessageType.RESPONSE.getCode()){ 24 | System.out.println("暂不支持此种数据"); 25 | return; 26 | } 27 | // 2. 读取序列化的类型 28 | short serializerType = in.readShort(); 29 | // 根据类型得到相应的序列化器 30 | Serializer serializer = Serializer.getSerializerByCode(serializerType); 31 | if(serializer == null)throw new RuntimeException("不存在对应的序列化器"); 32 | // 3. 读取数据序列化后的字节长度 33 | int length = in.readInt(); 34 | // 4. 读取序列化数组 35 | byte[] bytes = new byte[length]; 36 | in.readBytes(bytes); 37 | // 用对应的序列化器解码字节数组 38 | Object deserialize = serializer.deserialize(bytes, messageType); 39 | out.add(deserialize); 40 | } 41 | } -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/client/SimpleRPCClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.client; 2 | 3 | 4 | import com.ganghuan.myRPCVersion4.common.RPCRequest; 5 | import com.ganghuan.myRPCVersion4.common.RPCResponse; 6 | import lombok.AllArgsConstructor; 7 | 8 | import java.io.IOException; 9 | import java.io.ObjectInputStream; 10 | import java.io.ObjectOutputStream; 11 | import java.net.Socket; 12 | 13 | @AllArgsConstructor 14 | public class SimpleRPCClient implements RPCClient { 15 | private String host; 16 | private int port; 17 | 18 | // 客户端发起一次请求调用,Socket建立连接,发起请求Request,得到响应Response 19 | // 这里的request是封装好的,不同的service需要进行不同的封装, 客户端只知道Service接口,需要一层动态代理根据反射封装不同的Service 20 | public RPCResponse sendRequest(RPCRequest request) { 21 | try { 22 | Socket socket = new Socket(host, port); 23 | 24 | ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 25 | ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); 26 | 27 | System.out.println(request); 28 | objectOutputStream.writeObject(request); 29 | objectOutputStream.flush(); 30 | 31 | RPCResponse response = (RPCResponse) objectInputStream.readObject(); 32 | 33 | //System.out.println(response.getData()); 34 | return response; 35 | } catch (IOException | ClassNotFoundException e) { 36 | System.out.println(); 37 | return null; 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/server/ServiceProvider.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.server; 2 | 3 | 4 | 5 | import com.ganghuan.myRPCVersion5.register.ServiceRegister; 6 | import com.ganghuan.myRPCVersion5.register.ZkServiceRegister; 7 | 8 | import java.net.InetSocketAddress; 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | 12 | /** 13 | * 存放服务接口名与服务端对应的实现类 14 | * 服务启动时要暴露其相关的实现类 15 | * 根据request中的interface调用服务端中相关实现类 16 | * 17 | * 后面在这里新增了在zookeeper中注册的功能 18 | */ 19 | public class ServiceProvider { 20 | /** 21 | * 一个实现类可能实现多个服务接口, 22 | */ 23 | private Map interfaceProvider; 24 | 25 | private ServiceRegister serviceRegister; 26 | private String host; 27 | private int port; 28 | 29 | public ServiceProvider(String host, int port){ 30 | // 需要传入服务端自身的服务的网络地址 31 | this.host = host; 32 | this.port = port; 33 | this.interfaceProvider = new HashMap<>(); 34 | this.serviceRegister = new ZkServiceRegister(); 35 | } 36 | 37 | public void provideServiceInterface(Object service){ 38 | Class[] interfaces = service.getClass().getInterfaces(); 39 | 40 | for(Class clazz : interfaces){ 41 | // 本机的映射表 42 | interfaceProvider.put(clazz.getName(),service); 43 | // 在注册中心注册服务 44 | serviceRegister.register(clazz.getName(),new InetSocketAddress(host,port)); 45 | } 46 | 47 | } 48 | 49 | public Object getService(String interfaceName){ 50 | return interfaceProvider.get(interfaceName); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/server/ServiceProvider.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.server; 2 | 3 | 4 | 5 | import com.ganghuan.myRPCVersion6.register.ServiceRegister; 6 | import com.ganghuan.myRPCVersion6.register.ZkServiceRegister; 7 | 8 | import java.net.InetSocketAddress; 9 | import java.util.HashMap; 10 | import java.util.Map; 11 | 12 | /** 13 | * 存放服务接口名与服务端对应的实现类 14 | * 服务启动时要暴露其相关的实现类 15 | * 根据request中的interface调用服务端中相关实现类 16 | * 17 | * 后面在这里新增了在zookeeper中注册的功能 18 | */ 19 | public class ServiceProvider { 20 | /** 21 | * 一个实现类可能实现多个服务接口, 22 | */ 23 | private Map interfaceProvider; 24 | 25 | private ServiceRegister serviceRegister; 26 | private String host; 27 | private int port; 28 | 29 | public ServiceProvider(String host, int port){ 30 | // 需要传入服务端自身的服务的网络地址 31 | this.host = host; 32 | this.port = port; 33 | this.interfaceProvider = new HashMap<>(); 34 | this.serviceRegister = new ZkServiceRegister(); 35 | } 36 | 37 | public void provideServiceInterface(Object service){ 38 | Class[] interfaces = service.getClass().getInterfaces(); 39 | 40 | for(Class clazz : interfaces){ 41 | // 本机的映射表 42 | interfaceProvider.put(clazz.getName(),service); 43 | // 在注册中心注册服务 44 | serviceRegister.register(clazz.getName(),new InetSocketAddress(host,port)); 45 | } 46 | 47 | } 48 | 49 | public Object getService(String interfaceName){ 50 | return interfaceProvider.get(interfaceName); 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/server/NettyRPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.server; 2 | 3 | 4 | import io.netty.bootstrap.ServerBootstrap; 5 | import io.netty.channel.ChannelFuture; 6 | import io.netty.channel.nio.NioEventLoopGroup; 7 | import io.netty.channel.socket.nio.NioServerSocketChannel; 8 | import lombok.AllArgsConstructor; 9 | 10 | /** 11 | * 实现RPCServer接口,负责监听与发送数据 12 | */ 13 | @AllArgsConstructor 14 | public class NettyRPCServer implements RPCServer { 15 | private ServiceProvider serviceProvider; 16 | @Override 17 | public void start(int port) { 18 | // netty 服务线程组boss负责建立连接, work负责具体的请求 19 | NioEventLoopGroup bossGroup = new NioEventLoopGroup(); 20 | NioEventLoopGroup workGroup = new NioEventLoopGroup(); 21 | System.out.println("Netty服务端启动了..."); 22 | try { 23 | // 启动netty服务器 24 | ServerBootstrap serverBootstrap = new ServerBootstrap(); 25 | // 初始化 26 | serverBootstrap.group(bossGroup,workGroup).channel(NioServerSocketChannel.class) 27 | .childHandler(new NettyServerInitializer(serviceProvider)); 28 | // 同步阻塞 29 | ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); 30 | // 死循环监听 31 | channelFuture.channel().closeFuture().sync(); 32 | } catch (InterruptedException e) { 33 | e.printStackTrace(); 34 | } finally { 35 | bossGroup.shutdownGracefully(); 36 | workGroup.shutdownGracefully(); 37 | } 38 | } 39 | 40 | @Override 41 | public void stop() { 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/server/NettyRPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.server; 2 | 3 | 4 | import io.netty.bootstrap.ServerBootstrap; 5 | import io.netty.channel.ChannelFuture; 6 | import io.netty.channel.nio.NioEventLoopGroup; 7 | import io.netty.channel.socket.nio.NioServerSocketChannel; 8 | import lombok.AllArgsConstructor; 9 | 10 | /** 11 | * 实现RPCServer接口,负责监听与发送数据 12 | */ 13 | @AllArgsConstructor 14 | public class NettyRPCServer implements RPCServer { 15 | private ServiceProvider serviceProvider; 16 | @Override 17 | public void start(int port) { 18 | // netty 服务线程组boss负责建立连接, work负责具体的请求 19 | NioEventLoopGroup bossGroup = new NioEventLoopGroup(); 20 | NioEventLoopGroup workGroup = new NioEventLoopGroup(); 21 | System.out.println("Netty服务端启动了..."); 22 | try { 23 | // 启动netty服务器 24 | ServerBootstrap serverBootstrap = new ServerBootstrap(); 25 | // 初始化 26 | serverBootstrap.group(bossGroup,workGroup).channel(NioServerSocketChannel.class) 27 | .childHandler(new NettyServerInitializer(serviceProvider)); 28 | // 同步阻塞 29 | ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); 30 | // 死循环监听 31 | channelFuture.channel().closeFuture().sync(); 32 | } catch (InterruptedException e) { 33 | e.printStackTrace(); 34 | } finally { 35 | bossGroup.shutdownGracefully(); 36 | workGroup.shutdownGracefully(); 37 | } 38 | } 39 | 40 | @Override 41 | public void stop() { 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/server/NettyRPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.server; 2 | 3 | 4 | import io.netty.bootstrap.ServerBootstrap; 5 | import io.netty.channel.ChannelFuture; 6 | import io.netty.channel.nio.NioEventLoopGroup; 7 | import io.netty.channel.socket.nio.NioServerSocketChannel; 8 | import lombok.AllArgsConstructor; 9 | 10 | /** 11 | * 实现RPCServer接口,负责监听与发送数据 12 | */ 13 | @AllArgsConstructor 14 | public class NettyRPCServer implements RPCServer { 15 | private ServiceProvider serviceProvider; 16 | @Override 17 | public void start(int port) { 18 | // netty 服务线程组boss负责建立连接, work负责具体的请求 19 | NioEventLoopGroup bossGroup = new NioEventLoopGroup(); 20 | NioEventLoopGroup workGroup = new NioEventLoopGroup(); 21 | System.out.println("Netty服务端启动了..."); 22 | try { 23 | // 启动netty服务器 24 | ServerBootstrap serverBootstrap = new ServerBootstrap(); 25 | // 初始化 26 | serverBootstrap.group(bossGroup,workGroup).channel(NioServerSocketChannel.class) 27 | .childHandler(new NettyServerInitializer(serviceProvider)); 28 | // 同步阻塞 29 | ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); 30 | // 死循环监听 31 | channelFuture.channel().closeFuture().sync(); 32 | } catch (InterruptedException e) { 33 | e.printStackTrace(); 34 | } finally { 35 | bossGroup.shutdownGracefully(); 36 | workGroup.shutdownGracefully(); 37 | } 38 | } 39 | 40 | @Override 41 | public void stop() { 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/server/NettyRPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.server; 2 | 3 | 4 | import io.netty.bootstrap.ServerBootstrap; 5 | import io.netty.channel.ChannelFuture; 6 | import io.netty.channel.nio.NioEventLoopGroup; 7 | import io.netty.channel.socket.nio.NioServerSocketChannel; 8 | import lombok.AllArgsConstructor; 9 | 10 | /** 11 | * 实现RPCServer接口,负责监听与发送数据 12 | */ 13 | @AllArgsConstructor 14 | public class NettyRPCServer implements RPCServer { 15 | private ServiceProvider serviceProvider; 16 | @Override 17 | public void start(int port) { 18 | // netty 服务线程组boss负责建立连接, work负责具体的请求 19 | NioEventLoopGroup bossGroup = new NioEventLoopGroup(); 20 | NioEventLoopGroup workGroup = new NioEventLoopGroup(); 21 | System.out.println("Netty服务端启动了...端口号为" + port ); 22 | try { 23 | // 启动netty服务器 24 | ServerBootstrap serverBootstrap = new ServerBootstrap(); 25 | // 初始化 26 | serverBootstrap.group(bossGroup,workGroup).channel(NioServerSocketChannel.class) 27 | .childHandler(new NettyServerInitializer(serviceProvider)); 28 | // 同步阻塞 29 | ChannelFuture channelFuture = serverBootstrap.bind(port).sync(); 30 | // 死循环监听 31 | channelFuture.channel().closeFuture().sync(); 32 | } catch (InterruptedException e) { 33 | e.printStackTrace(); 34 | } finally { 35 | bossGroup.shutdownGracefully(); 36 | workGroup.shutdownGracefully(); 37 | } 38 | } 39 | 40 | @Override 41 | public void stop() { 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/server/NettyServerInitializer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.server; 2 | 3 | import io.netty.channel.ChannelInitializer; 4 | import io.netty.channel.ChannelPipeline; 5 | import io.netty.channel.socket.SocketChannel; 6 | import io.netty.handler.codec.LengthFieldBasedFrameDecoder; 7 | import io.netty.handler.codec.LengthFieldPrepender; 8 | import io.netty.handler.codec.serialization.ClassResolver; 9 | import io.netty.handler.codec.serialization.ObjectDecoder; 10 | import io.netty.handler.codec.serialization.ObjectEncoder; 11 | import lombok.AllArgsConstructor; 12 | 13 | /** 14 | * 初始化,主要负责序列化的编码解码, 需要解决netty的粘包问题 15 | */ 16 | @AllArgsConstructor 17 | public class NettyServerInitializer extends ChannelInitializer { 18 | private ServiceProvider serviceProvider; 19 | @Override 20 | protected void initChannel(SocketChannel ch) throws Exception { 21 | ChannelPipeline pipeline = ch.pipeline(); 22 | // 消息格式 [长度][消息体], 解决粘包问题 23 | pipeline.addLast(new LengthFieldBasedFrameDecoder(Integer.MAX_VALUE,0,4,0,4)); 24 | // 计算当前待大宋消息的长度,写入到前4个字节中 25 | pipeline.addLast(new LengthFieldPrepender(4)); 26 | 27 | // 这里使用的还是java 序列化方式, netty的自带的解码编码支持传输这种结构 28 | pipeline.addLast(new ObjectEncoder()); 29 | pipeline.addLast(new ObjectDecoder(new ClassResolver() { 30 | @Override 31 | public Class resolve(String className) throws ClassNotFoundException { 32 | return Class.forName(className); 33 | } 34 | })); 35 | 36 | pipeline.addLast(new NettyRPCServerHandler(serviceProvider)); 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion0/server/RPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion0.server; 2 | 3 | import com.ganghuan.myRPCVersion0.common.User; 4 | 5 | import java.io.IOException; 6 | import java.io.ObjectInputStream; 7 | import java.io.ObjectOutputStream; 8 | import java.net.ServerSocket; 9 | import java.net.Socket; 10 | 11 | public class RPCServer { 12 | public static void main(String[] args) { 13 | UserServiceImpl userService = new UserServiceImpl(); 14 | try { 15 | ServerSocket serverSocket = new ServerSocket(8899); 16 | System.out.println("服务端启动了"); 17 | // BIO的方式监听Socket 18 | while (true){ 19 | Socket socket = serverSocket.accept(); 20 | // 开启一个线程去处理 21 | new Thread(()->{ 22 | try { 23 | ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); 24 | ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 25 | // 读取客户端传过来的id 26 | Integer id = ois.readInt(); 27 | User userByUserId = userService.getUserByUserId(id); 28 | // 写入User对象给客户端 29 | oos.writeObject(userByUserId); 30 | oos.flush(); 31 | } catch (IOException e){ 32 | e.printStackTrace(); 33 | System.out.println("从IO中读取数据错误"); 34 | } 35 | }).start(); 36 | } 37 | 38 | } catch (IOException e) { 39 | e.printStackTrace(); 40 | System.out.println("服务器启动失败"); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/client/SimpleRPCClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.client; 2 | 3 | 4 | import com.ganghuan.myRPCVersion3.common.Blog; 5 | import com.ganghuan.myRPCVersion3.common.RPCRequest; 6 | import com.ganghuan.myRPCVersion3.common.RPCResponse; 7 | import com.ganghuan.myRPCVersion3.common.User; 8 | import com.ganghuan.myRPCVersion3.service.BlogService; 9 | import com.ganghuan.myRPCVersion3.service.UserService; 10 | import lombok.AllArgsConstructor; 11 | 12 | import java.io.IOException; 13 | import java.io.ObjectInputStream; 14 | import java.io.ObjectOutputStream; 15 | import java.net.Socket; 16 | 17 | @AllArgsConstructor 18 | public class SimpleRPCClient implements RPCClient{ 19 | private String host; 20 | private int port; 21 | 22 | // 客户端发起一次请求调用,Socket建立连接,发起请求Request,得到响应Response 23 | // 这里的request是封装好的,不同的service需要进行不同的封装, 客户端只知道Service接口,需要一层动态代理根据反射封装不同的Service 24 | public RPCResponse sendRequest(RPCRequest request) { 25 | try { 26 | Socket socket = new Socket(host, port); 27 | 28 | ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 29 | ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); 30 | 31 | System.out.println(request); 32 | objectOutputStream.writeObject(request); 33 | objectOutputStream.flush(); 34 | 35 | RPCResponse response = (RPCResponse) objectInputStream.readObject(); 36 | 37 | //System.out.println(response.getData()); 38 | return response; 39 | } catch (IOException | ClassNotFoundException e) { 40 | System.out.println(); 41 | return null; 42 | } 43 | } 44 | } 45 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | org.ganghuan 8 | myrpc 9 | 1.0-SNAPSHOT 10 | 11 | 12 | 11 13 | 11 14 | 15 | 16 | 17 | 18 | org.projectlombok 19 | lombok 20 | 1.18.12 21 | provided 22 | 23 | 24 | 25 | 26 | io.netty 27 | netty-all 28 | 4.1.51.Final 29 | 30 | 31 | 32 | com.alibaba 33 | fastjson 34 | 1.2.67 35 | 36 | 37 | 38 | org.apache.curator 39 | curator-recipes 40 | 5.1.0 41 | 42 | 43 | 44 | org.slf4j 45 | slf4j-nop 46 | 1.7.30 47 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion2/server/ThreadPoolRPCRPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion2.server; 2 | 3 | import java.io.IOException; 4 | import java.net.ServerSocket; 5 | import java.net.Socket; 6 | import java.util.concurrent.ArrayBlockingQueue; 7 | import java.util.concurrent.BlockingQueue; 8 | import java.util.concurrent.ThreadPoolExecutor; 9 | import java.util.concurrent.TimeUnit; 10 | 11 | 12 | /** 13 | * 线程池版服务端的实现 14 | */ 15 | public class ThreadPoolRPCRPCServer implements RPCServer { 16 | private final ThreadPoolExecutor threadPool; 17 | private ServiceProvider serviceProvider; 18 | // 默认构造函数 19 | public ThreadPoolRPCRPCServer(ServiceProvider serviceProvider){ 20 | threadPool = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), 21 | 1000, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100)); 22 | this.serviceProvider = serviceProvider; 23 | } 24 | // 自定义构造函数 25 | public ThreadPoolRPCRPCServer(ServiceProvider serviceProvider, int corePoolSize, 26 | int maximumPoolSize, 27 | long keepAliveTime, 28 | TimeUnit unit, 29 | BlockingQueue workQueue){ 30 | 31 | threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); 32 | this.serviceProvider = serviceProvider; 33 | } 34 | @Override 35 | public void start(int port) { 36 | System.out.println("线程池版服务端启动了"); 37 | try { 38 | ServerSocket serverSocket = new ServerSocket(port); 39 | while(true){ 40 | Socket socket = serverSocket.accept(); 41 | threadPool.execute(new WorkThread(socket,serviceProvider)); 42 | } 43 | } catch (IOException e) { 44 | e.printStackTrace(); 45 | } 46 | } 47 | 48 | @Override 49 | public void stop() { 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/server/ThreadPoolRPCRPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.server; 2 | 3 | import java.io.IOException; 4 | import java.net.ServerSocket; 5 | import java.net.Socket; 6 | import java.util.concurrent.ArrayBlockingQueue; 7 | import java.util.concurrent.BlockingQueue; 8 | import java.util.concurrent.ThreadPoolExecutor; 9 | import java.util.concurrent.TimeUnit; 10 | 11 | 12 | /** 13 | * 线程池版服务端的实现 14 | */ 15 | public class ThreadPoolRPCRPCServer implements RPCServer { 16 | private final ThreadPoolExecutor threadPool; 17 | private ServiceProvider serviceProvider; 18 | // 默认构造函数 19 | public ThreadPoolRPCRPCServer(ServiceProvider serviceProvider){ 20 | threadPool = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), 21 | 1000, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100)); 22 | this.serviceProvider = serviceProvider; 23 | } 24 | // 自定义构造函数 25 | public ThreadPoolRPCRPCServer(ServiceProvider serviceProvider, int corePoolSize, 26 | int maximumPoolSize, 27 | long keepAliveTime, 28 | TimeUnit unit, 29 | BlockingQueue workQueue){ 30 | 31 | threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); 32 | this.serviceProvider = serviceProvider; 33 | } 34 | @Override 35 | public void start(int port) { 36 | System.out.println("线程池版服务端启动了"); 37 | try { 38 | ServerSocket serverSocket = new ServerSocket(port); 39 | while(true){ 40 | Socket socket = serverSocket.accept(); 41 | threadPool.execute(new WorkThread(socket,serviceProvider)); 42 | } 43 | } catch (IOException e) { 44 | e.printStackTrace(); 45 | } 46 | } 47 | 48 | @Override 49 | public void stop() { 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/server/ThreadPoolRPCRPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.server; 2 | 3 | import java.io.IOException; 4 | import java.net.ServerSocket; 5 | import java.net.Socket; 6 | import java.util.concurrent.ArrayBlockingQueue; 7 | import java.util.concurrent.BlockingQueue; 8 | import java.util.concurrent.ThreadPoolExecutor; 9 | import java.util.concurrent.TimeUnit; 10 | 11 | 12 | /** 13 | * 线程池版服务端的实现 14 | */ 15 | public class ThreadPoolRPCRPCServer implements RPCServer { 16 | private final ThreadPoolExecutor threadPool; 17 | private ServiceProvider serviceProvider; 18 | // 默认构造函数 19 | public ThreadPoolRPCRPCServer(ServiceProvider serviceProvider){ 20 | threadPool = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), 21 | 1000, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100)); 22 | this.serviceProvider = serviceProvider; 23 | } 24 | // 自定义构造函数 25 | public ThreadPoolRPCRPCServer(ServiceProvider serviceProvider, int corePoolSize, 26 | int maximumPoolSize, 27 | long keepAliveTime, 28 | TimeUnit unit, 29 | BlockingQueue workQueue){ 30 | 31 | threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); 32 | this.serviceProvider = serviceProvider; 33 | } 34 | @Override 35 | public void start(int port) { 36 | System.out.println("线程池版服务端启动了"); 37 | try { 38 | ServerSocket serverSocket = new ServerSocket(port); 39 | while(true){ 40 | Socket socket = serverSocket.accept(); 41 | threadPool.execute(new WorkThread(socket,serviceProvider)); 42 | } 43 | } catch (IOException e) { 44 | e.printStackTrace(); 45 | } 46 | } 47 | 48 | @Override 49 | public void stop() { 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/server/ThreadPoolRPCRPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.server; 2 | 3 | import java.io.IOException; 4 | import java.net.ServerSocket; 5 | import java.net.Socket; 6 | import java.util.concurrent.ArrayBlockingQueue; 7 | import java.util.concurrent.BlockingQueue; 8 | import java.util.concurrent.ThreadPoolExecutor; 9 | import java.util.concurrent.TimeUnit; 10 | 11 | 12 | /** 13 | * 线程池版服务端的实现 14 | */ 15 | public class ThreadPoolRPCRPCServer implements RPCServer { 16 | private final ThreadPoolExecutor threadPool; 17 | private ServiceProvider serviceProvider; 18 | // 默认构造函数 19 | public ThreadPoolRPCRPCServer(ServiceProvider serviceProvider){ 20 | threadPool = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), 21 | 1000, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100)); 22 | this.serviceProvider = serviceProvider; 23 | } 24 | // 自定义构造函数 25 | public ThreadPoolRPCRPCServer(ServiceProvider serviceProvider, int corePoolSize, 26 | int maximumPoolSize, 27 | long keepAliveTime, 28 | TimeUnit unit, 29 | BlockingQueue workQueue){ 30 | 31 | threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); 32 | this.serviceProvider = serviceProvider; 33 | } 34 | @Override 35 | public void start(int port) { 36 | System.out.println("线程池版服务端启动了"); 37 | try { 38 | ServerSocket serverSocket = new ServerSocket(port); 39 | while(true){ 40 | Socket socket = serverSocket.accept(); 41 | threadPool.execute(new WorkThread(socket,serviceProvider)); 42 | } 43 | } catch (IOException e) { 44 | e.printStackTrace(); 45 | } 46 | } 47 | 48 | @Override 49 | public void stop() { 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/server/ThreadPoolRPCRPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.server; 2 | 3 | import java.io.IOException; 4 | import java.net.ServerSocket; 5 | import java.net.Socket; 6 | import java.util.concurrent.ArrayBlockingQueue; 7 | import java.util.concurrent.BlockingQueue; 8 | import java.util.concurrent.ThreadPoolExecutor; 9 | import java.util.concurrent.TimeUnit; 10 | 11 | 12 | /** 13 | * 线程池版服务端的实现 14 | */ 15 | public class ThreadPoolRPCRPCServer implements RPCServer { 16 | private final ThreadPoolExecutor threadPool; 17 | private ServiceProvider serviceProvider; 18 | // 默认构造函数 19 | public ThreadPoolRPCRPCServer(ServiceProvider serviceProvider){ 20 | threadPool = new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), 21 | 1000, 60, TimeUnit.SECONDS, new ArrayBlockingQueue<>(100)); 22 | this.serviceProvider = serviceProvider; 23 | } 24 | // 自定义构造函数 25 | public ThreadPoolRPCRPCServer(ServiceProvider serviceProvider, int corePoolSize, 26 | int maximumPoolSize, 27 | long keepAliveTime, 28 | TimeUnit unit, 29 | BlockingQueue workQueue){ 30 | 31 | threadPool = new ThreadPoolExecutor(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue); 32 | this.serviceProvider = serviceProvider; 33 | } 34 | @Override 35 | public void start(int port) { 36 | System.out.println("线程池版服务端启动了"); 37 | try { 38 | ServerSocket serverSocket = new ServerSocket(port); 39 | while(true){ 40 | Socket socket = serverSocket.accept(); 41 | threadPool.execute(new WorkThread(socket,serviceProvider)); 42 | } 43 | } catch (IOException e) { 44 | e.printStackTrace(); 45 | } 46 | } 47 | 48 | @Override 49 | public void stop() { 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/server/NettyRPCServerHandler.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.server; 2 | 3 | import com.ganghuan.myRPCVersion3.common.RPCRequest; 4 | import com.ganghuan.myRPCVersion3.common.RPCResponse; 5 | import io.netty.channel.ChannelHandlerContext; 6 | import io.netty.channel.SimpleChannelInboundHandler; 7 | import lombok.AllArgsConstructor; 8 | 9 | import java.lang.reflect.InvocationTargetException; 10 | import java.lang.reflect.Method; 11 | 12 | /** 13 | * 因为是服务器端,我们知道接受到请求格式是RPCRequest 14 | * Object类型也行,强制转型就行 15 | */ 16 | @AllArgsConstructor 17 | public class NettyRPCServerHandler extends SimpleChannelInboundHandler { 18 | private ServiceProvider serviceProvider; 19 | 20 | 21 | @Override 22 | protected void channelRead0(ChannelHandlerContext ctx, RPCRequest msg) throws Exception { 23 | //System.out.println(msg); 24 | RPCResponse response = getResponse(msg); 25 | ctx.writeAndFlush(response); 26 | ctx.close(); 27 | } 28 | 29 | @Override 30 | public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { 31 | cause.printStackTrace(); 32 | ctx.close(); 33 | } 34 | 35 | RPCResponse getResponse(RPCRequest request) { 36 | // 得到服务名 37 | String interfaceName = request.getInterfaceName(); 38 | // 得到服务端相应服务实现类 39 | Object service = serviceProvider.getService(interfaceName); 40 | // 反射调用方法 41 | Method method = null; 42 | try { 43 | method = service.getClass().getMethod(request.getMethodName(), request.getParamsTypes()); 44 | Object invoke = method.invoke(service, request.getParams()); 45 | return RPCResponse.success(invoke); 46 | } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { 47 | e.printStackTrace(); 48 | System.out.println("方法执行错误"); 49 | return RPCResponse.fail(); 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/server/NettyRPCServerHandler.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.server; 2 | 3 | import com.ganghuan.myRPCVersion4.common.RPCRequest; 4 | import com.ganghuan.myRPCVersion4.common.RPCResponse; 5 | import io.netty.channel.ChannelHandlerContext; 6 | import io.netty.channel.SimpleChannelInboundHandler; 7 | import lombok.AllArgsConstructor; 8 | 9 | import java.lang.reflect.InvocationTargetException; 10 | import java.lang.reflect.Method; 11 | 12 | /** 13 | * 因为是服务器端,我们知道接受到请求格式是RPCRequest 14 | * Object类型也行,强制转型就行 15 | */ 16 | @AllArgsConstructor 17 | public class NettyRPCServerHandler extends SimpleChannelInboundHandler { 18 | private ServiceProvider serviceProvider; 19 | 20 | 21 | @Override 22 | protected void channelRead0(ChannelHandlerContext ctx, RPCRequest msg) throws Exception { 23 | //System.out.println(msg); 24 | RPCResponse response = getResponse(msg); 25 | ctx.writeAndFlush(response); 26 | ctx.close(); 27 | } 28 | 29 | @Override 30 | public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { 31 | cause.printStackTrace(); 32 | ctx.close(); 33 | } 34 | 35 | RPCResponse getResponse(RPCRequest request) { 36 | // 得到服务名 37 | String interfaceName = request.getInterfaceName(); 38 | // 得到服务端相应服务实现类 39 | Object service = serviceProvider.getService(interfaceName); 40 | // 反射调用方法 41 | Method method = null; 42 | try { 43 | method = service.getClass().getMethod(request.getMethodName(), request.getParamsTypes()); 44 | Object invoke = method.invoke(service, request.getParams()); 45 | return RPCResponse.success(invoke); 46 | } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { 47 | e.printStackTrace(); 48 | System.out.println("方法执行错误"); 49 | return RPCResponse.fail(); 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/server/NettyRPCServerHandler.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.server; 2 | 3 | import com.ganghuan.myRPCVersion5.common.RPCRequest; 4 | import com.ganghuan.myRPCVersion5.common.RPCResponse; 5 | import io.netty.channel.ChannelHandlerContext; 6 | import io.netty.channel.SimpleChannelInboundHandler; 7 | import lombok.AllArgsConstructor; 8 | 9 | import java.lang.reflect.InvocationTargetException; 10 | import java.lang.reflect.Method; 11 | 12 | /** 13 | * 因为是服务器端,我们知道接受到请求格式是RPCRequest 14 | * Object类型也行,强制转型就行 15 | */ 16 | @AllArgsConstructor 17 | public class NettyRPCServerHandler extends SimpleChannelInboundHandler { 18 | private ServiceProvider serviceProvider; 19 | 20 | 21 | @Override 22 | protected void channelRead0(ChannelHandlerContext ctx, RPCRequest msg) throws Exception { 23 | //System.out.println(msg); 24 | RPCResponse response = getResponse(msg); 25 | ctx.writeAndFlush(response); 26 | ctx.close(); 27 | } 28 | 29 | @Override 30 | public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { 31 | cause.printStackTrace(); 32 | ctx.close(); 33 | } 34 | 35 | RPCResponse getResponse(RPCRequest request) { 36 | // 得到服务名 37 | String interfaceName = request.getInterfaceName(); 38 | // 得到服务端相应服务实现类 39 | Object service = serviceProvider.getService(interfaceName); 40 | // 反射调用方法 41 | Method method = null; 42 | try { 43 | method = service.getClass().getMethod(request.getMethodName(), request.getParamsTypes()); 44 | Object invoke = method.invoke(service, request.getParams()); 45 | return RPCResponse.success(invoke); 46 | } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { 47 | e.printStackTrace(); 48 | System.out.println("方法执行错误"); 49 | return RPCResponse.fail(); 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/server/NettyRPCServerHandler.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.server; 2 | 3 | import com.ganghuan.myRPCVersion6.common.RPCRequest; 4 | import com.ganghuan.myRPCVersion6.common.RPCResponse; 5 | import io.netty.channel.ChannelHandlerContext; 6 | import io.netty.channel.SimpleChannelInboundHandler; 7 | import lombok.AllArgsConstructor; 8 | 9 | import java.lang.reflect.InvocationTargetException; 10 | import java.lang.reflect.Method; 11 | 12 | /** 13 | * 因为是服务器端,我们知道接受到请求格式是RPCRequest 14 | * Object类型也行,强制转型就行 15 | */ 16 | @AllArgsConstructor 17 | public class NettyRPCServerHandler extends SimpleChannelInboundHandler { 18 | private ServiceProvider serviceProvider; 19 | 20 | 21 | @Override 22 | protected void channelRead0(ChannelHandlerContext ctx, RPCRequest msg) throws Exception { 23 | //System.out.println(msg); 24 | RPCResponse response = getResponse(msg); 25 | ctx.writeAndFlush(response); 26 | ctx.close(); 27 | } 28 | 29 | @Override 30 | public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception { 31 | cause.printStackTrace(); 32 | ctx.close(); 33 | } 34 | 35 | RPCResponse getResponse(RPCRequest request) { 36 | // 得到服务名 37 | String interfaceName = request.getInterfaceName(); 38 | // 得到服务端相应服务实现类 39 | Object service = serviceProvider.getService(interfaceName); 40 | // 反射调用方法 41 | Method method = null; 42 | try { 43 | method = service.getClass().getMethod(request.getMethodName(), request.getParamsTypes()); 44 | Object invoke = method.invoke(service, request.getParams()); 45 | return RPCResponse.success(invoke); 46 | } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { 47 | e.printStackTrace(); 48 | System.out.println("方法执行错误"); 49 | return RPCResponse.fail(); 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion6/client/SimpleRPCClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion6.client; 2 | 3 | 4 | import com.ganghuan.myRPCVersion6.common.RPCRequest; 5 | import com.ganghuan.myRPCVersion6.common.RPCResponse; 6 | import com.ganghuan.myRPCVersion6.register.ServiceRegister; 7 | import com.ganghuan.myRPCVersion6.register.ZkServiceRegister; 8 | 9 | import java.io.IOException; 10 | import java.io.ObjectInputStream; 11 | import java.io.ObjectOutputStream; 12 | import java.net.InetSocketAddress; 13 | import java.net.Socket; 14 | 15 | public class SimpleRPCClient implements RPCClient { 16 | private String host; 17 | private int port; 18 | private ServiceRegister serviceRegister; 19 | public SimpleRPCClient() { 20 | // 初始化注册中心,建立连接 21 | this.serviceRegister = new ZkServiceRegister(); 22 | } 23 | 24 | // 客户端发起一次请求调用,Socket建立连接,发起请求Request,得到响应Response 25 | // 这里的request是封装好的,不同的service需要进行不同的封装, 客户端只知道Service接口,需要一层动态代理根据反射封装不同的Service 26 | public RPCResponse sendRequest(RPCRequest request) { 27 | // 从注册中心获取host,port 28 | InetSocketAddress address = serviceRegister.serviceDiscovery(request.getInterfaceName()); 29 | host = address.getHostName(); 30 | port = address.getPort(); 31 | try { 32 | Socket socket = new Socket(host, port); 33 | 34 | ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 35 | ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); 36 | 37 | System.out.println(request); 38 | objectOutputStream.writeObject(request); 39 | objectOutputStream.flush(); 40 | 41 | RPCResponse response = (RPCResponse) objectInputStream.readObject(); 42 | 43 | //System.out.println(response.getData()); 44 | return response; 45 | } catch (IOException | ClassNotFoundException e) { 46 | System.out.println(); 47 | return null; 48 | } 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion5/client/SimpleRPCClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion5.client; 2 | 3 | 4 | import com.ganghuan.myRPCVersion5.common.RPCRequest; 5 | import com.ganghuan.myRPCVersion5.common.RPCResponse; 6 | import com.ganghuan.myRPCVersion5.register.ServiceRegister; 7 | import com.ganghuan.myRPCVersion5.register.ZkServiceRegister; 8 | import lombok.AllArgsConstructor; 9 | 10 | import java.io.IOException; 11 | import java.io.ObjectInputStream; 12 | import java.io.ObjectOutputStream; 13 | import java.net.InetSocketAddress; 14 | import java.net.Socket; 15 | 16 | public class SimpleRPCClient implements RPCClient { 17 | private String host; 18 | private int port; 19 | private ServiceRegister serviceRegister; 20 | public SimpleRPCClient() { 21 | // 初始化注册中心,建立连接 22 | this.serviceRegister = new ZkServiceRegister(); 23 | } 24 | 25 | // 客户端发起一次请求调用,Socket建立连接,发起请求Request,得到响应Response 26 | // 这里的request是封装好的,不同的service需要进行不同的封装, 客户端只知道Service接口,需要一层动态代理根据反射封装不同的Service 27 | public RPCResponse sendRequest(RPCRequest request) { 28 | // 从注册中心获取host,port 29 | InetSocketAddress address = serviceRegister.serviceDiscovery(request.getInterfaceName()); 30 | host = address.getHostName(); 31 | port = address.getPort(); 32 | try { 33 | Socket socket = new Socket(host, port); 34 | 35 | ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream()); 36 | ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream()); 37 | 38 | System.out.println(request); 39 | objectOutputStream.writeObject(request); 40 | objectOutputStream.flush(); 41 | 42 | RPCResponse response = (RPCResponse) objectInputStream.readObject(); 43 | 44 | //System.out.println(response.getData()); 45 | return response; 46 | } catch (IOException | ClassNotFoundException e) { 47 | System.out.println(); 48 | return null; 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/client/NettyRPCClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.client; 2 | 3 | import com.ganghuan.myRPCVersion3.common.RPCRequest; 4 | import com.ganghuan.myRPCVersion3.common.RPCResponse; 5 | import io.netty.bootstrap.Bootstrap; 6 | import io.netty.channel.*; 7 | import io.netty.channel.nio.NioEventLoopGroup; 8 | import io.netty.channel.socket.nio.NioSocketChannel; 9 | import io.netty.util.AttributeKey; 10 | 11 | /** 12 | * 实现RPCClient接口 13 | */ 14 | public class NettyRPCClient implements RPCClient { 15 | private static final Bootstrap bootstrap; 16 | private static final EventLoopGroup eventLoopGroup; 17 | private String host; 18 | private int port; 19 | public NettyRPCClient(String host, int port) { 20 | this.host = host; 21 | this.port = port; 22 | } 23 | // netty客户端初始化,重复使用 24 | static { 25 | eventLoopGroup = new NioEventLoopGroup(); 26 | bootstrap = new Bootstrap(); 27 | bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) 28 | .handler(new NettyClientInitializer()); 29 | } 30 | 31 | /** 32 | * 这里需要操作一下,因为netty的传输都是异步的,你发送request,会立刻返回一个值, 而不是想要的相应的response 33 | */ 34 | @Override 35 | public RPCResponse sendRequest(RPCRequest request) { 36 | try { 37 | ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); 38 | Channel channel = channelFuture.channel(); 39 | // 发送数据 40 | channel.writeAndFlush(request); 41 | channel.closeFuture().sync(); 42 | // 阻塞的获得结果,通过给channel设计别名,获取特定名字下的channel中的内容(这个在hanlder中设置) 43 | // AttributeKey是,线程隔离的,不会由线程安全问题。 44 | // 实际上不应通过阻塞,可通过回调函数 45 | AttributeKey key = AttributeKey.valueOf("RPCResponse"); 46 | RPCResponse response = channel.attr(key).get(); 47 | 48 | System.out.println(response); 49 | return response; 50 | } catch (InterruptedException e) { 51 | e.printStackTrace(); 52 | } 53 | return null; 54 | } 55 | } 56 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/client/NettyRPCClient.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.client; 2 | 3 | import com.ganghuan.myRPCVersion4.common.RPCRequest; 4 | import com.ganghuan.myRPCVersion4.common.RPCResponse; 5 | import io.netty.bootstrap.Bootstrap; 6 | import io.netty.channel.Channel; 7 | import io.netty.channel.ChannelFuture; 8 | import io.netty.channel.EventLoopGroup; 9 | import io.netty.channel.nio.NioEventLoopGroup; 10 | import io.netty.channel.socket.nio.NioSocketChannel; 11 | import io.netty.util.AttributeKey; 12 | 13 | /** 14 | * 实现RPCClient接口 15 | */ 16 | public class NettyRPCClient implements RPCClient { 17 | private static final Bootstrap bootstrap; 18 | private static final EventLoopGroup eventLoopGroup; 19 | private String host; 20 | private int port; 21 | public NettyRPCClient(String host, int port) { 22 | this.host = host; 23 | this.port = port; 24 | } 25 | // netty客户端初始化,重复使用 26 | static { 27 | eventLoopGroup = new NioEventLoopGroup(); 28 | bootstrap = new Bootstrap(); 29 | bootstrap.group(eventLoopGroup).channel(NioSocketChannel.class) 30 | .handler(new NettyClientInitializer()); 31 | } 32 | 33 | /** 34 | * 这里需要操作一下,因为netty的传输都是异步的,你发送request,会立刻返回一个值, 而不是想要的相应的response 35 | */ 36 | @Override 37 | public RPCResponse sendRequest(RPCRequest request) { 38 | try { 39 | ChannelFuture channelFuture = bootstrap.connect(host, port).sync(); 40 | Channel channel = channelFuture.channel(); 41 | // 发送数据 42 | channel.writeAndFlush(request); 43 | channel.closeFuture().sync(); 44 | // 阻塞的获得结果,通过给channel设计别名,获取特定名字下的channel中的内容(这个在hanlder中设置) 45 | // AttributeKey是,线程隔离的,不会由线程安全问题。 46 | // 实际上不应通过阻塞,可通过回调函数,后面可以再进行优化 47 | AttributeKey key = AttributeKey.valueOf("RPCResponse"); 48 | RPCResponse response = channel.attr(key).get(); 49 | 50 | System.out.println(response); 51 | return response; 52 | } catch (InterruptedException e) { 53 | e.printStackTrace(); 54 | } 55 | return null; 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion1/server/RPCServer.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion1.server; 2 | 3 | 4 | 5 | import com.ganghuan.myRPCVersion1.common.RPCRequest; 6 | import com.ganghuan.myRPCVersion1.common.RPCResponse; 7 | 8 | import java.io.IOException; 9 | import java.io.ObjectInputStream; 10 | import java.io.ObjectOutputStream; 11 | import java.lang.reflect.InvocationTargetException; 12 | import java.lang.reflect.Method; 13 | import java.net.ServerSocket; 14 | import java.net.Socket; 15 | 16 | public class RPCServer { 17 | public static void main(String[] args) { 18 | 19 | UserServiceImpl userService = new UserServiceImpl(); 20 | try { 21 | ServerSocket serverSocket = new ServerSocket(8899); 22 | System.out.println("服务端启动了"); 23 | // BIO的方式监听Socket 24 | while (true){ 25 | Socket socket = serverSocket.accept(); 26 | // 开启一个线程去处理 27 | new Thread(()->{ 28 | try { 29 | ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); 30 | ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 31 | // 读取客户端传过来的request 32 | RPCRequest request = (RPCRequest) ois.readObject(); 33 | // 反射调用对应方法 34 | Method method = userService.getClass().getMethod(request.getMethodName(), request.getParamsTypes()); 35 | Object invoke = method.invoke(userService, request.getParams()); 36 | // 封装,写入response对象 37 | oos.writeObject(RPCResponse.success(invoke)); 38 | oos.flush(); 39 | }catch (IOException | ClassNotFoundException | NoSuchMethodException | IllegalAccessException | InvocationTargetException e){ 40 | e.printStackTrace(); 41 | System.out.println("从IO中读取数据错误"); 42 | } 43 | }).start(); 44 | 45 | } 46 | } catch (IOException e) { 47 | e.printStackTrace(); 48 | System.out.println("服务器启动失败"); 49 | } 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion3/server/WorkThread.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion3.server; 2 | 3 | 4 | 5 | import com.ganghuan.myRPCVersion3.common.RPCRequest; 6 | import com.ganghuan.myRPCVersion3.common.RPCResponse; 7 | import lombok.AllArgsConstructor; 8 | 9 | import java.io.IOException; 10 | import java.io.ObjectInputStream; 11 | import java.io.ObjectOutputStream; 12 | import java.lang.reflect.InvocationTargetException; 13 | import java.lang.reflect.Method; 14 | import java.net.Socket; 15 | 16 | /** 17 | * 这里负责解析得到的request请求,执行服务方法,返回给客户端 18 | * 1. 从request得到interfaceName 2. 根据interfaceName在serviceProvide Map中获取服务端的实现类 19 | * 3. 从request中得到方法名,参数, 利用反射执行服务中的方法 4. 得到结果,封装成response,写入socket 20 | */ 21 | @AllArgsConstructor 22 | public class WorkThread implements Runnable{ 23 | private Socket socket; 24 | private ServiceProvider serviceProvider; 25 | @Override 26 | public void run() { 27 | try { 28 | ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); 29 | ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 30 | // 读取客户端传过来的request 31 | RPCRequest request = (RPCRequest) ois.readObject(); 32 | // 反射调用服务方法获得返回值 33 | RPCResponse response = getResponse(request); 34 | //写入到客户端 35 | oos.writeObject(response); 36 | oos.flush(); 37 | }catch (IOException | ClassNotFoundException e){ 38 | e.printStackTrace(); 39 | System.out.println("从IO中读取数据错误"); 40 | } 41 | } 42 | 43 | private RPCResponse getResponse(RPCRequest request){ 44 | // 得到服务名 45 | String interfaceName = request.getInterfaceName(); 46 | // 得到服务端相应服务实现类 47 | Object service = serviceProvider.getService(interfaceName); 48 | // 反射调用方法 49 | Method method = null; 50 | try { 51 | method = service.getClass().getMethod(request.getMethodName(), request.getParamsTypes()); 52 | Object invoke = method.invoke(service, request.getParams()); 53 | return RPCResponse.success(invoke); 54 | } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { 55 | e.printStackTrace(); 56 | System.out.println("方法执行错误"); 57 | return RPCResponse.fail(); 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /src/main/java/com/ganghuan/myRPCVersion4/server/WorkThread.java: -------------------------------------------------------------------------------- 1 | package com.ganghuan.myRPCVersion4.server; 2 | 3 | 4 | 5 | import com.ganghuan.myRPCVersion4.common.RPCRequest; 6 | import com.ganghuan.myRPCVersion4.common.RPCResponse; 7 | import lombok.AllArgsConstructor; 8 | 9 | import java.io.IOException; 10 | import java.io.ObjectInputStream; 11 | import java.io.ObjectOutputStream; 12 | import java.lang.reflect.InvocationTargetException; 13 | import java.lang.reflect.Method; 14 | import java.net.Socket; 15 | 16 | /** 17 | * 这里负责解析得到的request请求,执行服务方法,返回给客户端 18 | * 1. 从request得到interfaceName 2. 根据interfaceName在serviceProvide Map中获取服务端的实现类 19 | * 3. 从request中得到方法名,参数, 利用反射执行服务中的方法 4. 得到结果,封装成response,写入socket 20 | */ 21 | @AllArgsConstructor 22 | public class WorkThread implements Runnable{ 23 | private Socket socket; 24 | private ServiceProvider serviceProvider; 25 | @Override 26 | public void run() { 27 | try { 28 | ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream()); 29 | ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); 30 | // 读取客户端传过来的request 31 | RPCRequest request = (RPCRequest) ois.readObject(); 32 | // 反射调用服务方法获得返回值 33 | RPCResponse response = getResponse(request); 34 | //写入到客户端 35 | oos.writeObject(response); 36 | oos.flush(); 37 | }catch (IOException | ClassNotFoundException e){ 38 | e.printStackTrace(); 39 | System.out.println("从IO中读取数据错误"); 40 | } 41 | } 42 | 43 | private RPCResponse getResponse(RPCRequest request){ 44 | // 得到服务名 45 | String interfaceName = request.getInterfaceName(); 46 | // 得到服务端相应服务实现类 47 | Object service = serviceProvider.getService(interfaceName); 48 | // 反射调用方法 49 | Method method = null; 50 | try { 51 | method = service.getClass().getMethod(request.getMethodName(), request.getParamsTypes()); 52 | Object invoke = method.invoke(service, request.getParams()); 53 | return RPCResponse.success(invoke); 54 | } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { 55 | e.printStackTrace(); 56 | System.out.println("方法执行错误"); 57 | return RPCResponse.fail(); 58 | } 59 | } 60 | } 61 | --------------------------------------------------------------------------------