支持原生 Go 函数,不需要定义 proto 文件
支持 TCP、HTTP、KCP、QUIC 等传输协议
支持 JSON、Protobuf、MessagePack 数据编码协议
服务发现,支持 P2P、zookeeper、etcd、consul、mDNS 等
容错(Fault tolerance):支持 Failover(切换)、Failfast(快速失败)、Failtry(重试)
支持负载均衡
支持认证授权
支持心跳检测
貌似还支持跨语言
rpcx uses a binary protocol and platform-independent, which means you can develop services in other languages such as Java, python, nodejs, and you can use other prorgramming languages to invoke services developed in Go.
package com.example.dubbo.interfaces;
public interface GreetingService {
String sayHi(String name);
}
maven install 编译安装 interface
provider 实现了接口
com.exampledubbo1.0-SNAPSHOT../pom.xmldubbo-example-providerjarDemo project for dubboorg.apache.dubbodubbo2.7.8org.apache.dubbodubbo-dependencies-zookeeper2.7.8pomcom.exampledubbo-example-interface1.0-SNAPSHOTorg.apache.maven.pluginsmaven-compiler-plugin1.81.8UTF-8
public class GreetingServiceImpl implements GreetingService {
@Override
public String sayHi(String name) {
System.out.println("receive msg " + name);
return "hi, " + name;
}
}
public class Provider {
private static String zookeeperHost = System.getProperty("zookeeper.address", "localhost");
public static void main(String[] args) throws Exception {
ServiceConfig service = new ServiceConfig<>();
service.setApplication(new ApplicationConfig("first-dubbo-provider"));
service.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":2181"));
service.setInterface(GreetingService.class);
service.setRef(new GreetingServiceImpl());
service.export();
System.out.println("dubbo service started");
new CountDownLatch(1).await();
}
}
consumer 调用接口
com.exampledubbo1.0-SNAPSHOT../pom.xmldubbo-example-consumerjarDemo project for dubboorg.apache.dubbodubbo2.7.8org.apache.dubbodubbo-dependencies-zookeeper2.7.8pomcom.exampledubbo-example-interface1.0-SNAPSHOTorg.apache.maven.pluginsmaven-compiler-plugin1.81.8UTF-8
public class Consumer {
private static String zookeeperHost = System.getProperty("zookeeper.address", "localhost");
public static void main(String[] args) {
ReferenceConfig reference = new ReferenceConfig<>();
reference.setApplication(new ApplicationConfig("first-dubbo-consumer"));
reference.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":2181"));
reference.setInterface(GreetingService.class);
GreetingService service = reference.get();
String message = service.sayHi("dubbo");
System.out.println(message);
}
}
com.examplegrpc1.0-SNAPSHOT../pom.xmlgrpc-example-protojarDemo project for grpcio.grpcgrpc-netty-shadedio.grpcgrpc-protobufio.grpcgrpc-stubkr.motd.mavenos-maven-plugin1.6.2org.apache.maven.pluginsmaven-compiler-plugin1.81.8UTF-8org.xolstice.maven.pluginsprotobuf-maven-plugin0.6.1com.google.protobuf:protoc:3.12.0:exe:${os.detected.classifier}grpc-javaio.grpc:protoc-gen-grpc-java:1.35.0:exe:${os.detected.classifier}compilecompile-custom
com.examplegrpc1.0-SNAPSHOT../pom.xmlgrpc-example-interfacesjarDemo project for grpcio.grpcgrpc-netty-shadedio.grpcgrpc-protobufio.grpcgrpc-stuborg.apache.maven.pluginsmaven-compiler-plugin1.81.8UTF-8
maven install 编译安装 interface
再编写 server 实现接口
com.examplegrpc1.0-SNAPSHOT../pom.xmlgrpc-example-serverjarDemo project for grpcio.grpcgrpc-netty-shadedio.grpcgrpc-protobufio.grpcgrpc-stubcom.examplegrpc-example-interfaces1.0-SNAPSHOTorg.apache.maven.pluginsmaven-compiler-plugin1.81.8UTF-8
public class GreetingServiceImpl extends GreetingServiceGrpc.GreetingServiceImplBase {
@Override
public void sayHi(GreetingRequest req, StreamObserver responseObserver){
GreetingReply reply = GreetingReply.newBuilder().setMessage(("Hi " + req.getName())).build();
responseObserver.onNext(reply);
responseObserver.onCompleted();
}
}
public class GrpcServer {
private static final Logger logger = Logger.getLogger(GrpcServer.class.getName());
private int port = 50051;
private Server server;
private void start() throws IOException {
server = ServerBuilder.forPort(port)
.addService(new GreetingServiceImpl())
.build()
.start();
logger.info("Server started, listening on "+ port);
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run(){
System.err.println("*** shutting down gRPC server since JVM is shutting down");
GrpcServer.this.stop();
System.err.println("*** server shut down");
}
});
}
private void stop() {
if (server != null){
server.shutdown();
}
}
private void blockUntilShutdown() throws InterruptedException {
if (server != null){
server.awaitTermination();
}
}
public static void main(String[] args) throws IOException, InterruptedException {
final GrpcServer server = new GrpcServer();
server.start();
server.blockUntilShutdown();
}
}
再编写 client 调用接口
com.examplegrpc1.0-SNAPSHOT../pom.xmlgrpc-example-clientjarDemo project for grpcio.grpcgrpc-netty-shadedio.grpcgrpc-protobufio.grpcgrpc-stubcom.examplegrpc-example-interfaces1.0-SNAPSHOTorg.apache.maven.pluginsmaven-compiler-plugin1.81.8UTF-8
public class GrpcClient {
private final ManagedChannel channel;
private final GreetingServiceGrpc.GreetingServiceBlockingStub blockingStub;
private static final Logger logger = Logger.getLogger(GrpcClient.class.getName());
public GrpcClient(String host, int port){
channel = ManagedChannelBuilder.forAddress(host, port)
.usePlaintext()
.build();
blockingStub = GreetingServiceGrpc.newBlockingStub(channel);
}
public void shutdown() throws InterruptedException {
channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
}
public void greet(String name){
GreetingRequest request = GreetingRequest.newBuilder().setName(name).build();
GreetingReply response;
try{
response = blockingStub.sayHi(request);
} catch (StatusRuntimeException e) {
logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
return;
}
logger.info("Greeting: " + response.getMessage());
}
public static void main(String[] args) throws InterruptedException {
GrpcClient client = new GrpcClient("localhost", 50051);
try{
String user = "GRPC";
if (args.length > 0){
user = args[0];
}
client.greet(user);
}finally {
client.shutdown();
}
}
}