如何基于gRPC-java实现单服务器接入6个客户端?求示例
gRPC-Java 单服务器接入多客户端(6个)实现方案
gRPC-Java 基于 HTTP/2 协议,天然支持多路复用,默认就能同时处理大量客户端连接,6个客户端的场景完全不需要额外做特殊配置,按常规流程实现即可。下面是完整的实现示例:
1. 定义gRPC服务接口(.proto文件)
创建 src/main/proto/helloworld.proto 文件,定义简单的RPC服务:
syntax = "proto3"; option java_package = "com.example.grpc"; option java_outer_classname = "HelloWorldProto"; option java_multiple_files = true; package helloworld; // 定义Greeter服务 service Greeter { // 简单RPC方法:客户端发请求,服务器返回响应 rpc SayHello (HelloRequest) returns (HelloReply) {} } // 请求消息结构 message HelloRequest { string name = 1; } // 响应消息结构 message HelloReply { string message = 1; }
2. 生成Java代码
使用 protoc 工具结合gRPC-Java插件生成对应的Java代码,执行以下命令(替换插件路径为你的实际路径):
protoc --java_out=src/main/java \ --grpc-java_out=src/main/java \ --plugin=protoc-gen-grpc-java=/path/to/protoc-gen-grpc-java-1.59.0-linux-x86_64 \ src/main/proto/helloworld.proto
3. 实现服务逻辑
编写服务实现类,继承自动生成的 GreeterGrpc.GreeterImplBase:
package com.example.grpc; import io.grpc.stub.StreamObserver; public class GreeterImpl extends GreeterGrpc.GreeterImplBase { @Override public void sayHello(HelloRequest request, StreamObserver<HelloReply> responseObserver) { // 处理请求,生成响应 String replyMsg = "Hello, " + request.getName() + "!"; HelloReply reply = HelloReply.newBuilder().setMessage(replyMsg).build(); // 返回响应并结束RPC responseObserver.onNext(reply); responseObserver.onCompleted(); // 打印客户端请求信息,便于验证多客户端连接 System.out.println("已处理客户端[" + request.getName() + "]的请求"); } }
4. 启动gRPC服务器
编写服务器启动类,绑定端口并注册服务:
package com.example.grpc; import io.grpc.Server; import io.grpc.ServerBuilder; import java.io.IOException; public class GrpcServer { public static void main(String[] args) throws IOException, InterruptedException { // 构建服务器,监听50051端口 Server server = ServerBuilder.forPort(50051) .addService(new GreeterImpl()) .build(); // 启动服务器 server.start(); System.out.println("gRPC服务器启动完成,监听端口:50051"); // 阻塞等待服务器终止(避免主线程退出) server.awaitTermination(); } }
5. 编写客户端并测试多连接
编写客户端类,用于连接服务器并发送请求:
package com.example.grpc; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; public class GrpcClient { public static void main(String[] args) { // 检查参数,传入客户端标识 if (args.length == 0) { System.err.println("请传入客户端编号,例如:java GrpcClient 1"); return; } // 创建通道连接服务器 ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 50051) .usePlaintext() // 生产环境务必使用TLS加密 .build(); // 创建阻塞式存根(也可使用异步存根) GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel); // 发送请求并获取响应 HelloRequest request = HelloRequest.newBuilder().setName("客户端" + args[0]).build(); HelloReply reply = stub.sayHello(request); System.out.println("收到服务器响应:" + reply.getMessage()); // 关闭通道 channel.shutdown(); } }
测试多客户端连接
- 先启动
GrpcServer - 打开6个终端,分别执行以下命令,模拟6个客户端连接:
java com.example.grpc.GrpcClient 1 java com.example.grpc.GrpcClient 2 java com.example.grpc.GrpcClient 3 java com.example.grpc.GrpcClient 4 java com.example.grpc.GrpcClient 5 java com.example.grpc.GrpcClient 6
此时服务器控制台会打印每个客户端的请求处理日志,证明6个客户端已成功连接并与服务器通信。
注意事项
- 生产环境中,建议配置TLS加密(替换
usePlaintext()为TLS相关配置),保障通信安全。 - 如果需要优化性能,可通过
ServerBuilder.executor()自定义线程池,6个客户端的场景默认线程池完全够用,无需额外调整。
内容的提问来源于stack exchange,提问作者mac
相关产品推荐
相关产品推荐

