程序员开发实例大全宝库

网站首页 > 编程文章 正文

gRPC-Java HelloWorld使用笔记(java helloworld教程)

zazugpt 2024-09-01 07:49:45 编程文章 25 ℃ 0 评论

环境:Windows,JDK8,Maven3,Eclipse

在Eclipse创建Maven Project,项目名称“grpcdemo”

编写pom.xml,直接将gRPC-Java里examples里的pom文件内容复制过来,主要是以下部分:

<properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <grpc.version>1.15.0</grpc.version><!-- CURRENT_GRPC_VERSION -->
 <protobuf.version>3.5.1</protobuf.version>
 <protoc.version>3.5.1-1</protoc.version>
 <netty.tcnative.version>2.0.7.Final</netty.tcnative.version>
 <!-- required for jdk9 -->
 <maven.compiler.source>1.7</maven.compiler.source>
 <maven.compiler.target>1.7</maven.compiler.target>
 </properties>
 <dependencies>
 <dependency>
 <groupId>io.grpc</groupId>
 <artifactId>grpc-netty-shaded</artifactId>
 <version>${grpc.version}</version>
 </dependency>
 <dependency>
 <groupId>io.grpc</groupId>
 <artifactId>grpc-protobuf</artifactId>
 <version>${grpc.version}</version>
 </dependency>
 <dependency>
 <groupId>io.grpc</groupId>
 <artifactId>grpc-stub</artifactId>
 <version>${grpc.version}</version>
 </dependency>
 <dependency>
 <groupId>io.grpc</groupId>
 <artifactId>grpc-alts</artifactId>
 <version>${grpc.version}</version>
 </dependency>
 <dependency>
 <groupId>io.grpc</groupId>
 <artifactId>grpc-testing</artifactId>
 <version>${grpc.version}</version>
 <scope>test</scope>
 </dependency>
 <!-- Used in HelloWorldServerTls -->
 <dependency>
 <groupId>io.grpc</groupId>
 <artifactId>grpc-netty</artifactId>
 <version>${grpc.version}</version>
 </dependency>
 <dependency>
 <groupId>io.netty</groupId>
 <artifactId>netty-tcnative-boringssl-static</artifactId>
 <version>${netty.tcnative.version}</version>
 </dependency>
 <dependency>
 <groupId>com.google.api.grpc</groupId>
 <artifactId>proto-google-common-protos</artifactId>
 <version>1.0.0</version>
 </dependency>
 <dependency>
 <groupId>com.google.protobuf</groupId>
 <artifactId>protobuf-java-util</artifactId>
 <version>${protobuf.version}</version>
 </dependency>
 <dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>4.12</version>
 <scope>test</scope>
 </dependency>
 <dependency>
 <groupId>org.mockito</groupId>
 <artifactId>mockito-core</artifactId>
 <version>1.9.5</version>
 <scope>test</scope>
 </dependency>
 </dependencies>
 <build>
 <extensions>
 <extension>
 <groupId>kr.motd.maven</groupId>
 <artifactId>os-maven-plugin</artifactId>
 <version>1.5.0.Final</version>
 </extension>
 </extensions>
 <plugins>
 <plugin>
 <groupId>org.xolstice.maven.plugins</groupId>
 <artifactId>protobuf-maven-plugin</artifactId>
 <version>0.5.1</version>
 <configuration>
 <protocArtifact>com.google.protobuf:protoc:${protoc.version}:exe:${os.detected.classifier}</protocArtifact>
 <pluginId>grpc-java</pluginId>
 <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
 </configuration>
 <executions>
 <execution>
 <goals>
 <goal>compile</goal>
 <goal>compile-custom</goal>
 </goals>
 </execution>
 </executions>
 </plugin>
 <plugin>
 <groupId>org.apache.maven.plugins</groupId>
 <artifactId>maven-enforcer-plugin</artifactId>
 <version>1.4.1</version>
 <executions>
 <execution>
 <id>enforce</id>
 <goals>
 <goal>enforce</goal>
 </goals>
 <configuration>
 <rules>
 <requireUpperBoundDeps/>
 </rules>
 </configuration>
 </execution>
 </executions>
 </plugin>
 </plugins>
 </build>

