我的技术回顾因ABP框架触发DevOps云原生之路-2020年

 我的技术回顾:

我居然把这个系列坚持下来了,感觉真的是超级棒!感谢小伙伴的支持!以及督促。

2020年,我开始往非.NET技术方向发展,也就是DevOps和容器化解决方案发展。当然最后落地了之后,发现这就是各大厂商所开始推广的云原生解决方案。

ABPVnext源代码引发的思考

20年因为疫情的缘故,大家都没有办法出门,所以得空好好看看ABPVnext的源码,把握技术的发展趋势。在看ABP框架的微服务整套解决方案的时候,我发现了一个非常好玩的点,土牛为了严格遵循ABP模块化的规范,将所有的业务模块以及通用模块化拆分的特别细致。这样就带来了一个问题。

以业务模块为例它有差不多17个模块,而每个模块下按照类库划分,又会产生8-9个类库。

e179bd2ce834242f29027659731879eb.png

账户体系下的类库划分有9个类库,而这些还不包含Angular的前端。

10c31753e0f35d3ecce59e3910eb704a.png

我们做一个简单的计算就可以知道光业务模块的后端代码他就有136个类库,这个还仅仅是业务模块,还没有包含它的所有abpvnext的源代码,而且还没有前端的解决方案。

  • 这些类库还要发布到nuget.org作为公共的工具包,给广大开发者进行使用。

  • 前端的angular方案它也被拆成了一个个独立的npm包。

  • 如果是手动管理和发布这些nuget和npm包,那就是异常灾难。

  • 电脑的配置以及内存也要足够强。

abpframework采用了github的开源仓库以及周边强大的CI工具可以白嫖这些厂商的服务。但是它还有一个商业版本的代码是不开源的,而这些商业版本的CI也是需要服务的。所以土牛的团队里面肯定是有一套完整的DevOps解决方案的,而在容器化的解决方案上一定是Docker,大可能会直接采用k8s进行管理。

当然以上虽然是猜测,后面也确实基本上证实了,abp团队是这样的方案。那么我就在想我没有土牛团队的资金以及人手,我怎么打造一套方案呢。

再次拿52abp官网练手

我手里最现成的可以练手,而且还是足够真实,属于自主可控的就是52abp的官网了。那么不用它作为练手就太可惜了。

首先把他改造成完整的Docker部署,这个不难,但是又产生了一个问题,那就是镜像版本的控制。

Docker是要容器仓库的,自己中途搭建了habor的仓库,可惜因为没钱没服务器难产。

  • 作为微软MVP迁移到了微软Azure所提供的仓库,但是尴尬的就是因为是global的仓库,导致网速跟不上。

  • 白嫖的阿里云个人仓库真香,当然我的视频在线播放用的是阿里云VOD,也算是他的小客户了。

然后把配合Nginx加上docker swarm把52abp做成了双节点,后来发现是没有必要的,毕竟一个日均流量2k的网站要什么集群。然后切换为了Docker-compose 来管理。

我非常建议大家都学习下Docker进行部署和管理的解决方案,有兴趣的可以前往yoyomooc进行学习,你会发现你在运维这方面会给你省太多事情了。然后就要折腾CI CD工具了。

聊聊DevOps的折腾经验

DevOps这个话题非常的大,里面要包含的内容太多了。我们简单说下几个关键点:

在20年的时候我其实发布过一篇文章《小微技术团队的DevOps体系折腾之路》链接地址:https://mp.weixin.qq.com/s/MOiRNY8a6m0YROj5NzTwMQ

DevOps要实现的几大要素:

  • 代码管理

  • 需求管理

  • 持续集成(CI)

  • 持续部署(CD)

如果您是考虑公有云的解决方案,那么就很简单了,阿里云、腾讯云、华为云、微软Azure 里面有一堆现有的解决方案,你只需要把代码托管过去,然后配置下就可以了。

毕竟I'm Rich 这个技能永不过时

而作为一名程序员尤其是想打造一套可控的解决方案的时候,就需要把代码管理、需求管理、持续集成、持续部署这些都变成自己的技能,这样才能让自己的项目和技术栈更加稳定。

代码托管工具

市场上的代码托管工具有很多:Gogs、Gitea 、Gitee、GitHub、Gitlab、Azure DevOps,这些用于管理代码,足够了。你如果还是开源项目的话,可以使用github的所有免费服务。

但是如果是私有化方案,以上都行,但是你会涉及到一个问题那就是CI CD的工具选择。

CI CD工具的选择

大部分开发者会选择使用Jenkins作为自己的第一个CI 工具,毕竟Jenkins是最常用的CI CD工具,而且老牌、资料和文档也足够多。我在17年的时候也选择了它作为CI CD工具,当时觉得没什么问题,毕竟虽然部署有点小麻烦,毕竟部署好了的服务,谁会没事去改它的环境呢。

在2019年我和陈计节在 DNT精英论坛上,作为讲师分享的时候,我们探讨Jenkins作为CI的时候,讨论过它在容器化解决方案的问题。

