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 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Apache Thrift 官网学习 一 基本概述与入门 -> 正文阅读

[Java知识库]Apache Thrift 官网学习 一 基本概述与入门

一 基本概述与入门

1.1 官网知识

  • Thrift是一个轻量级、跨语言的远程服务调用框架,最初由Facebook开发,后面进入Apache开源项目。它通过自身的IDL中间语言, 并借助代码生成引擎生成各种主流语言的RPC服务端/客户端模板代码。
  • Thrift支持多种不同的编程语言,包括C++、Java、Python、PHP、Ruby等,本系列主要讲述基于Java语言的Thrift的配置方式和具体使用。
  • 官网:https://thrift.apache.org/

1.2 下载安装

  • 下载地址:http://www.apache.org/dyn/closer.cgi?path=/thrift/0.15.0/thrift-0.15.0.exe
  • 配置环境变量到path路径中

在这里插入图片描述

  • 验证:thrift -version

在这里插入图片描述

  • idea中安装thrift插件,可以实现thrift语法自动提示

在这里插入图片描述

  • 由官网可知这是一门新的语言,当然有他的基本语法,下面我们来认识下

1.3 基本数据结构

  • 基本类型:
      bool: 布尔值;byte: 8位有符号整数; i16: 16位有符号整数
      i32: 32位有符号整数;i64: 64位有符号整数;double: 64位浮点数
      string: UTF-8编码的字符串;binary: 二进制串
  • 结构体类型:
      struct: 定义的结构体对象
  • 容器类型:
      list: 有序元素列表;set: 无序无重复元素集合;map: 有序的key/value集合
  • 异常类型:
      exception: 异常类型
  • 服务类型:
      service: 具体对应服务的类

1.4 基本案例入门

1.4.1 编写thrift文件

idea中编写一个Person.thrift文件

// 定义包名
namespace java com.shu.demo.thrift

/**
* 基本类型:
    bool: 布尔值
    byte: 8位有符号整数
    i16: 16位有符号整数
    i32: 32位有符号整数
    i64: 64位有符号整数
    double: 64位浮点数
    string: UTF-8编码的字符串
    binary: 二进制串
  结构体类型:
    struct: 定义的结构体对象
  容器类型:
    list: 有序元素列表
    set: 无序无重复元素集合
    map: 有序的key/value集合
  异常类型:
    exception: 异常类型
  服务类型:
    service: 具体对应服务的类
**/


// 定义别名:将thrift基本数据类型别名为Java数据类型,方便使用
typedef i16 short
typedef i32 int
typedef i64 long
typedef string String
typedef bool  Boolean
typedef double Double



// 定义一个struct:相当于Java中的类
struct person{
1:optional String id;
2:optional String userName;
3:optional String passWord;
4:optional Boolean isCheck;
}

// 定义一个异常
exception personexception{
1:optional int code;
2:optional String message;
}

// 定义一个服务集合
service personservice{

 // 通过用户名获取信息,并扔出异常
 person getPersonInfoByUserNmae(1:required String username) throws (1: personexception exce )

 // 通过用户名检查是否可用
 Boolean IsCheck(1:required String username)

}

// 生成命令:thrift -gen java Person.thrift
1.4.2 新建springBoot项目
 <dependency>
            <groupId>org.apache.thrift</groupId>
            <artifactId>libthrift</artifactId>
            <version>0.15.0</version>
        </dependency>
1.4.3 生成文件
# 格式
thrift -gen <language> <Thrift filename>
# 命令,进入该文件目录,cmd中执行
thrift -gen java Person.thrift
# 把生成的文件拷到SpringBoot项目中
1.4.4 文件解析
  • Iface:服务端通过实现HelloWorldService.Iface接口,向客户端的提供具体的同步业务逻辑。
  • AsyncIface:服务端通过实现HelloWorldService.Iface接口,向客户端的提供具体的异步业务逻辑。
  • Client:客户端通过HelloWorldService.Client的实例对象,以同步的方式访问服务端提供的服务方法。
  • AsyncClient:客户端通过HelloWorldService.AsyncClient的实例对象,以异步的方式访问服务端提供的服务方法。

在这里插入图片描述

1.4.5 定义实现类
package com.example.thrift;
import com.example.thrift.thrift.person;
import com.example.thrift.thrift.personexception;
import com.example.thrift.thrift.personservice;
import org.apache.thrift.TException;


/**
 * @Author shu
 * @Date: 2022/02/06/ 16:02
 * @Description 实现接口,自定义方法逻辑
 **/
public class PersonServiceImpl implements personservice.Iface{
    @Override
    public person getPersonInfoByUserNmae(String username) throws personexception, TException {
        System.out.println("客服端数据:"+username);
        person person=new person();
        person.setId("1");
        person.setUserName("admin");
        person.setPassWord("123456");
        person.setIsCheck(false);
        return person;
    }

    @Override
    public boolean IsCheck(String username) throws TException {
        System.out.println("客服端数据:"+username);
        return false;
    }
}

1.4.6 服务端
package com.example.thrift.server;
import com.example.thrift.PersonServiceImpl;
import com.example.thrift.thrift.personservice;
import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TNonblockingServerSocket;
import org.apache.thrift.transport.TTransportException;
import org.apache.thrift.transport.layered.TFastFramedTransport;

/**
 * @Author shu
 * @Date: 2022/02/06/ 16:08
 * @Description 服务端
 **/
public class ThriftServer {
    public static void main(String[] args) throws TTransportException {
        // 建立连接
        TNonblockingServerSocket serverSocket =new TNonblockingServerSocket(8803);
        // 建立高可用server
        THsHaServer.Args arg=new THsHaServer.Args(serverSocket).maxWorkerThreads(4).minWorkerThreads(2);
        // 处理器
        personservice.Processor<PersonServiceImpl> processor =new personservice.Processor<>(new PersonServiceImpl());
        // 设置协议处理器
        arg.protocolFactory(new TCompactProtocol.Factory());
        // 设置传输处理器
        arg.transportFactory(new TFastFramedTransport.Factory());
        // 处理器工厂
        arg.processorFactory(new TProcessorFactory(processor));
        // 开始执行
        TServer tServer = new THsHaServer(arg);
        System.out.println("Running Simple Server");
        tServer.serve();
    }
}
1.4.7 客服端
package com.example.thrift.client;

import com.example.thrift.thrift.person;
import com.example.thrift.thrift.personservice;
import org.apache.thrift.TException;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.protocol.TProtocol;
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TTransport;
import org.apache.thrift.transport.layered.TFramedTransport;


/**
 * @Author shu
 * @Date: 2022/02/06/ 16:08
 * @Description 客服端
 **/
public class ThriftClient {
    public static void main(String[] args) {
        TTransport transport =null;
        try {
            // 连接
            transport = new TFramedTransport(new TSocket("127.0.0.1",8803),600);
            // 协议,注意服务端保持一致
            TProtocol protocol = new TCompactProtocol(transport);
            // 调用方法
            personservice.Client client = new personservice.Client(protocol);
            // 打开连接
            transport.open();
            // 调用方法
            person result = client.getPersonInfoByUserNmae("Leo");
            System.out.println("Result =: " + result);
        } catch (TException e) {
            e.printStackTrace();
        } finally {
            if (null != transport) {
                transport.close();
            }
        }

    }
}
1.4.8 测试

在这里插入图片描述

在这里插入图片描述

到此一个简单的入门就完成了

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-02-07 13:35:18  更:2022-02-07 13:36:57 
 
开发: 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/24 11:56:55-

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