gRPC基本使用(一)--java与go之间的相互调用 原 荐

栏目: 服务器 · 发布时间: 7年前

内容简介:gRPC是一个高性能、开源、通用的RPC框架,面向移动和HTTP/2设计。gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制。Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。本文只是根据gRPC相关资料文档编写的Java Spring Boot 与 Golang 语

gRPC是一个高性能、开源、通用的RPC框架,面向移动和HTTP/2设计。gRPC 默认使用 protocol buffers,这是 Google 开源的一套成熟的结构数据序列化机制。

Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。

简介

本文只是根据gRPC相关资料文档编写的Java Spring Boot 与 Golang 语言相关调用的示例。

详细内容

编写proto文件

使用proto3语法。文件 user_provider.proto

需要使用proto文件,来自动生成不同语言的相关接口、类、对象等。

// user service provider

// proto语法版本
syntax = "proto3";

// 可选参数 设置java package
option java_package = "cn.lpe234.grpc.grpcdemo.grpc";

// 定义对外暴露的服务
service UserProvider {

    // 根据用户id获取用户信息的服务(具体服务/函数)
    rpc getByUserId(UserIdRequest) returns (UserVoReplay) {}
}

// 请求
message UserIdRequest {
    uint64 id = 1;          // 用户id 类型为Long
}

// 响应
message UserVoReplay {
    uint64 id = 1;          // 用户id
    string username = 2;    // 用户名称
}

Java Spring Boot 相关

使用Maven作为项目的依赖管理及编译构建工具。当前使用Maven插件,在编译时根据proto文件自动生成服务编写时所需的Class类。

需要将 *.proto 放置在 xxProject/src/main/proto 文件夹下,才能被插件读取到。也就是 proto 文件夹需要跟 javaresources 文件夹并列才行(或许可通过修改配置信息修改proto文件存储位置,未做深究~)。

Maven配置

项目精简的pxm.xml配置文件。

<!-- grpc 依赖版本 -->
<properties>
        <grpc.version>1.14.0</grpc.version>
</properties>

