当前位置:   article > 正文

Spring Boot 集成 Protobuf 快速入门 Demo

Spring Boot 集成 Protobuf 快速入门 Demo

1、什么是 Protobuf

Protobuf(Protocol Buffers)是由 Google 开发的一种轻量级、高效的数据交换格式,它被用于结构化数据的序列化、反序列化和传输。相比于 XML 和 JSON 等文本格式,Protobuf 具有更小的数据体积、更快的解析速度和更强的可扩展性。Protobuf 的核心思想是使用协议(Protocol)来定义数据的结构和编码方式。使用 Protobuf,可以先定义数据的结构和各字段的类型、字段等信息,然后使用 Protobuf 提供的编译器生成对应的代码,用于序列化和反序列化数据。

Protobuf 有以下几个优势:

1、 更小的数据量:Protobuf 的二进制编码通常只有 XML 和 JSON 的 1/3 到 1/10 左右,因此在网络传输和存储数据时可以节省带宽和存储空间。
2、 更快的序列化和反序列化速度:由于 Protobuf 使用二进制格式,所以序列化和反序列化速度比 XML 和 JSON 快得多。
3、 跨语言:Protobuf 支持多种编程语言,可以使用不同的编程语言来编写客户端和服务端。这种跨语言的特性使得 Protobuf 受到很多开发者的欢迎(JSON 也是如此)。
4、 易于维护可扩展:Protobuf 使用 .proto 文件定义数据模型和数据格式,这种文件比 XML 和 JSON 更容易阅读和维护,且可以在不破坏原有协议的基础上,轻松添加或删除字段,实现版本升级和兼容性。

2、代码工程

实验目标

本实验的目标是实现基于 Protobuf 协议的 REST API 通信。

pom.xml
  1. <?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <parent>
  5. <groupId>org.springframework.boot</groupId>
  6. <artifactId>spring-boot-starter-parent</artifactId>
  7. <version>3.2.1</version>
  8. </parent>
  9. <modelVersion>4.0.0</modelVersion>
  10. <artifactId>protobuf</artifactId>
  11. <properties>
  12. <maven.compiler.source>17</maven.compiler.source>
  13. <maven.compiler.target>17</maven.compiler.target>
  14. </properties>
  15. <dependencies>
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-web</artifactId>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.springframework.boot</groupId>
  22. <artifactId>spring-boot-starter-test</artifactId>
  23. <scope>test</scope>
  24. </dependency>
  25. <dependency>
  26. <groupId>com.google.protobuf</groupId>
  27. <artifactId>protobuf-java</artifactId>
  28. <version>3.19.2</version>
  29. </dependency>
  30. </dependencies>
  31. <build>
  32. <plugins>
  33. <plugin>
  34. <groupId>org.xolstice.maven.plugins</groupId>
  35. <artifactId>protobuf-maven-plugin</artifactId>
  36. <version>0.6.1</version>
  37. <configuration>
  38. <protoSourceRoot>${basedir}/src/main/resources</protoSourceRoot>
  39. <protocArtifact>com.google.protobuf:protoc:3.19.1:exe:${os.detected.classifier}</protocArtifact>
  40. <outputDirectory>src/main/java</outputDirectory>
  41. </configuration>
  42. <executions>
  43. <execution>
  44. <goals>
  45. <goal>compile</goal>
  46. <goal>compile-custom</goal>
  47. </goals>
  48. </execution>
  49. </executions>
  50. </plugin>
  51. <plugin>
  52. <groupId>org.springframework.boot</groupId>
  53. <artifactId>spring-boot-maven-plugin</artifactId>
  54. </plugin>
  55. </plugins>
  56. </build></project>
定义 Protobuf 文件

src/main/resources 目录下创建 mxsm.proto 文件:

  1. syntax = "proto3";
  2. package mxsm;
  3. option java_package = "com.et.protobuf";
  4. option java_outer_classname = "ProtobufMessage";
  5. message Student {
  6. int32 id = 1;
  7. string first_name = 2;
  8. string last_name = 3;
  9. string email = 4;
  10. repeated PhoneNumber phone = 5;
  11. message PhoneNumber {
  12. string number = 1;
  13. PhoneType type = 2;
  14. }
  15. enum PhoneType {
  16. MOBILE = 0;
  17. LANDLINE = 1;
  18. }
  19. }
