jprotobuf-rpc-http 是应用jprotobuf类库实现基于http协议的RPC开发组件。
目前1.0提供可以直接把Google protobuf的IDL定义语言发布成RPC服务,客户端也可以直接应用IDL定义语言进行动态创建,帮助开发完全省去了手工编译protobuf IDL语言的麻烦。
应用过protobuf的同学有知道,使用protobuf需要先定义protobuf IDL 脚本,由protoc工具编译生成指定语言的代码。
jprotobuf-rpc-http 针对java开发同学来讲,完全可以不需要使用protoc工具编译,就可以直接把protobuf IDL 脚本发布成RPC的服务,相当简单易用。
jprotobuf-rpc-http 基于Spring3 JDK6基础上进行开发,下面演示的发布RPC服务的示例代码:
- 在Spring配置文件,定义IDLServiceExporter服务发布配置 (直接由IDL定义发布)
<bean class="com.baidu.jprotobuf.rpc.server.IDLServiceExporter">
<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>
<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接口
上面示例相关的代码如下:
public interface 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;
}
/**
* 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;
}
public class SimpleIDLInvoker implements ServerInvoker {
@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");
}
}
}
@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 文件定义:
package pkg;
option java_package = "com.baidu.bjf.remoting.protobuf.simplestring";
option java_outer_classname = "StringTypeClass";
message StringMessage {
required string list = 1;
}
option java_package = "com.baidu.bjf.remoting.protobuf.simplestring";
option java_outer_classname = "StringTypeClass";
message StringMessage {
required string list = 1;
}
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>
- 在Spring配置文件,定义IDLServiceExporter服务发布配置 (直接由IDL定义发布)
RPC客户端使用IDLProxyFactoryBean进行访问,示例代码如下:
@Test 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")); }
相关资料链接:
jprotobuf-rpc-http文档: https://github.com/jhunters/JProtobuf-rpc-http
jprotobuf文档:https://github.com/jhunters/jprotobuf
相关推荐
jprotobuf-rpc-http 是应用jprotobuf类库实现基于http协议的RPC开发组件。现可支持直接把Google protobuf的IDL定义语言发布成RPC服务,客户端也可以直接应用IDL定义语言进行动态创建,帮助开发完全省去了手工编译...
Jprotobuf-rpc-socket Build status Protobuf RPC是一种基于TCP协议的二进制高性能RPC通信协议实现。它以Protobuf作为基本的数据交换格式,支持完全基于POJO的发布方式,极大的简化了开发复杂性。 Features: 完全...
protobuf-rpc-pro是一个基于Java实现的Protocol Buffers(protobuf)的RPC框架,它支持双向通信功能,即客户端和服务器之间可以同时发起调用。RPC(Remote Procedure Call)是一种分布式计算技术,允许程序在不同的...
实现,适用于想要简单实现其 protobuf rpc 服务的人。 看: 下载/安装 Java 你可以在downloads/protobuf-socket-rpc-2.0.jar找到用Java 1.6编译的jar,或者你也可以下载源码直接使用。 您还需要在类路径中使用 ...
1. **高性能**:SOFA-RPC 使用高效的序列化协议,如protobuf或Hessian,减少网络传输的数据量,同时采用异步非阻塞IO模型,提升并发处理能力。 2. **高可扩展性**:该框架支持多种插件机制,例如服务注册与发现、...
protobuf-rpc是一个基于的远程方法调用(RPC))实现,服务器端当前仅支持Java(JDK 1.7及以上),客户端支持Objective-C(cocoa/iOS)和Java(J2SE/Android)。 Why protobuf-rpc? 对于纯的基于Windows或者Linux的服务器来...
RPC(Remote Procedure Call)框架是分布式系统中的一种通信机制,允许程序在不同的网络节点上进行相互通信,就像调用本地方法一样简单。本项目"guide-rpc-framework-master"是一个自研的RPC框架实现,旨在帮助...
**简单RPC:基于Netty的高效RPC框架** `Simple-RPC`是一个专为Java开发者设计的轻量级RPC(远程过程调用)框架,它利用了高性能的网络库`Netty`来实现实时、高效的远程通信。RPC框架在分布式系统中起到了关键作用,...
Java平台上的RPC框架有很多,如Hadoop的Hadoop RPC、Apache Thrift、Google的gRPC等,而“nfs-rpc”则是一个专门基于Java开发的高性能RPC框架。这个框架的设计目标是提供高效、稳定、易用的跨网络服务调用能力。 ...
2. **Java RPC实现**:nfs-rpc框架利用Java的反射和动态代理技术来实现RPC调用。反射允许在运行时检查类、接口和对象,动态代理则可以在运行时创建符合特定接口的新类,这在构建RPC服务调用时非常有用。 3. **服务...
二、Java中的RPC实现 Java中实现RPC框架的关键在于如何高效地处理远程调用。nfs-rpc框架可能采用了以下技术: 1. 异步非阻塞IO:使用NIO(New IO)或AIO(Asynchronous IO),提高并发性能。 2. 高效序列化库:如...
在IT行业中,Protocol Buffers(简称protobuf)是一种高效的数据序列化协议,由Google开发,用于结构化数据的编码和解码。PHP与protobuf的结合,允许开发者在PHP应用程序中使用protobuf进行数据交换,提高数据传输...
标题“spring-rpc-case”指的是一个关于Spring RPC的案例研究,RPC(Remote Procedure Call)是远程过程调用,一种在分布式系统中实现客户端与服务器端通信的技术。Spring框架提供了Spring RPC支持,允许开发者构建...
**cpp-rpc: 简单的C++ RPC库** RPC(Remote Procedure Call)是一种分布式计算技术,允许在不同的计算机之间调用函数或方法,就像它们在同一台机器上一样。cpp-rpc是一个针对C++开发的简单RPC库,旨在简化跨网络的...
赠送jar包:protobuf-java-3.16.1.jar; 赠送原API文档:protobuf-java-3.16.1-javadoc.jar; 赠送源代码:protobuf-java-3.16.1-sources.jar; 赠送Maven依赖信息文件:protobuf-java-3.16.1.pom; 包含翻译后的API...
服务器端与客户端通信,使用google protobuf作为交互数据的序列化工具,其中客户端使用select机制实现I/O复用,服务端使用epoll机制,提高并发连接时的处理效率。软件环境:linux。文件dealpack.cc是服务端和客户端...
gRPC是Google推出的基于HTTP/2协议和Protobuf的高性能RPC框架,支持多种语言;Thrift是Facebook开源的跨语言服务开发框架,也是基于IDL(接口定义语言)的。 接下来,我们将关注RPC的几个关键组件。服务提供者...
赠送jar包:protobuf-java-3.11.4.jar; 赠送原API文档:protobuf-java-3.11.4-javadoc.jar; 赠送源代码:protobuf-java-3.11.4-sources.jar; 赠送Maven依赖信息文件:protobuf-java-3.11.4.pom; 包含翻译后的API...
安装protobuf各个版本的编译代码,从protobuf-2.4.1到protobuf-3.0.0-Release之间的20个版本,在Mac上protobuf-2.6.1、protobuf-3.0.0-alpha-1、protobuf-3.0.0-beta-2、protobuf-3.0.0测试全部成功!解决了从GitHub...
学习这个简单的Java-RPC实现,你可以了解到RPC的基本原理,这对于理解和使用更复杂的RPC框架,如Dubbo、gRPC或Hessian等,是非常有帮助的。同时,它还能加深你对Java网络编程、多线程、并发控制以及对象序列化的理解...