Go 语言项目开发实战
孔令飞
腾讯云专家工程师,前 Red Hat、联想云工程师
41030 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 61 讲
Go 语言项目开发实战
15
15
1.0x
00:00/00:00
登录|注册

28 | 控制流(上):通过iam-apiserver设计,看Web服务的构建

仓库层
业务层
控制层
模型层
策略相关接口
密钥相关接口
用户相关接口
认证相关接口
仓库层
业务层
控制层
模型层
代码架构
REST API请求处理流程
启动流程设计
配置处理
Insomnia
cURL工具
RESTful API接口
服务构建方式抽象
REST API服务共享
测试思路
代码实现
使用方法介绍
功能介绍
课后练习
iam-apiserver
总结

该思维导图由 AI 生成,仅供参考

你好,我是孔令飞。
前面我们讲了很多关于应用构建的内容,你一定迫不及待地想看下 IAM 项目的应用是如何构建的。那么接下来,我就讲解下 IAM 应用的源码。
在讲解过程中,我不会去讲解具体如何 Code,但会讲解一些构建过程中的重点、难点,以及 Code 背后的设计思路、想法。我相信这是对你更有帮助的。
IAM 项目有很多组件,这一讲,我先来介绍下 IAM 项目的门面服务:iam-apiserver(管理流服务)。我会先给你介绍下 iam-apiserver 的功能和使用方法,再介绍下 iam-apiserver 的代码实现。

iam-apiserver 服务介绍

iam-apiserver 是一个 Web 服务,通过一个名为 iam-apiserver 的进程,对外提供 RESTful API 接口,完成用户、密钥、策略三种 REST 资源的增删改查。接下来,我从功能和使用方法两个方面来具体介绍下。

iam-apiserver 功能介绍

这里,我们可以通过 iam-apiserver 提供的 RESTful API 接口,来看下 iam-apiserver 具体提供的功能。iam-apiserver 提供的 RESTful API 接口可以分为四类,具体如下:
认证相关接口
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

IAM项目中的门面服务iam-apiserver是一项关键的Web服务,通过RESTful API接口提供用户、密钥、策略等资源的增删改查功能。文章详细介绍了iam-apiserver的功能和使用方法,以及通过cURL工具执行HTTP请求的示例操作。作者还推荐了Insomnia等带UI界面的REST API客户端工具,并给出了对secret资源进行CURD操作的示例。此外,文章还介绍了如何测试IAM应用中的各个部分,以及发布完iam-apiserver后的冒烟测试方法。通过本文,读者可以快速了解iam-apiserver的设计和Web服务构建的技术特点,以及如何使用iam-apiserver进行开发测试。文章还详细介绍了iam-apiserver的代码实现,包括配置处理、启动流程、请求处理流程等方面。通过对iam-apiserver的配置处理和启动流程设计的解析,读者可以深入了解iam-apiserver的内部实现和工作原理。iam-apiserver代码设计遵循简洁架构设计,具有独立于框架、可测试性、独立于UI、独立于数据库和独立于外部媒介等特点。iam-apiserver的代码架构设计简洁清晰,具有良好的可维护性和扩展性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《Go 语言项目开发实战》
新⼈⾸单¥68
立即购买
登录 后留言

