首页 > 编程知识 正文

boot什么意思,Spring响应式编程

时间:2023-05-04 02:27:16 阅读:153711 作者:3690

之前几经波折,最终进入了一家公司实习,但实习公司使用的技术并不熟悉。 但是,确实面试中并不要求这些技术。

我办完入职手续后,给我练习了。 给了我两个GitHub的链接。 一个是protobuffer的,另一个是tars的。 练习是编写一个可以使用springboot响应protobuffer的接口。

准备不知道protobuffer是什么,所以先学习protobuffer。

protocol buffer是谷歌的独立数据交换格式,可以用于很多领域。

protobuffer是一种数据交换格式,与json、xml类似,但它序列化后变小,独立于语言、平台,因此比json、xml更高效。 缺点是编码后的数据可读性差。

protobuffer独立于语言和平台,并且需要protobuffer编译器的支持,因此必须安装protobuffer编译器。 IDEA下面有一个名为GenProtobuf的插件。 此插件会自动生成编译后的Java类,但还必须将protobuf编译器放在Configure GenProtobuf中。 因此,无论如何都需要安装protobuf的编译器。 但是,在idea中安装插件后,不需要手动生成Java类。

正式着手mac书,使用IDEA工具,但与其他系统、工具也相似。

第一步,您需要创建一个项目,创建一个springboot项目,并引入protobuf依赖关系以及web模块

! --protobuf依赖--dependencygroupidcom.Google.proto buf/groupidartifactidprotobuf-Java/artifactidversion3. 14.0 dependencydependencygroupidcom.Google code.proto buf-Java-format/groupidartifactidprotobuf-Java-format/artifact

步骤2准备protobuf 2.1首先,创建proto buf文件。 示例:

//表示是proto3的语法,在proto3中不能使用' required'syntax='proto3'; //表示生成的序列化程序的Java包option Java _ package=' com.proto buf.proto buf.proto buf.proto buf '; //生成的Java序列化程序的类名option Java _ outer _ class name=' serializer '; //单个消息消息teacher {//proto中的数据类型字段名称=唯一编号//编号范围1-536870911、19000、199992个编号为1-15,16-2047为2个字节字符串名称=3; } 2.2使用插件生成Java类的示例:

步骤3接口3.1构想这里是主要的实现逻辑,我的构想是将一个实体序列化,然后使用base64进行编码,编码为字符串,这个字符串是我要传输的。 在json中,正如[ 1,2,3 ]表示数组一样。 确实,protobuf编码后的可读性很差,或者说完全没有可读性。 在进行传输时,将需要传输的内容放入请求体,在接口接收到该字符串后,对字符串进行base64解码,然后进行protobuf反序列化,恢复实例。 如果需要响应protobuf格式的数据,请首先构建一个实例,使用protobuf序列化它,使用base64进行编码,然后将编码字符串设置为响应方。 这样就完成了。 请求和响应使用protobuf格式的数据。

3.2代码import com.QL.protobuftest.util.serializer; importorg.spring framework.web.bind.annotation.request mapping; importorg.spring framework.web.bind.annotation.rest controller; import javax.servlet.http.http servlet request; import java.io.BufferedReader; import java.io.IOException; import java.util.Bas

e64;@RestController@RequestMapping("/test")public class ProtobufController { @RequestMapping("/test1") public String test1(HttpServletRequest request) { //获取请求体里的字符串 BufferedReader br = null; StringBuilder sb = new StringBuilder(); try { br = request.getReader(); String str; while ((str = br.readLine()) != null) { sb.append(str); } br.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (null != br) { try { br.close(); } catch (IOException e) { e.printStackTrace(); } } } String requestBody = sb.toString(); byte[] decode = null; try { //使用base64解码读取到的字符串, decode = Base64.getDecoder().decode(requestBody); } catch (Exception e) { e.printStackTrace(); } Serializer.Teacher teacher; try { // 将解析出来的字符串进行反序列化 teacher = Serializer.Teacher.parseFrom(decode); } catch (Exception e) { // 如果解析失败,就返回一个特殊的实例 teacher = Serializer.Teacher.newBuilder().setName("-1").setTeacherId(-1).setAge(-1).build(); e.printStackTrace(); } // 查看是否反序列化成功 System.err.println("teacher=" + teacher.toString()); // 返回一个序列化并且经过base64编码的字符串 Serializer.Teacher.Builder builder = Serializer.Teacher.newBuilder().setName("2").setAge(2).setTeacherId(2); return Base64.getEncoder().encodeToString(builder.build().toByteArray()); }} 第四步 测试

使用工具postman进行测试,对接口进行调用。

可以看到,请求体中携带了经过序列化并且使用base64编码的字符串,在接口中可以进行解析并且反序列化,将原本的对象还原回来。接口最后返回了一个将对象序列化之后并且经过base64编码的字符串。

ok 完成。我自己在写的时候,前面还写了好几个版本,但是都不太好,有问题。最终这版,我自己觉得还不错。

有什么不对或不懂的地方,欢迎讨论交流。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。