提交 f567e6bc 编写于 作者: fun binary's avatar fun binary

111

上级 4d0400cb
Github:https://github.com/marmotedu/iam
# 一、GO 项目实战技能点
![img](https://develop-1301758814.cos.ap-nanjing.myqcloud.com/c4a4bdfc103f193d292b54e44510f28c.jpg)
# 二、IAM系统架构
1. IAM(Identity and Access Management,身份识别与访问管理)系统是用 Go 语言编写的一个 Web 服务,用于给第三方用户提供访问控制服务。
2. IAM 系统可以帮用户解决的问题是:在特定的条件下,谁能够 / 不能够对哪些资源做哪些操作(Who is able to do what on something given some context),也即完成资源授权功能。
3. IAM资源授权流程
![img](https://develop-1301758814.cos.ap-nanjing.myqcloud.com/eed75fcd91d6e726ca74315d65193150.jpg)
4. IAM架构
![img](https://develop-1301758814.cos.ap-nanjing.myqcloud.com/0a5f6fd67af1eda1c690c8216dc5e042.jpg)
5. IAM系统包括9大组件和3大数据库,核心组件:iam-apiserver、iam-authz-server、iam-pump、marmotedu-sdk-go和iamctl。
![img](https://develop-1301758814.cos.ap-nanjing.myqcloud.com/6cdbde36255c7fb2d4f2e718c9077a71.jpeg)![img](https://develop-1301758814.cos.ap-nanjing.myqcloud.com/e68c21e1991c74becc4b8a6a8bf5a8f2.jpeg)
# 三、IAM流程
1. 创建平台资源:用户通过 iam-webconsole(RESTful API)或 iamctl(sdk marmotedu-sdk-go)客户端请求 iam-apiserver 提供的 RESTful API 接口完成用户、密钥、授权策略的增删改查,iam-apiserver 会将这些资源数据持久化存储在 MySQL 数据库中。而且,为了确保通信安全,客服端访问服务端都是通过 HTTPS 协议来访问的。
2. 请求API完成资源授权:用户可以通过请求 iam-authz-server 提供的 /v1/authz 接口进行资源授权,请求 /v1/authz 接口需要通过密钥认证,认证通过后 /v1/authz 接口会查询授权策略,从而决定资源请求是否被允许。为了提高 /v1/authz 接口的性能,iam-authz-server 将密钥和策略信息缓存在内存中,以便实现快速查询。那密钥和策略信息是如何实现缓存的呢?首先,iam-authz-server 通过调用 iam-apiserver 提供的 gRPC 接口,将密钥和授权策略信息缓存到内存中。同时,为了使内存中的缓存信息和 iam-apiserver 中的信息保持一致,当 iam-apiserver 中有密钥或策略被更新时,iam-apiserver 会往特定的 Redis Channel(iam-authz-server 也会订阅该 Channel)中发送 PolicyChanged 和 SecretChanged 消息。这样一来,当 iam-authz-server 监听到有新消息时就会获取并解析消息,根据消息内容判断是否需要重新调用 gRPC 接来获取密钥和授权策略信息,再更新到内存中。
3. 授权日志分析:iam-authz-server 会将授权日志上报到 Redis 高速缓存中,然后 iam-pump 组件会异步消费这些授权日志,再把清理后的数据保存在 MongoDB 中,供运营系统 iam-operating-system 查询。这里还有一点你要注意:iam-authz-server 将授权日志保存在 Redis 高性能 key-value 数据库中,可以最大化减少写入延时。不保存在内存中是因为授权日志量我们没法预测,当授权日志量很大时,很可能会将内存耗尽,造成服务中断。
4. 运营平台授权数据展示: iam-operating-system 是 IAM 的运营系统,它可以通过查询 MongoDB 获取并展示运营数据,比如某个用户的授权 / 失败次数、授权失败时的授权信息等。此外,我们也可以通过 iam-operating-system 调用 iam-apiserver 服务来做些运营管理工作。比如,以上帝视角查看某个用户的授权策略供排障使用,或者调整用户可创建密钥的最大个数,再或者通过白名单的方式,让某个用户不受密钥个数限制的影响等等。
# 四、前后端分离架构
![img](https://develop-1301758814.cos.ap-nanjing.myqcloud.com/a2e1f1cc135debd86611yya1f221c476.jpg)
采用了前后端分离架构之后,当你通过浏览器请求前端 ops-webconsole 时,ops-webconsole 会先请求静态文件服务器加载静态文件,比如 HTML、CSS 和 JavaScript,然后它会执行 JavaScript,通过负载均衡请求后端数据,最后把后端返回的数据渲染到前端页面中。
## 4.1 前后端分离优势
1. 可以让前、后端人员各自专注在自己业务的功能开发上,让专业的人做专业的事,来提高代码质量和开发效率
2. 前后端可并行开发和发布,这也能提高开发和发布效率,加快产品迭代速度
3. 前后端组件、代码分开,职责分明,可以增加代码的维护性和可读性,减少代码改动引起的 Bug 概率,同时也能快速定位 Bug
4. 前端 JavaScript 可以处理后台的数据,减少对后台服务器的压力
5. 可根据需要选择性水平扩容前端或者后端来节约成本
# 五、MVC架构
如果运营系统功能比较少,采用前后端分离框架的弊反而大于利,比如前后端分离要同时维护 2 个组件会导致部署更复杂,并且前后端分离将人员也分开了,这会增加一定程度的沟通成本。同时,因为代码中也需要实现前后端交互的逻辑,所以会引入一定的开发量。这时候可以采用MVC架构。
![img](https://develop-1301758814.cos.ap-nanjing.myqcloud.com/a23b8ba92705710c694fd7cb99812feb.jpg)
- View(视图):提供给用户的操作界面,用来处理数据的显示。
- Controller(控制器):根据用户从 View 层输入的指令,选取 Model 层中的数据,然后对其进行相应的操作,产生最终结果。
- Model(模型):应用程序中用于处理数据逻辑的部分。
MVC 架构的好处是通过控制器层将视图层和模型层分离之后,当更改视图层代码后时,我们就不需要重新编译控制器层和模型层的代码了。同样,如果业务流程发生改变也只需要变更模型层的代码就可以。在实际开发中为了更好的 UI 效果,视图层需要经常变更,但是通过 MVC 架构,在变更视图层时,我们根本不需要对业务逻辑层的代码做任何变化,这不仅减少了风险还能提高代码变更和发布的效率。
除此之外,还有一种跟 MVC 比较相似的软件开发架构叫三层架构,它包括 UI 层、BLL 层和 DAL 层。其中,UI 层表示用户界面,BLL 层表示业务逻辑,DAL 层表示数据访问。在实际开发中很多人将 MVC 当成三层架构在用,比如说,很多人喜欢把软件的业务逻辑放在 Controller 层里,将数据库访问操作的代码放在 Model 层里,软件最终的代码放在 View 层里,就这样硬生生将 MVC 架构变成了伪三层架构。
\ No newline at end of file
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册