IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 实践常见的RPC框架:Thrift -> 正文阅读

[网络协议]实践常见的RPC框架:Thrift

实践常见的RPC框架:Thrift

一、Thrift介绍

维基百科上对Thrift的介绍如下:

Thrift是一种接口描述语言和二进制通讯协议,[1]它被用来定义和创建跨语言的服务。[2]它被当作一个远程过程调用(RPC)框架来使用,是由Facebook为“大规模跨语言服务开发”而开发的。它通过一个代码生成引擎联合了一个软件栈,来创建不同程度的、无缝的跨平台高效服务,可以使用C#C++(基于POSIX兼容系统[3])、Cappuccino、[4]CocoaDelphiErlangGoHaskellJavaNode.jsOCamlPerlPHPPythonRubySmalltalk。[5]虽然它以前是由Facebook开发的,但它现在是Apache软件基金会开源项目了。该实现被描述在2007年4月的一篇由Facebook发表的技术论文中,该论文现由Apache掌管。[6]

需要安装thrift编译器,将Thrift的接口定义文件编译成对应的技术栈的代码。

二、Thrift使用示例

参考:

2.1 安装Thrift编译器

macbook下:

brew install thrift

可以在IDEA中添加Thrift support插件。

2.2 编写Thrift的IDL文件

参考官方的IDL文件示例:https://git-wip-us.apache.org/repos/asf?p=thrift.git;a=blob_plain;f=test/ThriftTest.thrift;hb=HEAD

myrpc.thrift内容如下:

namespace java com.hef.demo.thrift.api

struct User {
  1: i32 id,
  2: string name
}

service UserService {
   User findUser(1 : i32 id)
}

struct Order {
  1: i32 id,
  2: string name,
  3: double amount
}

service OrderService {
   Order findOrder(1 : i32 id)
}

运行thrift命令编译上面的文件: thrift -r --gen java myrpc.thrift , 之后就产生了四个java文件:User、UserService、Order、OrderService。

2.3 通过Thrift实现RPC功能

action-rpcfx-demo项目中三个模块 : demo-thrift-apidemo-thrift-clientdemo-thrift-server

(1) demo-thrift-api

User、UserService、Order、OrderService 四个java文件都是通过Thirft命令生成的。

thrift -r --gen java myrpc.thrift

(2) demo-thrift-server 服务端代码

    public static void main(String[] args) {
        try {
            TServerSocket tServerSocket = new TServerSocket(ServerConfig.SERVER_PORT);

            // 只注册一个服务
//            UserService.Processor<UserService.Iface> processor = new UserService.Processor<>(new UserServiceImpl());
            // 注册多个服务
            TMultiplexedProcessor processor = new TMultiplexedProcessor();
            processor.registerProcessor("userService", new UserService.Processor<>(new UserServiceImpl()));
            processor.registerProcessor("orderService", new OrderService.Processor<>(new OrderServiceImpl()));

            TThreadPoolServer.Args tArgs = new TThreadPoolServer.Args(tServerSocket);
            tArgs.processor(processor);
            tArgs.protocolFactory(new TBinaryProtocol.Factory());
            tArgs.transportFactory(new TTransportFactory());

            TSimpleServer server = new TSimpleServer(tArgs);
            System.out.println("Running Simple server");
            server.serve();

        } catch (TTransportException e) {
            throw new RuntimeException(e);
        }
    }

(3) demo-thrift-client 客户端代码

    public static void main(String[] args) {
        TTransport transport = null;
        try {
            transport = new TSocket(new TConfiguration(), ServerConfig.SERVER_HOST,
                    ServerConfig.SERVER_PORT, ServerConfig.TIMEOUT);
            transport.open();

            TBinaryProtocol protocol = new TBinaryProtocol(transport);
            // 当注册了一个服务当时候,获取方法
            /*UserService.Client userService = new UserService.Client(protocol);
            User user = userService.findUser(2);
            System.out.println(user);*/

            // 当注册多个服务当时候,获取方法
            UserService.Client userService = new UserService.Client(new TMultiplexedProtocol(protocol, "userService"));
            User user = userService.findUser(2);
            System.out.println(user);

            OrderService.Client orderService = new OrderService.Client(new TMultiplexedProtocol(protocol, "orderService"));
            Order order = orderService.findOrder(3);
            System.out.println(order);


        } catch (TException e) {
            throw new RuntimeException(e);
        } finally {
            if (transport!=null) {
                transport.close();
            }
        }
    }
  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-02-19 01:33:50  更:2022-02-19 01:33:54 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 9:36:52-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码