全部留言(32)

  • 最新
  • 精选
  • yandongxiao
    总结: 介绍了 internal/pkg/apiserver 内部的组织结构 1. 最外层的Go文件主要完成: 1. 构建应用框架(app.go) 2. 提供应用框架执行时,需要的Run函数(run.go) 3. 创建 apiServer 服务实例(server.go 和 grpc.go) 4. 创建路由规则,安装中间件等(auth.go, router.go) 2. config 对应**应用配置** 3. options 对应命令行参数和配置文件。 4. controller、service、store 三个层次,controller 负责参数解析、校验;service 层负责业务逻辑;store负责数据库操作。 4层模型,模型层、控制层、业务层、存储层。层级之间如何解耦? 1. 通过 interface 实现解耦; 2. service层和store层的实例,是在请求执行过程中动态创建,它们都依赖一个工厂对象,作为实例化的输入。 3. 工厂对象 store store.Factory 不与具体的表、具体的操作绑定,通过store对象,你可以执行数据库的任何操作。类似的,srv srvv1.Service 工厂也不与具体的业务绑定,通过srv对象,你可以执行任何业务逻辑。 服务启动流程分为三个阶段:配置阶段、PreRun阶段、Run阶段。配置相关的对象有:Options、Config、HTTP/GRPC 相关的配置对象。

    作者回复: 强!

    2021-12-02
    13
  • Jasper
    var _ UserSrv = (*userService)(nil) 我是go初学者,这种语法表示没看明白

    作者回复: 这段代码的意思是:强制确保userService实现了UserSrv接口。

    2021-08-23
    3
    6
  • Sch0ng
    结合前面章节的铺垫,介绍iam-apiserver的使用方法、架构和代码实现,前后连贯,逻辑清晰,简洁易懂。 顺便一提,跟郑晔老师的《软件设计之美》中讲到的:快速了解一个项目时,要了解项目的模型、接口、实现,核心思想如出一辙。软件设计的路上,殊途同归。

    作者回复: 是的,项目源码结合背后的设计思路,学习效果会翻倍的。学习一次,职业生涯中会一直受益

    2021-08-15
    5
  • 徐海浪
    练习1:通过component-base共享 REST API 相关代码

    作者回复: 对的

    2021-08-27
    4
  • Geek_cede76
    这里使用到了设计模式中的工厂方法模式。Service是工厂接口,里面包含了一系列创建具体业务层对象的工厂函数:Users()、Secrets()、Policies()。通过工厂方法模式,不仅隐藏了业务层对象的创建细节,而且还可以很方便地在Service工厂接口实现方法中添加新的业务层对象

    作者回复: 666666

    2022-11-18归属地:广东
    2
  • hiDaLao
    老师,请问下context作为参数一直传下去的目的是什么呢

    作者回复: 2个目的: 1. 可以通过context.WithValue进行参数传递,这样就不用通过给函数添加入参的方式进行参数传递了,简单、灵活,扩展性高; 2. 可以通过context.WithTimeout的方式,传递关停信号、过期时间等

    2022-08-30归属地:广东
    2
  • 左耳朵东
    业务层和仓库层那里都做了两层抽象,比如仓库层有 Factory 和 SecretStore 两类接口,业务层调用的时候要这样写 s.store.Secrets().Create()。我的疑问是 Factory 这层抽象是不是可以省掉,业务层调用直接这样写 store.Secrets(dbIns).Create() 貌似也可以,这样有什么缺点吗?

    作者回复: 这样写是不行的吧,dbIns作为参数传入Secrets没啥意义。因为仓库层的db都是固定的,所以如果这么搞整个仓库调用都要加入固定的dbIns。 store.Secrets(username).List 这种到是可以,Secrets传入的username类似于k8s的namespace

    2022-03-08
    2
    2
  • Summer 空城
    老师,您好,在app/app.go 中 func NewApp(name string, basename string, opts ...Option) *App内部执行Option的方法,其实就是给App设置参数。为什么不来个set方法直接设置,现在这种设置方法感觉绕了一圈。。。。。

    作者回复: 这里使用的是选项模式,好处是,新加参数选项时,不用修改NewApp代码

    2021-09-02
    2
    2
  • Geek_cede76
    这里使用到了设计模式中的工厂方法模式。Service是工厂接口,里面包含了一系列创建具体业务层对象的工厂函数:Users()、Secrets()、Policies()。通过工厂方法模式,不仅隐藏了业务层对象的创建细节,而且还可以很方便地在Service工厂接口实现方法中添加新的业务层对象 老师,我感觉这里更像是抽象工厂方法模式

    作者回复: 这里用到了 工厂方法模式模式。可以参考 https://zhuanlan.zhihu.com/p/514427527

    2022-11-18归属地:广东
    1
  • 3608375821
    api接口是在哪里注册到router上面的啊,没找到,比如/v1/secrets/

    作者回复: 在 internal/apiserver/router.go 文件中

    2022-10-06归属地:广东
    1
收起评论
显示
设置
留言
32
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部