珍爱网微服务底层框架演进——从开源组件封装到自研

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 珍爱网微服务底层框架演进——从开源组件封装到自研


作为一家拥有 17 年历史的婚恋交友网站,珍爱网经历过业务规模爆发性增长,系统出现瓶颈,业务经历了微服务拆分、链路优化、上云、容器化、双云双活等发展历史,在每个技术环节都有相应的思考,在反复地暴露问题、解决问题之后,最终沉淀出一套珍爱特色的微服务治理架构。以下是珍爱网 CTO 彭万亮老师对架构的解读。

下图是珍爱网底层框架整体架构图,黄色部分是基础的工具类,项目公用的一些配置;紫色部分是扩展的插件,使用插件是因为涉及到流程控制,例如容器化、单元化、发布流程、日志(监控);蓝色部分是用的 Springboot 的快速启动方便大家接入项目中。

其中蓝色部分是珍爱网自研的组件,比如优雅停机,延迟回调,数据库缓存同步,上报,异步任务,字节码增强,调度任务;绿色部分是对优秀开源组件进行封装或者二次开发,对于数据库、缓存、队列、异步等的操作进行了管理,大大减少问题的发生次数。

服务框架层——微服务拆分

架构上独立业务一个服务,拆分的法则有很多,需要理论 + 经验 + 实践,大家需要注意的是,将业务改成树状的调用,去除网状层调用,另外需要验证实际效果,我们将 Spring Cloud 的 RPC 方案和 Dubbo 的 RPC 方案做了一下压测,Dubbo 的 TPS 的确优于 Spring Cloud,但是没有网上很多资料呈现的那么明显,实际效果和实验室效果存在差异,我们去做这个测试核心是让你能更好预估系统的能力。

网关层建设

除了本身核心路由功能外,还扩展了一些能力:基于 Sentinel 的熔断限流(进行二次开发),统一返回(出参入参标准化,包体结构,异常返回码),重试优化(Connect 的异常),优雅停机,启动预热。

数据框架层

第一个要做的就是数据层按照业务拆分,我们也是正好借用上云这个契机,整体需要做数据迁移,对数据重新规划。

第二,去除数据库中间层,为了提升性能和稳定性,引入 Sharding-JDBC(3.1.0,有些现在版本已经完善了),我们在底层框架上也提供了分库分表算法、ID 生成规则、路由工具类等工具,并且我们自研了一套配置管理,给我们后续的治理工作也带来了很大的便利,首先对于数据库的配置,我们希望统一进行管理,所有数据库配置在一个目录下面,交给架构组来维护,项目配置可以由业务团队负责(Nacos 实现),在 Git 上建了一个项目,里面是所有项目的数据库层配置,大家 Git 上提交配置之后,由架构组来发布,里面会涉及一些配置检查,尤其是分片规则的配置上,特别容易配置错,发布完成之后,我们通过对配置进行转换(二次开发),使用 ZK 监听让应用层和代理层做到同时的更新,为我们做大表无缝切换,带来了极大的便利,涉及到配置更新。

那怎么刷新数据库链接,如图所示:

里面会有坑,数据库瞬时面临翻倍的连接,对于本身连接数过高的数据库,会直接造成数据库崩溃,所以需要大家自己根据业务进行平衡。

另外一个常见的需求就是怎么把一张大表进行分表并且在不停机的情况下完成,全量数据采用 Dump 的方式,增量的数据我们通过 otter 同步数据,采用 ShardingProxy(上面配置分库分表规则)的方式写入到新表中,验证数据一致之后,我们把配置直接刷新,应用端便能直接切换完成,如果还有连接没有切换过来会怎么样,老的数据依旧会通过 ShardingProxy 写过去(现在 Sharding-Scaling),如图所示

另外我们还有一些和原作者的交流,有些他们不支持的地方,我们也做了一些二次开发,有些他们后续的版本也进行了采纳,比如一表多分片键(场景:动态表需要根据动态 ID 查询,也需要根据用户 ID 查询,避免了非分片建的全表扫描)、时间分片键如何做到不等式的路由(场景:日志业务,避免了区间查询的全表扫描),我们识别出分表键为时间,并且存在动态结构,也能自动定时创建表,我们经过调试发现性能上的问题。

服务治理层 发布框架

基于 Maven 的插件开发,自研 Zhenai-Dockerx-PlugIn 插件,让应用透明接入 Docker、Kubernetes。

参数校验,构建镜像,发布部署都由插件完成,开发只需执行 MVN Test 命令,便完成了容器化部署到测试环境,效率大大提升。

并行发布测试

微服务架构下,如何做到并行开发,需要有一套稳定服务,部署上只部署修改的分支涉及的微服务,通过 Zone 的方式进行流量染色,客户端可以通过在 Header 里面埋 Zone 的方式,也可以通过 Nginx 暴露固定 IP 生成 Zone 的方式,进行流量的全链路路由,另外要注意中间件也需要按照 Zone 进行路由。

发布流程改造

