GRPC简单示例

本文详细介绍了如何在Java项目中利用ProtoBuf和Maven插件搭建gRPC服务。首先,在pom.xml中添加必要的依赖和protobuf-maven-plugin插件,接着编写.proto文件定义服务和消息类型,通过Maven插件生成Java代码。然后,实现服务接口并启动gRPC服务器。最后,展示了客户端如何调用服务并接收响应。整个过程涵盖了从proto文件的编写到服务的部署和调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用 proto + maven 的 proto 插件

1. pom.xml

添加依赖:

        <properties>
           <java.version>1.8</java.version>
           <grpc.version>1.24.0</grpc.version>
        </properties>

        <dependency>
            <groupId>io.grpc</groupId>
            <artifactId>grpc-netty</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>
        <!-- protobuf -->
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>3.8.0</version>
        </dependency>

添加 protobuf-maven 插件:

            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>0.5.0</version>
                <configuration>
                    <protocArtifact>com.google.protobuf:protoc:3.8.0:exe:windows-x86_64</protocArtifact>
                    <pluginId>grpc-java</pluginId>
                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.14.0:exe:windows-x86_64</pluginArtifact>
                </configuration>
                <executions>
                    <execution>
                        <goals>
                            <goal>compile</goal>
                            <goal>compile-custom</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

再 idea 的 maven 视图窗口 可以看到 protobuf的插件:

 说明:

使用  protobuf:compile 完成  message  的 代码生成,使用 protobuf:compile-custom完成 service的代码生成

依赖 、插件 添加完之后,可以 写 proto文件了:

2. proto 文件, 再 main 文件夹下 新建 proto文件夹,并新建 .proto文件

示例中建的是 cal_grpc_service.proto

 内容如下:


syntax = "proto3";
option java_multiple_files = true;
option java_package = "com.wxj.grpctest.auto";

message RequestWxj {
  string name = 1;
}


message ResponseWxj {
  string message = 1;
}

service WxjHelloService {

  rpc sayHello (RequestWxj) returns (ResponseWxj) {
  }
}

3. 再 maven 视图的 protobuf插件,执行 protobuf:compile、protobuf:compile-custom, 会再 target文件夹下 生成相应的 Java代码

grpc-java 文件夹里是 service服务

java文件夹里是 message 实体类

4. 把生成的 Java文件 copy到 工程里,然后把 target 文件夹删除,maven的 protobuf插件注释掉,防止重复生成Java文件。

5. 再生成的 service 类中,有一个 抽象的内部类 需要 我们自己实现


public class HelloService extends WxjHelloServiceGrpc.WxjHelloServiceImplBase {

    @Override
    public void sayHello(RequestWxj request, StreamObserver<ResponseWxj> responseObserver) {
        // 第一个 参数 就是 客户端 请求时传入的
        System.out.println("接收到请求:" + request.getName()); ;

        // 设置 响应数据
        ResponseWxj res = ResponseWxj.newBuilder().setMessage("收到请求了,放心吧!").build();

        responseObserver.onNext(res);
        responseObserver.onCompleted();

        System.out.println("业务处理结束。");
    }
}

6. 启动服务

@Service
public class ServiceStart {

    @PostConstruct
    public void init() throws Exception{

        Server server = ServerBuilder.forPort(8090).addService(new HelloService()).build();
        server.start();
        System.out.println("grpc server start");
    }
}

7 客户端代码

首先,客户端代码,也需要使用到 .proto 文件中定义的 message 和 service, 把 生成的Java代码 copy到 客户端项目中即可。

然后,再编写 客户端代码:


public class GrpcClient {
    public static void main(String[] args) {

        // 建立grpc连接
        ManagedChannel channel = ManagedChannelBuilder
                .forAddress("localhost", 8090)
                .usePlaintext()
                .build();

        // 创建 客户端代理
        WxjHelloServiceGrpc.WxjHelloServiceBlockingStub stub = WxjHelloServiceGrpc.newBlockingStub(channel);

        // 创建 请求对象
        RequestWxj req = RequestWxj.newBuilder().setName("0101").build();

        // 发起 grpc 调用
        ResponseWxj res = stub.sayHello(req);

        System.out.println("client 收到了回复:" + res.getMessage());

        // 关闭连接
        channel.shutdownNow();
    }
}

这样代码都写完了,可以启动服务测试:

服务端:

客户端:

 以上就是 简单的 grpc示例代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值