怎么做符合seo的网站,什么是门户网站有哪些,好的网站推荐一个,不用框架做网站#x1f4cb; 个人简介
#x1f496; 作者简介#xff1a;大家好#xff0c;我是阿牛#xff0c;全栈领域优质创作者。#x1f61c;#x1f4dd; 个人主页#xff1a;馆主阿牛#x1f525;#x1f389; 支持我#xff1a;点赞#x1f44d;收藏⭐️留言#x1f4d… 个人简介 作者简介大家好我是阿牛全栈领域优质创作者。 个人主页馆主阿牛 支持我点赞收藏⭐️留言格言迄今所有人生都大写着失败但不妨碍我继续向前 目录 个人简介 前言Thrift简介IDL介绍IDL语法学习1.基本类型2.struct结构体3.container容器4.service服务5.枚举(enum)6.异常(exception)7.命名空间 Thrift 编译器安装入门案例业务逻辑服务端客户端pom.xml运行 结语 前言
随着近些年微服务的盛行使得服务逐渐模块化功能化单个服务仅仅实现某个特定的功能或者模块因此服务间的调用变得常见且频繁所以高性能且快速响应的服务调用成了必须去面对的问题传统的http请求能面对跨语言的问题但是性能远远无法达到高并发的要求因此更偏向底层的RPC框架越来越受到青睐像阿里的Dubbo谷歌的gRPCfacebook的Thrift等等本节将学习Thrift这个跨语言的Thrift RPC框架
Thrift简介
Thrift是一个跨语言的服务部署框架最初由Facebook于2007年开发2008年进入Apache开源项目主要用于各个服务之间的RPC通信支持跨语言常用的语言比如C, Java, Python, PHP, Ruby, Erlang, Perl, C#, JavaScript, Node.js等都支持。博主也是一名多语言爱好者因此对Thrift也比较感兴趣所以在后面我也会写javapython 的这两种语言的RPC调用。
IDL介绍
Thrift是一个典型的CS客户端/服务端结构客户端和服务端可以使用不同的语言开发。既然客户端和服务端能使用不同的语言开发那么一定就要有一种中间语言来关联客户端和服务端的语言没错这种语言就是IDLInterface Description Language。
IDL 是一种用于定义接口和数据结构的语言用于描述 Thrift 的服务接口和数据类型。在 Thrift 中使用的是 Thrift 自定义的 IDL 语言它具有类似于其他接口描述语言的特性。
因此我们需要写IDL然后使用Thrift编译器将IDL转换为对应的语言我们开发者只需要实现具体的业务逻辑无需关注底层逻辑
IDL语法学习
在学习thrift之前我们需要先简单的学习一下IDL的语法很简单和其他语言结构差不多。
1.基本类型
类型解释bool布尔值byte8位有符号整数i1616位有符号整数i3232位有符号整数i6464位有符号整数double64位浮点数stringUTF-8编码的字符串binary二进制串
2.struct结构体
先看例子
struct Person { // 定义 Person 结构体1: required string name; // 姓名必选字段2: required i32 age; // 年龄必选字段3: optional string sex; // 性别可选字段
}如上面所示它类似C语言的结构体对应java中的Bean其中required修饰的他的值初始化是必传项。
3.container容器
有三种可用的容器类型
list 元素类型为t的有序列表允许重复。类似于java中的ArrayList。set 元素类型为t的无序表不允许重复。类似于java中的HashSet。mapt, t 键类型为t值类型为t的键值对键不允许重复。类似于java中的HashMap。
例如
struct Test {1: mapstring, User usermap,2: seti32 intset,3: listdouble doublelist
}4.service服务
服务的定义方法在语义上等同于面向对象语言中的接口。
service PersonService { // 定义 PersonService 服务接口Person getByName(1: string name); // 根据姓名获取 Person 信息bool save(1: Person person); // 保存 Person 信息
}5.枚举(enum)
枚举的定义形式和Java的Enum定义差不多例如
enum Sex {MALE,FEMALE
}6.异常(exception)
thrift支持自定义exception规则和struct一样如下
exception RequestException {1: i32 code;2: string reason;
}7.命名空间
thrift的命名空间相当于Java中的package的意思主要目的是组织代码。thrift使用关键字namespace定义命名空间例如
namespace java com.aniu.servicenamespace py examplenamespace 后跟的是你要转化的语言以及生成的文件所在的包
Thrift 编译器安装
写完IDL文件后我们需要将其转换成对应语言因此我们需要先安装Thrift编译器这里博主用的Windowsmacos和Linux自行下载
网址https://dlcdn.apache.org/thrift/0.19.0/thrift-0.19.0.exe
下载安装完成后配置完环境变量如下图可查看版本后序在其他语言例如java中引入maven包时需要对应版本
入门案例
这里编写一个简单的入门案例实现rpc远程过程调用 定义thrift 文件 person.thrift
namespace java com.aniu.servicestruct Person { // 定义 Person 结构体1: required string name; // 姓名必选字段2: required i32 age; // 年龄必选字段3: optional string sex; // 性别可选字段
}service PersonService { // 定义 PersonService 服务接口Person getByName(1: string name); // 根据姓名获取 Person 信息bool save(1: Person person); // 保存 Person 信息
}使用
thrift --gen java user.thrift命令即可在当前目录下生成gen-java目录里面即是生成的java代码 引入对应版本的Maven包
dependencygroupIdorg.apache.thrift/groupIdartifactIdlibthrift/artifactIdversion0.19.0/version/dependency目录结构如下 如上图Person和PersonService即为thrift编译器将IDL转换后生成的java代码。
业务逻辑
PersonService里面有两个接口我们需要实现接口在实现类里面写业务逻辑。
package com.aniu.service.impl;import com.aniu.service.Person;
import com.aniu.service.PersonService;
import org.apache.thrift.TException;public class PersonServiceImpl implements PersonService.Iface {Overridepublic Person getByName(String name) throws TException {return new Person(name,18);}Overridepublic boolean save(Person person) throws TException {return false;}
}
服务端
package com.aniu.server;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.server.TServer;
import org.apache.thrift.server.TSimpleServer;
import org.apache.thrift.transport.TServerSocket;
import com.aniu.service.PersonService;
import com.aniu.service.impl.PersonServiceImpl;
public class Server {public static void main(String[] args) {try{// 创建一个新的 Thrift 服务端套接字监听在端口 9000 上TServerSocket socket new TServerSocket(9000);// 创建一个 PersonService 的 Processor。Processor 是 Thrift 中用于处理请求的接口它需要一个实现了 PersonService 接口的对象作为参数。PersonService.ProcessorPersonServiceImpl processor new PersonService.Processor(new PersonServiceImpl());// 创建一个二进制协议工厂对象。Thrift 支持多种协议如 TBinaryProtocol、TCompactProtocol、TJSONProtocol 等这里选择的是二进制协议。TBinaryProtocol.Factory factory new TBinaryProtocol.Factory();// 创建一个 TSimpleServer 的参数对象 args1并将之前创建的套接字、Processor 和协议工厂设置为其属性。TServer.Args args1 new TSimpleServer.Args(socket);args1.processor(processor);args1.protocolFactory(factory);// 使用之前设置好的参数创建 TSimpleServer 对象TSimpleServer tSimpleServer new TSimpleServer(args1);// 开始执行 TSimpleServer开始监听并处理客户端的请求。tSimpleServer.serve();}catch (Exception e){System.out.println(e);}}
}客户端
import com.aniu.service.PersonService;
import org.apache.thrift.protocol.TBinaryProtocol;
import org.apache.thrift.transport.TSocket;
public class Client {public static void main(String[] args) {try{// 创建一个 Thrift 的套接字对象连接到在本地主机localhost的9000端口上运行的 Thrift 服务。TSocket socket new TSocket(localhost, 9000);// 创建一个使用二进制协议的实例该协议用于在客户端和服务器之间传输数据。TBinaryProtocol protocol new TBinaryProtocol(socket);// 创建一个Thrift 客户端实例它使用前面创建的二进制协议实例进行通信。PersonService.Client client new PersonService.Client(protocol);// 打开与服务器端的连接通过客户端对象client进行远程过程调用RPC或其他通信操作socket.open();// RPC 调用Person person client.getByName(aniu);System.out.println(person);}catch (Exception e){System.out.println(e);}}
}pom.xml
dependenciesdependencygroupIdorg.apache.thrift/groupIdartifactIdlibthrift/artifactIdversion0.19.0/version/dependencydependencygroupIdorg.slf4j/groupIdartifactIdslf4j-log4j12/artifactIdversion1.7.5/version/dependencydependencygroupIdorg.slf4j/groupIdartifactIdslf4j-api/artifactIdversion1.7.30/versionscopecompile/scope/dependencydependencygroupIdjakarta.annotation/groupIdartifactIdjakarta.annotation-api/artifactIdversion1.3.5/versionscopecompile/scope/dependency/dependencies运行
先启动服务端再启动客户端即可实现RPC调用
结语
本节实现了一个简单的案例但对于thrift的服务端如何创建的客户端如何调用没有具体讲解基本都在注释里下一篇博文来讲解原理以及实现跨语言RPC调用