Jenkins虽然来市场上最早,但是因为无法做到快速的云原生部署,所以迟早会没落。我也在接触了Jenkins之后,发现他在Docker下的解决方案,确实不美好。虽然后面 Blue Ocean提供的pipeline的出现和发展让这一情况有了很大改观,但是我个人依然不推荐。

Drone 也一直是作为和Jenkins进行碰瓷的选手所存在的,后面推出了商业版本,我在研究了之后,发现确实是一个很好的选择。

在最开始的Git代码管理的时候,我看过Gogs、Gitea、gitlab等很多平台,最开始想选择Gitea的,但是在19年经历过了免费的才是的最贵的经验之后。这次选择让我不得不慎重。

在翻阅gitlab的时候,发现他的CE版本,以及它的runner CI工具,集成度非常的高。而且最大的优势在于它的很多扩展都是内置的,对于的社区也是很庞大的。而且gitlab的名气让我至少不用担心,他不会更新这种问题吧。

在确定了采用gitlab+gitlab runner 这个技术方案后。我就开始了狂奔之旅。

单独用gitlab + gitlab runner 都不难,配合docker也不难。难的是你要把所有的场景和流程都适配进去,这个时候就开始变难了。

不过好歹都解决了,不得不说 gitlab runner 可以在Docker下快速进行部署和发布的时候一切问题都迎刃而解了。

聊聊云原生的容器化

关于云原生的介绍网上有很多,我就不再阐释了。在说云原生容器化的时候,我们都会说它是最佳的载体,因为容器具备快速伸缩扩展以及销毁。

我在练习Devops流程的时候,每天要销毁和创建十几次vm虚拟机。容器的创建和销毁就更多了,这个时候就发现容器化的魅力太强了。而如果没有云基础设施的话,我要手动去维护和管理这些虚拟机,实在是太烦了。

6bceac7135992f3ee26e526b6bbd0f4c.png

尤其是在利用cloud-init配合vm机器创建的时候,一键给你部署好Docker环境,甚至你做的好点,配合脚本可以快速搭建和部署属于你自己的一套环境。而这些时间可以从2-3天的环境搭建到部署安装依赖环境,缩短到1-2个小时。

哦。到了这里,你可能问我为什么没有使用kubernetes。那是因为就52abp的情况来说,没有必要上Kubernetes,而且上了K8S,我的运维成本又会上去了。所以选择适合自己的场景永远是最好的。

尾声

21年的回顾就不用写了,因为之前已经写过差点翻车的总结吧。同时21年我的纯技术没什么提升,毕竟从目前的技术上来说能玩的都基本上玩了一遍,剩下的就是具体场景具体处理了。同时因为工作的原因接触的都是全新的工业软件这条路了。今年是22年或许到年底的时候,我会有一些新的收获和变化吧。

招个人

我的团队还缺.NET 开发 中高级工程师,薪资14-20K不等。有兴趣的可以联系下我,投个简历。

c8272333ac176c8eeac2367ab77f87a5.png

多种方式联系我们

 交流社区

QQ群:461610507

 课程网站 

yoyomooc.com

54144dac1640b86bb20e4bf51c65ab4e.png

《深入浅出ASP.NET Core》书籍配套源代码与视频下载

京东/当当均有在售

