如何将我的服务开放给用户:构建 API 接口和用户认证的实践指南

83 阅读3分钟

如何将我的服务开放给用户:构建 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),然后在中间件我们进行完整的验证。也就是意味着这里的认证是在网关进行的而不是服务处。如果验证失败会直接报错返回,成功则继续调用服务。