如何将我的服务开放给用户:构建 API 接口和用户认证的实践指南
零、Kitex 与 Hertz 简述
Kitex
Kitex 是由字节跳动开发的一款高性能、类型安全的 RPC 框架。它基于 Go 语言,旨在简化微服务之间的通信,提供自动生成代码、负载均衡、熔断等功能。Kitex 支持多种传输协议,如 Thrift、Protobuf 等,具有良好的扩展性和灵活性。
主要特点:
高性能:优化的传输和序列化机制,适合高并发场景。
- 类型安全:通过接口定义语言(IDL)确保类型安全,减少运行时错误。
- 自动生成代码:支持自动生成客户端和服务端代码,提升开发效率。
- 丰富的中间件:内置多种中间件,如限流、熔断、监控等。
Hertz
Hertz 是一款高性能、极简主义的 HTTP 框架,同样由字节跳动开发。它借鉴了 Gin 的设计理念,但在性能和扩展性上进行了优化,适用于构建高吞吐量的 Web 服务和 API。
主要特点:
- 极致性能:通过高效的路由和中间件机制,实现极低的延迟和高吞吐量。
- 简洁易用:简洁的 API 设计,降低学习曲线,快速上手。
- 插件化架构:支持插件化开发,方便功能扩展和维护。
- 丰富的生态:兼容大量中间件和第三方库,满足多样化需求。
一、结构
文章基于 cloudwego 带来的工具链(kitex hertz)生成的框架。准确的说由 kitex 搭建项目各个 rpc 的模块和脚手架,然后使用 hertz 来管理网关。
实际框架模拟如下
-IDL
-kitex_gen
-rpc
-route
|
---biz
|
---handler
|
---model
|
---router
其中, IDL 是存放 thrift 文件,而 kitex_gen 是生成的代码,rpc 是各个服务的脚手架。
而我们这次主题关注的重点放在 hertz 生成的 route 中。
二、实际使用
route 本质上是一个网关服务,这里忽略 main.go 等主体,讨论 biz 下面的代码。
也就是那三个目录 handler model router
handler
handler 是放置每个服务在网关处的使用的,也就是每个 api 的直接调用对象。
我们生成出来的代码如下
// AddToCart .
// @router /api/cart [POST]
func AddToCart(ctx context.Context, c *app.RequestContext) {
var err error
var req cart.AddToCartRequest
err = c.BindAndValidate(&req)
if err != nil {
c.String(consts.StatusBadRequest, err.Error())
return
}
resp := new(base.MessageResponse)
c.JSON(consts.StatusOK, resp)
}
所以这里需要去修改为真正项目的逻辑去调用其他微服务即可。
至于如何获取 Client,这里提供一种思路是为建立 global,利用全局变量
module
没太多好谈的,基本为生成的代码,有兴趣可以自行阅读下。
router
网关实际注册的地方,以及写中间件的地方
每个服务 下面都会被分为 middleware.go 和 xx.go,也就是我们需要为每个微服务提供属于他的中间件。(这样应该比较方便生成的代码?)
所以这里可以考虑实现一个生成中间件的函数,为每个函数提供他们需要的中间件。
然后我们的框架已经为我们生成好了中间件的使用,可以参考 xx.go 文件。
通过这种方式,我们可以实现用户认证功能,在登陆页面我们返回token(比如 jwt),然后在中间件我们进行完整的验证。也就是意味着这里的认证是在网关进行的而不是服务处。如果验证失败会直接报错返回,成功则继续调用服务。