ABPFrameWork开发指南 入门文档 目 录 1 ABP总体介绍 1 1.1 入门介绍 1 1.1.1 ABP采用了以下技术 2 1.1.2 ABP框架已实现了以下特性 2 1.1.3 ABP适用的场景 4 1.2 多层架构体系 4 1.2.1 前言 4 1.2.2 ABP的体系结构 5 1.2.3 领域层 5 1.2.4 应用层 6 1.2.5 基础设施层 6 1.2.6 WEB与展现层 6 1.2.7 其它 7 1.3 模块系统 7 1.3.1 ABP模块系统简介 7 1.3.2 生命期事件 8 1.3.3 模块依赖 9 1.3.4 自定义的模块方法 10 1.4 启动配置 11 1.4.1 配置ABP 11 1.4.2 配置模块 13 1.4.3 为一个模块创建配置 13 2 ABP公共结构 16 2.1 ABP依赖注入 16 2.1.1 传统方式的问题 16 2.1.2 解决方案 18 2.1.3 依赖注入框架 20 2.1.4 ABP依赖注入的基础结构 21 2.1.5 附件 25 2.2 ABP会话管理 26 2.2.1 简介 26 2.2.2 注入会话 27 2.2.3 使用会话属性 27 2.3 ABP日志管理 28 2.3.1 服务器端 28 2.3.2 客户端 32 2.4 ABP设置管理 32 2.4.1 介绍 32 2.4.2 定义设置 33 2.4.3 设置范围 34 2.4.4 获取设置值 35 2.4.5 更改设置 36 2.4.6 关于缓存 36 3 ABP领域层 37 3.1 ABP领域层—实体 37 3.1.1 实体类 37 3.1.2 接口约定 38 3.1.3 IEntity接口 41 3.2 ABP领域层—仓储 42 3.2.1 IRepository接口 42 3.2.2 仓储的实现 47 3.2.3 管理数据库连接 48 3.2.4 仓储的生命周期 48 3.2.5 仓储的最佳实践 48 3.3 ABP领域层—工作单元 49 3.3.1 通用连接和事务管理方法 49 3.3.2 ABP的连接和事务管理 50 3.3.3 工作单元 53 3.3.4 选项 56 3.3.5 方法 57 3.3.6 事件 57 3.4 ABP领域层—数据过滤器 58 3.4.1 介绍 58 3.4.2 预定义过滤器 58 3.4.3 禁用过滤器 60 3.4.4 启用过滤器 61 3.4.5 设定过滤器参数 62 3.4.6 自定义过滤器 62 3.4.7 其它对象关系映射工具 64 3.5 ABP领域层—领域事件 64 3.5.1 事件总线 64 3.5.2 定义事件 65 3.5.3 触发事件 65 3.5.4 事件处理 66 3.5.5 注册处理器 68 3.5.6 取消注册事件 69 4 ABP应用层 71 4.1 ABP应用层—应用服务 71 4.1.1 IApplicationService接口 71 4.1.2 应用服务类型 73 4.1.3 工作单元 74 4.1.4 应用服务的生命周期 76 4.2 ABP应用层—数据传输对象 76 4.2.1 数据传输对象的作用 76 4.2.2 DTO 约定 & 验证 78 4.2.3 DTO和实体间的自动映射 80 4.2.4 辅助接口和类型 82 4.3 ABP应用层—DTO有效性验证 82 4.3.1 使用数据注解 83 4.3.2 自定义检验 84 4.3.3 设置缺省值 85 4.4 ABP应用层—权限认证 86 4.4.1 定义权限 86 4.4.2 检查权限 87 4.5 ABP应用层—审计日志 90 4.5.1 配置 91 4.5.2 通过属性来启用和禁用审计日志 92 4.5.3 说明 93 5 ABP表现层 94 5.1 ABP展现层—动态WebApi层 94 5.1.1 建立动态web api 控制器 94 5.1.2 使用动态js代理 95 5.2 ABP展现层—本地化 97 5.2.1 程序语言 97 5.2.2 本地化源文件 98 5.2.3 获得一个本地化配置文件 100 5.2.4 总结 103 5.3 ABP展现层—Javascript函数库 103 5.3.1 AJAX 103 5.3.2 通知 107 5.3.3 消息 107 5.3.4 用户界面的繁忙提示 109 5.3.5 Js日志接口 110 5.3.6 Javascript公共方法 111 5.4 ABP展现层—导航栏 112 5.4.1 创建菜单 112 5.4.2 显示菜单 114 5.5 ABP展现层—异常处理 114 5.5.1 开启错误处理 115 5.5.2 非Ajax请求 115 5.5.3 AJAX请求 117 5.5.4 异常事件 118 5.6 ABP展现层—嵌入资源文件 118 6 ABP基础设施层 119 6.1 ABP基础设施层—集成Entity Framework 119 6.1.1 Nuget包 119 6.1.2 创建DbContext 119 6.1.3 仓储 120 6.2 ABP基础设施层—集成NHibernate 124 6.2.1 Nuget包 125 6.2.2 配置 125 6.2.3 仓储实现 127 7 ABP实例一:ASP.NET Boilerplate 131 7.1 引子 131 7.2 什么是ASP.Net Boilerplate? 132 7.3 ABP不适用于那些场合? 133 7.4 开始 134 7.5 使用模板创建空的网站应用程序 134 7.6 领域层 136 7.6.1 实体-Entities 137 7.6.2 仓储-Repository 138 7.6.3 关于命名空间 139 7.7 基础设施层 139 7.7.1 数据库迁移 139 7.7.2 实体映射 143 7.7.3 仓储实现 143 7.8 应用层 145 7.8.1 应用服务及数据传输对象 145 7.8.2 DTO验证 149 7.8.3 动态Web API控制器 150 7.9 表现层 151 7.9.1 单页应用 152 7.9.2 视图和视图模型 152 7.9.3 本地化 160 7.9.4 JavaScript API 162 7.10 更多 164 7.10.1 模块系统 164 7.10.2 依赖注入和约定 165 7.11 结论 165 8 ABP实例二:单页面网站应用程序 167 8.1 简介 167 8.2 基于Abp创建应用程序 168 8.3 创建实体 169 8.4 创建DbContext 170 8.5 创建Database Migrations 171 8.6 定义仓储 173 8.7 实现仓储 174 8.8 构建应用程序服务 175 8.9 验证 179 8.10 异常处理 180 8.11 构建Web API 服务 181 8.12 开发单页面应用(SPA) 181 8.13 本地化 186
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值