message Person { required string name = 1; required int32 id = 2; optional string email = 3; enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } repeated PhoneNumber phone = 4; }
service SearchService { rpc Search (SearchRequest) returns (SearchResponse); }
syntax = "proto3"; option java_multiple_files = true; option java_package = "io.grpc.examples.helloworld"; option java_outer_classname = "HelloWorldProto"; option objc_class_prefix = "HLW"; package helloworld; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply) {} } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings message HelloReply { string message = 1; }
<plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.5.1</version> <configuration> <protocArtifact>com.google.protobuf:protoc:3.7.1:exe:${os.detected.classifier} </protocArtifact> <pluginId>dubbo-grpc-java</pluginId> <pluginArtifact>org.apache.dubbo:protoc-gen-dubbo-java:1.19.0-SNAPSHOT:exe:${os.detected.classifier}</pluginArtifact> <outputDirectory>build/generated/source/proto/main/java</outputDirectory> <clearOutputDirectory>false</clearOutputDirectory> <pluginParameter>grpc</pluginParameter> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> </goals> </execution> </executions> </plugin>
<pluginArtifact>org.apache.dubbo:protoc-gen-dubbo-java:1.19.0-SNAPSHOT:exe:${os.detected.classifier}</pluginArtifact>
<pluginParameter>grpc</pluginParameter>
# 运行以下 maven 命令 $ mvn clean compile
/** * Code generated for Dubbo */ public interface IGreeter { default public io.grpc.examples.helloworld.HelloReply sayHello(io.grpc.examples.helloworld.HelloRequest request) { throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows."); } default public com.google.common.util.concurrent.ListenableFuture<io.grpc.examples.helloworld.HelloReply> sayHelloAsync( io.grpc.examples.helloworld.HelloRequest request) { throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows."); } public void sayHello(io.grpc.examples.helloworld.HelloRequest request, io.grpc.stub.StreamObserver<io.grpc.examples.helloworld.HelloReply> responseObserver); }
package org.apache.dubbo.samples.basic.impl; import io.grpc.examples.helloworld.GreeterGrpc; import io.grpc.examples.helloworld.HelloReply; import io.grpc.examples.helloworld.HelloRequest; import io.grpc.stub.StreamObserver; public class GrpcGreeterImpl extends GreeterGrpc.GreeterImplBase { @Override public void sayHello(HelloRequest request, StreamObserver<HelloReply> responseObserver) { System.out.println("Received request from client."); System.out.println("Executing thread is " + Thread.currentThread().getName()); HelloReply reply = HelloReply.newBuilder() .setMessage("Hello " + request.getName()).build(); responseObserver.onNext(reply); responseObserver.onCompleted(); } }
<dubbo:application name="demo-provider"/> <!-- 指定服务暴露协议为 gRPC --> <dubbo:protocol id="grpc" name="grpc"/> <dubbo:registry address="zookeeper://${zookeeper.address:127.0.0.1}:2181"/> <bean id="greeter" class="org.apache.dubbo.samples.basic.impl.GrpcGreeterImpl"/> <!-- 指定 protoc-gen-dubbo-java 生成的接口 --> <dubbo:service interface="io.grpc.examples.helloworld.GreeterGrpc$IGreeter" ref="greeter" protocol="grpc"/>public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-demo-provider.xml"); context.start(); System.out.println("dubbo service started"); new CountDownLatch(1).await(); }
<dubbo:application name="demo-consumer"/> <dubbo:registry address="zookeeper://${zookeeper.address:127.0.0.1}:2181"/> <!-- 指定 protoc-gen-dubbo-java 生成的接口 --> <dubbo:reference id="greeter" interface="io.grpc.examples.helloworld.GreeterGrpc$IGreeter" protocol="grpc"/>public static void main(String[] args) throws IOException { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-demo-consumer.xml"); context.start(); GreeterGrpc.IGreeter greeter = (GreeterGrpc.IGreeter) context.getBean("greeter"); HelloReply reply = greeter.sayHello(HelloRequest.newBuilder().setName("world!").build()); System.out.println("Result: " + reply.getMessage()); System.in.read(); }
/** * Code generated for Dubbo */ public interface IGreeter { default public HelloReply sayHello(HelloRequest request) { // ...... } default public ListenableFuture<HelloReply> sayHelloAsync(HelloRequest request) { // ...... } public void sayHello(HelloRequest request, StreamObserver<HelloReply> responseObserver); }
public static void main(String[] args) throws IOException { // ... GreeterGrpc.IGreeter greeter = (GreeterGrpc.IGreeter) context.getBean("greeter"); ListenableFuture<HelloReply> future = greeter.sayHAsyncello(HelloRequest.newBuilder().setName("world!").build()); // ... }
public interface GrpcConfigurator { // 用来定制 gRPC NettyServerBuilder default NettyServerBuilder configureServerBuilder(NettyServerBuilder builder, URL url) { return builder; } // 用来定制 gRPC NettyChannelBuilder default NettyChannelBuilder configureChannelBuilder(NettyChannelBuilder builder, URL url) { return builder; } // 用来定制 gRPC CallOptions, 定义某个服务在每次请求间传递数据 default CallOptions configureCallOptions(CallOptions options, URL url) { return options; } }
public class MyGrpcConfigurator implements GrpcConfigurator { private final ExecutorService executor = Executors .newFixedThreadPool(200, new NamedThreadFactory("Customized-grpc", true)); @Override public NettyServerBuilder configureServerBuilder(NettyServerBuilder builder, URL url) { return builder.executor(executor); } @Override public NettyChannelBuilder configureChannelBuilder(NettyChannelBuilder builder, URL url) { return builder.flowControlWindow(10); } @Override public CallOptions configureCallOptions(CallOptions options, URL url) { return options.withOption(CallOptions.Key.create("key"), "value"); } }
default=org.apache.dubbo.samples.basic.comtomize.MyGrpcConfigurator
private final ExecutorService executor = Executors .newFixedThreadPool(200, new NamedThreadFactory("Customized-grpc", true)); public NettyServerBuilder configureServerBuilder(NettyServerBuilder builder, URL url) { return builder.executor(executor); }
@Override public NettyChannelBuilder configureChannelBuilder(NettyChannelBuilder builder, URL url) { return builder.flowControlWindow(10); }
@Override public CallOptions configureCallOptions(CallOptions options, URL url) { if (url.getServiceInterface().equals("xxx.DemoService")) { return options.withOption(CallOptions.Key.create("key"), "value"); } else { return options; } }
* MyClientStreamInterceptor,工作在 client 端,拦截发出的请求流和接收的响应流 * MyServerStreamInterceptor,工作在 server 端,拦截收到的请求流和发出的响应流
syntax = "proto3"; option java_multiple_files = true; option java_package = "org.apache.dubbo.demo"; option java_outer_classname = "DemoServiceProto"; option objc_class_prefix = "DEMOSRV"; package demoservice; // The demo service definition. service DemoService { rpc SayHello (HelloRequest) returns (HelloReply) {} } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings message HelloReply { string message = 1; }
<plugin> <groupId>org.xolstice.maven.plugins</groupId> <artifactId>protobuf-maven-plugin</artifactId> <version>0.5.1</version> <configuration> <protocArtifact>com.google.protobuf:protoc:3.7.1:exe:${os.detected.classifier} </protocArtifact> <pluginId>dubbo-grpc-java</pluginId> <pluginArtifact>org.apache.dubbo:protoc-gen-dubbo-java:1.19.0-SNAPSHOT:exe:${os.detected.classifier}</pluginArtifact> <outputDirectory>build/generated/source/proto/main/java</outputDirectory> <clearOutputDirectory>false</clearOutputDirectory> <pluginParameter>dubbo</pluginParameter> </configuration> <executions> <execution> <goals> <goal>compile</goal> <goal>compile-custom</goal> </goals> </execution> </executions> </plugin>
# 运行以下 maven 命令 $mvn clean compile
public final class DemoServiceDubbo { private static final AtomicBoolean registered = new AtomicBoolean(); private static Class<?> init() { Class<?> clazz = null; try { clazz = Class.forName(DemoServiceDubbo.class.getName()); if (registered.compareAndSet(false, true)) { org.apache.dubbo.common.serialize.protobuf.support.ProtobufUtils.marshaller( org.apache.dubbo.demo.HelloRequest.getDefaultInstance()); org.apache.dubbo.common.serialize.protobuf.support.ProtobufUtils.marshaller( org.apache.dubbo.demo.HelloReply.getDefaultInstance()); } } catch (ClassNotFoundException e) { // ignore } return clazz; } private DemoServiceDubbo() {} public static final String SERVICE_NAME = "demoservice.DemoService"; /** * Code generated for Dubbo */ public interface IDemoService { static Class<?> clazz = init(); org.apache.dubbo.demo.HelloReply sayHello(org.apache.dubbo.demo.HelloRequest request); java.util.concurrent.CompletableFuture<org.apache.dubbo.demo.HelloReply> sayHelloAsync( org.apache.dubbo.demo.HelloRequest request); } }
public class DemoServiceImpl implements DemoServiceDubbo.IDemoService { private static final Logger logger = LoggerFactory.getLogger(DemoServiceImpl.class); @Override public HelloReply sayHello(HelloRequest request) { logger.info("Hello " + request.getName() + ", request from consumer: " + RpcContext.getContext().getRemoteAddress()); return HelloReply.newBuilder() .setMessage("Hello " + request.getName() + ", response from provider: " + RpcContext.getContext().getLocalAddress()) .build(); } @Override public CompletableFuture<HelloReply> sayHelloAsync(HelloRequest request) { return CompletableFuture.completedFuture(sayHello(request)); } }
<dubbo:application name="demo-provider"/> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <dubbo:protocol name="dubbo"/> <bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/> <dubbo:service interface="org.apache.dubbo.demo.DemoServiceDubbo$IDemoService" ref="demoService"/>public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-provider.xml"); context.start(); System.in.read(); }
<dubbo:application name="demo-consumer"/> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.demo.DemoServiceDubbo$IDemoService"/>public static void main(String[] args) throws Exception { ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring/dubbo-consumer.xml"); context.start(); IDemoService demoService = context.getBean("demoService", IDemoService.class); HelloRequest request = HelloRequest.newBuilder().setName("Hello").build(); HelloReply reply = demoService.sayHello(request); System.out.println("result: " + reply.getMessage()); System.in.read(); }
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/69947441/viewspace-2666498/,如需转载,请注明出处,否则将追究法律责任。