首页 > 其他分享 >SpringBoot Kotlin 集成和使用 Protobuf

SpringBoot Kotlin 集成和使用 Protobuf

时间:2023-04-20 13:32:00浏览次数:44  
标签:文件 SpringBoot protoc protobuf proto grpc Kotlin Protobuf

环境版本

不同的环境配置参数可能区别较大,请酌情参考。

插件或依赖 版本号
SpringBoot 2.7.10
Gradle 7.5.1
Protobuf Gradle Plugin 0.9.2
Protobuf Java 3.21.9
Protoc 3.21.9
Grpc 1.53.0

项目是使用 IDEA 创建的 Spring Web 项目,语言 Kotlin,构建 Gradle

Protobuf 手动配置

Protobuf 的目的是将数据序列化,它提供了完善的编码工具:Protoc,可以将 .proto 定义的文件方便地转换为所需语言的类文件。

比如:Kotlin 使用 Protobuf,手动配置的流程如下:

graph TB
A(创建 .proto 文件) --> B(运行 protoc 命令将 .proto 文件转换为 .kt 文件)
B --> C(使用 .kt 类方法进行序列化)

但是,实践结果是生成的 .kt 文件有错误,可能是 Kotlin 版本问题。 用起来也不是很方便,所以采用 gradle plugin 的方式自动管理包和编译Proto。

添加插件和依赖

在 build.gradle.kts 中配置 Protobuf 需要的插件和依赖。

添加 protobuf gralde plugin

plugins {
    ... 
    id("com.google.protobuf") version "0.9.2"
}

该插件帮助管理 protoc 和完成文件转换。

Protobuf Gradle Plugin 的源码地址: https://github.com/google/protobuf-gradle-plugin

添加 Protobuf 的依赖包

dependencies {
	...
	implementation("com.google.protobuf:protobuf-java:3.21.9")
	implementation("io.grpc:grpc-protobuf:1.53.0")
	implementation("io.grpc:grpc-stub:1.53.0")
}

配置 Protobuf 插件

protobuf {
	// 配置 protoc
    protoc {
        artifact = "com.google.protobuf:protoc:3.21.9"
    }
    // 配置 grpc
    plugins {
    	// 这里需要加 id,旧版本可能是这样: grpc {}
        id("grpc"){
            artifact = "io.grpc:protoc-gen-grpc-java:1.53.0"
        }
    }
    // 配置 gradle task
    generateProtoTasks {
        ofSourceSet("main").forEach {
            it.plugins {
                id("grpc") { }
            }
        }
    }
}

编写 .proto 文件

文件位置

在 src/main目录下新建目录 proto,然后在该目录下新建包名和 .proto 文件。 示例目录结构如下:

  src
	└─ main
	    ├─kotlin
	    │  └─cn.test.proj
	    ├─proto
	    │  └─cn.test.proj
	    │          Param.proto
	    │          
	    └─resources

proto 与 kotlin 在同一级,.proto 文件在相同的包下。

proto 文件编写

这里是简单示例,详细内容,请参考 proto 官方文档。

syntax = "proto3";
package cn.test.proj;
message Person {
  string id = 1;
  string name = 2;
}

package 值与目录中的包名对应

使用方法

生成 Proto 对象

在 IDEA 右侧 Gradle 窗口,执行 Tasks - other - generateProto 任务,生成 Proto 对象。

使用 Proto 对象

不像手动运行 protoc 命令会生成 .kt 文件。运行 generateProto task 之后,项目文件中没有看到对应的 .kt 文件生成,但是可以像使用 Kotlin 对象一样使用 proto 对象。

参照上文示例,我们在 Param.proto 中定义了一个 Person 对象,如果使用 Okhttp3 请求网络服务,参数是 Person,响应参数也是 Person 示例代码如下:


private const val CONTENT_TYPE = "application/x-protobuf"

