`
Rigel团队
  • 浏览: 10951 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jprotobuf-rpc-http 超简单的Google Protobuf RPC应用实现

阅读更多

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>

 

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;
}

 

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");
        }
    }

}

 

simplestring.proto 文件定义:

package pkg;  

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

 

分享到:
评论
1 楼 penkee 2018-09-19  
我有疑问,看dubbo的设计,是无侵入式的。意思就是原来类接口参数不改动。你只搞一个StringMessage ,那么实际不同的VO是如何转成成对应的Msg的。比如 UserInfoVo getUser(int id);AddressVo getAddressByCity(CityVo city);代理方法拦截所有,怎么将不同类型VO转成StringMessage 呢,然后有怎么转出返回客户端呢

相关推荐

    jprotobuf-rpc-http.zip

    jprotobuf-rpc-http 是应用jprotobuf类库实现基于http协议的RPC开发组件。现可支持直接把Google protobuf的IDL定义语言发布成RPC服务,客户端也可以直接应用IDL定义语言进行动态创建,帮助开发完全省去了手工编译...

    Jprotobuf-rpc-socket:Protobuf RPC是一种基于TCP协议的二进制RPC通信协议的Java实现

    Jprotobuf-rpc-socket Build status Protobuf RPC是一种基于TCP协议的二进制高性能RPC通信协议实现。它以Protobuf作为基本的数据交换格式,支持完全基于POJO的发布方式,极大的简化了开发复杂性。 Features: 完全...

    protobuf-rpc-pro

    protobuf-rpc-pro是一个基于Java实现的Protocol Buffers(protobuf)的RPC框架,它支持双向通信功能,即客户端和服务器之间可以同时发起调用。RPC(Remote Procedure Call)是一种分布式计算技术,允许程序在不同的...

    javasocketserver源码-protobuf-socket-rpc:使用tcp/ip套接字的Java和Pythonprotobufr

    实现,适用于想要简单实现其 protobuf rpc 服务的人。 看: 下载/安装 Java 你可以在downloads/protobuf-socket-rpc-2.0.jar找到用Java 1.6编译的jar,或者你也可以下载源码直接使用。 您还需要在类路径中使用 ...

    sofa-rpc,sofarpc是一个高性能、高扩展性、生产级的java rpc框架。.zip

    1. **高性能**:SOFA-RPC 使用高效的序列化协议,如protobuf或Hessian,减少网络传输的数据量,同时采用异步非阻塞IO模型,提升并发处理能力。 2. **高可扩展性**:该框架支持多种插件机制,例如服务注册与发现、...

    protobuf-rpc:protobuf-rpc 是一个基于 Google ProtocolBuffer 的 RPC 框架。 目前 protobuf-rpc 支持 Cocoa Objective-C 和 Java 的服务和消息定义和代码生成

    protobuf-rpc是一个基于的远程方法调用(RPC))实现,服务器端当前仅支持Java(JDK 1.7及以上),客户端支持Objective-C(cocoa/iOS)和Java(J2SE/Android)。 Why protobuf-rpc? 对于纯的基于Windows或者Linux的服务器来...

    guide-rpc-framework-master.zip

    RPC(Remote Procedure Call)框架是分布式系统中的一种通信机制,允许程序在不同的网络节点上进行相互通信,就像调用本地方法一样简单。本项目"guide-rpc-framework-master"是一个自研的RPC框架实现,旨在帮助...

    simple-rpc是一款基于netty的RPC框架

    **简单RPC:基于Netty的高效RPC框架** `Simple-RPC`是一个专为Java开发者设计的轻量级RPC(远程过程调用)框架,它利用了高性能的网络库`Netty`来实现实时、高效的远程通信。RPC框架在分布式系统中起到了关键作用,...

    基于Java的高性能RPC框架 nfs-rpc.zip

    Java平台上的RPC框架有很多,如Hadoop的Hadoop RPC、Apache Thrift、Google的gRPC等,而“nfs-rpc”则是一个专门基于Java开发的高性能RPC框架。这个框架的设计目标是提供高效、稳定、易用的跨网络服务调用能力。 ...

    基于Java的实例源码-高性能RPC框架 nfs-rpc.zip

    2. **Java RPC实现**:nfs-rpc框架利用Java的反射和动态代理技术来实现RPC调用。反射允许在运行时检查类、接口和对象,动态代理则可以在运行时创建符合特定接口的新类,这在构建RPC服务调用时非常有用。 3. **服务...

    基于java的高性能RPC框架 nfs-rpc.zip

    二、Java中的RPC实现 Java中实现RPC框架的关键在于如何高效地处理远程调用。nfs-rpc框架可能采用了以下技术: 1. 异步非阻塞IO:使用NIO(New IO)或AIO(Asynchronous IO),提高并发性能。 2. 高效序列化库:如...

    PHP调用protobuf的rpc接口示例和说明

    在IT行业中,Protocol Buffers(简称protobuf)是一种高效的数据序列化协议,由Google开发,用于结构化数据的编码和解码。PHP与protobuf的结合,允许开发者在PHP应用程序中使用protobuf进行数据交换,提高数据传输...

    spring-rpc-case

    标题“spring-rpc-case”指的是一个关于Spring RPC的案例研究,RPC(Remote Procedure Call)是远程过程调用,一种在分布式系统中实现客户端与服务器端通信的技术。Spring框架提供了Spring RPC支持,允许开发者构建...

    cpp-rpc:简单的 C++ rpc 库

    **cpp-rpc: 简单的C++ RPC库** RPC(Remote Procedure Call)是一种分布式计算技术,允许在不同的计算机之间调用函数或方法,就像它们在同一台机器上一样。cpp-rpc是一个针对C++开发的简单RPC库,旨在简化跨网络的...

    protobuf-java-3.16.1-API文档-中文版.zip

    赠送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的应用

    服务器端与客户端通信,使用google protobuf作为交互数据的序列化工具,其中客户端使用select机制实现I/O复用,服务端使用epoll机制,提高并发连接时的处理效率。软件环境:linux。文件dealpack.cc是服务端和客户端...

    084-RPC实战与核心原理

    gRPC是Google推出的基于HTTP/2协议和Protobuf的高性能RPC框架,支持多种语言;Thrift是Facebook开源的跨语言服务开发框架,也是基于IDL(接口定义语言)的。 接下来,我们将关注RPC的几个关键组件。服务提供者...

    protobuf-java-3.11.4-API文档-中文版.zip

    赠送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-3.0.0-beta-2-cpp

    安装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远程过程调用

    学习这个简单的Java-RPC实现,你可以了解到RPC的基本原理,这对于理解和使用更复杂的RPC框架,如Dubbo、gRPC或Hessian等,是非常有帮助的。同时,它还能加深你对Java网络编程、多线程、并发控制以及对象序列化的理解...

Global site tag (gtag.js) - Google Analytics