【gRPC实现java端调用go的服务】

实现一个客户端调用go服务端的简单服务

1.项目结构如下

在lib下面的存在一个simple.proto文件,我们使用插件protobuf-maven-plugin对其进行编译。配置如下:

xml 复制代码
 <properties>
        <os-maven-plugin.version>1.5.0.Final</os-maven-plugin.version>
        <protobuf-maven-plugin.version>0.5.1</protobuf-maven-plugin.version>
        <protoc.version>3.5.1-1</protoc.version>
        <protobuf.version>3.6.0</protobuf.version>
        <grpc.version>1.13.1</grpc.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.google.protobuf</groupId>
            <artifactId>protobuf-java</artifactId>
            <version>${protobuf.version}</version>
        </dependency>
        <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>
    </dependencies>

    <build>
        <extensions>
            <extension>
                <groupId>kr.motd.maven</groupId>
                <artifactId>os-maven-plugin</artifactId>
                <version>${os-maven-plugin.version}</version>
            </extension>
        </extensions>
        <plugins>
            <plugin>
                <groupId>org.xolstice.maven.plugins</groupId>
                <artifactId>protobuf-maven-plugin</artifactId>
                <version>${protobuf-maven-plugin.version}</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>
        </plugins>
    </build>

利用插件进行编译

后可以获得对应的文件。

2. Client

在client下创建一个grpc的包,并将以上两个文件放入。最后创建一个SimpleClient。

java 复制代码
package com.iq50.client.grpc;

import io.grpc.ManagedChannel;
import io.grpc.ManagedChannelBuilder;
import java.util.concurrent.TimeUnit;

/**
 * gRPC客户端示例
 */
public class SimpleClient {

    // gRPC通信通道
    private final ManagedChannel channel;
    
    // 自动生成的存根
    private final SimpleGrpc.SimpleBlockingStub blockingStub;

    /**
     * 构造函数,创建SimpleClient实例
     * @param host 服务器主机名
     * @param port 服务器端口
     */
    public SimpleClient(String host, int port){
        this(ManagedChannelBuilder.forAddress(host, port).usePlaintext());
    }

    /**
     * 私有构造函数,接受ManagedChannelBuilder参数
     * @param channelBuilder 通道构建器
     */
    private SimpleClient(ManagedChannelBuilder<?> channelBuilder) {
        // 构建通信通道
        channel = channelBuilder.build();
        // 根据通道返回的信息创建存根
        blockingStub = SimpleGrpc.newBlockingStub(channel);
    }

    /**
     * 关闭通信通道
     * @throws InterruptedException 线程中断异常
     */
    public void shutdown() throws InterruptedException {
        // 关闭通道并等待最多5秒钟确保关闭完成
        channel.shutdown().awaitTermination(5, TimeUnit.SECONDS);
    }

    /**
     * 向gRPC服务发送问候消息
     * @param name 问候消息的名称
     * @return 服务响应的消息
     */
    public String sayHello(String name) {
        // 创建HelloRequest对象
        SimpleOuterClass.HelloRequest req = SimpleOuterClass.HelloRequest.newBuilder().setName(name).build();
        // 调用服务方法获取响应
        SimpleOuterClass.HelloReplay replay = blockingStub.sayHello(req);
        // 返回服务响应的消息
        return replay.getMessage();
    }
}

最后在Application中调用即可

java 复制代码
package com.iq50.client;

import com.iq50.client.grpc.SimpleClient;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ClientApplication {

    public static void main(String[] args) {

        SpringApplication.run(ClientApplication.class, args);

        SimpleClient client = new SimpleClient("127.0.0.1",50051);
        String replay = client.sayHello("Jack");
        try {
            client.shutdown();
        } catch (InterruptedException e) {
            System.out.println("channel关闭异常:"+ e.getMessage());
        }
        System.out.println("回应是"+replay);
    }

}
相关推荐
oscar9997 分钟前
Maven项目中不修改 pom.xml 状况下直接运行OpenRewrite的配方
java·maven·openrewrite
南宫生7 分钟前
力扣-数据结构-3【算法学习day.74】
java·数据结构·学习·算法·leetcode
工业甲酰苯胺13 分钟前
聊一聊 C#线程池 的线程动态注入
java·开发语言·c#
NiNg_1_23415 分钟前
Python中SKlearn的K-means使用详解
python·kmeans·sklearn
m0_7482402520 分钟前
docker--压缩镜像和加载镜像
java·docker·eureka
向宇it24 分钟前
【从零开始入门unity游戏开发之——C#篇30】C#常用泛型数据结构类——list<T>列表、`List<T>` 和数组 (`T[]`) 的选择
java·开发语言·数据结构·unity·c#·游戏引擎·list
葡萄架子25 分钟前
Python中的logger作用(from loguru import logger)
java·前端·python
hakesashou29 分钟前
python怎么看矩阵维数
开发语言·python
daopuyun38 分钟前
GB/T34944-2017 《Java语言源代码漏洞测试规范》解读——安全功能
java·开发语言·安全
编程洪同学42 分钟前
Spring Boot 中实现自定义注解记录接口日志功能
android·java·spring boot·后端