<!-- grpc 依赖jar包 -->
<dependencies>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-netty</artifactId>
        <version>${grpc.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-protobuf</artifactId>
        <version>${grpc.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-core</artifactId>
        <version>${grpc.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>io.grpc</groupId>
        <artifactId>grpc-stub</artifactId>
        <version>${grpc.version}</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>net.devh</groupId>
        <artifactId>grpc-server-spring-boot-starter</artifactId>
        <version>2.0.1.RELEASE</version>
    </dependency>
</dependencies>

<!-- grpc build 插件 -->
<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.3.0:exe:${os.detected.classifier}</protocArtifact>
                <pluginId>grpc-java</pluginId>
                <pluginArtifact>io.grpc:protoc-gen-grpc-java:1.4.0:exe:${os.detected.classifier}</pluginArtifact>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                        <goal>compile-custom</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

理论上,此时执行 mvn -DskipTests=true compile ,即可正常生成gRPC相关的Class类。

target
├── generated-sources
│   ├── annotations
│   └── protobuf
│       ├── grpc-java
│       │   └── cn
│       │       └── lpe234
│       │           └── grpc
│       │               └── grpcdemo
│       │                   └── grpc
│       │                       └── UserProviderGrpc.java
│       └── java
│           └── cn
│               └── lpe234
│                   └── grpc
│                       └── grpcdemo
│                           └── grpc
│                               └── UserProviderOuterClass.java

gPPC服务提供编写

使用注解( @net.devh.springboot.autoconfigure.grpc.server.GrpcService )的方式对外提供服务,类似Dubbo服务中的注解方式。

package cn.lpe234.grpc.grpcdemo.grpcprovider;

import cn.lpe234.grpc.grpcdemo.grpc.UserProviderGrpc;
import cn.lpe234.grpc.grpcdemo.grpc.UserProviderOuterClass;
import io.grpc.stub.StreamObserver;
import lombok.extern.slf4j.Slf4j;
import net.devh.springboot.autoconfigure.grpc.server.GrpcService;

/**
 * Grpc服务暴露
 *
 * @author lpe234
 * @datetime 2018/11/24 14:36
 */
@Slf4j
@GrpcService(UserProviderGrpc.class)
public class UserProvider extends UserProviderGrpc.UserProviderImplBase {

    @Override
    public void getByUserId(UserProviderOuterClass.UserIdRequest request, StreamObserver<UserProviderOuterClass.UserVoReplay> responseObserver) {
        // super.getByUserId(request, responseObserver);

        // 获取请求数据
        long userId = request.getId();
        log.debug("grpc request: userId=" + userId);

        // 构造返回数据
        UserProviderOuterClass.UserVoReplay.Builder userVoReplayBuild = UserProviderOuterClass.UserVoReplay.newBuilder();
        userVoReplayBuild.setId(userId);
        userVoReplayBuild.setUsername("hello world");
        UserProviderOuterClass.UserVoReplay userVoReplay = userVoReplayBuild.build();

        // 做出响应
        responseObserver.onNext(userVoReplay);
        responseObserver.onCompleted();
    }
}

gRPC对外服务暴露相关配置

application.xml 文件。需配置绑定的地址和监听的端口。

# grpc
grpc:
  server:
    address: 0.0.0.0
    port: 10081

运行

如果一切顺利的话,启动Spring Boot项目。可看到控制台日志输出:

2018-11-24 16:51:16.999  INFO 60266 --- [           main] n.d.s.a.g.server.NettyGrpcServerFactory  : Registered gRPC service: UserProvider, bean: userProvider, class: cn.lpe234.grpc.grpcdemo.grpcprovider.UserProvider
2018-11-24 16:51:17.124  INFO 60266 --- [           main] n.d.s.a.grpc.server.GrpcServerLifecycle  : gRPC Server started, listening on address: 0.0.0.0, port: 10081
2018-11-24 16:51:17.141  INFO 60266 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 10080 (http) with context path ''
2018-11-24 16:51:17.145  INFO 60266 --- [           main] c.l.grpc.grpcdemo.GrpcDemoApplication    : Started GrpcDemoApplication in 2.246 seconds (JVM running for 2.721)

可看到: gRPC Server started, listening on address: 0.0.0.0, port: 10081 。说明服务启动正常~

Golang相关

新建项目 grpc-demo 并 创建子文件夹 grpc-demo/proto ,然后将 最开始的 user_provider.proto 拷贝进去( 由于proto文件定义了RPC调用的所有细节,即所有服务提供或调用均需要保持版本的相同。拷贝似乎有些不妥~ )。

生成Golang gRPC调用相关文件

该步骤,需要一些相关依赖~

protoc --go_out=plugins=grpc:. user_provider.proto

执行成功后,会在该文件夹下生成 user_provider.pb.go 文件。

服务调用

在项目的 src 目录下,新建 main.go 文件。

备注:地址直接硬编码毕竟是不好的,暂不考虑服务注册发现相关内容,知道这块应该有更好的解决方案即可~

package main

import (
	"google.golang.org/grpc"
	pb "proto"
	"context"
	"log"
)

func main() {
	// java spring boot 暴露的grpc服务接口
	const addr = "127.0.0.1:10081"


	// 连接服务
	conn, err := grpc.Dial(addr, grpc.WithInsecure())
	if err != nil {
		log.Panic(err)
	}

	// 确保连接最终被关闭
	defer conn.Close()

	// 建立远程调用客户端
	client := pb.NewUserProviderClient(conn)
	reply, err := client.GetByUserId(context.Background(), &pb.UserIdRequest{Id: 1})
	if err != nil {
		log.Panic(err)
	}

	// 输出结果
	log.Println("user info:", reply.Id, reply.Username)
}

运行

执行后,可分别在服务调用和提供者日志中看到如下内容:

# Golang
2018/11/24 17:10:12 user info: 1 hello world
# Spring Boot
2018-11-24 17:10:12.123 DEBUG 60266 --- [ault-executor-1] c.l.g.g.grpcprovider.UserProvider        : grpc request: userId=1

完结

至此,已完成了 Java 提供服务,Golang调用服务。

项目源码: https://github.com/lpe234/grpc-demo


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Cypherpunks

Cypherpunks

Julian Assange、Jacob Appelbaum、Andy Müller-Maguhn、Jérémie Zimmermann / OR Books / 2012-11 / GBP 8.99

Cypherpunks are activists who advocate the widespread use of strong cryptography (writing in code) as a route to progressive change. Julian Assange, the editor-in-chief of and visionary behind WikiLea......一起来看看 《Cypherpunks》 这本书的介绍吧!

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具