28 | 控制流(上):通过iam-apiserver设计,看Web服务的构建
该思维导图由 AI 生成,仅供参考
iam-apiserver 服务介绍
iam-apiserver 功能介绍
- 深入了解
- 翻译
- 解释
- 总结
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-0213 - Jaspervar _ UserSrv = (*userService)(nil) 我是go初学者,这种语法表示没看明白
作者回复: 这段代码的意思是:强制确保userService实现了UserSrv接口。
2021-08-2336 - Sch0ng结合前面章节的铺垫,介绍iam-apiserver的使用方法、架构和代码实现,前后连贯,逻辑清晰,简洁易懂。 顺便一提,跟郑晔老师的《软件设计之美》中讲到的:快速了解一个项目时,要了解项目的模型、接口、实现,核心思想如出一辙。软件设计的路上,殊途同归。
作者回复: 是的,项目源码结合背后的设计思路,学习效果会翻倍的。学习一次,职业生涯中会一直受益
2021-08-155 - 徐海浪练习1:通过component-base共享 REST API 相关代码
作者回复: 对的
2021-08-274 - 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-0822 - Summer 空城老师,您好,在app/app.go 中 func NewApp(name string, basename string, opts ...Option) *App内部执行Option的方法,其实就是给App设置参数。为什么不来个set方法直接设置,现在这种设置方法感觉绕了一圈。。。。。
作者回复: 这里使用的是选项模式,好处是,新加参数选项时,不用修改NewApp代码
2021-09-0222 - Geek_cede76这里使用到了设计模式中的工厂方法模式。Service是工厂接口,里面包含了一系列创建具体业务层对象的工厂函数:Users()、Secrets()、Policies()。通过工厂方法模式,不仅隐藏了业务层对象的创建细节,而且还可以很方便地在Service工厂接口实现方法中添加新的业务层对象 老师,我感觉这里更像是抽象工厂方法模式
作者回复: 这里用到了 工厂方法模式模式。可以参考 https://zhuanlan.zhihu.com/p/514427527
2022-11-18归属地:广东1 - 3608375821api接口是在哪里注册到router上面的啊,没找到,比如/v1/secrets/
作者回复: 在 internal/apiserver/router.go 文件中
2022-10-06归属地:广东1