配置类

com.et.protobuf.config 包下创建 Config 类:

  1. package com.et.protobuf.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter;
  5. import org.springframework.web.client.RestTemplate;
  6. import java.util.Arrays;
  7. @Configurationpublic class Config {
  8. @Bean
  9. public RestTemplate restTemplate(ProtobufHttpMessageConverter hmc) {
  10. return new RestTemplate(Arrays.asList(hmc));
  11. }
  12. @Bean
  13. public ProtobufHttpMessageConverter protobufHttpMessageConverter() {
  14. return new ProtobufHttpMessageConverter();
  15. }
  16. }
控制器类

com.et.protobuf.controller 包下创建 HelloWorldController 类:

  1. package com.et.protobuf.controller;
  2. import com.et.protobuf.ProtobufMessage;
  3. import com.et.protobuf.StudentJson;
  4. import org.springframework.web.bind.annotation.PathVariable;
  5. import org.springframework.web.bind.annotation.RequestMapping;
  6. import org.springframework.web.bind.annotation.RestController;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. @RestControllerpublic class HelloWorldController {
  10. @RequestMapping("/json/{id}")
  11. public StudentJson showHelloWorld(@PathVariable Integer id) {
  12. StudentJson studentJson = new StudentJson();
  13. studentJson.setId(id);
  14. studentJson.setFirstName("张三");
  15. studentJson.setLastName("李四");
  16. studentJson.setEmail("zhangsan@example.com");
  17. // 创建电话对象
  18. StudentJson.PhoneNumber phoneNum = new StudentJson.PhoneNumber();
  19. phoneNum.setNumber("123456789");
  20. phoneNum.setType(1);
  21. List<StudentJson.PhoneNumber> list = new ArrayList<>();
  22. list.add(phoneNum);
  23. studentJson.setPhone(list);
  24. return studentJson;
  25. }
  26. @RequestMapping("/protobuf/{id}")
  27. public ProtobufMessage.Student protobuf(@PathVariable Integer id) {
  28. return ProtobufMessage.Student.newBuilder()
  29. .setId(id)
  30. .setFirstName("张三")
  31. .setLastName("李四")
  32. .setEmail("zhangsan@example.com")
  33. .addPhone(ProtobufMessage.Student.PhoneNumber.newBuilder()
  34. .setNumber("123456789")
  35. .setType(ProtobufMessage.Student.PhoneType.MOBILE).build())
  36. .build();
  37. }
  38. }
实体类

com.et.protobuf 包下创建 StudentJson 类:

  1. package com.et.protobuf;
  2. import java.util.List;
  3. public class StudentJson {
  4. private int id;
  5. private String firstName;
  6. private String lastName;
  7. private String email;
  8. private List<PhoneNumber> phone;
  9. public int getId() {
  10. return id;
  11. }
  12. public void setId(int id) {
  13. this.id = id;
  14. }
  15. public String getFirstName() {
  16. return firstName;
  17. }
  18. public void setFirstName(String firstName) {
  19. this.firstName = firstName;
  20. }
  21. public String getLastName() {
  22. return lastName;
  23. }
  24. public void setLastName(String lastName) {
  25. this.lastName = lastName;
  26. }
  27. public String getEmail() {
  28. return email;
  29. }
  30. public void setEmail(String email) {
  31. this.email = email;
  32. }
  33. public List<PhoneNumber> getPhone() {
  34. return phone;
  35. }
  36. public void setPhone(List<PhoneNumber> phone) {
  37. this.phone = phone;
  38. }
  39. public static class PhoneNumber {
  40. private int type;
  41. private String number;
  42. public int getType() {
  43. return type;
  44. }
  45. public void setType(int type) {
  46. this.type = type;
  47. }
  48. public String getNumber() {
  49. return number;
  50. }
  51. public void setNumber(String number) {
  52. this.number = number;
  53. }
  54. }
  55. }

