jprotobuf-rpc-http 是应用jprotobuf类库实现基于http协议的RPC开发组件。 目前1.0提供可以直接把Google protobuf的IDL定义语言发布成RPC服务,客户端也可以直接应用IDL定义语言进行动态创建,帮助开发完全省去了手工编译protobuf IDL语言的麻烦。
jprotobuf-rpc-http文档: https://github.com/jhunters/JProtobuf-rpc-http
jprotobuf文档:https://github.com/jhunters/jprotobuf
环境要求
JDK 6 或以上版本 Spring 3.0+
API使用说明
RPC服务的发布
a1 在Spring配置文件,定义IDLServiceExporter服务发布配置 (直接由IDL定义发布)
<property name="serviceName" value="SimpleIDLTest"></property>
<property name="invoker" ref="simpleIDLInvoker"></property>
<property name="inputIDL" value="classpath:/simplestring.proto"></property>
<property name="outputIDL" value="classpath:/simplestring.proto"></property>
</bean>
<bean id="simpleIDLInvoker" class="com.baidu.bjf.SimpleIDLInvoker"></bean>
inputIDL 属性表示接收的protobuf协议定义 outputIDL 属性表示返回的protobuf协议定义 serviceName 服务名称,必须填写。 在服务的servlet发布后,服务名称会以path路径方式查找 invoker 服务回调实现,必须实现 com.baidu.jprotobuf.rpc.server.ServerInvoker接口
a2 在Spring配置文件,定义AnnotationServiceExporter服务发布配置 (通过Jprotobuf注解类发布)
<property name="serviceName" value="SimpleIDLTest2"></property>
<property name="invoker" ref="simpleIDLInvoker"></property>
<property name="inputClass" value="com.baidu.bjf.StringMessagePOJO"></property>
<property name="outputClass" value="com.baidu.bjf.StringMessagePOJO"></property>
</bean>
<bean id="simpleIDLInvoker" class="com.baidu.bjf.SimpleIDLInvoker"></bean>
inputClass 属性表示接收的JProtobuf注解POJO类 outputClass 属性表示返回的JProtobuf注解POJO类 serviceName 服务名称,必须填写。 在服务的servlet发布后,服务名称会以path路径方式查找 invoker 服务回调实现,必须实现 com.baidu.jprotobuf.rpc.server.ServerInvoker接口
/**
* RPC service call back method.
*
* @param input request IDL proxy object by protobuf deserialized
* @param output return back IDL proxy object to serialized
* @throws Exception in case of any exception
*/
void invoke(IDLProxyObject input, IDLProxyObject output) throws Exception;
}
@Override
public void invoke(IDLProxyObject input, IDLProxyObject output) throws Exception {
if (input != null) {
System.out.println(input.get("list"));
}
if (output != null) {
output.put("list", "hello world");
}
}
}
simplestring.proto 文件定义:
option java_package = "com.baidu.bjf.remoting.protobuf.simplestring";
option java_outer_classname = "StringTypeClass";
message StringMessage {
required string list = 1;
}
b web.xml文件配置服务发布servlet
<servlet-name>protobufExporter</servlet-name>
<servlet-class>com.baidu.jprotobuf.rpc.server.HttpRequestHandlerServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>protobufExporter</servlet-name>
<url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
RPC客户端的API开发
RPC客户端使用IDLProxyFactoryBean进行访问,示例代码如下:
public void testProxyFactoryBean() throws Exception {
String idl = "package pkg; " +
"option java_package = \"com.baidu.bjf.remoting.protobuf.simplestring\";" +
"option java_outer_classname = \"StringTypeClass\";" +
"message StringMessage { required string list = 1;} ";
ByteArrayResource resource = new ByteArrayResource(idl.getBytes());
IDLProxyFactoryBean proxyFactoryBean = new IDLProxyFactoryBean();
proxyFactoryBean.setServiceUrl("http://localhost:8080/myfirstproject/remoting/SimpleIDLTest");
proxyFactoryBean.setInputIDL(resource);
proxyFactoryBean.setOutputIDL(resource);
proxyFactoryBean.afterPropertiesSet();
ClientInvoker invoker = proxyFactoryBean.getObject();
//set request param
IDLProxyObject input = invoker.getInput();
input.put("list", "how are you!");
IDLProxyObject output = invoker.invoke(input);
System.out.println(output.get("list"));
}
RPC客户端使用AnnotationProxyFactoryBean进行访问,示例代码如下:
public void testClientProxy() throws Exception {
AnnotationProxyFactoryBean<StringMessagePOJO, StringMessagePOJO> factoryBean;
factoryBean = new AnnotationProxyFactoryBean<StringMessagePOJO, StringMessagePOJO>();
factoryBean.setServiceUrl("http://localhost:8080/myfirstproject/remoting/SimpleIDLTest");
factoryBean.setInputClass(StringMessagePOJO.class);
factoryBean.setOutputClass(StringMessagePOJO.class);
factoryBean.afterPropertiesSet();
ClientInvoker<StringMessagePOJO, StringMessagePOJO> invoker = factoryBean.getObject();
StringMessagePOJO input = invoker.getInput();
if (input != null) {
input.setList("how are you!");
}
StringMessagePOJO output = invoker.invoke(input);
if (output != null) {
System.out.println(output.getList());
}
}
StringMessagePOJO对象代码:
@Protobuf(fieldType = FieldType.STRING, order = 1, required = true)
private String list;
/**
* get the list
* @return the list
*/
public String getList() {
return list;
}
/**
* set list value to list
* @param list the list to set
*/
public void setList(String list) {
this.list = list;
}
}
RPC客户端Spring配置
RPC客户端使用IDLProxyFactoryBean进行访问
<property name="inputIDL" value="classpath:/simplestring.proto"></property>
<property name="outputIDL" value="classpath:/simplestring.proto"></property>
<property name="inputIDLObjectName" value="StringMessage"></property>
<property name="serviceUrl" value="http://localhost:8080/myfirstproject/remoting/SimpleIDLTest"></property>
</bean>
RPC客户端使用AnnotationProxyFactoryBean进行访问
<property name="inputClass" value="com.baidu.bjf.remoting.protobuf.FieldType.StringMessagePOJO"></property>
<property name="outputClass" value="com.baidu.bjf.remoting.protobuf.FieldType.StringMessagePOJO"></property>
<property name="serviceUrl" value="http://localhost:8080/myfirstproject/remoting/SimpleIDLTest"></property>
</bean>
多个IDL message定义解决方案
例如下面定义了多个message定义时,则在服务发布以及客户连接时,需要指定objectName
option java_package = "com.baidu.bjf.remoting.protobuf.simplestring";
option java_outer_classname = "StringTypeClass";
message StringMessage {
required string list = 1;
optional StringMessage2 msg = 2;
}
message StringMessage2 {
required string name = 1;
}
下面示例只演示了客户端的配置,服务发布的配置也是相同
<property name="inputIDL" value="classpath:/simplestring.proto"></property>
<property name="outputIDL" value="classpath:/simplestring.proto"></property>
<property name="inputIDLObjectName" value="StringMessage"></property>
<property name="serviceUrl" value="http://localhost:8080/myfirstproject/remoting/SimpleIDLTest"></property>
</bean>
联系我们
email: rigel-opensource@baidu.com
相关推荐
现可支持直接把Google protobuf的IDL定义语言发布成RPC服务,客户端也可以直接应用IDL定义语言进行动态创建,帮助开发完全省去了手工编译protobuf IDL语言的麻烦。 环境要求:JDK 6 或以上版本 Spring 3.0 ...
Thrift是Facebook开源的跨语言服务开发框架,也是基于IDL(接口定义语言)的。 接下来,我们将关注RPC的几个关键组件。服务提供者(ServiceProvider)是暴露服务的节点,它注册服务到服务注册中心;服务消费者...
在实际项目中,protobuf常用于实现RPC(远程过程调用)框架,例如gRPC,它基于HTTP/2和protobuf定义服务接口。开发者可以利用protobuf的强大功能简化服务之间的通信,并提高数据传输效率。 总的来说,protobuf-...
- **服务定义**:protobuf还支持定义RPC服务,提供了服务端和客户端的接口。 7. **protobuf与其他格式比较** - **与XML/JSON比较**:protobuf的数据体积小,解析速度快,适合在网络传输和存储大量数据。 - **与 ...
8. **集成与应用**:在实际项目中,protobuf常用于服务之间的RPC(Remote Procedure Call)通信,如gRPC框架就基于protobuf。同时,protobuf还可以用于持久化存储、数据交换等场景。 9. **测试与调试**:压缩包可能...
7. **服务定义**:protobuf不仅可以序列化数据,还可以定义RPC服务,使得远程调用像本地调用一样简单。 8. **扩展性**:protobuf允许自定义选项和扩展,以适应不同的业务需求。 9. **兼容性**:protobuf设计时考虑...
此外,Protobuf还支持服务定义,可以用来创建RPC(Remote Procedure Call)服务。在.proto文件中,你可以定义一个`service`,并使用`rpc`关键字声明服务方法: ```proto service PersonService { rpc GetPerson ...
这个版本是 GRPC 交叉编译过程中必不可少的组件,GRPC 是一个开源的高性能、通用的 RPC 框架,基于 HTTP/2 和 Protobuf。 首先,我们需要了解 Protobuf 的基本概念。在 Protobuf 中,开发者通过定义 .proto 文件来...
8. 消息服务:protobuf还支持定义RPC(远程过程调用)服务,允许创建分布式服务接口。 通过protobuf-all-3.5.1.zip,开发者可以获得protobuf 3.5.1版本的完整工具集,从而在自己的项目中利用其强大的数据序列化能力...
1. **.proto文件**:这是protobuf的接口定义语言(IDL),用来定义消息结构。开发者可以定义各种数据类型的字段,如整型、浮点型、字符串、消息类型等,并指定它们的序号和可选/必需属性。例如: ```protobuf ...
7. **服务定义与gRPC支持**:protobuf不仅支持数据序列化,还提供了定义远程过程调用(RPC)服务的方法。在.proto文件中,可以使用service关键字定义服务,配合gRPC框架,可以在不同的语言环境中实现高性能的RPC通信...
RPC(Remote Procedure Call)协议是一种在分布式计算环境中实现程序间通信的技术,它的核心思想是让调用者(客户端)能够像调用本地函数一样去调用远程计算机上的服务(服务端)。RPC协议解决了本地调用与远程调用...
protobuf的工作原理是定义一种数据结构——.proto文件,它类似于接口定义语言(IDL),用来描述数据模型。开发者可以使用protobuf编译器将.proto文件转换为目标语言(如C++、Java、Python等)的源代码,生成的类库...
- **protobuf-rpc-pro-demo-1.1.0及源码.zip** 包含了一个基于Protobuf实现的RPC框架的示例项目和源代码,版本为1.1.0,可以帮助开发者快速理解和应用Protobuf RPC。 Protobuf RPC的优势在于它具有高效的序列化...
protobuf-c 提供了 C 语言的编译器和库,使得开发者能够在 C 语言环境中使用 protobuf 定义的接口,进行序列化和反序列化操作。 在 C 语言环境中,protobuf-c 有以下几个关键知识点: 1. **protobuf 编译器**:...
1. **接口定义**:定义客户端和服务端共享的接口,这通常是通过idl(Interface Definition Language)完成。 2. **序列化/反序列化实现**:选择或实现合适的序列化库,如protobuf、json等,处理对象与字节流的转换...
`.proto`文件是Protobuf的接口定义语言(IDL),类似于XML或IDL文件用于描述远程过程调用(RPC)服务,`.proto`文件定义了数据结构和消息类型。例如: ```proto syntax = "proto3"; message Person { string name...
例如,在RPC框架如gRPC中,接口定义语言(IDL)如protobuf用于描述服务和消息类型。 3. **协议栈**:RPC实现通常涉及多个层次,包括网络传输层(如TCP或UDP)、序列化/反序列化层(如JSON、protobuf或XML)以及错误...
1. **接口定义**:RPC框架通常需要一个接口定义语言(IDL),用于描述服务提供的功能。例如,protobuf、gRPC中的.proto文件,或者XML-RPC的XML结构。接口定义包括服务名、方法名、参数类型和返回类型。 2. **序列化...
- 服务接口定义,如IDL(接口定义语言)文件,如protobuf或Thrift。 - 序列化库,如Jackson、Gson或protobuf库。 - RPC框架的使用,如gRPC、Dubbo、Thrift或RabbitMQ等。 - 配置文件,包含服务器地址、端口、超时...