protobuf的java example见:protobuf的java学习版
在那篇文章中我们也说了,protobuf仅用于一些对性能要求特别高的场景,缺点就是和传统的java编程还是有一些不耦合的地方,需要进行转换,导致了编程有些麻烦。
在这篇文章中,我们来看一下 protobuf如何和springboot进行结合:
- 新建一个maven的springboot工程,在这个工程的pom中加入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.google.protobuf</groupId>
<artifactId>protobuf-java-util</artifactId>
<version>3.10.0</version>
</dependency>
<dependency>
<groupId>com.googlecode.protobuf-java-format</groupId>
<artifactId>protobuf-java-format</artifactId>
<version>1.4</version>
</dependency>
- 本例子还是使用官方的 addressbook.proto 这个例子,对这个文件中的java输出包改成:
option java_package = “com.champbay.blog.protobuf.model”;
其他不变,然后在这个目录中运行:protoc –java_out=. addressbook.proto,将生成 com/champbay/blog/protobuf/model/AddressBookProtos.java -
创建一个Configuration来加载 ProtobufHttpMessageConverter 的Bean
package com.champbay.blog.protobuf.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.protobuf.ProtobufHttpMessageConverter;
@Configuration
public class WebConfig {
@Bean
ProtobufHttpMessageConverter protobufHttpMessageConverter() {
return new ProtobufHttpMessageConverter();
}
}
此 ProtobufHttpMessageConverter 的作用是对 protobuf 进行 encode 和 decode
- 创建一个 Rest Controller:
package com.champbay.blog.protobuf.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.champbay.blog.protobuf.model.AddressBookProtos;
import com.champbay.blog.protobuf.model.AddressBookProtos.Person;
@Controller
public class TestController {
@RequestMapping(value = "/test", consumes = "application/x-protobuf", produces = "application/x-protobuf")
@ResponseBody
public AddressBookProtos.Person getPersonProto(@RequestBody AddressBookProtos.Person person) {
System.out.println("id: " + person.getId());
System.out.println("name: " + person.getName());
System.out.println("email: " + person.getEmail());
//这个地方需要加入将protobuf的对象转换成普通的java pojo的方法 !
Person.Builder builder = Person.newBuilder();
builder.setId(2);
builder.setName("myhello");
builder.setEmail("myhello@aaa.com");
return builder.build();
}
}
从这个类中能看到需要加入将protobuf的对象转换成普通的java pojo的方法,这个方法可以参考: Protobuf与POJO的相互转化 – 通过Json,也能看出protobuf要想方便使用,这个道路还是比较难的,可谓是“鱼和熊掌不可兼得”
5,最后通过 HttpClient 来调用这个 rest。
具体可以见源代码:https://github.com/champbay/protobuf-springboot-test