3、测试

启动 Spring Boot 应用,并编写测试类。

测试类

com.et.protobuf 包下创建 ApplicationTest 类:

  1. package com.et.protobuf;
  2. import org.junit.jupiter.api.Test;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.boot.test.context.SpringBootTest;
  5. import org.springframework.http.ResponseEntity;
  6. import org.springframework.web.client.RestTemplate;
  7. @SpringBootTest(classes = DemoApplication.class)
  8. public class ApplicationTest {
  9. private static final String STUDENT_URL = "http://localhost:8080/protobuf/1";
  10. @Autowired
  11. private RestTemplate
  12. restTemplate;
  13. @Test
  14. public void whenUsingRestTemplate_thenSucceed() {
  15. ResponseEntity<ProtobufMessage.Student> student = restTemplate.getForEntity(STUDENT_URL, ProtobufMessage.Student.class);
  16. System.out.println("学生信息: " + student.toString());
  17. }
  18. }

4、引用

参考资料:Protobuf 官方文档

以上就是一个简单的 Spring Boot 集成 Protobuf 的示例,通过这个示例,你可以了解如何在 Spring Boot 项目中使用 Protobuf 进行数据传输和处理。希望对你有所帮助!

推荐一个springboot的入门教程,有需要的可以学起来:

一起来学 SpringBoot 2.x | 第一篇:构建第一个 SpringBoot 工程
一起来学 SpringBoot 2.x | 第二篇:SpringBoot配置详解
一起来学 SpringBoot 2.x | 第三篇:SpringBoot日志配置
一起来学 SpringBoot 2.x | 第五篇:使用 JdbcTemplate 访问数据库
一起来学 SpringBoot 2.x | 第四篇:整合Thymeleaf模板
一起来学 SpringBoot 2.x | 第六篇:整合SpringDataJpa
一起来学 SpringBoot 2.x | 第七篇:整合Mybatis
一起来学 SpringBoot 2.x | 第八篇:通用Mapper与分页插件的集成
一起来学 SpringBoot 2.x | 第十篇:使用Spring Cache集成Redis
一起来学 SpringBoot 2.x | 第九篇:整合Lettuce Redis
一起来学 SpringBoot 2.x | 第十一篇:集成Swagger在线调试
一起来学 SpringBoot 2.x | 第十二篇:初探RabbitMQ消息队列
一起来学 SpringBoot 2.x | 第十三篇:RabbitMQ延迟队列
一起来学 SpringBoot 2.x | 第十四篇:强大的 actuator 服务监控与管理
一起来学 SpringBoot 2.x | 第十六篇:定时任务详解
一起来学 SpringBoot 2.x | 第十五篇:actuator与Spring-boot-admin 可以说的秘密
一起来学 SpringBoot 2.x | 第十七篇:轻松搞定文件上传
一起来学 SpringBoot 2.x | 第十八篇:轻松搞定全局异常
一起来学 SpringBoot 2.x | 第十九篇:轻松搞定数据验证(一)
一起来学 SpringBoot 2.x | 第二十篇:轻松搞定数据验证(二)
一起来学 SpringBoot 2.x | 第二十一篇:轻松搞定数据验证(三)
一起来学 SpringBoot 2.x | 第二十二篇:轻松搞定重复提交(本地锁)
一起来学 SpringBoot 2.x | 第二十三篇:轻松搞定重复提交(分布式锁)
一起来学 SpringBoot 2.x | 第二十五篇:打造属于你的聊天室(WebSocket)
一起来学 SpringBoot 2.x | 第二十四篇:数据库管理与迁移(Liquibase)
一起来学 SpringBoot 2.x | 第二十六篇:轻松搞定安全框架(Shiro)
一起来学 SpringBoot 2.x | 第二十七篇:优雅解决分布式限流

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/953615
推荐阅读
相关标签
  

闽ICP备14008679号