fun request(){
	val requestPerson = Param.Person.newBuilder().apply{
		id = "testid"
		name = "Peter"
	}.build()
	val requestBytes = requestPerson.toByteArray() // 序列化
	val requestBody = requestBytes.toRequestBody(CONTENT_TYPE.toMediaType())
	... 
	// Okhttp 请求
	// header 中添加 "Content-Type" = CONTENT_TYPE
	// 请求响应结果 response: Response
	...
	val responseBytes = response.body?.bytes()
	val responsePerson = Param.Person.parseFrom(responseBytes) // 反序列化
}

标签:文件,SpringBoot,protoc,protobuf,proto,grpc,Kotlin,Protobuf
From: https://blog.51cto.com/u_15777791/6209498

相关文章

  • 记录一次使用 表达式引擎 自定义注解 还有 sql union all 实现对数据库数据提取、重组
    这样编写减少了前后端很多没必要的遍历,以及if判断并最大限度提高了代码的可变通性额外需要学习的是ORM框架下,如何接收多表(各表结构不同)操作后,sql返回的新结构的临时表问题表达式引擎用到的依赖<dependency><groupId>org.apache.commons</groupId>......
  • SpringBoot静态文件映射问题
    如果遇到这种情况,检查静态文件(js/css/img)是不是在默认的static路径下,在查看application配置中的static-path-pattern:是否和前端映射路径完全相同,要是不相同则会造成访问不到......
  • springboot 事件监听@EventListener注解用法
    前言关于@EventListener注解,百度了一下,网上的教程很多都是继承这个,实现那个的,其实根本用不着这么麻烦,所以就写了此文,如文章所讲有误,还请谅解更多详细用法请百度一下~作用关于事件监听,目前我的用法最多的就是记录日志之类的。在此之前我们记录日志一般都是先把日志的service注......
  • SpringBoot利用Filter获取请求数据request和修改返回response中的数据
    WrapperedRequestimportjavax.servlet.ReadListener;importjavax.servlet.ServletInputStream;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletRequestWrapper;importjava.io.*;publicclassWrapperedRequestextendsHttpSe......
  • springboot学习之五(自动配置)
    一、@Conditional源码springboot的自动配置是通过@Conditional注解(条件判断)实现的.@Conditional是Spring4版本新提供的一种注解,它的作用是按照设定的条件进行判断,把满足判断条件的bean注册到Spring容器。packageorg.springframework.context.annotation;importjava.lang.a......
  • 创建idea springboot(spring Initializr项目)需要手动导包)
    用注解@RestController 的时候,报错:找不到符号原来是没有import这个包,复制粘贴 @RestController 的时候,idea并没有自动import这个包,导致找不到,要手动import。手动导入就行了。另外,如果是创建的maven项目,由于main类文件的放置位置不同,也会报错:nested exception is java.lang.I......
  • @SpringBootApplication等四个爆红
    在黑马的上面学习,按步骤做,出现爆红问题,之后尝试过很多方法,后发现没导包。导包后可以 ......
  • Java SpringBoot 加载 yml 配置文件中字典项
    将字典数据,配置在yml文件中,通过加载yml将数据加载到Map中SpringBoot中yml配置、引用其它yml中的配置。#在配置文件目录(如:resources)下新建application-xxx必须以application开头的yml文件,多个文件用","号分隔,不能换行项目结构文件application.ymlserver:po......
  • springboot项目 宿舍管理系统 (源码+数据库文件+1w字论文+ppt)
    来了就点个赞再走呗,即将毕业的兄弟有福了文章底部获取源码springboot项目宿舍管理系统(源码+数据库文件+1w字论文+ppt)技术框架:java+springboot+vue+mysql后端框架:SpringBoot、SpringMVC、MyBatisPlus前端界面:vue、BootStrap、jQuery、ajxs系统共分为三种用户系统主要功......
  • springboot
    介绍springboot是spring项目中的一个子工程,前者的实现是基于spring的。springboot的特点:“开箱即用”和“约定大于配置”使用pom配置1)添加父工程依赖<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId>......