开发 k8s 管理平台 - k8sailor 04. 使用 gin 创建第一个 API 接口

简介: 开发 k8s 管理平台 - k8sailor 04. 使用 gin 创建第一个 API 接口

开发 k8s 管理平台 - k8sailor 04. 使用 gin 创建第一个 API 接口

原文地址: https://tangx.in/posts/books/k8sailor/chapter01/04-init-httpserver/
tag: https://github.com/tangx/k8sailor/tree/feat/04-httpserver-initial
cd cmd/k8sailor && go run . httpserver

启动 web 服务器

Usage:
  k8sailor httpserver [flags]

Flags:
  -h, --help   help for httpserver

Global Flags:
      --config string   k8s 配置授权文件 (default "./k8sconfig/config.yml")

2021/09/24 07:56:51 open config/local.yml: no such file or directory
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /k8sailor/v0/ping         --> github.com/tangx/k8sailor/cmd/k8sailor/apis.RootGroup.func1 (3 handlers)
[GIN-debug] Listening and serving HTTP on :8088

创建 pkg/confgin 初始化配置文件

为了方便服务配置管理, 将使用 使用 jarvis 初始化配置

需要对 httpserver 进行一些初始化配置

// Server 定义一个 gin httpserver 的关键字段
// `env:""` 可以通过 `github.com/go-jarvis/jarvis` 库渲染成配置文件
type Server struct {
    Host    string `env:""`
    Port    int    `env:""`
    Appname string `env:""`
    engine  *gin.Engine
}

其中需要额外强调的是, httpserver 必须 有自己的 应用名 的前缀路由。 应该 有自己的版本路由。

http://127.0.0.1:8088/appname/v0/ping

在服务容器化后, 具有自己 应用名 路由的服务对 各家 ingress 规则都是友好的。 如果没有, 上线之后要强行使用 rewrite 实现的话, 那就必须依赖 ingress controller 的实现了。

如果 rewrite 规则里面 正则表达式 , 那就让运维哭去吧

目前所知

  • nginx ingress controller 支持 rewrite, 支持正则表达式
  • traefik 好像可以使用 middleware 实现, 不支持正则表达式
  • istio 有自己的规则, 但不支持正则表达式
// RegisterRoute 注册
func (s *Server) RegisterRoute(registerFunc func(rg *gin.RouterGroup)) {

    // 注册以服务名为根的路由信息,方便在 k8s ingress 中做转发
    base := s.engine.Group(s.Appname)

    // 注册业务子路由
    registerFunc(base)
}

使用 jarvis 初始化配置

jarvis 是一个对 配置解析配置加载 操作封装的库。

  1. 可以方便的通过 config struct 解析出对应的配置参数。
  2. 在启动时, 支持通过 配置文件环境变量 加载配置参数, 对 k8s 容器应用还算友好。
  3. 支持 giltab 分支配置特点, 可以在不同分支使用不同的变量值。

具体使用案例, 可以参考 github 的 demo github.com/go-jarvis/jarvis

// 定义服务相关信息
var (
    HttpServer = &confgin.Server{}

    app = jarvis.App{
        Name: "k8sailor",
    }
)

// 使用 jarvis 初始化配置文件
func init() {
    config := &struct {
        HttpServer *confgin.Server
    }{
        HttpServer: HttpServer,
    }
    app.Conf(config)
}

在运行的时候, 会在 运行 根目录生成 config/default.yml 文件。 该文件不要直接修改, 每次运行将被覆盖。

加载顺序 default.yml -> config.yml -> local.yml / config.branch.yml -> env

如果本地开发, 可以把一些关键的敏感配置放在 local.yml 中并 .gitignore 忽略。

为命令行添加 httpserver 子命令

初始化子命令

并设置启动命令

// runHttpserver 启动 http server
func runHttpserver() {
    // 1. 将 apis 注册到 httpserver 中
    global.HttpServer.RegisterRoute(apis.RootGroup)

    // 2. 启动服务
    if err := global.HttpServer.Run(); err != nil {
        logrus.Fatalf("start httpserver failed: %v", err)
    }
}

完成之后, 在 cmd/root.go 命令中添加子命令

func init() {
    cobrautils.BindFlags(rootCmd, global.Flags)

    // 添加子命令
    rootCmd.AddCommand(cmdHttpserver)
}

创建并注册路由

自定义启动参数

由于是用了 jarvis 库, 在程序启动的时候, 会在运行目录生成 config/defualt.yml 配置文件。

复制并重命名为 config.yml 覆盖默认值。

k8sailor__HttpServer_Appname: k8sailor
k8sailor__HttpServer_Host: ""
k8sailor__HttpServer_Port: 8088

启动

如开头所示, 可以看到, 配置项已成功被应用

  • httpserver 的根路由为 /k8sailor/v0/xxxxx
  • httpserver 的监听端口为 8088

