更美成立于2013年,旗下更美App是专业医美平台, 提供整形、微整形、齿科、眼科、抗衰老等消费医疗服务。更美App平台的业务主要分为三大部分:医美用户社区、健康服务电商及特卖、企业级医疗机构应用平台。 更美致力于帮助求美者更高效地找到合适的医生,降低消费风险;也帮助医生塑造个人品牌。
#
更美的开发环境发展历程#
更美架构介绍更美目前的整体技术架构形式为微服务+多语言,基于云厂商进行容器化部署。微服务基于功能分为业务逻辑层、核心服务层、底层服务层。
#
最初的本地开发环境#
开发模式在更美基础团队最初的开发模式中,所有的开发和调试工作都是在本地进行的。在上面提到的服务分层,业务逻辑和核心服务是最常变动开发的服务。底层服务层相对稳定,例如passport服务,一般不会变动,提供基础的接口支持。开发人员在个人开发环境运行服务、调试代码。联调服务时,在办公网络下暴露自己电脑的网络接口。底层服务只作为服务端,不会作为客户端请求其他服务,可以部署在云端测试环境,通过打通办公网络与云端测试环境网络的方式,暴露给开发人员。
#
存在问题在这种开发模式下,存在如下几个问题:
- 开发人员本地微服务环境难以搭建。在微服务的架构下,一套环境有几十个微服务,每个服务都需要相对独立的运行环境。
- 开发人员需要在本地同时运行多个服务,对开发机的要求极高。一般的个人笔记本电脑难以支撑及时升级配置,也难以完成支撑一整套测试环境的运行,极大的提升成本,降低开发效率。
- 测试环境供不应求,资源冗余,成本上升。开发环境与测试环境分离,需求开发完成提交代码到测试环境时,尝尝遇到上一个需求还在测试中,占用环境阻塞提测。
- 创建多套完全独立的测试环境,在一定程度上可以缓解阻塞的情况,但是带来了更多的资源冗余问题。每一套环境,都需要跑整套的微服务、底层数据和配置管理。资源消耗、运维压力都很大。
- 在业务需求多、周期紧张的情况下,仍旧无法很好的支持多分支、多feature并行开发、并行测试的需求
#
基于GitOps的云原生开发环境#
什么是GitOpsGitOps 是一套使用 Git 来管理基础架构和应用配置的实践,GitOps 在运行过程中以 Git 为声明性基础架构和应用的单一事实来源,Git 仓库包含系统的全部状态(集群部署的mainfest file)。
#
新环境架构及现状面对之前存在的种种痛点和问题,我们的架构运维团队一直在探索和优化整体的架构新模式。首先,服务部署形式全部容器化,由主机部署模式,转变为基于k8s的容器化部署。引入了多种开源工具,基于云原生生态,搭建了一整套的自动化开发测试体系。实现了整个开发测试流程运维无介入的GitOps体系。极大的解放了人力,提高的迭代效率。
在新的测试环境体系中,为了解决多分支、多feature并行测试的需求,我们引入了serviceMesh工具Istio,做流量管理。通过Istio流量分发,串联多套测试环境。测试环境维护一套基于当前线上最新分支构建的base环境。所有微服务在未进入开发周期中,只保持base环境的最小化运行。进入开发周期的微服务,可以在根据命名规范切出对应分支后,部署对应分支环境,测试流量通过Istio IngressGateway进入后,根据不同的规则进行路由。实现了一套基础环境+多套feature环境的大测试集群。
整体环境的自动化流转基于git代码提交来实现,在代码提交后,自动实现镜像构建、容器发布、流量切换、群通知,极大提升开发迭代效率。主要实现如下能力:
- 一套base测试环境,减少资源冗余
基础环境同步当前线上最新代码,自动触发部署。确保base环境永远与生产环境相同
- 多套feature环境
根据分支命名规则,同feature下的不同微服务形成一套小环境,流量与其他feature隔离;
各feature对应的小环境相互独立;
feature中的服务请求到了不在开发中的微服务,把流量路由到base环境。实现底层服务的对多环境共享。
开发、测试环境一体化。在独立feature环境下完成开发联调和提测。
- GitOps自动化运维体系
基于git代码的变更实现自动化流程的运转
基于git仓库来声明整体的基础架构
#
基于coding的CICD体系在持续集成阶段,我们采用git+jenkins+docker镜像仓库来实现。符合开发命名规范的代码分支变更后,触发jenkins的构建流程,完成后push镜像到仓库。
在持续交付阶段,采用的是Netflix 开源持续交付平台 Spinnaker。在CI流程完成后触发CD流程,spinnaker自动完成新分支版本的创建、部署、流量分发及结果通知触发。
后续我们逐步把CD流程在逐步迁移到腾讯云的coding平台。coding的CICD发布体系,也是基于jenkins+spinnaker来实现,并进行了一系列优化。与我们的技术栈非常契合,迁移成本非常小,能有效降低我们的运维成本。
目前我们的生产环境已经完成全部迁移,可以基于coding发布单实现服务的快速发布。整体发布过程由开发人员提交发布,测试人员确认后,即进入自动化发布流程。相比之前的上线开发与测试线下沟通确认可上线后,再找运维来处理发布,更加合理也更加灵活。
#
当前主要痛点- 开发测试阶段如何快速联调应用。在当前的架构形式下,整体的流程都是正常运转的。但是开发人员的code环境和开发联调、测试环境是分离的,每一次修改都需要数分钟的时间等待CICD流程的完成,才能实际验证修改效果。比较影响开发人员的开发体验,降低工作效率。
- 初始开发环境构建难度大。本地仍旧需要开发人员针对不同的微服务,设置不同语言、甚至不同语言版本的开发环境。微服务越多,本地开发环境越难以搭建。新入职的初级开发工程师,甚至需要花费数天乃至一周来搭建自己的开发环境。
#
Nocalhost的到来为了解决目前最主要的痛点,我们一直在调研本地容器化开发、云端开发等各种开发模式与开发工具,来提升开发体验。我们调研过多种方案与工具,最终发现Nocalhost的出现,非常契合我们目前的架构体系,也能最大程度解决我们现在遇到的痛点。
#
Nocalhost是什么根据官网介绍,Nocalhost 一词源于 No Local,它是一款基于 IDE 的云原生开发工具,提供实时的云原生应用开发体验。
在Nocalhost中开发基于云端的应用时,任何代码更改都可以立即在远程端生效,无需重新构建新镜像。这可以缩短整个开发反馈循环周期并大幅提高研发效率。有团队把nocalhost称之为容器时代的rsync工具。
#
Nocalhost带来了什么开发中的优势:
- 环境一致性:开发环境与生产环境统一由运维团队维护和部署,整体环境一致性非常高;
- 反馈及时性:在nocalhost开发模式下,开发人员在IDE中的代码编辑可实现保存即生效,与本地开发没有太大差别;
- 环境易搭建:即使是新人入职,本地没有开发环境。那他在常用的IDE中安装插件后,运维提供授权即可连接云端K8S测试集群,即时进入coding状态;
- 资源易拓展:开发不再受限于开发机的计算资源,可随时借助云端集群扩展资源。
#
Nocalhost in 更美下图是一张通过Nocalhost VScode插件进入云端的开发模式,左侧可以遍历显示所有容器的当前开发状态,代码编辑窗口的保存可实时同步到容器触发重载;最下面的终端其实是已经远程到容器内的输出了,可以看到容器内running进程的实时反馈。
可以看到,在进入nocalhost开发模式后,完全可以实现类似于本地开发模式的即改即生效的效果,开发过程非常舒适。对于编译型语言,既可以在本地编译,也可以直接在云端编译。
根据参与体验的开发人员反馈,使用nocalhost开发,能大约提升30%的开发效率,效果非常可观。我们也在与nocalhost团队保持沟通、持续反馈使用体验和过程中遇到的一些问题,希望这款工具能越来越好。我们也会尝试在团队内继续推进工具的落地,助力我们进一步提升团队工作效率。十分期待nocalhost的进一步发展