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

jprotobuf-rpc-http组件库1.0发布,可支持直接把Protobuf IDL定义发布成RPC服务应用

阅读更多

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定义发布)

<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接口

a2 在Spring配置文件,定义AnnotationServiceExporter服务发布配置 (通过Jprotobuf注解类发布)

 <bean class="com.baidu.jprotobuf.rpc.server.AnnotationServiceExporter">
        <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接口
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;


b web.xml文件配置服务发布servlet

    <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进行访问,示例代码如下:

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

    }


RPC客户端使用AnnotationProxyFactoryBean进行访问,示例代码如下:

    @Test
    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对象代码:

public class 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进行访问

    <bean id="simpleTestClientForIDLProxy" class="com.baidu.jprotobuf.rpc.client.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进行访问

    <bean id="simpleTestClientForAnnotationProxy" class="com.baidu.jprotobuf.rpc.client.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

package pkg;  

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

下面示例只演示了客户端的配置,服务发布的配置也是相同

    <bean id="simpleTestClientForIDLProxy" class="com.baidu.jprotobuf.rpc.client.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>

 

 

 

联系我们

email: rigel-opensource@baidu.com

分享到:
评论

相关推荐

    jprotobuf-rpc-http.zip

    现可支持直接把Google protobuf的IDL定义语言发布成RPC服务,客户端也可以直接应用IDL定义语言进行动态创建,帮助开发完全省去了手工编译protobuf IDL语言的麻烦。 环境要求:JDK 6 或以上版本 Spring 3.0 ...

    084-RPC实战与核心原理

    Thrift是Facebook开源的跨语言服务开发框架,也是基于IDL(接口定义语言)的。 接下来,我们将关注RPC的几个关键组件。服务提供者(ServiceProvider)是暴露服务的节点,它注册服务到服务注册中心;服务消费者...

    protobuf-3.3.0_X86库.rar

    在实际项目中,protobuf常用于实现RPC(远程过程调用)框架,例如gRPC,它基于HTTP/2和protobuf定义服务接口。开发者可以利用protobuf的强大功能简化服务之间的通信,并提高数据传输效率。 总的来说,protobuf-...

    protobuf-all-3.10.1.zip

    7. **服务定义**:protobuf不仅可以序列化数据,还可以定义RPC服务,使得远程调用像本地调用一样简单。 8. **扩展性**:protobuf允许自定义选项和扩展,以适应不同的业务需求。 9. **兼容性**:protobuf设计时考虑...

    protobuf-cpp-3.2.0.zip

    此外,Protobuf还支持服务定义,可以用来创建RPC(Remote Procedure Call)服务。在.proto文件中,你可以定义一个`service`,并使用`rpc`关键字声明服务方法: ```proto service PersonService { rpc GetPerson ...

    protobuf-cpp-3.12.3.tar.gz

    这个版本是 GRPC 交叉编译过程中必不可少的组件,GRPC 是一个开源的高性能、通用的 RPC 框架,基于 HTTP/2 和 Protobuf。 首先,我们需要了解 Protobuf 的基本概念。在 Protobuf 中,开发者通过定义 .proto 文件来...

    protobuf-all-3.5.1.zip

    8. 消息服务:protobuf还支持定义RPC(远程过程调用)服务,允许创建分布式服务接口。 通过protobuf-all-3.5.1.zip,开发者可以获得protobuf 3.5.1版本的完整工具集,从而在自己的项目中利用其强大的数据序列化能力...

    protobuf-3.13.0.zip

    8. **集成与应用**:在实际项目中,protobuf常用于服务之间的RPC(Remote Procedure Call)通信,如gRPC框架就基于protobuf。同时,protobuf还可以用于持久化存储、数据交换等场景。 9. **测试与调试**:压缩包可能...

    protobuf-csharp-3.13.0.zip

    1. **.proto文件**:这是protobuf的接口定义语言(IDL),用来定义消息结构。开发者可以定义各种数据类型的字段,如整型、浮点型、字符串、消息类型等,并指定它们的序号和可选/必需属性。例如: ```protobuf ...

    protobuf-3.3.0

    7. **服务定义与gRPC支持**:protobuf不仅支持数据序列化,还提供了定义远程过程调用(RPC)服务的方法。在.proto文件中,可以使用service关键字定义服务,配合gRPC框架,可以在不同的语言环境中实现高性能的RPC通信...

    protobuf 的源码 版本2.5.0

    - **服务定义**:protobuf还支持定义RPC服务,提供了服务端和客户端的接口。 7. **protobuf与其他格式比较** - **与XML/JSON比较**:protobuf的数据体积小,解析速度快,适合在网络传输和存储大量数据。 - **与 ...

    32-RPC协议综述:远在天边,近在眼前1

    RPC(Remote Procedure Call)协议是一种在分布式计算环境中实现程序间通信的技术,它的核心思想是让调用者(客户端)能够像调用本地函数一样去调用远程计算机上的服务(服务端)。RPC协议解决了本地调用与远程调用...

    protobuf-all-3.6.1

    protobuf的工作原理是定义一种数据结构——.proto文件,它类似于接口定义语言(IDL),用来描述数据模型。开发者可以使用protobuf编译器将.proto文件转换为目标语言(如C++、Java、Python等)的源代码,生成的类库...

    RPC调用框架比较分析

    - **protobuf-rpc-pro-demo-1.1.0及源码.zip** 包含了一个基于Protobuf实现的RPC框架的示例项目和源代码,版本为1.1.0,可以帮助开发者快速理解和应用Protobuf RPC。 Protobuf RPC的优势在于它具有高效的序列化...

    protobuf-c

    protobuf-c 提供了 C 语言的编译器和库,使得开发者能够在 C 语言环境中使用 protobuf 定义的接口,进行序列化和反序列化操作。 在 C 语言环境中,protobuf-c 有以下几个关键知识点: 1. **protobuf 编译器**:...

    Protobuf工具 Google官方协议转换工具

    `.proto`文件是Protobuf的接口定义语言(IDL),类似于XML或IDL文件用于描述远程过程调用(RPC)服务,`.proto`文件定义了数据结构和消息类型。例如: ```proto syntax = "proto3"; message Person { string name...

    手写rpc rpc简单源码 rpc源码学习 rpc过程了解 rpc通信原理

    1. **接口定义**:定义客户端和服务端共享的接口,这通常是通过idl(Interface Definition Language)完成。 2. **序列化/反序列化实现**:选择或实现合适的序列化库,如protobuf、json等,处理对象与字节流的转换...

    RPC 通信 通过 名称获取RPC服务端

    例如,在RPC框架如gRPC中,接口定义语言(IDL)如protobuf用于描述服务和消息类型。 3. **协议栈**:RPC实现通常涉及多个层次,包括网络传输层(如TCP或UDP)、序列化/反序列化层(如JSON、protobuf或XML)以及错误...

    RPC 实例,RPC实例

    1. **接口定义**:RPC框架通常需要一个接口定义语言(IDL),用于描述服务提供的功能。例如,protobuf、gRPC中的.proto文件,或者XML-RPC的XML结构。接口定义包括服务名、方法名、参数类型和返回类型。 2. **序列化...

    rpc-xiuyuan.rar

    - 服务接口定义,如IDL(接口定义语言)文件,如protobuf或Thrift。 - 序列化库,如Jackson、Gson或protobuf库。 - RPC框架的使用,如gRPC、Dubbo、Thrift或RabbitMQ等。 - 配置文件,包含服务器地址、端口、超时...

Global site tag (gtag.js) - Google Analytics