这是我参与「第五届青训营」伴学笔记的第5天
阅前提示:由于kitex和hertz都已经有官方文档和大佬总结过啦,所以我只是放上了他们的文章链接,就并没有太多相关总结。本文主要是一些涉及到kitex和hertz的,但我之前没有了解过的知识,譬如RPC和IDL语言等~
Kitex的基础使用
Kitex是一个RPC框架,类似的框架还有thrift等。
有关kitex的使用和介绍大家可以看看官方文档,非常的详细!
点击跳转
由于kitex对于支持windows还不是非常完善,所以windows系统最好使用虚拟机或者wsl。
笔者是用wsl构建Golang的Windows和linux并存开发环境(因为电脑配置不高,以前课程需要用VM虚拟机跑过代码,比较慢)
而有关如何用wsl构建Golang的Windows和linux并存开发环境,这里有一份非常好的官方文档供大家参考:点击跳转
RPC
远程过程调用,它是利用网络从远程计算机上请求服务,可以理解为把程序的一部分放在其他远程计算机上执行。通过网络通信将调用请求发送至远程计算机后,利用远程计算机的系统资源执行这部分程序,最终返回远程计算机上的执行结果。 更多的相关知识请点击跳转
IDL语言
客户端和服务端使用不同语言开发,使用IDL来关联不同的语言
基本语法
数据类型和Go语言中的转换:
| Tyep | Go |
|---|---|
| i8 | int8 |
| i16 | int16 |
| i32 | int32 |
| i64 | int64 |
| double | float64 |
| bool | bool |
| string | string |
| list<T> | []T |
| set<T> | []T(go语言中没有set集合以数组代替) |
| map<K,V> | map[K] V |
| binary | []byte |
在使用容器类型时必须指定泛型,否则无法编译idl文件。
集合中的元素可以是除了service之外的任何类型,包括exception。
struct Test {
1: map<string, User> usermap,
2: set<i32> intset,
3: list<double> doublelist
}
常量及类型别名(Const&&Typedef):
//常量定义
const i32 MALE_INT = 1
const map<i32, string> GENDER_MAP = {1: "male", 2: "female"}
//某些数据类型比较长可以用别名简化
typedef map<i32, string> gmp
struct类型
struct <结构体名称> {
<序号>:[字段性质] <字段类型> <字段名称> [= <默认值>] [;|,]
}
例如:
struct User{
1: required string name, //该字段必须填写
2: optional i32 age = 0; //默认值
3: bool gender //默认字段类型为optional
}
struct有以下一些约束:
1.struct不能继承,但是可以嵌套,不能嵌套自己。
2.其成员都是有明确类型
3.成员是被正整数编号过的,其中的编号使不能重复的,这个是为了在传输过程中编码使用。
4.成员分割符可以是逗号(,)或是分号(;),而且可以混用
5.字段会有optional和required之分和protobuf一样,但是如果不指定则为无类型–可以不填充该值,但是在序列化传输的时候也会序列化进去,optional是不填充则不序列化,required是必须填充也必须序列化。
6.每个字段可以设置默认值
7.同一文件可以定义多个struct,也可以定义在不同的文件,进行include引入。
枚举(enum)
不支持枚举类嵌套,枚举常量必须是32位的正整数
enum HttpStatus {
OK = 200,
NOTFOUND=404
}
异常(Exceptions)
异常在语法和功能上类似于结构体,差别是异常使用关键字exception,而且异常是继承每种语言的基础异常类。
exception MyException {
1: i32 errorCode
2: string message
}
service ExampleService {
string GetName() throws (1: MyException e)
}
Service (服务定义类型)
服务的定义方法在语义上等同于面向对象语言中的接口。
service HelloService {
i32 sayInt(1:i32 param)
string sayString(1:string param)
bool sayBoolean(1:bool param)
void sayVoid()
}
编译后的Java代码
public class HelloService {
public interface Iface {
public int sayInt(int param) throws org.apache.thrift.TException;
public java.lang.String sayString(java.lang.String param) throws
org.apache.thrift.TException;
public boolean sayBoolean(boolean param) throws
org.apache.thrift.TException;
public void sayVoid() throws org.apache.thrift.TException;
}
// ... 省略很多代码
}
Namespace (名字空间)
Thrift中的命名空间类似于go中的package,它们提供了一种组织(隔离)代码的简便方式。名字空间也可以用于解决类型定义中的名字冲突。
由于每种语言均有自己的命名空间定义方式(如python中有module), 允许开发者针对特定语言定义namespace。
namespace go main // 命名空间定义,规范:namespace + 语言 + 包路径
service Hello{ // 接口定义,类似Java接口定义
string getWord(), // 方法定义,类似Java接口定义
void writeWold(1:string words) //参数类型指定
Hertz的基础使用
Hertz是一个结合了fasthttp、gin、echo等HTTP框架的优势,由字节跳动开发的Golang微服务的HTTP框架。
有关该框架的安装和使用,掘金上有位大佬的文写得超级详细!链接如下:
字节开源WEB框架Hertz太香啦! - 掘金 (juejin.cn))