没有合适的资源?快使用搜索试试~ 我知道了~
基于 Go 语言构建企业级的 RESTful API 服务 企业级go gin 开发框架 附带源码
需积分: 0 3 下载量 51 浏览量
2023-01-04
16:20:01
上传
评论
收藏 4.72MB PDF 举报
温馨提示
试读
54页
基于 Go 语言构建企业级的 RESTful API 服务 企业级go gin 开发框架 附带源码
资源推荐
资源详情
资源评论
本⼩册所实现的功
本⼩册所实现的 API 功能(项目源码 https://github.com/qq601046124/golang-gin-api)
能
本⼩册通过实现⼀个账号系统,来演⽰如何构建⼀个真实的API服务器,构建⽅法和技术是笔者根据多年的⼤型API服务器开发经验不断优化沉淀⽽成。通过实战展⽰了API构建过程中各个流程(准备
->设计->开发->测试->部署)的实现⽅法,⼩册涵盖的内容如下(包括但不限于):
详细为:
准备阶段
如何安装和配置Go开发环境
如何安装和配置VimIDE
设计阶段
API构建技术选型
API基本原理
API规范设计
开发阶段
如何读取配置⽂件
如何管理和记录⽇志
如何做数据库的CURD操作
如何⾃定义错误Code
如何读取和返回HTTP请求
如何进⾏业务逻辑开发
如何对请求插⼊⾃⼰的处理逻辑
如何进⾏API⾝份验证
如何进⾏HTTPS加密
如何⽤Makefile管理API源码
如何给API命令添加版本功能
如何管理API命令
如何⽣成Swagger在线⽂档
测试阶段
如何进⾏单元测试
如何进⾏性能测试(函数性能)
如何做性能分析
API性能测试和调优
部署阶段
如何⽤Nginx部署API服务
如何做API⾼可⽤
通过以上各功能的介绍,读者可以完整、系统地学习API构建⽅法和技巧,笔者也会在⽂章中融⼊⾃⼰的开发经验以供读者参考。
账号系统业务功能
本⼩册为了演⽰,构建了⼀个账号系统(后⾯统称为apiserver),功能如下:
API服务器状态检查
登录⽤户
新增⽤户
删除⽤户
更新⽤户
获取指定⽤户的详细信息
获取⽤户列表
本⼩册执⾏环境
本⼩册所有的软件安装,运⾏均是在CentOS7.1系统上执⾏的。
理论上本⼩册所构建的API可以在所有的Unix/Linux系统上编译和运⾏,⼩册中的软件安装⽤的是yum⼯具,⼩册中所列举的yum软件理论上可以在CentOS6和CentOS7上直接执⾏yum命令安装。
⼩结
本⼩节介绍了⼩册所要实现的API功能,以及API系统的业务功能,让读者在实战前对⼩册所要构建的系统有个整体了解,以便于接下来的学习。⼩册每⼀节都会提供源码,供读者学习参考。
RESTfulAPI介绍
什么是API
API(ApplicationProgrammingInterface,应⽤程序编程接⼜)是⼀些预先定义的函数或者接⼜,⽬的是提供应⽤程序与开发⼈员基于某软件或硬件得以访问⼀组例程的能⼒,⽽又⽆须访问源码,或理解
内部⼯作机制的细节。
要实现⼀个API服务器,⾸先要考虑两个⽅⾯:API风格和媒体类型。Go语⾔中常⽤的API风格是RPC和REST,常⽤的媒体类型是JSON、XML和Protobuf。在GoAPI开发中常⽤的组合是gRPC+
Protobuf和REST+JSON。
REST简介
REST代表表现层状态转移(REpresentationalStateTransfer),由RoyFielding在他的论⽂中提出。REST是⼀种软件架构风格,不是技术框架,REST有⼀系列规范,满⾜这些规范的API均可称为
RESTfulAPI。REST规范中有如下⼏个核⼼:
1. REST中⼀切实体都被抽象成资源,每个资源有⼀个唯⼀的标识——URI,所有的⾏为都应该是在资源上的CRUD操作
2. 使⽤标准的⽅法来更改资源的状态,常见的操作有:资源的增删改查操作
3. ⽆状态:这⾥的⽆状态是指每个RESTfulAPI请求都包含了所有⾜够完成本次操作的信息,服务器端⽆须保持Session
⽆状态对于服务端的弹性扩容是很重要的。
REST风格虽然适⽤于很多传输协议,但在实际开发中,REST由于天⽣和HTTP协议相辅相成,因此HTTP协议已经成了实现RESTfulAPI事实上的标准。在HTTP协议中通过POST、DELETE、PUT、
GET⽅法来对应REST资源的增、删、改、查操作,具体的对应关系如下:
HTTP⽅法 ⾏为 URI ⽰例说明
GET 获取资源列表 /users 获取⽤户列表
GET 获取⼀个具体的资源 /users/admin 获取admin⽤户的详细信息
POST 创建⼀个新的资源 /users 创建⼀个新⽤户
PUT 以整体的⽅式更新⼀个资源 /users/1 更新id为1的⽤户
DELETE 删除服务器上的⼀个资源 /users/1 删除id为1的⽤户
RPC简介
根据维基百科的定义:远程过程调⽤(RemoteProcedureCall,RPC)是⼀个计算机通信协议。该协议允许运⾏于⼀台计算机的程序调⽤另⼀台计算机的⼦程序,⽽程序员⽆须额外地为这个交互作⽤编
程。
通俗来讲,就是服务端实现了⼀个函数,客户端使⽤RPC框架提供的接⼜,调⽤这个函数的实现,并获取返回值。RPC屏蔽了底层的⽹络通信细节,使得开发⼈员⽆须关注⽹络编程的细节,⽽将更多的
时间和精⼒放在业务逻辑本⾝的实现上,从⽽提⾼开发效率。
RPC的调⽤过程如下(图⽚来⾃HowRPCWorks):
1. Client通过本地调⽤,调⽤ClientStub
2. ClientStub将参数打包(也叫Marshalling)成⼀个消息,然后发送这个消息
3. Client所在的OS将消息发送给Server
4. Server端接收到消息后,将消息传递给ServerStub
5. ServerStub将消息解包(也叫Unmarshalling)得到参数
6. ServerStub调⽤服务端的⼦程序(函数),处理完后,将最终结果按照相反的步骤返回给Client
Stub负责调⽤参数和返回值的流化(serialization)、参数的打包解包,以及负责⽹络层的通信。Client端⼀般叫Stub,Server端⼀般叫Skeleton。
RESTvsRPC
在做API服务器开发时,很多⼈都会遇到这个问题——选择REST还是RPC。RPC相⽐REST的优点主要有3点:
1. RPC+Protobuf采⽤的是TCP做传输协议,REST直接使⽤HTTP做应⽤层协议,这种区别导致REST在调⽤性能上会⽐RPC+Protobuf低
2. RPC不像REST那样,每⼀个操作都要抽象成对资源的增删改查,在实际开发中,有很多操作很难抽象成资源,⽐如登录操作。所以在实际开发中并不能严格按照REST规范来写API,RPC就不存
在这个问题
3. RPC屏蔽⽹络细节、易⽤,和本地调⽤类似
这⾥的易⽤指的是调⽤⽅式上的易⽤性。在做RPC开发时,开发过程很烦琐,需要先写⼀个DSL描述⽂件,然后⽤代码⽣成器⽣成各种语⾔代码,当描述⽂件有更改时,必须重新定义和编
译,维护性差。
但是REST相较RPC也有很多优势:
1. 轻量级,简单易⽤,维护性和扩展性都⽐较好
2. REST相对更规范,更标准,更通⽤,⽆论哪种语⾔都⽀持HTTP协议,可以对接外部很多系统,只要满⾜HTTP调⽤即可,更适合对外,RPC会有语⾔限制,不同语⾔的RPC调⽤起来很⿇烦
3. JSON格式可读性更强,开发调试都很⽅便
4. 在开发过程中,如果严格按照REST规范来写API,API看起来更清晰,更容易被⼤家理解
在实际开发中,严格按照REST规范来写很难,只能尽可能RESTful化。
其实业界普遍采⽤的做法是,内部系统之间调⽤⽤RPC,对外⽤REST,因为内部系统之间可能调⽤很频繁,需要RPC的⾼性能⽀撑。对外⽤REST更易理解,更通⽤些。当然以现有的服务器性能,如
果两个系统间调⽤不是特别频繁,对性能要求不是⾮常⾼,以笔者的开发经验来看,REST的性能完全可以满⾜。本⼩册不是讨论微服务,所以不存在微服务之间的⾼频调⽤场景,此外REST在实际开发
中,能够满⾜绝⼤部分的需求场景,所以RPC的性能优势可以忽略,相反基于REST的其他优势,笔者更倾向于⽤REST来构建API服务器,本⼩册正是⽤REST风格来构建API的。
媒体类型选择
媒体类型是独⽴于平台的类型,设计⽤于分布式系统间的通信,媒体类型⽤于传递信息,⼀个正式的规范定义了这些信息应该如何表⽰。HTTP的REST能够提供多种不同的响应形式,常见的是XML和
JSON。JSON⽆论从形式上还是使⽤⽅法上都更简单。相⽐XML,JSON的内容更加紧凑,数据展现形式直观易懂,开发测试都⾮常⽅便,所以在媒体类型选择上,选择了JSON格式,这也是很多⼤公
司所采⽤的格式。
⼩结
本⼩节介绍了软件架构中API的实现⽅式,并简单介绍了相应的技术,通过对⽐,得出本⼩册所采⽤的实现⽅式:API风格采⽤REST,媒体类型选择JSON。通过本⼩节的学习,读者可以了解⼩册所构
建API服务器核⼼技术的选型和原因。
API流程和代码结构
为了使读者在开始实战之前对API开发有个整体的了解,这⾥选择了两个流程来介绍:
HTTPAPI服务器启动流程
HTTP请求处理流程
本⼩节也提前给出了程序代码结构图,让读者从宏观上了解将要构建的API服务器的功能。
HTTPAPI服务器启动流程
如上图,在启动⼀个API命令后,API命令会⾸先加载配置⽂件,根据配置做后⾯的处理⼯作。通常会将⽇志相关的配置记录在配置⽂件中,在解析完配置⽂件后,就可以加载⽇志包初始化函数,来初
始化⽇志实例,供后⾯的程序调⽤。接下来会初始化数据库实例,建⽴数据库连接,供后⾯对数据库的CRUD操作使⽤。在建⽴完数据库连接后,需要设置HTTP,通常包括3⽅⾯的设置:
1. 设置Header
2. 注册路由
3. 注册中间件
之后会调⽤net/http包的ListenAndServe()⽅法启动HTTP服务器。
在启动HTTP端⼜之前,程序会go⼀个协程,来pingHTTP服务器的/sd/health接⼜,如果程序成功启动,ping协程在timeout之前会成功返回,如果程序启动失败,则ping协程最终会timeout,并终
⽌整个程序。
解析配置⽂件、初始化Log、初始化数据库的顺序根据⾃⼰的喜好和需求来排即可。
HTTP请求处理流程
⼀次完整的HTTP请求处理流程如上图所⽰。(图⽚出⾃《HTTP权威指南》,推荐想全⾯理解HTTP的读者阅读此书。)
1.建⽴连接
客户端发送HTTP请求后,服务器会根据域名进⾏域名解析,就是将⽹站名称转变成IP地址:localhost->127.0.0.1,Linuxhosts⽂件、DNS域名解析等可以实现这种功能。之后通过发起TCP的三次握⼿
建⽴连接。TCP三次连接请参考TCP三次握⼿详解及释放连接过程,建⽴连接之后就可以发送HTTP请求了。
2.接收请求
HTTP服务器软件进程,这⾥指的是API服务器,在接收到请求之后,⾸先根据HTTP请求⾏的信息来解析到HTTP⽅法和路径,在上图所⽰的报⽂中,⽅法是GET,路径是/index.html,之后根据API
服务器注册的路由信息(⼤概可以理解为:HTTP⽅法+路径和具体处理函数的映射)找到具体的处理函数。
3.处理请求
在接收到请求之后,API通常会解析HTTP请求报⽂获取请求头和消息体,然后根据这些信息进⾏相应的业务处理,HTTP框架⼀般都有⾃带的解析函数,只需要输⼊HTTP请求报⽂,就可以解析到需要
的请求头和消息体。通常情况下,业务逻辑处理可以分为两种:包含对数据库的操作和不包含对数据的操作。⼤型系统中通常两种都会有:
1. 包含对数据库的操作:需要访问数据库(增删改查),然后获取指定的数据,对数据处理后构建指定的响应结构体,返回响应包。数据库通常⽤的是MySQL,因为免费,功能和性能也都能满⾜企
业级应⽤的要求。
2. 不包含对数据库的操作:进⾏业务逻辑处理后,构建指定的响应结构体,返回响应包。
4.记录事务处理过程
在业务逻辑处理过程中,需要记录⼀些关键信息,⽅便后期Debug⽤。在Go中有各种各样的⽇志包可以⽤来记录这些信息。
HTTP请求和响应格式介绍
⼀个HTTP请求报⽂由请求⾏(requestline)、请求头部(header)、空⾏和请求数据四部分组成,下图是请求报⽂的⼀般格式。
第⼀⾏必须是⼀个请求⾏(requestline),⽤来说明请求类型、要访问的资源以及所使⽤的HTTP版本
紧接着是⼀个头部(header)⼩节,⽤来说明服务器要使⽤的附加信息
之后是⼀个空⾏
再后⾯可以添加任意的其他数据(称之为主体:body)
HTTP响应格式跟请求格式类似,也是由4个部分组成:状态⾏、消息报头、空⾏和响应数据。
⽬录结构
├── admin.sh # 进程的start|stop|status|restart控制⽂件
├── conf # 配置⽂件统⼀存放⽬录
│ ├── config.yaml # 配置⽂件
│ ├── server.crt # TLS配置⽂件
│ └── server.key
├── config # 专⻔⽤来处理配置和配置⽂件的Go package
│ └── config.go
├── db.sql # 在部署新环境时,可以登录MySQL客户端,执⾏source db.sql创建数据库和表
├── docs # swagger⽂档,执⾏ swag init ⽣成的
│ ├── docs.go
│ └── swagger
│ ├── swagger.json
│ └── swagger.yaml
├── handler # 类似MVC架构中的C,⽤来读取输⼊,并将处理流程转发给实际的处理函数,最后返回结果
│ ├── handler.go
│ ├── sd # 健康检查handler
│ │ └── check.go
│ └── user # 核⼼:⽤户业务逻辑handler
│ ├── create.go # 新增⽤户
│ ├── delete.go # 删除⽤户
│ ├── get.go # 获取指定的⽤户信息
│ ├── list.go # 查询⽤户列表
│ ├── login.go # ⽤户登录
│ ├── update.go # 更新⽤户
│ └── user.go # 存放⽤户handler公⽤的函数、结构体等
├── main.go # Go程序唯⼀⼊⼝
├── Makefile # Makefile⽂件,⼀般⼤型软件系统都是采⽤make来作为编译⼯具
├── model # 数据库相关的操作统⼀放在这⾥,包括数据库初始化和对表的增删改查
│ ├── init.go # 初始化和连接数据库
│ ├── model.go # 存放⼀些公⽤的go struct
│ └── user.go # ⽤户相关的数据库CURD操作
├── pkg # 引⽤的包
│ ├── auth # 认证包
│ │ └── auth.go
│ ├── constvar # 常量统⼀存放位置
│ │ └── constvar.go
│ ├── errno # 错误码存放位置
│ │ ├── code.go
│ │ └── errno.go
│ ├── token
剩余53页未读,继续阅读
资源评论
免费编程培训
- 粉丝: 108
- 资源: 26
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 筷手引流工具.apk
- 论文(最终)_20240430235101.pdf
- 基于python编写的Keras深度学习框架开发,利用卷积神经网络CNN,快速识别图片并进行分类
- 最全空间计量实证方法(空间杜宾模型和检验以及结果解释文档).txt
- 5uonly.apk
- 蓝桥杯Python组的历年真题
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 2023-04-06-项目笔记 - 第一百十九阶段 - 4.4.2.117全局变量的作用域-117 -2024.04.30
- 前端开发技术实验报告:内含4四实验&实验报告
- Highlight Plus v20.0.1
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功