zoukankan      html  css  js  c++  java
  • Thrift对多接口服务的支持

                                Thrift对多接口服务的支持

    Thrift在0.9.1版本之前,一直只提交了对单一接口服务的支持,即一个RPC服务器(对应一个端口)支持一个服务接口的实现。

    但是很多时候,我们的服务不能实现在一个接口里,一是接口里的方法越来越多,不好管理和使用;二是根据职责的单一要求,不能类型的方法,不能放在同一接口里。

    在 Thrift-0.9.1之前,我们要解决上面的问题,一是通过多个RPC服务器来实现,这个方法必然导致了我们RPC服务器越来越多,管理上麻烦;二是通过其他的一些途径,如使用netty作为RPC服务器等,这个方法实现上相对麻烦一些,需要去了解netty的知识。

    这些方法在这里就不再详述了。

    从Thrift-0.9.1开始,thrift开始提供对多接口服务的支持,使得我们开发多接口RPC服务相对简单多了。

    这里还是给出例子来说明。

    首先,我们做了两个接口定义文件来定义两个接口:

    namespace javacom.eli.test.service

    struct Topic

    {

        1: i32 uid,

        2: string name,

        3: string content

    }

    service TopicService

    {

        void store(1: Topic topic),

        Topic retrieve(1: i32 uid)

    }

    namespace javacom.eli.test.service

    struct User

    {

        1: i32 uid,

        2: string name,

        3: string blurb

    }

    service UserService

    {

        void store1(1: User user),

        User retrieve1(1: i32 uid)

    }

    然后使用Thrift-0.9.1.exe生成相应的JavaBean及接口:

    然后,我们写两个接口的实现类:

    import org.apache.thrift.TException;

    import com.eli.test.service.Topic;

    import com.eli.test.service.TopicService;

    public class TopicImpl implements TopicService.Iface{

    public void store(Topic topic)throws TException

    {

            System.out.println("theinput topic: ");

            System.out.println("id:"+topic.getUid());

            System.out.println("name:"+topic.getName());

            System.out.println("content:"+topic.getContent());

    }

    public Topic retrieve(int uid)throws TException

    {

            System.out.println("theinput uid: "+uid);

            return newTopic(uid,"test","test");

    }

    }

    import org.apache.thrift.TException;

    import com.eli.test.service.User;

    import com.eli.test.service.UserService;

    public class UserImpl implements UserService.Iface{

    public void store1(User user)throws TException

    {

            System.out.println("theinput user: ");

            System.out.println("uid:"+user.getUid());

            System.out.println("name:"+user.getName());

            System.out.println("blur:"+user.getBlurb());

    }

    public User retrieve1(int uid)throws TException

    {

            System.out.println("theinput uid: "+uid);

            return newUser(uid,"tom","123");

    }

    }

    上述工作完成以后,就可以写服务器代码了。

    服务器代码与单一接口的服务器代码最大的不同是使用了“TMultiplexedProcessor”类,通过该类,可以注册多个接口的服务实现类:

    TMultiplexedProcessor processor = new TMultiplexedProcessor();

                 

           processor.registerProcessor("TopicService", newTopicService.Processor<TopicService.Iface>(new TopicImpl()));

        processor.registerProcessor("UserService", new UserService.Processor<UserService.Iface>(new UserImpl()));

    其他代码就跟以前的服务器代码一样了。

    完整的服务器代码如下:

    TMultiplexedProcessor processor = newTMultiplexedProcessor();

              

               TServerTransport t = new TServerSocket(9090);

               TServer server = new TThreadPoolServer(newTThreadPoolServer.Args(t).processor(processor));

              

               processor.registerProcessor("TopicService", newTopicService.Processor<TopicService.Iface>(new TopicImpl()));

               processor.registerProcessor("UserService", newUserService.Processor<UserService.Iface>(new UserImpl()));

              

    //         TSimpleServer server = new TSimpleServer(new Args(t).processor(processor));

     

               System.out.println("the serveris started and is listening at 9090...");

              

            server.serve();

    最后是客户端代码了,客户端代码的不同之处是引入了“TMultiplexedProtocol”类,它来帮助客户端区别调用哪个接口:

    TMultiplexedProtocol mp1 = new TMultiplexedProtocol(protocol,"TopicService");

                               

        TopicService.Clientservice1 = new TopicService.Client(mp1);

    完整的客户端测试代码如下:

                  TSocket transport = new TSocket("localhost",9090);

                 

                  TBinaryProtocol protocol = new TBinaryProtocol(transport);

                 

                  TMultiplexedProtocolmp1 = new TMultiplexedProtocol(protocol,"TopicService");

                 

                  TopicService.Client service1 = newTopicService.Client(mp1);

                 

                  TMultiplexedProtocolmp2 = new TMultiplexedProtocol(protocol,"UserService");

                 

                  UserService.Client service2 = newUserService.Client(mp2);

                 

                  transport.open();

                 

                  service1.store(new Topic(668,"test topic","just a test!"));

                 

                  service2.store1(new User(888,"tom","haha"));

                 

                  System.out.println(service1.retrieve(168));

                  System.out.println(service2.retrieve1(999));

                 

               transport.close();

    运行服务器代码和客户端代码,则客户端会打印如下结果:

    Topic(uid:168, name:test, content:test)

    User(uid:999, name:tom, blurb:123)

    服务器端会打印如下的信息:

    the server is started and is listening at 9090...

    the input topic:

    id: 668

    name: test topic

    content: just a test!

    the input user:

    uid: 888

    name: tom

    blur: haha

    the input uid: 168

    the input uid: 999

    通过上面的例子,可以看到,Thrift-0.9.1版本很简单的解决了多接口服务的问题,随便说一下,该版本并没有解决所有语言的多接口实现问题,只是解决了Java和其他几个语言。请大家在使用的时候,查清楚您使用的语言是否解决了这个问题。

  • 相关阅读:
    定时器中断彩灯控制程序
    单片机C51 8位流水灯
    十进制转换2-9进制转换
    加减乘除+菜单实现
    文件 I/O缓冲流
    文件 I/O字符流
    spring配置c3p0连接池
    javax.swing.Timer的与Lambda的使用
    代码简化之道--接口之从传统实现到Lambda表达式实现
    Java核心技术第六章--内部类
  • 原文地址:https://www.cnblogs.com/pangblog/p/3323060.html
Copyright © 2011-2022 走看看