新建src/main/proto文件夹,编写hello.proto文件(相关protobuf语法可自行搜索)

// Copyright 2015 The gRPC Authors
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
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) {}
 rpc SayHelloAgain (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;
}

在命令窗口切换到项目根目录,运行

mvn compile

运行完成后,项目结构如下

编写服务端代码

/**
 * Server that manages startup/shutdown of a {@code Greeter} server.
 */
public class HelloWorldServer {
 private static final Logger logger = Logger.getLogger(HelloWorldServer.class.getName());
 private Server server;
 private void start() throws IOException {
 /* The port on which the server should run */
 int port = 50051;
 server = ServerBuilder.forPort(port)
 .addService(new GreeterImpl())
 .build()
 .start();
 logger.info("Server started, listening on " + port);
 Runtime.getRuntime().addShutdownHook(new Thread() {
 @Override
 public void run() {
 // Use stderr here since the logger may have been reset by its JVM shutdown hook.
 System.err.println("*** shutting down gRPC server since JVM is shutting down");
 HelloWorldServer.this.stop();
 System.err.println("*** server shut down");
 }
 });
 }
 private void stop() {
 if (server != null) {
 server.shutdown();
 }
 }
 /**
 * Await termination on the main thread since the grpc library uses daemon threads.
 */
 private void blockUntilShutdown() throws InterruptedException {
 if (server != null) {
 server.awaitTermination();
 }
 }
 /**
 * Main launches the server from the command line.
 */
 public static void main(String[] args) throws IOException, InterruptedException {
 final HelloWorldServer server = new HelloWorldServer();
 server.start();
 server.blockUntilShutdown();
 }
 static class GreeterImpl extends GreeterGrpc.GreeterImplBase {
 @Override
 public void sayHello(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
 HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + req.getName()).build();
 responseObserver.onNext(reply);
 responseObserver.onCompleted();
 }
 @Override
 public void sayHelloAgain(HelloRequest req, StreamObserver<HelloReply> responseObserver) {
 HelloReply reply = HelloReply.newBuilder().setMessage("Hello again " + req.getName()).build();
 responseObserver.onNext(reply);
 responseObserver.onCompleted();
 }
 }
}

编写客户端代码

public class HelloWorldClient {
 private static final Logger logger = Logger.getLogger(HelloWorldClient.class.getName());
 private final ManagedChannel channel;
 private final GreeterGrpc.GreeterBlockingStub blockingStub;
 /** Construct client connecting to HelloWorld server at {@code host:port}. */
 public HelloWorldClient(String host, int port) {
 this(ManagedChannelBuilder.forAddress(host, port)
 // Channels are secure by default (via SSL/TLS). For the example we disable TLS to avoid
 // needing certificates.
 .usePlaintext()
 .build());
 }
 /** Construct client for accessing HelloWorld server using the existing channel. */
 HelloWorldClient(ManagedChannel channel) {
 this.channel = channel;
 blockingStub = GreeterGrpc.newBlockingStub(channel);
 }
 public void shutdown() throws InterruptedException {
 channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
 }
 /** Say hello to server. */
 public void greet(String name) {
 logger.info("Will try to greet " + name + " ...");
 HelloRequest request = HelloRequest.newBuilder().setName(name).build();
 HelloReply response;
 try {
 response = blockingStub.sayHello(request);
 } catch (StatusRuntimeException e) {
 logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
 return;
 }
 logger.info("Greeting: " + response.getMessage());
 try {
 response = blockingStub.sayHelloAgain(request);
 } catch (StatusRuntimeException e) {
 logger.log(Level.WARNING, "RPC failed: {0}", e.getStatus());
 return;
 }
 logger.info("Greeting: " + response.getMessage());
 }
 /**
 * Greet server. If provided, the first element of {@code args} is the name to use in the
 * greeting.
 */
 public static void main(String[] args) throws Exception {
 HelloWorldClient client = new HelloWorldClient("localhost", 50051);
 try {
 /* Access a service running on the local machine on port 50051 */
 String user = "world";
 if (args.length > 0) {
 user = args[0]; /* Use the arg as the name to greet if provided */
 }
 client.greet(user);
 } finally {
 client.shutdown();
 }
 }
}

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表