回到整个发布流程环节,开发人员只需要执行 MVN Test,其余的环节通过 Webhook 的钩子实现联动,在验收人员进行生成环境发布之后,会打一个正式的 tag,并触发钩子将正式环境也更新到测试的稳定服务中。

单元化改造

若一个业务引起了基础服务问题,那么将会影响到所有业务,利用容器部署的便利性,只要依赖单元化组件的项目,生产部署文件的同时增加项目名称,多运行一套环境,即可实现单元化,要注意的是注册中心正确路由和配置中心区分配置项,网关也同样需要单元化,后面甚至可以延伸到整个业务进行单元化。

双云架构

以上的内容仅是珍爱网微服务架构升级的一部分,实践过程中遇到过很多痛点,如业务技术发展很快却不知道如何切入到业务,需要沉淀了一套自己的微服务治理底层框架,只有把底层建设好了,才能支持技术和业务的多样性发展,后续用什么样的技术方案,只需扩展底层架构就行了。

更多细节,彭万亮老师会在将于 7 月份举办的 ArchSummit 全球架构师峰会(深圳站)2022 上详细阐述,希望帮助听众在面对一个庞大系统问题时,能够进行多维度分析与持续改进,同时,构建一套行之有效的自有架构。

相关文章
|
1月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
101 3
|
1月前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
2月前
|
Dubbo Java 应用服务中间件
微服务框架Dubbo环境部署实战
微服务框架Dubbo环境部署的实战指南,涵盖了Dubbo的概述、服务部署、以及Dubbo web管理页面的部署,旨在指导读者如何搭建和使用Dubbo框架。
223 17
微服务框架Dubbo环境部署实战
|
2月前
|
Kubernetes Java Android开发
用 Quarkus 框架优化 Java 微服务架构的设计与实现
Quarkus 是专为 GraalVM 和 OpenJDK HotSpot 设计的 Kubernetes Native Java 框架,提供快速启动、低内存占用及高效开发体验,显著优化了 Java 在微服务架构中的表现。它采用提前编译和懒加载技术实现毫秒级启动,通过优化类加载机制降低内存消耗,并支持多种技术和框架集成,如 Kubernetes、Docker 及 Eclipse MicroProfile,助力开发者轻松构建强大微服务应用。例如,在电商场景中,可利用 Quarkus 快速搭建商品管理和订单管理等微服务,提升系统响应速度与稳定性。
68 5
|
2月前
|
存储 Java Maven
从零到微服务专家:用Micronaut框架轻松构建未来架构
【9月更文挑战第5天】在现代软件开发中,微服务架构因提升应用的可伸缩性和灵活性而广受欢迎。Micronaut 是一个轻量级的 Java 框架,适合构建微服务。本文介绍如何从零开始使用 Micronaut 搭建微服务架构,包括设置开发环境、创建 Maven 项目并添加 Micronaut 依赖,编写主类启动应用,以及添加控制器处理 HTTP 请求。通过示例代码展示如何实现简单的 “Hello, World!” 功能,并介绍如何通过添加更多依赖来扩展应用功能,如数据访问、验证和安全性等。Micronaut 的强大和灵活性使你能够快速构建复杂的微服务系统。
93 5
|
2月前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
74 2
|
2月前
|
Cloud Native 安全 Java
Micronaut对决Spring Boot:谁是微服务领域的王者?揭秘两者优劣,选对框架至关重要!
【9月更文挑战第5天】近年来,微服务架构备受关注,Micronaut和Spring Boot成为热门选择。Micronaut由OCI开发,基于注解的依赖注入,内置多种特性,轻量级且启动迅速;Spring Boot则简化了Spring应用开发,拥有丰富的生态支持。选择框架需考虑项目需求、团队经验、性能要求及社区支持等因素。希望本文能帮助您选择合适的微服务框架,助力您的软件开发项目取得成功!
157 2
|
3月前
|
Cloud Native JavaScript API
一文读懂云原生 go-zero 微服务框架
一文读懂云原生 go-zero 微服务框架
|
5月前
|
开发框架 移动开发 JavaScript
SpringCloud微服务实战——搭建企业级开发框架(四十七):【移动开发】整合uni-app搭建移动端快速开发框架-添加Axios并实现登录功能
在uni-app中,使用axios实现网络请求和登录功能涉及以下几个关键步骤: 1. **安装axios和axios-auth-refresh**: 在项目的`package.json`中添加axios和axios-auth-refresh依赖,可以通过HBuilderX的终端窗口运行`yarn add axios axios-auth-refresh`命令来安装。 2. **配置自定义常量**: 创建`project.config.js`文件,配置全局常量,如API基础URL、TenantId、APP_CLIENT_ID和APP_CLIENT_SECRET等。
217 60
|
3月前
|
开发框架 Dubbo 应用服务中间件
微服务开发框架-----Apache Dubbo
这篇文章介绍了Apache Dubbo微服务开发框架,它提供RPC通信和微服务治理能力,支持服务发现、负载均衡和流量治理等功能,并强调了Dubbo在微服务规模化实践和企业级治理方面的优势。
微服务开发框架-----Apache Dubbo