Go框架三件套详解(Web/RPC/ORM)(二) | 青训营笔记

158 阅读4分钟

这是我参与「第五届青训营」伴学笔记的第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语言中的转换:

TyepGo
i8int8
i16int16
i32int32
i64int64
doublefloat64
boolbool
stringstring
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))