如果要在容器中运行, 只需要在容器中注入相同变量名的变量

export k8sailor__HttpServer_Appname=k8sailor
相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
11天前
|
Java API Maven
如何使用Java开发抖音API接口?
在数字化时代,社交媒体平台如抖音成为生活的重要部分。本文详细介绍了如何用Java开发抖音API接口,从创建开发者账号、申请API权限、准备开发环境,到编写代码、测试运行及注意事项,全面覆盖了整个开发流程。
54 10
|
11天前
|
API 开发工具 数据库
开发一份API接口,需要注意这些,看你做到了几项
本文介绍了设计API接口时需注意的关键点,包括数字签名、敏感数据加密与脱敏、限流、参数校验、统一返回与异常处理、请求日志记录、幂等设计、数据量限制、异步处理、参数定义、完整文档及开发者对接SDK等内容,旨在帮助开发者设计出安全、稳定、易维护的API接口。
67 6
开发一份API接口,需要注意这些,看你做到了几项
|
8天前
|
缓存 前端开发 API
深入浅出:后端开发中的RESTful API设计原则
【10月更文挑战第43天】在数字化浪潮中,后端开发如同搭建梦想的脚手架,而RESTful API则是连接梦想与现实的桥梁。本文将带你领略API设计的哲学之美,探索如何通过简洁明了的设计,提升开发效率与用户体验。从资源定位到接口约束,从状态转换到性能优化,我们将一步步构建高效、易用、可维护的后端服务。无论你是初涉后端的新手,还是寻求进阶的开发者,这篇文章都将为你的开发之路提供指引。让我们一起走进RESTful API的世界,解锁后端开发的新篇章。
|
15天前
|
存储 SQL API
探索后端开发:构建高效API与数据库交互
【10月更文挑战第36天】在数字化时代,后端开发是连接用户界面和数据存储的桥梁。本文深入探讨如何设计高效的API以及如何实现API与数据库之间的无缝交互,确保数据的一致性和高性能。我们将从基础概念出发,逐步深入到实战技巧,为读者提供一个清晰的后端开发路线图。
|
14天前
|
JSON 前端开发 API
后端开发中的API设计与文档编写指南####
本文探讨了后端开发中API设计的重要性,并详细阐述了如何编写高效、可维护的API接口。通过实际案例分析,文章强调了清晰的API设计对于前后端分离项目的关键作用,以及良好的文档习惯如何促进团队协作和提升开发效率。 ####
|
12天前
|
JSON API 数据格式
如何使用Python开发1688商品详情API接口?
本文介绍了如何使用Python开发1688商品详情API接口,获取商品的标题、价格、销量和评价等详细信息。主要内容包括注册1688开放平台账号、安装必要Python模块、了解API接口、生成签名、编写Python代码、解析返回数据以及错误处理和日志记录。通过这些步骤,开发者可以轻松地集成1688商品数据到自己的应用中。
27 1
|
15天前
|
监控 搜索推荐 安全
探究亚马逊详情API接口:开发与应用
在数字化时代,亚马逊作为全球领先的电商平台,为商家和消费者提供了丰富的商品信息和便捷的购物体验。本文深入探讨了亚马逊详情API接口的获取与运用,帮助开发者和商家实时监控商品数据、分析市场趋势、优化价格策略、分析竞争对手、构建推荐系统及自动化营销工具,从而在竞争中占据优势。文章还提供了Python调用示例和注意事项,确保API使用的安全与高效。
44 3
|
8天前
|
Web App开发 人工智能 自然语言处理
WebChat:开源的网页内容增强问答 AI 助手,基于 Chrome 扩展的最佳实践开发,支持自定义 API 和本地大模型
WebChat 是一个基于 Chrome 扩展开发的 AI 助手,能够帮助用户理解和分析当前网页的内容,支持自定义 API 和本地大模型。
33 0
|
10天前
|
数据采集 自然语言处理 搜索推荐
淘宝评价API接口的开发与应用
在数字化商业时代,数据成为企业提升竞争力的关键资源。淘宝作为电商巨头,其商品评论数据极具价值。本文详细介绍了淘宝评价API接口的开发流程与应用场景,从注册账号、获取密钥到实际调用和数据解析,再到商品分析、店铺管理、个性化推荐等多个方面,全面解析了技术细节与实践方法,为企业和开发者提供了宝贵的技术支持和数据资源。
53 0
|
14天前
|
缓存 前端开发 API
探索后端开发中的API设计原则
【10月更文挑战第37天】本文旨在引导读者理解API设计的核心理念,通过简明的语言和直观的示例,揭示如何构建高效、稳定且易于维护的后端接口。我们将深入浅出地探讨RESTful API的设计规范,并通过一个简易的代码样例,展示如何在实战中应用这些原则。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的参考和启示。
下一篇
无影云桌面