zoukankan      html  css  js  c++  java
  • thrift简介

    简介

    thrift是由facebook开发的一个跨平台,跨语言RPC框架。于2007年贡献给apache基金会。在HBase中提供了跨平台的服务调用。本文以一个简单的例子来看下thrift在java中的使用,使用的是thrift-0.10.0。

    案例

    首先需要下载thrift的编译器
    写一个thrift的服务定义文件,Calculator.thrift:

    service Calculator{
       i32 add(1:i32 num1, 2:i32 num2),
    }
    

    上面只是一个Calculator服务包含add一个方法。
    使用前面下载的thrift编译器进行编译

    thrift-0.10.0.exe --gen java Calculator.thrift
    

    之后就会生成一个java源码文件,将其放入项目,并添加Thrift需要的java依赖

        compile group: 'org.apache.thrift', name: 'libthrift', version: '0.10.0'
    

    接下来需要定义对应的服务器,客户端和服务实现

    //服务器
    public class JavaServer {
        public static CalculatorHandler handler;
        public static Calculator.Processor processor;
    	
        public static void main(String [] args) {
            try {
                handler = new CalculatorHandler();
                processor = new Calculator.Processor(handler);
    
                Runnable simple = new Runnable() {
                    public void run() {
                        simple(processor);
                    }
                };
    			new Thread(simple).start();
    			
                /* 安全连接
                Runnable secure = new Runnable() {
                    public void run() {
                        secure(processor);
                    }
                };
    			new Thread(secure).start();
    			*/
    
            } catch (Exception x) {
                x.printStackTrace();
            }
        }
    
        public static void simple(Calculator.Processor processor) {
            try {
                TServerTransport serverTransport = new TServerSocket(9090);
                TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
    
                // 需要多线程时使用下一行代码
                // TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));
    
                System.out.println("Starting the simple server...");
                server.serve();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        public static void secure(Calculator.Processor processor) {
            try {
                TSSLTransportParameters params = new TSSLTransportParameters();
                params.setKeyStore("../../lib/java/test/.keystore", "thrift", null, null);
    
                TServerTransport serverTransport = TSSLTransportFactory.getServerSocket(9091, 0, null, params);
                TServer server = new TSimpleServer(new Args(serverTransport).processor(processor));
    
                // 需要多线程时使用下一行代码
                // TServer server = new TThreadPoolServer(new TThreadPoolServer.Args(serverTransport).processor(processor));
    
                System.out.println("Starting the secure server...");
                server.serve();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    //客户端
    public class JavaClient {
        public static void main(String [] args) {
    
    
            try {
                TTransport transport;
                transport = new TSocket("localhost", 9090);
                transport.open();
                /* ssl transport
                    TSSLTransportParameters params = new TSSLTransportParameters();
                    params.setTrustStore("../../lib/java/test/.truststore", "thrift", "SunX509", "JKS");
                    transport = TSSLTransportFactory.getClientSocket("localhost", 9091, 0, params);
                */
    
                TProtocol protocol = new  TBinaryProtocol(transport);
                Calculator.Client client = new Calculator.Client(protocol);
    
                perform(client);
    
                transport.close();
            } catch (TException x) {
                x.printStackTrace();
            }
        }
    
        private static void perform(Calculator.Client client) throws TException
        {
    		//调用add方法
            int sum = client.add(1,1);
            System.out.println("1+1=" + sum);
        }
    }
    
    //服务实现
    public class CalculatorHandler implements Calculator.Iface {
        public int add(int n1, int n2) {
            System.out.println("add(" + n1 + "," + n2 + ")");
            return n1 + n2;
        }
    }
    

    运行服务端,服务端就会运行,之后运行客户端,然后就可以看到输出结果。

  • 相关阅读:
    转载:从51CTO转来的两篇关于SQL的文章
    转载:几万年前,有一只猴子大闹地府后删库跑路...
    【java/oralce/sql】往一张仅有id,名称,创建时间三个字段的表中插入百万数据需要多久?1分26秒
    处处留心皆学问
    [oracle/java/sql]用于上十万批量数据插入Oracle表的Java程序
    Linux学习_003_虚拟机CentOS 7.5 如何固定IP地址
    Linux学习_002_VMware12.0 Pro 中安装 CentOS-7.5(桌面版)
    Linux学习_001_VMware10.0 && VMware12.0 Pro && VMware14.0 Pro && VMware 15.0 Pro 的安装与破解
    day76_淘淘商城项目_09_商品详情页动态展示实现(jsp+redis) + FreeMarker模板引擎入门 + 商品详情页静态化实现(Win版本的nginx作http服务器)_匠心笔记
    Eclipse注释模板设置详解
  • 原文地址:https://www.cnblogs.com/resentment/p/6978258.html
Copyright © 2011-2022 走看看