grpc java环境搭建+简单例子

本文详细介绍了在Ubuntu 16.04上搭建Java GRPC环境的过程,包括protobuf的使用、protoc-gen-grpc-java插件的下载与安装,以及GRPC服务器和客户端程序的编写。作者遇到网上教程不适用和Github资源无法访问的问题,通过实践最终成功实现了一个简单的HelloWorld示例。文章最后给出了GRPC服务器和客户端的Java代码片段。

之前用GRPC主要是用Golang,Java之前基本只停留在会写hello world阶段。现在工作上需要用到Java的GRPC,所以不得不从头开始。让我沮丧的是,网上现有的教程基本都跑不通,然后Github上的grpc-java库按照readme一步一步走又提示一个网站不可达(不知道是不是被墙了)。靠着摸索一步一步地把一个Java的GRPC基本的HelloWorld弄通了。我主要参考的是这篇博客:

https://blog.youkuaiyun.com/qq_35047503/article/details/80985794

写GRPC程序其实总结起来就是:利用protobuf将定义的消息和服务生成对应语言的源代码,然后下载对应语言的grpc库,通过grpc库调用生成的服务,传递消息。

我的环境是ubuntu 16.04,之前我的电脑上是装了protoc命令的,GRPC程序需要使用protoc将.proto文件生成对应的源代码文件。没有装的话百度一下也会有很多教程。

定义proto文件helloworld.proto:

syntax = "proto3";
option java_multiple_files = true;
option java_package = "demo";
option java_outer_classname = "HelloWorldProto";
//option java_generic_services = true;
// 可以生成rpc接口

package helloworld;
service GreetHelloWorld {
rpc SayHello (HelloWorldRequest) returns (HelloWorldResponse);
}

message HelloWorldRequest {
string name = 1;
}


message HelloWorldResponse {
string message = 1;
}

用这个来生成java源文件。有一些教程上面说把这个文件放到一个maven工程中可以一键自动生成java文件,但是我试了没有成功。如果您看到这篇文章知道如何利用maven生成java源文件的话希望您能告诉我一下。

此时还不够,需要下载protoc的java插件,否则只会针对message生成java文件,我们定义的service GreetHelloWorld没有办法生成java文件。需要下载protoc-gen-grpc-java插件,下载地址:https://repo1.maven.org/maven2/io/grpc/protoc-gen-grpc-java/

文件名里就是具体用于哪个平台的grpc-java插件,虽然都是.exe结尾,但是不都是windows平台下面的东西。将grpc-java插件可执行文件下载下来即可。

编译proto文件:

protoc --java_out=./ ./helloworld.proto

这条命令会将定义的message编译成.java文件

protoc --plugin=protoc-gen-grpc-java=grpc-java插件可执行文件路径 --grpc-java_out=./ ./helloworld.proto

这条命令将定义的service编译成.java文件。当前目录下会生成demo目录,目录下包含以下java源文件:GreetHelloWorldGrpc.java,HelloWorldProto.java,HelloWorldRequest.java,HelloWorldRequestOrBuilder.java,HelloWorldResponse.java,HelloWorldResponseOrBuilder.java。

GRPC程序编写采用mevan,下载地址:http://maven.apache.org/download.cgi

解压以后,将mevan目录下的bin目录加入到PATH环境变量中:

sudo gedit /etc/profile

在文件末尾加上一句:

export PATH=$PATH:mevan路径/bin

打开eclipse,建立一个mevan项目,eclipse目前的版本都是自带mevan项目的。groudId设为com.mingluck.kang,artifactId设为gPRC-RPC。在src/main/java下建立一个java包demo,将protoc生成的java源文件放到这个目录下,在这个目录下建立HelloWorldServer.java文件,输入grpc服务器程序:

package demo; 
import io.grpc.Server; 
import java.io.IOException;

