一、背景
-
近年来,随着科技的迅速发展和互联网的普及,线上点餐成为了一个蓬勃发展的行业。然而,在目前的美国市场上,线上点餐业务相对较少。为了在这个市场上打开局面,我们决定推出一款全新的点餐软件—diancan。
-
Java语言是一种广泛使用的编程语言,以其跨平台性、安全性和稳定性而闻名。通过使用Java语言,我们将能够更好地处理用户的请求、提升系统的并发访问能力,并且能够更方便地与其他系统对接。不仅如此,Java语言还拥有丰富的开发工具和强大的社区支持,可以为我们带来更多的开发便利和技术支持。
-
除了语言的选择,我们还选择微服务架构的应用。微服务架构将整个系统划分为多个小而自治的服务,每个服务都负责一个特定的功能模块。这种架构设计有助于提高系统的灵活性、可伸缩性和容错性,同时也方便团队协作和系统的迭代升级。
-
重新搭建点餐系统需要耗费大量的人力和资源,但我们坚信这是值得的。通过使用java语言微服务架构开发diancan,我们将能够为用户提供更流畅、更稳定、更智能的点餐体验。无论是在功能上还是在用户界面上,我们都将尽力做到极致,让用户感受到真正的便捷和舒适。
-
随着diancan的推出,我们相信线上点餐业务将在美国市场上迎来新的机遇和挑战。我们期待着与合作伙伴一同促进这个行业的发展,为用户带来更多的选择和便利。
二、目标
-
为餐饮行业提供一体化的点餐解决方案。
-
提升用户体验。
-
提高管理效率。
-
增强营销能力。
-
收集和分析订单和顾客数据,为餐厅提供有价值的业务洞察,帮助餐厅进行市场分析、客户行为分析和菜品销售分析等,从而为餐厅决策提供科学依据。
-
提高营收效益
三、架构梳理
-
产品形态
-
点餐多租户SaaS架构
-
多租户概念
-
多租户技术或称多重租赁技术,它是一种软件架构技术,目的是为了让多用户环境下使用同一套应用程序,且保证用户间数据隔离。
-
-
多租户数据隔离方案
-
独立服务,独立数据库
-
独立数据库即一个租户一个数据库,这种方案的用户数据隔离级别最高,安全性最好,但成本较高。
-
优点:
-
为不同租户提供独立数据库,有助于简化数据模型的扩展设计,满足个性化需求;
-
如果遇到故障时,数据恢复简单。
-
-
缺点:
扩大了数据库的安装和运维数量,随之带来维护成本和购置成本的增加。
-
-
-
共享服务,共享数据库,独立表空间
-
多个租户或所有租户共享数据库,但每一个租户提供一个Schema的方式。
-
优点:
-
一定程度的逻辑数据隔离(并非完全),可满足较高程度的安全性保障;
-
每个数据库,可支持更多租户数量;
-
-
缺点:
-
跨租户统计数据实现难度大
-
-
-
-
共享服务,共享数据库,共享表
-
所有的租户共享同一个数据库、同一个Schema,但是租户之间的数据隔离通过在数据表中添加TenantID属性进行实现。
-
优点:
-
每个数据库可支持租户数量多,维护和购置成本低;
-
-
缺点:
-
隔离级别低,数据安全性低,在应用开发时需做大量安全开发工作,提高研发成本;
-
需要逐表逐条备份和还原数据,数据备份和恢复困难。
-
-
-
-
-
产品目标分析
-
餐饮商户分类
-
大型连锁品牌餐饮商:
-
有自研能力,有能力为自身餐饮体系提供一整套的餐饮解决方案
-
-
中型连锁餐饮:
-
使用Saas服务商餐饮系统+私有化定制
-
-
小型连锁餐饮
-
使用Saas服务商餐饮系统
-
-
单店餐饮店:
-
使用Saas服务商餐饮系统
-
线下人工点餐
-
-
-
自身系统目标是什么?
-
前期目标以单店餐饮、小型连锁餐饮为主
-
-
-
结论:结合自身定位发展和数据安全性和部署成本考虑
-
以商家客户中心,以品牌为租户颗粒度,使用共享数据库,独立表空间的多租户方案
-
跨租户统计数据解决方案
-
构建数据平台,实现各个租户的数据集中管理和统一查询,根据业务需求选择数据视图、数据接口、数据同步的方式进行
-
-
-
-
水平分层架构原则
-
基本原则
-
上层服务依赖下层服务,下层服务不应该依赖上层服务。
-
同一层次的服务可以相互调用,但要绝对避免一个调用链路上服务循环依赖。
-
领域层才会依赖DB,其他层次不应该依赖DB
-
随着业务的发展变化,服务也在演化,演化的方向是功能逐步下沉
-
服务层次从上到下,服务数量逐渐减少。服务变动频率由上到下逐渐变小。
-
-
应用层
-
应用层是系统的顶层,负责直接面向与用户交互的逻辑和业务。
-
-
网关层:网关层通常不涉及业务逻辑的处理,用于管理和路由来自客户端的请求,并将请求转发给底层的服务。
-
Web API
-
提供多端API(APP、PC、H5)。
-
多数据支持(JSON、XML、YAML、Form Data、...)。
-
数据校验:数据完整性。
-
权限检验:请求合法性。
-
-
交互逻辑
-
服务编排:服务路由和请求转发,根据业务需求将多个微服务按照特定的逻辑顺序进行调用,以满足用户的请求。
-
数据转换:将从系统内部获取的数据进行模型转换,将原有数据结构转换为更适合在Web API中传输的数据结构,以便于前端页面的展示和用户的交互
-
异常处理:发生的错误、异常流程的处理和错误信息的返回。
-
-
-
流程层
-
聚合服务:将底层的服务或功能进行组合,提供更高层次的功能服务。聚合层的设计关注于服务组合、功能整合和接口封装,以方便上层系统或应用的调用。
-
逻辑流程服务:将复杂的业务逻辑分解为多个步骤或子任务,并通过服务的方式进行封装,使得业务逻辑的实现更加清晰和可维护。
-
-
领域层
-
业务领域:包含业务逻辑和规则的核心部分,负责处理业务实体和业务规则,对数据进行验证、计算和持久化等操作。
-
数据领域:负责和持久化数据进行交互,包括与数据库、缓存、文件等数据源进行通信,封装数据操作的细节。
-
-
-
服务架构
根据不同的业务阶段和诉求不同,通过分层复用和动态边界的指导原则,可以根据不同的业务阶段和诉求,合理划分和组织这些层次的能力,实现灵活的业务需求支持。这样的架构设计可以提高代码的复用性和可维护性,同时也满足不同业务需求的变化和调整。
-
用户应用层:是面向不同角色用户的前端系统,通过提供用户界面和交互方式,与用户进行交互和数据传递。
-
服务层:是用户应用层的业务功能逻辑,将业务功能进行拆分和聚合,依赖底层能力和基础能力,实现具体的业务需求。
-
领域层:是对业务的抽象,关注系统的业务逻辑和领域知识,负责处理核心业务规则和操作,通过领域模型和领域服务等方式来实现。
-
基础设施:是应用中的基础设施,提供必要的功能和服务,为上层提供支持,例如操作系统能力、网络通信能力、数据存储与管理能力等。
四、技术架构
-
技术栈
-
前端:
-
Vue:是一款简单易用、高效灵活的前端框架,它通过响应式数据绑定、组件化开发和虚拟DOM等特性,使开发者能够快速构建交互式、可维护的Web应用。它的生态系统丰富,易于学习和使用,因此被广泛应用于各种规模的项目中
-
UniApp:是一款基于Vue.js的跨平台开发框架,它可以帮助开发者使用一套代码同时创建Android、iOS以及Web应用。UniApp将原生开发中的核心逻辑和界面展示进行了解耦,开发者只需要编写一次代码,UniApp会根据不同平台进行编译和适配,实现真正的跨平台开发。
-
-
网关:
-
Nginx:是一款高性能、可靠且灵活的服务器软件,被广泛应用于Web服务器、反向代理、负载均衡等场景。其简单的配置文件和效率高的处理能力,使其成为许多网站和应用的首选服务器。
-
SpringCloudGateway:Spring Gateway是一个基于Spring Cloud的API网关,提供了丰富的功能和灵活的配置方式。它可以用于实现统一的路由、负载均衡、安全认证、请求转发和限流等功能,将多个微服务整合在一个入口,简化了微服务架构的复杂性和提高了系统的可扩展性。
-
-
服务:
-
SpringBoot:一款简化Spring应用开发的框架,通过约定优于配置的方式提供了开箱即用的特性和功能,大大简化了开发和部署的过程。它适用于各种类型的应用程序,包括传统的Web应用、RESTful服务、批处理作业、微服务等,在Java开发领域具有广泛的应用和影响力。
-
SpringCloud:是一套构建分布式系统的开发工具集,通过集成和整合各种组件,为构建微服务架构提供了一系列解决方案和模块,简化了微服务环境下的开发和部署,提高了系统的可扩展性和稳定性。它是在Spring框架基础上的延伸,与Spring Boot相结合,为开发者提供了一套完整的微服务解决方案。
-
SpringCloudAlibaba:基于Spring Cloud的拓展,提供了阿里巴巴开源组件的集成和支持,用于构建分布式微服务系统。提供了服务注册与发现、配置管理、负载均衡、熔断降级、消息中间件等功能,简化了微服务架构的开发和管理,提高了系统的可靠性和性能。
-
OpenFeign:是一个声明式的HTTP客户端,开发者可以更方便地调用其他服务的接口,减少了重复的代码编写和配置工作,提高了开发效率。同时,配合Spring Cloud的其他组件,可以实现服务的负载均衡、断路器等功能,提高了系统的稳定性和可靠性。
-
Ribbon:用于客户端负载均衡的组件,通过选择合适的负载均衡策略和容错机制,实现了请求的分发和容错处理。它与Spring Cloud无缝集成,是构建分布式微服务系统不可或缺的一部分。
-
RabbitMq:是一个开源的消息队列中间件,实现了高效可靠的消息传递机制,可以实现应用程序之间的解耦和异步通信,提高系统的可维护性和可伸缩性。它被广泛应用于分布式架构、微服务架构、消息驱动的系统等领域。
-
kafka:是一个分布式的流处理平台和消息队列系统,用于大数据处理、日志收集和分析、消息通信等场景。它具有高可靠性、高吞吐量和可伸缩性的特点,可以帮助构建高效可靠的事件驱动架构。
-
SpringCloudAdmin:是一个用于管理和监控分布式系统的前端UI界面,可以实时监控和管理微服务,包括查看微服务的运行状态、收集监控数据、进行错误追踪等,帮助开发者快速定位和解决问题,提高系统的可靠性和可维护性。
-
Sentinel:是阿里巴巴开源的一款流量控制和熔断降级的框架,用于保护分布式系统的稳定性和可靠性。它提供了实时的流量监控、规则配置和控制台展示等功能。
-
SkWalking:是一个开源的分布式系统性能监控和追踪分析工具,可以深入了解分布式系统的性能状况,快速定位和解决性能问题,提高系统的可靠性和性能。它适用于微服务架构、云原生应用和分布式系统的监控和优化。
-
ELK:指Elasticsearch、Logstash和Kibana三个开源工具的组合,应用于日志分析、系统监控、业务分析等场景。它能够帮助用户对大量的日志和数据进行实时分析和可视化展示,从而提升系统的可观测性、故障排查的效率,并从数据中发现问题和机会。
-
Seata:是一个开源的分布式事务解决方案,致力于解决分布式事务的一致性和可靠性问题。它提供了高性能、易于使用的分布式事务管理能力,能够保证分布式系统中的各个业务操作的一致性。
-
MybatisPlus:是一款基于MyBatis的增强工具,能够简化MyBatis的开发流程,提供更多的便利功能和增强特性。Mybatis-Plus的目标是提高开发效率,减少重复代码的编写,提供更加优雅和简洁的方式操作数据库。
-
Knife4j:是一款开源的Java接口文档生成工具,它基于Swagger构建,提供了更加强大、美观和易用的接口文档展示和管理功能。
-
Hutool:是一个Java工具包,它提供了一系列的工具类和方法,旨在简化Java开发中常见的任务,提高开发效率和代码质量。
-
EasyExcel:用于快速读写Excel文件。它提供了高性能、低内存占用的Excel操作能力,简化了Java中对Excel文件的读写操作,提供了方便和高效的Excel数据处理能力,适用于各种Java项目中的Excel处理需求。
-
Sa-Token:是一个个基于Java的轻量级权限认证和会话管理框架。它提供了一套简单易用、灵活且安全的认证和授权解决方案。
-
Nacos:是一个功能强大的服务治理平台,支持云原生架构的服务注册、配置管理和服务发现等核心功能。它已经被广泛应用于微服务架构和云原生应用开发中,得到了许多开发者和企业的认可和使用。
-
xxl-job:是国内一家知名的分布式任务调度平台,提供了可靠高效的定时任务调度和管理功能。被广泛应用于各种项目中,特别适合于需要大规模任务调度和管理的分布式系统和微服务架构。
-
-
数据
-
Mysql:是一种开源的关系型数据库管理系统,广泛应用于各种Web应用和数据驱动的应用程序中。提供了强大的数据管理和处理能力,适用于各种规模的应用和项目。
-
Redis:是一个高性能、多功能的内存数据存储系统,适用于各种场景下的数据缓存、高速读写、实时消息传递以及分布式系统的数据处理等需求。
-
ElasticSearch:是一个强大而灵活的搜索和分析引擎,被广泛应用于各种领域,包括电子商务、日志分析、实时监控、搜索引擎等。它提供了高性能、易用性和可扩展性,为处理和分析大规模数据提供了强大的工具和平台。
-
Minio:是一个灵活、可靠和易用的对象存储服务器,可以在分布式环境下提供高性能的存储服务。它适用于各种应用场景,包括数据备份和归档、云原生应用、多媒体存储和共享等。通过Minio,用户可以轻松地搭建和管理自己的对象存储平台,满足不同规模和需求的存储需求。
-
-
持续集成
-
K8S:是一个强大、灵活和可靠的容器编排和管理平台,用于简化和自动化容器化应用程序的部署、扩展和管理。它提供了丰富的功能和灵活的配置选项,支持各种应用场景和规模。
-
Docker:是一个开源且功能强大的容器化平台,它简化了应用程序的打包、部署和管理。
-
Github:是一个面向开发者的网站和平台,提供了基于Git版本控制系统的代码托管服务。它为开发者提供了一个集中存储、协作和共享代码的平台,并且具备丰富的协作、管理和部署工具。
-
Jenkins:是一个开源的自动化构建和持续集成工具,用于自动化构建、测试和部署软件项目。它能够集成各种代码管理和构建工具,提供了一种自动化的方式来进行软件开发和交付。
-
Maven:是一个强大且灵活的项目管理和构建工具,可以帮助开发者管理项目依赖、自动化构建过程,并提供了一套标准化的项目构建生命周期。通过使用Maven,开发者可以提高开发效率、降低项目依赖管理的复杂性,并实现更可靠和高效的软件构建。
-
Sonar:是一个开源的代码质量管理平台,用于进行静态代码分析和代码质量评估。它提供了一系列静态代码分析规则和指标,帮助开发者发现和修复代码中的潜在问题,并提高代码的可读性、可维护性和可靠性。
-
-
-
后端服务结构
-
stackdin
-
stackdin-gateway //网关模块
-
stackdin-auth //认证中心
-
stackdin-common //通用模块
-
stackdin-common-core //核心模块
-
stackdin-common-security //安全模块
-
stackdin-common-redis //缓存模块
-
stackdin-common-datasource //数据源
-
stackdin-common-swagger //接口文档
-
stackdin-common-es //es日志收集
-
-
stackdin-modules //业务模块
-
...
-
-
stackdin-monitor //监控中心
-
stackdin-monitor-admin //应用监控
-
-
-
五、部署架构
-
服务架构的高可用性和扩展性解决方案
-
冗余无单点
-
保证系统的各个节点在部署时是冗余的,没有单点。
-
-
水平扩展
-
通过容器化技术和容器编排工具,Kubernetes和Docker,实现自动化的水平扩展。根据业务需求和监控数据,动态地添加或移除服务实例,以满足不同负载和并发需求。
-
-
柔性事务
-
根据服务需求,基于CAP理论,我们保证服务的可用性、分区容错性和最终数据一致性
-
采用异步通信方式,使用消息队列进行服务间的解耦,减少服务间的依赖和影响。
-
-
-
系统降级
-
当系统问题无法在短时间内解决时,考虑尽快止损,为故障支付尽可能小的代价
-
使用Sentinel进行限流、降级、熔断
-
针对具体的功能,我们设置功能开关,根据配置文件开关设置,灵活决定是否执行这部分逻辑。
-
-
-
分布式数据管理
-
采用数据库主从复制、缓存集群策略,提高数据的访问性能,实现高可用和容错。
-
定期进行数据备份,确保数据的安全性和可用性。
-
-
实施自动化运维
-
通过容器化技术和容器编排工具,Kubernetes和Docker,实现自动化的构建、测试和部署。减少人工干预,提高系统的稳定性和可靠性。
-
-
监控与告警
-
通过ELK,收集、存储和分析监控数据,监测微服务架构中的关键指标及时发现异常情况,并采取相应的措施。
-
-