博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring Cloud OpenFeign集成Protocol Buffer
阅读量:6520 次
发布时间:2019-06-24

本文共 4659 字,大约阅读时间需要 15 分钟。

本文作者张天,著有《Spring Cloud 微服务架构进阶》一书。

背景

 在之前的文章中,我们介绍过基于Spring Cloud微服务架构,其中,微服务实例之间的交互方式一般为RESTful HTTP请求或RPC调用。Spring Cloud已经为开发者提供了专门用于RESTful HTTP请求处理的OpenFeign组件,但是并没有相关的RPC调用组件。今天,我们就要定制OpenFeign的编解码器,使用Google的Protocol Buffer编码,让它拥有RPC调用的数据传输和转换效率高的优点。

 OpenFeign是一个声明式RESTful HTTP请求客户端,它使得编写Web服务客户端更加方便和快捷。它有较强的定制性,可以根据自己的需求来对它的各个方面进行定制,比如说编解码器,服务路由解析和负载均衡。

 而Protocol Buffer 是Google的一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,或者说序列化。它很适合做数据存储或 RPC 数据交换格式。可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。目前提供了 C++、Java、Python 三种语言的 API。

 OpenFeign默认使用HttpUrlConnection进行网络请求的发送; 相关实现代码在DefaultFeignLoadBalancedConfigurationClient.Default。而其使用的编解码器默认为jackson2,默认配置为HttpMessageConvertersAutoConfiguration

 Protocol Buffer的编解码效率要远高于jackson2,在微服务实例频频通信的场景下,使用Protocol Buffer编解码时会少占用系统资源,并且效率较高。具体详见这个对比对比各种序列化和反序列化框架的性能的文档,

客户端集成Protocol Buffer

 开发人员可以使用自定义配置类对OpenFeign进行定制,提供OpenFeign所需要的编解码组件实例,从而替代默认的组件实例,达到定制化的目的。自定义的配置类如下所示。

@Configurationpublic class ProtoFeignConfiguration {    @Autowired    private ObjectFactory
messageConverterObjectFactory; @Bean public ProtobufHttpMessageConverter protobufHttpMessageConverter() { return new ProtobufHttpMessageConverter(); } @Bean public Encoder springEncoder() { return new SpringEncoder(this.messageConverterObjectFactory); } @Bean public Decoder springDecoder() { return new ResponseEntityDecoder(new SpringDecoder(this.messageConverterObjectFactory)); }}复制代码

 其中ProtobufHttpMessageConverterHttpMessageConverters的Protobuf的实现类,负责使用Protocol Buffer进行网络请求和响应的编解码。而SpringEncoderResponseEntityDecoder是OpenFeign中的编解码器实现类。

 下面,我们来看一下OpenFeign中发送网络请求的接口定义。@FeignClient中配置了ProtoFeignConfiguration为自定义配置类。

@FeignClient(name = "user", configuration = ProtoFeignConfiguration.class)public interface UserClient {    @RequestMapping(value = "/info", method = RequestMethod.GET,            consumes = "application/x-protobuf", produces = "application/x-protobuf")    UserDTO getUserInfo(@RequestParam("id") Long id);}复制代码

 其中,UserDTO是使用Protocol Buffer的maven插件自动生成的。需要注意的是,必须将@RequestMappingconsumesproduces属性设置为application/x-protobuf,表示网络请求和响应的编码格式必须是Protobuf,否则可能会接收到406的错误响应码。

 下面是proto文件中的数据格式定义,其中java_package是表明生成文件的目标文件夹。该文件中定义了UserDTO数据格式,它包括ID,名称和主页URL三个属性。

syntax = "proto3";option java_multiple_files = true;option java_package = "com.remcarpediem.feignprotobuf.proto.dto";package com.remcarpediem.feignprotobuf.proto.dto;message UserDTO {    int32 id = 1;    string name = 2;    string url = 3;}复制代码

 在pom文件中配置build属性,使用Protocol Buffer的maven插件可以自动根据proto文件生成Java代码。每个配置项都在代码中有对应的解释。

org.xolstice.maven.plugins
protobuf-maven-plugin
0.5.0
true
${project.basedir}/src/main/proto
${project.build.sourceDirectory}
false
${project.build.directory}/protoc-dependencies
compile
test-compile
复制代码

 然后运行Protocol Buffer的maven插件可以自动生成相关的数据类。

服务端

 然后是服务端对于Protocol Buffer的集成。我们也需要使用自定义配置类将ProtobufHttpMessageConverter设置为系统默认的编解码器,如下述代码所示。

@Configurationpublic class Conf {    @Bean    ProtobufHttpMessageConverter protobufHttpMessageConverter() {        return new ProtobufHttpMessageConverter();    }}复制代码

 然后定义Controller的关于user的info接口。返回UserDTO实例作为网络请求的返回值。ProtobufHttpMessageConverter会自动将其转换为Protocol Buffer的数据格式进行传输。

@RestControllerpublic class UserController {    private String host = "http://blog.com/user/";    @GetMapping("/info")    public UserDTO getUserInfo(@RequestParam("id") Long id) {        return UserDTO.newBuilder().                setId(id).setName("Tom").                setUrl(host + "Tom").build();    }}复制代码

 本文的源码地址: GitHub:

总结

 欲了解更详细的实现原理和细节,大家可以关注笔者出版的《Spring Cloud 微服务架构进阶》,本书中对Spring Cloud Finchley.RELEASE版本的各个主要组件进行原理讲解和实战应用,里边也有关于OpenFeign的原理和实现的详细解析。更多的介绍见。

《Spring Cloud 微服务架构进阶》购买地址:

转载地址:http://xprfo.baihongyu.com/

你可能感兴趣的文章
getopt--parse command line options
查看>>
闭包和OC的block的本质
查看>>
每天一个linux命令(34):du 命令
查看>>
MySQL出现Waiting for table metadata lock的场景浅析
查看>>
C# 语言历史版本特性(C# 1.0到C# 7.1汇总更新)
查看>>
什么是数据埋点?
查看>>
git回滚
查看>>
vue2.0 引用qrcode.js实现获取改变二维码的样式
查看>>
Python 判断闰年,判断日期是当前年的第几天
查看>>
web.xml 中的listener、 filter、servlet 加载顺序
查看>>
MyBatis原理简介和小试牛刀
查看>>
js部分基础
查看>>
脏读,幻读,不可重复读解释和例子
查看>>
Tomcat指定(JDK路径)JAVA_HOME而不用环境变量
查看>>
Bluemix专属版本落地中国 开放物联网和认知计算能力
查看>>
汤姆大叔的6道javascript编程题题解
查看>>
【世界知名量子科学家加盟阿里】施尧耘出任阿里云量子技术首席科学家
查看>>
DataCore对外出售其虚拟化软件产品
查看>>
说说云计算与移动管理
查看>>
T-Mobile美国使用28GHz频段测试5G
查看>>