import demo.GreetHelloWorldGrpc.GreetHelloWorldImplBase;
import io.grpc.ServerBuilder; 
import io.grpc.BindableService; 
import io.grpc.stub.StreamObserver;
public class HelloWorldServer { 
	private int port = 8851; 
	private Server server; 
	private void start() throws IOException { 
		server = ServerBuilder.forPort(port)
				.addService((BindableService) new GreeterHelloWorldImpl())
				.build()
				.start();
		System.out.println("service start..."); 
		Runtime.getRuntime().addShutdownHook(new Thread() { 
			@Override 
			public void run() { 
				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();
		} 
	}
	private void blockUntilShutdown() throws InterruptedException { 
		if (server != null) { 
			server.awaitTermination(); 
		}
	}
	public static void main(String[] args) throws IOException, InterruptedException {
		System.out.println("new server");
		final HelloWorldServer server = new HelloWorldServer(); 
		server.start();
		
		server.blockUntilShutdown();
	}
	
	
	// 实现 定义一个实现服务接口的类 
	private class GreeterHelloWorldImpl extends GreetHelloWorldImplBase { 
		public void sayHello(HelloWorldRequest req, StreamObserver<HelloWorldResponse> responseObserver) {
			// 具体其他丰富的业务实现代码 
			System.err.println("service:" + req.getName()); 
			HelloWorldResponse reply = HelloWorldResponse.newBuilder().setMessage(("Hello: " + req.getName())).build(); 
			responseObserver.onNext(reply); responseObserver.onCompleted(); 
			}
	}
}

更改pom.xml文件内容为:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.mingluck.kang</groupId>
  <artifactId>gPRC-RPC</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>gPRC-RPC</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    
    <dependency> 
      <groupId>io.grpc</groupId> 
      <artifactId>grpc-netty</artifactId> 
      <version>1.10.0</version> 
    </dependency>
    
    <dependency>
      <groupId>io.grpc</groupId> 
      <artifactId>grpc-protobuf</artifactId> 
      <version>1.10.0</version> 
    </dependency>
    
    <dependency> 
      <groupId>io.grpc</groupId> 
      <artifactId>grpc-stub</artifactId> 
      <version>1.10.0</version> 
    </dependency>
  </dependencies>
  
  <build> 
    <extensions> 
      <extension> 
        <groupId>kr.motd.maven</groupId> 
        <artifactId>os-maven-plugin</artifactId> 
        <version>1.4.1.Final</version> 
      </extension> 
    </extensions> 
    <plugins> 
      <plugin> 
        <groupId>org.xolstice.maven.plugins</groupId> 
        <artifactId>protobuf-maven-plugin</artifactId> 
        <version>0.5.0</version> 
        <configuration> 
          <protocArtifact>com.google.protobuf:protoc:3.6.0:exe:${os.detected.classifier}</protocArtifact> 
          <pluginId>grpc-java</pluginId> 
          <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.10.0:exe:${os.detected.classifier}</pluginArtifact> 
        </configuration> 
        <executions> 
          <execution> 
            <goals> 
              <goal>compile</goal> 
              <goal>compile-custom</goal> 
            </goals> 
          </execution> 
        </executions> 
      </plugin> 
    </plugins> 
  </build>
  
</project>

进入pom.xml文件所在目录,运行命令:

mvn compile

此时grpc所依赖的库会下载到本机并且导入到当前项目中。我进行到这一步的时候出现了编译错误,就是子类里某些方法有@java.lang.override标签但是父类中并没有该方法,将override标签注释掉即可。

运行服务器程序,grpc java服务器程序启动起来。

 

grpc java客户端程序同样道理的搭建。客户端代码:

package com.mingluck.kang.gPRC_RPC; 
import java.util.concurrent.TimeUnit; 
import demo.GreetHelloWorldGrpc; 
import demo.GreetHelloWorldGrpc.GreetHelloWorldBlockingStub; 
import demo.HelloWorldRequest; 
import demo.HelloWorldResponse; 
import io.grpc.ManagedChannel; 
import io.grpc.ManagedChannelBuilder; 
public class HelloWorldClient { 
	private final ManagedChannel channel; 
	private final GreetHelloWorldBlockingStub blockingStub; 
	public HelloWorldClient(String host,int port){ 
		channel = ManagedChannelBuilder.forAddress(host,port)
				.usePlaintext(true)
				.build(); 
		blockingStub = GreetHelloWorldGrpc.newBlockingStub(channel); 
	} 
	public void shutdown() throws InterruptedException { 
		channel.shutdown().awaitTermination(5, TimeUnit.SECONDS); 
	} 
	public void greet(String name){ 
		HelloWorldRequest request = HelloWorldRequest.newBuilder()
				.setName(name)
				.build(); 
		HelloWorldResponse response = blockingStub.sayHello(request); 
		System.out.println(response.getMessage()); 
	}
	public static void main(String[] args) throws InterruptedException { 
		HelloWorldClient client = new HelloWorldClient("127.0.0.1", 8851); 
		for(int i=0;i<5;i++){ 
			client.greet("world:"+i); 
		} 
	}
}

 

<think>好的,我现在需要帮助用户了解如何在Java中配置gRPC。首先,我需要回忆一下用户提供的引用内容,看看里面有哪些相关的步骤和资源。 用户引用了四个文档,其中提到了安装gRPCJava环境、使用Gradle和Maven的步骤,以及生成proto接口的方法。首先,我应该按照这些引用来组织回答,确保步骤正确。 第一步,安装和项目设置。用户提到需要克隆grpc-java仓库,并用Gradle构建示例项目。引用[2]中的命令是`git clone`和`./gradlew installDist`,这部分需要放在安装步骤里。同时,引用[3]提到创建Maven项目,所以可能需要分Gradle和Maven两种情况说明依赖配置。 第二步,配置依赖管理。用户引用了Maven和Gradle的例子,比如在pom.xml中添加grpc-all依赖,以及Gradle的protobuf插件配置。引用[3]和[4]中提到了Maven命令生成代码,这里需要详细说明如何配置构建文件。 第三步,定义proto文件。这部分需要指导用户编写.proto文件,并确保语法正确。引用[3]中的grpc-protos项目可能涉及如何组织proto文件结构,需要强调这部分的重要性。 第四步,生成代码。引用[4]中的Maven命令`mvn protobuf:compile`是用来生成Java类的,这里要说明如何通过构建工具自动生成服务端和客户端的代码。 第五步,服务实现和启动。根据引用[3],可能需要创建服务实现类并重写方法,然后启动gRPC服务器。这部分需要给出示例代码,比如使用`ServerBuilder`来配置端口和服务。 第六步,客户端配置。需要展示如何创建通道和管理存根,引用[3]和[4]中的生成对象可能涉及`ManagedChannel`和阻塞存根的使用。 另外,用户的问题是关于配置指南,所以需要涵盖环境搭建、依赖管理、构建配置、代码生成、服务端和客户端的设置。需要检查是否有遗漏的步骤,比如是否需要处理SSL配置或者负载均衡,但根据引用内容,可能暂时不需要深入这些高级主题,保持基础配置即可。 还要注意用户提供的示例中代码块的使用,需要用正确的格式展示Java代码和构建脚本。同时,确保所有LaTeX格式正确,但根据问题内容,可能数学公式较少,重点在代码和配置步骤。 最后,生成相关问题时要围绕gRPCJava配置,可能涉及性能优化、不同构建工具对比、常见错误处理等。需要确保问题与配置指南相关,帮助用户进一步学习。</think>以下是Java中配置gRPC的逐步指南,整合了官方文档和实践经验: ### 一、安装与环境配置 1. **依赖管理工具** - 使用Maven时,在`pom.xml`中添加: ```xml <dependency> <groupId>io.grpc</groupId> <artifactId>grpc-all</artifactId> <version>1.54.0</version> </dependency> ``` - 使用Gradle时配置protobuf插件: ```groovy plugins { id 'com.google.protobuf' version '0.9.2' }[^2] ``` 2. **Proto文件定义** ```protobuf syntax = "proto3"; service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} } message HelloRequest { string name = 1; } message HelloReply { string message = 2; } ``` ### 二、代码生成配置 1. **Maven项目执行命令**: ```bash mvn protobuf:compile protobuf:compile-custom # 生成请求/响应对象及存根类[^4] ``` 2. **Gradle项目构建**: ```bash ./gradlew installDist # 自动生成服务存根 ``` ### 三、服务端实现 ```java public class GreeterImpl extends GreeterGrpc.GreeterImplBase { @Override public void sayHello(HelloRequest req, StreamObserver<HelloReply> resObserver) { HelloReply reply = HelloReply.newBuilder().setMessage("Hello " + req.getName()).build(); resObserver.onNext(reply); resObserver.onCompleted(); } } Server server = ServerBuilder.forPort(8080) .addService(new GreeterImpl()) .build().start();[^3] ``` ### 四、客户端配置 ```java ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080) .usePlaintext() // TLS配置可替换为.useTransportSecurity() .build(); GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel); HelloReply response = stub.sayHello(HelloRequest.newBuilder().setName("World").build());[^3] ``` ### 高级配置建议 - TLS加密配置需替换`.usePlaintext()`为: ```java .useTransportSecurity() .sslContext(GrpcSslContexts.forClient().trustManager(new File("server.crt")).build()) ``` - 负载均衡策略可通过`NameResolverRegistry`配置[^1]
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值