Drpc
is a high performance RPC framework, which aims to help users build their networking communications easily.
The biggest feature to distinguish with other RPC frameworks is it supports multiple languages server.
- Multiple languages server and client
- Asynchronous services in server
- Dynamic registration for service
- The ability for order preserving
- High performance and easy to use
mvn clean install -DskipTests
Server example: ./example/src/main/java/com/distkv/drpc/pb/ExampleServer.java
Client example: ./example/src/main/java/com/distkv/drpc/pb/ExampleServer.java
import org.drpc.DrpcServer;
import org.drpc.config.ServerConfig;
public class ExampleServer {
public static void main(String[] args) {
ServerConfig serverConfig = ServerConfig.builder()
.port(8080)
.build();
DrpcServer drpcServer = new DrpcServer(serverConfig);
drpcServer.registerService(ExampleService.class, new ExampleServiceImpl());
drpcServer.run();
}
}
import org.drpc.Stub;
import org.drpc.api.Client;
import org.drpc.config.ClientConfig;
import org.drpc.netty.DrpcClient;
import org.drpc.pb.generated.StringProtocol;
import org.drpc.session.DrpcSession;
import java.util.concurrent.CompletableFuture;
public class ExampleClient {
public static void main(String[] args) throws Throwable {
ClientConfig clientConfig = ClientConfig.builder()
.address("127.0.0.1:8080")
.build();
Client client = new DrpcClient(clientConfig);
client.open();
Stub<ExampleService> stub = new Stub<>(ExampleService.class);
ExampleService service = stub.getService(client);
StringProtocol.PutRequest putRequest = StringProtocol.PutRequest.newBuilder()
.setKey("dstPut")
.setValue("PutValue")
.build();
StringProtocol.GetRequest getRequest = StringProtocol.GetRequest.newBuilder()
.setKey("dstGet").build();
//sync
StringProtocol.GetResponse getResponse = service.get(getRequest).get();
System.out.println(getResponse.getStatus());
System.out.println(getResponse.getValue());
StringProtocol.PutResponse putResponse = service.put(putRequest).get();
System.out.println(putResponse.getStatus());
//async
CompletableFuture future1 = service.get(getRequest);
future1.whenComplete((r, t) -> {
if (t == null) {
System.out.println(getResponse.getStatus());
System.out.println(getResponse.getValue());
}
});
CompletableFuture future2 = service.put(putRequest);
future2.whenComplete((r, t) -> {
if (t == null) {
System.out.println(putResponse.getStatus());
}
});
//session (keep order)
DrpcSession session = DrpcSession.createSession();
ExampleService sessionService = stub.getService(client, session);
//async (keep order in server)
CompletableFuture sessionFuture1 = sessionService.get(getRequest);
sessionFuture1.whenComplete((r, t) -> {
if (t == null) {
System.out.println(getResponse.getValue());
}
});
CompletableFuture sessionFuture2 = sessionService.put(putRequest);
sessionFuture2.whenComplete((r, t) -> {
if (t == null) {
System.out.println(putResponse.getStatus());
}
});
sessionFuture1.get();
sessionFuture2.get();
client.close();
}
}
Asynchronous services in serverOrder preserving in one client contextSession concept for Order preserving
- Go client and C++ client
- Dynamic registration for service
- Support Multiple languages for server
- Load balance for services
TODO
Thank you for your attention to the Drpc
project. If you have any questions, you can create a new issue in our Issues list. And we welcome you to participate in our project. If you want to make some contributions, you can refer the file CONTRIBUTING.md.