使用NodeJs构建后端服务

目录

前言

起源

最近,我们启动了一个名为”工艺包加密”的项目。

作为这个项目的一部分,我们重新构建了一个基于Node.js的后端服务。

在本次分享中,我讲着重介绍这个后端服务的相关内容。

适用人群

  • 具备一定编程能力的开发者。
  • 是想向全栈工程师方向发展的开发者。
  • 管理和决策者想要初步了解业务架构体系的人。
  • 对Node.js感兴趣,想了解如何构建安全可靠的后端服务的人。

涉及内容

  • 从项目的需求和架构开始,解释为什么选择Node.js作为后端开发框架。
  • 深入探讨如何处理路由和请求,包括如何设计API接口和处理用户认证。
  • 介绍如何连接和操作数据库,提供实用的建议。
  • 如何使用Node.js构建高质量的后端服务,提供有价值的见解。

愿景

  • 学无止境,人人都是全栈工程师。
  • 让我们一起深入使用node构建后端服务,开启全栈工程师之路吧。

痛点

原因

当前针我们部分,面临的主要问题是,我们有许多老旧的Java项目,这些项目难以维护,并且我们的Java开发人员已经离职。这给我们的项目带来了一些挑战和痛点。

首先,老旧的Java项目可能存在代码有Bug、缺乏文档等问题。这使得项目的维护和改进变得困难,因为新的开发人员需要花费大量时间来理解和修改这些代码。而且,由于没有原始开发人员的支持,解决问题和调试错误也变得更加复杂。

其次,由于Java开发人员离职,我们可能面临技术咨询和知识转移的缺失。新的开发人员可能对这些老项目的技术栈和架构不熟悉,需要花费时间来学习和适应。这可能导致项目的进展缓慢,并且可能无法及时满足业务需求。

解决

为了解决这些问题,我们考虑重新构建基于Node.js的后端服务。

Node.js作为一个快速、高效和灵活的后端开发框架,可以帮助我们快速构建可扩展的应用程序。

同时,Node.js拥有庞大的开发社区和丰富的资源,可以提供技术支持和解决方案。

通过采用Node.js,我们可以摆脱老旧Java项目的束缚,重新设计和实现我们的后端服务,这将使我们能够更好地应对业务需求。

此外,Node.js的学习曲线相对较低,我们目前的开发人员已有的技术架构经过短暂的学习,就可以更快地上手并为项目做出贡献。

综上所述,我们认为采用基于Node.js的后端服务可以解决当前面临的痛点。它将帮助我们摆脱老旧Java项目的困扰,并为项目的维护和发展提供更好的基础。

同时,我们也需要积极寻找和培养具备Node.js开发经验的人才,以确保项目的顺利进行。

使用NodeJs带来的优势

谁在用

国内

阿里巴巴(Alibaba)
  • 阿里云(Alibaba Cloud):阿里云是阿里巴巴集团旗下的云计算服务提供商,他们的一些后端服务和工具是使用Node.js构建的。例如,阿里云函数计算(Function Compute)是基于Node.js的无服务器计算服务。
  • 淘宝(Taobao)和天猫(Tmall):淘宝和天猫是阿里巴巴旗下的电子商务平台,他们的一些后端服务和实时应用程序也是使用Node.js开发的。
腾讯(Tencent)
  • 微信(WeChat):微信是腾讯开发的一款流行的社交媒体和通讯应用程序。微信的后端服务和一些实时功能也是使用Node.js构建的。
  • QQ音乐(QQ Music):QQ音乐是腾讯旗下的音乐流媒体平台,他们的一些后端服务和音乐推荐系统也是使用Node.js开发的。
美团(Meituan)
  • 美团外卖(Meituan Waimai):美团外卖是中国领先的在线外卖订餐平台,他们的一些后端服务和实时订单处理系统是使用Node.js构建的。
  • 美团点评(Meituan Dianping):美团点评是一家提供本地生活服务的综合性平台,他们的一些后端服务和实时数据分析系统也是使用Node.js开发的。
百度(Baidu)
  • 百度地图(Baidu Maps):百度地图是百度提供的在线地图服务,他们的一些后端服务和地理位置相关的应用程序也是使用Node.js构建的。
  • 百度网盘(Baidu Cloud Storage):百度网盘是百度提供的云存储服务,他们的一些后端服务和文件管理系统也是使用Node.js开发的。

国外

Google
  • Firebase是Google提供的一套云服务,用于构建移动和Web应用程序。Firebase的后端服务和实时数据库使用了Node.js作为开发语言。
Facebook
  • Facebook Messenger:Facebook Messenger是Facebook的即时通讯应用程序,其后端服务和实时通信功能是使用Node.js构建的。Node.js的高并发和实时性能使得Messenger能够处理大量的消息传递和实时通信需求。
  • Instagram:Instagram是一款流行的社交媒体应用程序,其后端服务和实时功能也是使用Node.js开发的。Node.js的高性能和实时特性使得Instagram能够处理大量的用户活动和实时内容更新。
LinkedIn

领英是一个全球知名的在线视频流媒体服务提供商,他们的许多后端服务和实时数据处理系统是使用Node.js构建的。Node.js的高并发能力和实时性能使得Netflix能够提供稳定的视频流媒体服务,并处理大量的用户请求和数据流。

Walmart

沃尔玛是全球最大的零售商之一,他们的一些电子商务和供应链系统也采用了Node.js。

其他

这些公司在使用Node.js方面的业务范围非常广泛,涵盖了云计算、电子商务、社交媒体、外卖订餐、本地生活服务、云服务、即时通讯、社交媒体、视频流媒体等多个领域。Node.js的高性能、实时性能和跨平台特性使其成为这些公司构建高性能、可扩展和实时应用程序的首选。

语言优点

  • 快速和高效:Node.js采用了非阻塞式I/O模型,使得它能够高效处理并发请求。这使得它在处理大量请求和实时应用程序方面表现出色。
  • 跨平台:Node.js可以在多个操作系统上运行,包括Windows、Linux和macOS等。这使得开发人员可以在不同的环境中使用相同的代码和工具。
  • 强大的开发工具和库:Node.js拥有丰富的开发工具和库,使开发人员能够更轻松地构建和扩展应用程序。
  • 大型社区支持:Node.js拥有庞大的开发者社区,提供了丰富的资源、文档和解决方案。开发人员可以从社区中获取支持和分享经验。
  • Node.js的语言便利性也是其受欢迎的原因之一。JavaScript作为一种广泛使用的脚本语言,具有较低的学习曲线和易用性。对于前端开发人员来说,他们可以直接使用JavaScript来开发后端服务,无需学习新的语言。同时,JavaScript的生态系统非常丰富,拥有大量的开源库和工具,可以加速开发过程。

应用场景

  • 实时应用程序:由于Node.js具有高并发和低延迟的特性,它非常适合构建实时聊天应用、协作工具、游戏服务器等需要实时性的应用程序。
  • 微服务架构:Node.js的轻量级和模块化特性使得它成为构建微服务架构的理想选择。它可以与其他服务和组件无缝集成,提供灵活的服务拆分和扩展能力。
  • 高度可扩展的Web应用程序:Node.js的事件驱动和非阻塞I/O模型使得它能够处理大量并发请求,并具备良好的水平扩展能力。这使得它成为构建高性能Web应用程序的首选。

使用TypeScript

对于使用TypeScript作为服务端的开发语言,编译后使用的好处,可以解决JavaScript弱类型带来的风险和不便:

  • 类型检查:TypeScript引入了静态类型检查,可以在开发过程中发现潜在的类型错误。这有助于减少运行时错误,并提供更好的代码健壮性和可维护性。
  • 更好的IDE支持:TypeScript提供了丰富的类型信息,使得IDE能够提供更准确的代码补全、错误提示和重构功能。这提高了开发效率,并减少了调试时间。
  • 渐进式采用:TypeScript是基于JavaScript的超集,这意味着现有的JavaScript代码可以逐步迁移到TypeScript,无需一次性重写。这使得团队可以逐步采用TypeScript,而无需对整个项目进行大规模的重构。
  • 更好的可维护性:由于TypeScript提供了类型信息和更严格的语法规则,它可以帮助开发人员编写更清晰、更可读和更易于维护的代码。这对于大型项目和团队协作非常有价值。

综上所述,Node.js和TypeScript的结合可以提供更好的开发体验和代码质量,特别适用于大型项目和团队开发。

NodeJs做服务端的今生前世

Node.js作为服务端开发的技术框架,经历了多个阶段和演进过程。以下是一些常见的Node.js服务端框架及其渊源:

Express:

Express是一个简洁而灵活的Node.js Web应用程序框架,它于2010年发布。Express的设计目标是提供一种快速构建Web应用程序的方式,它提供了简单而强大的路由、中间件和模板引擎等功能。Express在Node.js社区中非常流行,被广泛应用于构建Web应用程序。

Koa:

Koa是由Express团队开发的下一代Node.js Web框架,于2013年发布。Koa的设计理念是更加简洁和模块化,它引入了基于Generator函数的中间件机制,使得异步流程控制更加优雅。Koa在Express的基础上做了一些改进和优化,并且更加注重开发者体验。

Sails:

Sails是一个基于Express的实时Web应用框架,于2012年发布。Sails的特点是提供了一种类似于MVC的开发模式,支持实时数据同步和RESTful API的自动生成。它在构建实时应用程序和API驱动的应用程序方面非常有优势。

Egg.js:

Egg.js是一个基于Koa的企业级Node.js框架,于2016年发布。Egg.js的目标是提供一种可扩展、可插拔的架构,适用于大型应用程序的开发。它提供了一套约定和插件机制,使得团队开发更加高效,并且支持插件的热加载和自动化测试等功能。

Next.js:

Next.js是一个基于React的服务端渲染框架,于2016年发布。虽然Next.js主要关注前端渲染,但它也提供了一些服务端开发的能力,例如API路由和服务器端数据获取。Next.js使得开发者能够快速构建具有服务端渲染能力的React应用程序。

Nest.js:

Nest.js是一个基于Express的渐进式Node.js框架,于2017年发布。Nest.js的设计灵感来自于Angular,它采用了模块化、依赖注入和装饰器等概念,使得开发者能够以面向对象的方式构建可扩展的应用程序。Nest.js在企业级应用程序开发中得到了广泛应用。

Midway:

Midway是一个基于Egg.js的Node.js框架,于2018年发布。Midway的目标是提供一种面向企业级应用的开发框架,它结合了Egg.js和TypeScript,并提供了一套完整的开发规范和插件体系。Midway在大型企业应用的开发中得到了广泛应用。

这些框架之间存在一定的渊源和演进关系,每个框架都在前辈框架的基础上进行了改进和创新,以满足不同的开发需求和场景。它们共同推动了Node.js服务端开发的发展,并为开发者提供了丰富的选择和工具。

本次文字后续会着重介绍 Midway 这个框架,这个框架也是我为公司选择的后端框架。

历史使用NodeJs的经验

介绍了那么多,如果没有实际使用,会很陌生,会有很多坑要踩。接下来我会介绍我在从业过程中使用NodeJs的经验。

新会员系统

时间:

  • 2018年(开发)
    背景:
  • 香港联合出版集团旗下会员系统分流
    量级:
  • 老会员系统注册用户数(300w+),日活1-10w,用户体系为微服务体系。
  • 新会员系统日活100-1000人。
  • 业务,提供数字出版分流相关,主要作为后台管理的API系统。
    架构:
  • Express + Mysql + MongoDB

谢谢有你外卖平台

时间

  • 2019年(开发)
    背景:
  • 创业团队做的外卖平台
    量级:
  • 从深圳大学做试点,辐射惠州,广州,山东等多个城市多所大学
  • 用户量级:100w+
  • 累计营业额突破 1亿
    架构
  • Express + Mysql + Docker

SWTC公链钱包

时间

  • 2020年(维护)
    背景:
  • 井通区块链官方钱包
    量级:
  • 用户量级:100w+
  • 日活:1w-10w
    架构:
  • Salis + Mysql + Redis + RabbitMq + 多服务分布式 + 直接部署

其他各类业务

其他各类业务做的比较多的是使用 Egg.js 大致涵盖一下类型

  • 后端服务
  • 中间件
  • 微服务
  • 各种业务

介绍之前的技术选型和项目

后端架构体系的介绍

后端的本质

  • 触发器
  • 函数
  • 数据

触发器

  • http触发器
  • ws触发器
  • RPC触发器
  • 时间触发器
  • MQ队列触发器
  • 等等

作用,触发函数执行

函数

一段业务逻辑,用于处理数据。

数据

数据的形式

  • 关系型数据
    • mysql
    • sqlserver
    • Oracle
    • PostgreSQL
  • 非关系形数据
    • Redis
    • MongoDB
    • CouchDB
    • Tokyo Cabint
  • 日志型数据
  • 文件型数据
  • 流形数据
  • 分布式数据
  • 等等

数据有多种表现形式,存储在不同的存储仓库中,具有一定的时效性。

其他各种各样的数据,经过触发器触发,经过函数处理,让数据满足一定的规范、变化、展示,即是后端架构。

传统的后端的构建方式

前后端不分离

JAVA的JSP渲染页面。asp.net、PHP、NodeJs的ejs模版等。

多数为老旧项目使用,目前使用的多的还是通用接口服务,前后端分离处理。

不过有其他情况,服务端渲染 SSR 对SEO友好。如 next.js

不是本文重点,这里不多做介绍

前后端分离

后端主要管理数据,权限等。提供统一的 Restful 接口服务。

部署方式

  • linux服务器
  • 环境信息(如指定java版本,指定Nodejs版本)
  • 程序源码或者打包之后的代码(如java的jar包)
  • 监听端口
  • Nginx 做反向代理

部署方式-优点

  • 简单

部署方式-缺点

  • 和环境强绑定
  • 难维护,需要专业的运维人员
  • 难扩容,每台服务器都需要部署
  • 难监控
  • 异常down机难以恢复
  • 版本控制较难

基于容器的构建方式

Docker 是什么

Docker是一种开源的容器化平台,它可以将应用程序和其依赖的软件打包成一个独立的、可移植的容器。每个容器都包含了应用程序的代码、运行时环境、系统工具、系统库等,使得应用程序能够在任何环境中以相同的方式运行。

部署的优点

  • 简化环境配置:Docker可以将应用程序及其依赖打包成一个容器,容器中包含了运行应用所需的所有组件和配置。这样,开发人员可以将应用程序与其环境隔离开来,避免了环境配置的复杂性和潜在的冲突问题。
  • 跨平台和可移植性:Docker容器可以在不同的操作系统和硬件平台上运行,因为容器本身包含了所有运行所需的组件。这使得应用程序能够在开发、测试和生产环境之间轻松迁移,减少了部署过程中的兼容性问题。
  • 快速部署:Docker容器可以快速启动和停止,使得应用程序的部署和扩展变得非常高效。
  • 资源隔离和安全性:Docker使用了Linux内核的容器技术,可以实现对应用程序之间的资源隔离,避免了应用之间的相互影响。每个容器都运行在独立的环境中,有自己的文件系统、进程空间和网络接口,提供了一定程度的安全性。
  • 简化持续集成和交付:Docker容器可以与持续集成和交付(CI/CD)工具集成,使得应用程序的构建、测试和部署过程更加简化和可靠。开发人员可以通过使用Docker镜像来确保在不同的环境中一致地运行应用程序。

部署的缺点

  • 学习曲线:对于初学者来说,学习和理解Docker的概念和工作原理可能需要一些时间和精力。使用Docker需要掌握一些命令和配置,以及了解容器、镜像、网络等概念。对于团队中没有经验的开发人员,可能需要一定的培训和学习成本。
  • 资源消耗:Docker在运行时需要一定的系统资源,包括内存、CPU和存储空间。每个容器都需要一定的资源来运行,如果应用程序规模较大或容器数量较多,可能会占用较多的系统资源。此外,Docker在启动容器时也需要一定的时间和性能开销。
  • 安全性考虑:虽然Docker提供了一定程度的安全隔离,但仍然需要注意一些安全性方面的考虑。例如,需要确保容器中的应用程序和镜像没有安全漏洞,及时更新和维护镜像,限制容器的权限,避免容器之间的攻击等。不正确的配置和管理可能导致安全风险。
  • 持久化数据管理:Docker容器本身是临时的,当容器被删除或重新启动时,容器内部的数据也会丢失。对于需要持久化数据的应用程序,需要额外的配置和管理来确保数据的安全和可靠性,例如使用数据卷或挂载外部存储。
  • 网络配置复杂性:在多个容器之间建立网络连接和通信可能需要一些配置和管理。特别是在分布式系统或微服务架构中,容器之间的网络配置和服务发现可能变得复杂,需要额外的工具和技术来简化和管理网络。
  • 需要专业的运维人员

这些缺点并不意味着Docker不适合使用,而是需要在使用过程中认识到并妥善处理。对于特定的应用场景和需求,可能需要权衡利弊并选择适合的解决方案。

基于K8S的构建方式

K8S是什么

Kubernetes(简称K8s)是一个开源的容器编排平台,它提供了一套强大的工具和机制,用于管理和部署容器化应用程序。使用Kubernetes部署应用程序有以下优点:

使用K8S的优点

  • 自动化和可扩展性:Kubernetes可以自动管理应用程序的部署、扩展、升级和回滚。它可以根据应用程序的负载和资源需求进行自动扩展和缩减,以确保应用程序始终具有足够的资源,并能够处理高负载。
  • 高可用性:Kubernetes提供了高可用性的机制,通过在集群中运行多个副本来保证应用程序的可用性。如果一个容器或节点发生故障,Kubernetes会自动重新调度容器到其他可用节点,从而保证应用程序的连续性和稳定性。
  • 负载均衡和服务发现:Kubernetes具有内置的负载均衡和服务发现机制,可以将流量均匀分发到运行同一应用程序的多个容器实例之间。这样可以提高应用程序的性能和可伸缩性,并且对外部服务的访问更加简化和可靠。
  • 灵活的部署策略:Kubernetes支持多种部署策略,例如滚动更新、蓝绿部署和金丝雀发布。这些策略可以确保应用程序在升级或回滚过程中保持稳定,并且可以根据需要进行灵活的部署和管理。
  • 配置和密钥管理:Kubernetes提供了集中化的配置和密钥管理机制,可以将应用程序的配置和敏感信息(如数据库密码、API密钥等)存储在安全的地方,并在容器启动时自动注入到应用程序中。这样可以简化配置管理和提高安全性。
  • 社区支持和生态系统:Kubernetes拥有庞大的社区支持和活跃的生态系统,有大量的工具、插件和服务可供选择。这使得使用Kubernetes部署应用程序更加方便和灵活,可以根据需求选择适合的解决方案。

总之,使用Kubernetes可以实现应用程序的自动化部署、弹性扩展、高可用性和灵活的部署策略。它是一种强大的容器编排平台,适用于构建和管理复杂的容器化应用程序。

使用K8S的缺点

  • 学习曲线
  • 业务场景
  • 需要专业的运维人员

基于Serverless的构建方式

什么是Serverless

Serverless是一种云计算模型,它使开发人员能够构建和运行应用程序,而无需管理底层的服务器和基础设施。在传统的服务器模型中,开发人员需要自己设置、配置和管理服务器,而Serverless模型将这些任务交给云服务提供商处理。

在Serverless模型中,开发人员将应用程序的代码打包成函数或服务,并将其上传到Serverless平台。当应用程序需要执行某个功能时,平台会自动根据需要分配计算资源来运行相应的函数或服务。这意味着开发人员只需关注应用程序的业务逻辑,而无需关心底层的服务器管理。

基于Serverless的优点:

  • 无服务器架构:Serverless架构使开发人员能够将注意力集中在业务逻辑上,而无需关心底层的服务器和基础设施管理。开发人员只需编写函数或服务,并将其上传到Serverless平台,由平台负责处理底层的资源管理和自动扩展。
  • 弹性扩展:Serverless平台可以根据应用程序的负载自动扩展或缩减资源。它可以根据实际需求动态分配计算资源,以确保应用程序具有足够的计算能力来处理流量高峰,同时在负载较低时减少资源消耗和成本。
  • 节省成本:Serverless模型按需分配资源,只在需要时付费。与传统的基于服务器的架构相比,Serverless模型可以显著降低成本,因为开发人员只需支付实际使用的计算资源,而无需为未使用的资源付费。
  • 快速部署和迭代:Serverless平台提供了快速部署和迭代的能力。开发人员可以通过简单的命令或API调用将函数或服务部署到Serverless平台,并立即开始运行。这种快速部署和迭代的方式有助于加快开发速度和响应市场需求。
  • 高可用性和容错性:Serverless平台通常具有高可用性和容错性。它们会自动处理底层的故障恢复、备份和监控,以确保应用程序的可用性。如果某个函数或服务发生故障,平台会自动重新启动或切换到备用实例,从而减少了应用程序中断的风险。
  • 无需管理基础设施:在Serverless模型中,开发人员无需关心服务器的管理和维护任务,如操作系统更新、容量规划和安全补丁等。这样可以节省时间和精力,专注于业务逻辑的开发和创新。

基于Serverless的缺点:

  • 冷启动延迟:在Serverless模型中,当函数或服务需要被调用时,可能会发生冷启动延迟。这是因为在没有活动的情况下,平台可能会释放函数的资源,而当请求到达时,需要重新分配和启动资源。这可能导致一些延迟,尤其是对于需要快速响应的实时应用程序而言。
  • 限制和限额:Serverless平台通常会施加一些限制和限额,如最大执行时间、内存限制、并发请求限制等。这些限制可能会对某些应用程序的性能和可扩展性产生影响,特别是对于需要处理大量数据或高并发请求的应用程序。
  • 依赖于第三方服务商:使用Serverless模型,开发人员将应用程序的一部分或全部功能交给第三方云服务提供商处理。这意味着应用程序的可用性和性能可能会受到第三方服务商的影响。如果服务商出现故障或性能下降,可能会对应用程序产生负面影响。
  • 难以调试和监控:在Serverless模型中,由于应用程序的部分或全部功能在云端运行,调试和监控变得更加困难。开发人员可能需要依赖平台提供的工具和日志来进行故障排除和性能优化。
  • 不适合长时间运行的任务:Serverless模型适用于短时间运行的任务,但对于长时间运行的任务,可能会受到平台的限制。一些Serverless平台可能会对函数的执行时间进行限制,如果超过限制,可能会导致函数被中断。
  • 成本不可预测:尽管Serverless模型可以降低成本,但对于某些应用程序,成本可能不可预测。由于按需计费的方式,应用程序的使用情况和负载波动可能会导致成本的不稳定性。

总的来说,基于Serverless的构建和部署方式可以提供灵活、高效、成本效益高的应用程序开发和部署体验。它使开发人员能够更专注于业务逻辑,同时享受自动扩展、高可用性和快速部署的好处,但在选择使用Serverless时,开发人员需要权衡这些优点和潜在的缺点,并根据应用程序的需求和特点做出决策。

基于应用场景的框架选型

使用Node.js作为开发语言时,以下是一些常见的场景和相应的构建以及部署方式选择:

传统的构建方式(直接部署在服务器上):

场景:

  • 适用于传统的单服务器应用程序,对环境绑定较强的情况。

选择原因:

  • 传统部署方式可以提供更高的控制和灵活性,适用于需要对服务器进行深度定制和优化的场景。适合对基础设施和环境有较高要求的应用程序。

使用Docker构建并直接部署:

场景:

  • 适用于需要在不同环境中轻松部署和移植的应用程序,以及需要隔离和容器化的场景。

选择原因:

  • Docker提供了容器化的部署方式,可以将应用程序和其依赖项打包成容器,使其在不同的环境中具有一致的运行方式。这样可以简化部署过程,提高可移植性,并提供更好的隔离性。

使用Kubernetes(K8s)部署:

场景:

  • 适用于需要管理和编排大规模容器化应用程序的场景,以及对高可用性、自动伸缩和负载均衡有较高要求的应用程序。

选择原因:

  • Kubernetes是一个开源的容器编排平台,可以自动管理和调度容器化的应用程序。它提供了高可用性、自动伸缩、负载均衡等功能,可以简化应用程序的部署、扩展和管理,适用于大规模和复杂的应用程序环境。

使用Serverless构建并部署:

场景:

  • 适用于需要弹性扩展、按需计费和快速部署的应用程序,以及对于事件驱动的应用程序。

选择原因:

  • Serverless模型使开发人员能够专注于业务逻辑,而无需关心底层的服务器和基础设施。它提供了自动扩展、按需计费和简化部署的优势,适用于处理突发流量、快速迭代和敏捷开发的场景。

总体而言,选择部署方式取决于应用程序的需求和特点。传统部署方式适用于对环境和基础设施有较高要求的应用程序,Docker适用于可移植性和隔离性要求较高的应用程序,Kubernetes适用于大规模和复杂的应用程序环境,Serverless适用于弹性扩展和快速部署的场景。开发人员应根据应用程序的需求、团队的能力和预算等方面进行综合考虑,并选择最适合的部署方式

概念介绍

后端常用的概念解释,以及用途介绍。

自己根据经验和理解,整理绘制了下图:

概念介绍-路由

在后端开发中,路由(Routing)是指将传入的请求与相应的处理逻辑进行匹配和分发的过程。它决定了请求应该由哪个处理程序(通常是控制器)来处理,并定义了处理程序的执行路径。

路由的主要目的是将不同的URL路径映射到相应的处理程序或控制器方法上,以便执行相应的业务逻辑。它允许开发人员定义应用程序的不同端点(endpoints),并将请求路由到正确的处理程序上。

以下是一些与路由相关的概念和要点:

路由表(Routing Table):

路由表是一个定义了不同URL路径与处理程序之间映射关系的数据结构。
它通常由开发人员在应用程序中进行配置或定义。

路由方法(Routing Methods):

路由方法指的是HTTP请求方法(如GET、POST、PUT、DELETE等)与路由之间的对应关系。
不同的HTTP请求方法可以用于执行不同的操作,例如获取资源、创建资源、更新资源或删除资源。

动态路由参数(Dynamic Route Parameters):

动态路由参数允许在URL路径中定义可变的部分。
通过在路由路径中使用参数占位符,可以捕获URL中的特定值,并将其传递给处理程序使用。

路由中间件(Routing Middleware):

路由中间件是在请求到达路由处理程序之前或之后执行的逻辑。
它可以用于执行身份验证、授权、日志记录、错误处理等操作。

嵌套路由(Nested Routing):

嵌套路由是指将多个相关的路由组织在一起形成一个层次结构。
这种方式可以帮助组织和管理复杂的路由逻辑,使代码更具可读性和可维护性。

路由参数提取(Route Parameter Extraction):

在路由处理程序中,可以从URL路径中提取参数值,并将其用作处理逻辑的输入。
这样可以根据不同的参数值执行不同的操作。

路由重定向(Route Redirection):

路由重定向是指将一个URL请求重定向到另一个URL的过程。
这通常用于处理URL的重命名、重定位或路由到不同的处理程序。
路由在后端开发中扮演着至关重要的角色,它将请求导向正确的处理程序,并帮助构建具有良好结构和可扩展性的应用程序。通过合理设计和组织路由,可以实现清晰的请求处理流程,并提供灵活的URL映射和路由控制。

概念介绍-控制器

在后端开发中,控制器(Controller)是一种组件或类,负责接收请求并处理相应的业务逻辑,然后返回响应给客户端。控制器通常是后端应用程序的核心部分之一,用于协调和处理请求的处理流程。

请求处理:

控制器接收传入的请求,并根据请求的类型和参数来决定执行相应的操作。
它可以处理不同的HTTP方法(GET、POST、PUT、DELETE等)和路由路径。

业务逻辑处理:

控制器包含了应用程序的业务逻辑,它调用相应的服务层方法来执行具体的业务操作。
它可以处理数据验证、数据转换、调用其他服务或组件等操作。

请求参数解析:

控制器负责解析传入请求的参数,并将其提供给业务逻辑处理。
这可能涉及从URL路径、查询字符串、请求体或请求头中提取参数值。

响应构建:

控制器在处理完业务逻辑后,构建相应的响应对象,并返回给客户端。
响应可以是数据、HTML页面、JSON、XML或其他格式的数据。

错误处理:

控制器处理请求过程中可能发生的错误,如参数验证失败、数据库查询失败等。
它可以捕获这些错误,并返回适当的错误响应给客户端。

控制器的组织:

控制器可以根据应用程序的需求进行组织和划分。
通常,控制器按功能或资源进行组织,每个控制器负责处理特定的功能或资源相关的请求。

中间件的应用:

控制器可以与中间件一起使用,用于在请求到达控制器之前或之后执行额外的逻辑。
中间件可以用于身份验证、授权、日志记录等操作。
控制器在后端应用程序中起着重要的作用,它将请求的处理流程分离成可管理的模块,并使代码具有良好的结构和可维护性。通过合理设计和组织控制器,可以实现清晰的请求处理逻辑,并提供灵活的业务逻辑处理能力。

概念介绍-数据传输对象

在后端开发中,数据传输对象(Data Transfer Object,DTO)是一种设计模式,用于在不同层之间传输数据。DTO用于封装和传递数据,以便在应用程序的不同部分之间进行交互。

数据封装:

DTO用于封装数据,将相关的数据字段组合成一个对象。
它可以包含属性、字段和方法,用于描述数据的结构和行为。

数据传输:

DTO用于在不同的层之间传输数据,例如在控制器和服务层之间、服务层和数据访问层之间等。
它可以将数据从一个层传递到另一个层,以便进行处理、展示或持久化。

数据转换:

DTO可以用于在不同的数据模型之间进行转换。
它可以将数据从一个模型转换为另一个模型,以满足不同层或组件的需求。

数据验证:

DTO可以用于验证传入的数据的有效性和完整性。
它可以包含验证规则和方法,用于验证数据是否符合预期的格式和要求。

数据展示:

DTO可以用于封装要在用户界面上显示的数据。
它可以根据用户界面的需要,将数据进行组织和转换,以便进行显示和交互。

数据传输的优化:

DTO可以帮助优化数据传输的性能和效率。
它可以避免在传输过程中传递不必要的数据字段,只传递需要的数据,减少数据传输的大小和开销。
DTO在后端开发中起着重要的作用,它可以帮助解耦不同层之间的数据传输和转换,提供灵活性和可维护性。通过使用DTO,可以确保数据的一致性、完整性和安全性,并提高应用程序的性能和效率。

概念介绍-服务

在后端开发中,服务层(Service Layer)是一种组件或模块,用于处理业务逻辑和执行具体的业务操作。服务层位于控制器和数据访问层之间,负责协调和处理业务逻辑的复杂性。

业务逻辑处理:

服务层包含应用程序的业务逻辑,它实现了具体的业务操作。
它可以调用数据访问层(如数据库访问)来执行数据操作,并根据业务需求进行逻辑处理。

业务操作的封装:

服务层将具体的业务操作封装为可重用的方法或函数。
它提供了一组公共接口,供控制器或其他组件调用。

事务管理:

服务层可以处理事务管理,确保业务操作的原子性和一致性。
它可以在业务操作的开始和结束时启动和提交事务,以确保数据操作的完整性。

数据转换和验证:

服务层可以处理数据的转换和验证。
它可以将传入的数据转换为适合业务操作的格式,并进行数据验证以确保数据的有效性和完整性。

业务规则的实施:

服务层可以实施应用程序的业务规则和策略。
它可以执行复杂的业务逻辑,如权限验证、计算、条件判断等。

外部服务和组件的集成:

服务层可以与外部服务和组件进行集成,如第三方API、消息队列、缓存等。
它可以调用外部服务来获取数据或执行特定的操作,并将其集成到业务逻辑中。

与控制器的交互:

服务层与控制器紧密合作,处理控制器传递的请求,并返回处理结果。
它可以接收控制器传递的参数,执行相应的业务操作,并将结果返回给控制器。
服务层在后端应用程序中起着重要的作用,它将业务逻辑与控制器和数据访问层分离,提供了一个可重用和可测试的业务逻辑层。通过合理设计和组织服务层,可以实现业务逻辑的解耦和可维护性,使应用程序更加灵活和可扩展。

概念介绍-实体

在后端开发中,实体(Entity)是指代表应用程序的领域模型或业务对象的概念。实体通常是与数据库中的表或集合相对应的对象,用于表示和操作持久化数据。

数据持久化:

实体用于表示应用程序中的数据,并将其持久化到数据库或其他存储介质中。
它通常与数据库表的结构相对应,每个实体类对应一个表,实体对象对应表中的一行数据。

属性和字段:

实体具有属性和字段,用于描述和存储数据的特征和状态。
属性可以是实体的特征,如名称、年龄、地址等;字段是属性在数据库中的映射,用于存储和检索数据。

标识和唯一性:

实体具有唯一的标识,用于区分不同的实体对象。
标识可以是一个或多个属性的组合,通常使用唯一的标识符(如主键)来表示。

关联和关系:

实体之间可以存在关联和关系,用于描述不同实体之间的关系。
关联可以是一对一、一对多或多对多的关系,通过关联可以进行数据的查询和操作。

行为和方法:

实体可以具有行为和方法,用于执行特定的操作和业务逻辑。
方法可以用于修改实体的状态、计算属性、执行业务规则等。

领域模型的核心:

实体是领域模型的核心,它代表了业务的核心概念和实体之间的关系。
领域模型是对应用程序领域的抽象和建模,实体是领域模型的具体实现。

实体在后端开发中扮演着重要的角色,它们用于表示和操作应用程序的核心数据。通过定义和使用实体,可以实现对数据的封装、操作和管理,提供了一种面向对象的方式来处理业务逻辑和数据持久化。

概念介绍-dbschema

在后端开发中,DB Schema(数据库模式)是指数据库的结构和组织方式的定义。它描述了数据库中表、列、关系和约束等元素的结构和关系,定义了数据的存储方式和访问规则。

表和列:

数据库模式中的表是数据的基本组织单位,用于存储特定类型的数据。
表由列组成,每列定义了表中的一个数据字段,用于存储特定类型的数据。

主键和外键:

主键是表中用于唯一标识每行数据的列或列组合。
外键是表中的列,它与另一个表的主键形成关联,用于建立表之间的关系。

索引:

索引是数据库模式中的一种数据结构,用于提高数据的检索效率。
索引可以基于一个或多个列,通过创建索引可以快速定位和访问数据。

约束:

约束是数据库模式中的规则,用于限制数据的完整性和一致性。
常见的约束包括主键约束、唯一约束、非空约束和外键约束等。

关系和关联:

关系是数据库模式中表之间的逻辑连接,用于建立数据之间的关系。
关联是通过主键和外键建立的表之间的连接,用于查询和操作相关数据。

视图:

视图是数据库模式中的虚拟表,它是基于一个或多个表的查询结果。
视图可以简化复杂的查询操作,提供一种逻辑上的数据展示方式。

存储过程和触发器:

存储过程是一组预定义的数据库操作,可以在数据库中执行。
触发器是与表相关联的一种特殊类型的存储过程,它在特定的数据库操作发生时自动触发执行。
数据库模式在后端开发中起着重要的作用,它定义了数据的结构和组织方式,提供了数据的存储和访问规则。通过合理设计和使用数据库模式,可以实现数据的有效管理和查询,确保数据的完整性和一致性。

概念介绍-过滤器

针对 Midway 框架,它提供了一种称为“过滤器(Filter)”的中间件机制,用于在请求和响应的不同阶段对数据进行筛选和处理。

在 Midway 框架中,过滤器是一种类似于中间件的概念,它可以在请求的不同生命周期中对请求和响应进行拦截和处理。通过过滤器,你可以在请求到达控制器之前或响应离开控制器之前对数据进行预处理或后处理。

生命周期

Midway 框架中的过滤器可以在请求的不同生命周期中进行操作,包括请求前、请求后、响应前和响应后等阶段。

拦截请求

你可以使用过滤器来拦截请求,对请求进行验证、鉴权、参数解析等操作,确保请求的有效性和安全性。

预处理请求

通过过滤器,你可以在请求到达控制器之前对请求数据进行预处理,如修改请求参数、添加额外的上下文信息等。

后处理响应

过滤器还可以在响应离开控制器之前对响应数据进行处理,如修改响应数据、添加响应头等。

过滤器链

在 Midway 框架中,多个过滤器可以组成一个过滤器链,按照特定的顺序对请求和响应进行处理。过滤器链的顺序由配置文件中的顺序决定。

异常处理

过滤器可以捕获并处理控制器中抛出的异常,进行统一的异常处理和错误响应。

通过使用 Midway 框架中的过滤器,你可以实现对请求和响应的全局性处理和控制,提高代码的可维护性和可扩展性。你可以在 Midway 框架的官方文档中查找更多关于过滤器的详细信息和使用示例。

概念介绍-守卫

在 Midway 框架中,”守卫”(Guard)是一种用于进行身份验证和授权的概念。守卫可以在请求到达控制器之前对用户身份进行验证,并根据用户的权限决定是否允许其访问受保护的资源。

我们当前框架使用的的是基于 JWT 的身份验证,没有使用 session 和 cookie,在保证安全性的同时做到了无状态,可以横向扩展应用程序。

身份验证

守卫用于验证用户的身份,通常涉及用户提供的身份凭证,如用户名和密码、访问令牌等。守卫可以根据验证结果决定是否允许用户继续访问资源。

授权

守卫还可以进行授权,即确定用户是否有权限访问特定的资源或执行特定的操作。它可以基于用户的角色、权限或其他自定义规则来进行授权判断。

守卫策略

Midway 框架中的守卫可以通过定义守卫策略来实现具体的身份验证和授权逻辑。守卫策略是一个函数或类,用于处理身份验证和授权的逻辑,并返回相应的验证结果。

守卫装饰器

Midway 框架提供了装饰器来标记需要应用守卫的控制器方法或路由。通过在控制器方法或路由上添加守卫装饰器,可以指定需要应用的守卫策略。

守卫链

在某些情况下,多个守卫可以组成一个守卫链,按照特定的顺序对请求进行身份验证和授权。守卫链的顺序由装饰器的顺序决定。

守卫上下文

守卫可以访问请求上下文和用户信息,以便进行身份验证和授权判断。请求上下文包含了请求的相关信息,如请求头、请求参数等。

通过使用守卫,你可以在 Midway 框架中实现身份验证和授权的功能,保护你的应用程序的资源免受未经授权的访问。你可以根据具体的业务需求和安全要求,定义和配置守卫策略,确保只有经过验证和授权的用户能够访问受保护的资源。在 Midway 框架的官方文档中可以找到更多关于守卫的详细信息和使用示例。

概念介绍-定时任务

定时任务(Scheduled Tasks)是后端开发中的一个概念,用于在预定的时间间隔或特定时间点执行一些任务或操作。定时任务通常用于处理一些需要周期性执行的业务逻辑,如数据清理、数据同步、报表生成等。

定时任务调度器

定时任务通常由一个调度器来管理和触发。调度器负责按照预定的时间间隔或时间点来触发任务的执行。

任务定义

每个定时任务都需要定义具体的执行逻辑。这可以是一个函数、一个类的方法或一个独立的任务处理器。任务定义包括任务的执行逻辑、执行频率、执行时间等信息。

时间表达式

定时任务通常使用时间表达式来定义任务的执行时间。时间表达式可以是简单的间隔,如每小时执行一次,也可以是复杂的时间规则,如每天的特定时间点执行。

并发处理

在某些情况下,定时任务可能会并发执行。需要注意任务的并发处理方式,避免出现并发冲突或资源竞争的问题。

错误处理

定时任务执行过程中可能会出现错误或异常情况。需要考虑如何处理这些错误,如记录日志、发送通知或进行补偿操作。

可视化管理

一些后端框架或工具提供了可视化管理定时任务的界面,方便配置和监控任务的执行情况。

定时任务是后端开发中常用的工具,可以帮助自动化执行一些重复性的任务,提高开发效率和系统的稳定性。

概念介绍-中间件

在 Node.js 中,”中间件”(Middleware)是一个常见的概念,用于处理 HTTP 请求和响应。中间件允许你在请求到达路由处理程序之前或响应发送给客户端之前,对请求和响应进行一些额外的处理。

中间件函数

中间件是一个函数,它接收三个参数:请求对象(req)、响应对象(res)和下一个中间件函数(next)。中间件函数可以执行一些逻辑操作,如修改请求对象、响应对象,处理数据,或者调用下一个中间件函数。

请求处理流程

在 Node.js 中,请求会按照定义的路由规则进行匹配,并通过中间件函数进行处理。中间件函数可以在请求到达路由处理程序之前或响应发送给客户端之前,对请求和响应进行一些处理。

中间件链

多个中间件函数可以组成一个中间件链,按照定义的顺序依次执行。中间件链中的每个中间件函数都可以选择调用下一个中间件函数,或者在某些条件下终止请求处理。

使用中间件

在 Express.js 等常见的 Node.js 框架中,使用中间件非常简单。你可以通过 app.use() 方法将中间件函数添加到应用程序中,或者使用特定的路由方法(如 app.get()、app.post())将中间件函数绑定到特定的路由上。

中间件功能

中间件函数可以执行各种功能,如请求日志记录、身份验证、数据解析、错误处理等。你可以根据具体的需求编写自定义的中间件函数,或使用现有的中间件库来实现常见的功能。

通过使用中间件,你可以在 Node.js 应用程序中实现一些共享的、可重用的逻辑,如身份验证、日志记录等。中间件提供了一种灵活的方式来处理请求和响应,使得代码结构更清晰、易于维护。在选择和使用中间件时,可以根据具体的需求和框架选择适合的中间件库,或编写自定义的中间件函数。

概念介绍-工具类

在 Node.js 中,”工具类”(Utility Classes)是指用于封装常用功能、提供实用工具函数或方法的类或模块。这些工具类可以帮助简化开发过程,提高代码的可重用性和可维护性。

需要注意的是在使用工具类的过程中,需要注意约束以下几点:

  • 工具类应该是纯函数,没有副作用。
  • 工具类应该保持简单,避免引入过多依赖。
  • 工具类应该保持独立,避免与特定框架或库耦合。
  • 工具类应该保持稳定,避免频繁更改。

使用工具类可以帮助你提高开发效率,避免重复编写相同的代码,同时也提供了一种组织代码的方式,使得代码结构更清晰、易于维护。在选择和使用工具类时,可以根据具体的需求和功能选择适合的模块或库,或者自己编写自定义的工具类。

概念介绍-环境

在后端开发中,”环境”(Environment)是一个重要的概念,通常通过环境变量(Environment Variables)来表示。环境变量是在操作系统中设置的一些键值对,用于配置应用程序在特定环境下的行为。

环境变量

环境变量是操作系统中的一些预定义或自定义的键值对。它们可以在不同的开发、测试和生产环境中设置不同的值,以便应用程序在不同环境下具有不同的行为。环境变量可以包含敏感信息,如数据库连接字符串、API 密钥等,因此需要妥善保管。

配置管理

通过使用环境变量,你可以在应用程序中管理各种配置信息。例如,数据库连接信息、服务器端口、日志级别等可以通过环境变量来配置,而不需要硬编码到代码中。这样可以使得应用程序更加灵活和可配置。

开发环境和生产环境

通常,一个应用程序会在不同的环境中运行,如开发环境、测试环境和生产环境。每个环境可能有不同的配置需求和行为。通过使用环境变量,你可以在不同环境中设置不同的值,以适应不同的需求。

获取环境变量

在后端开发中,你可以使用编程语言提供的特定方法或库来获取环境变量的值。例如,在 Node.js 中,你可以使用 process.env 对象来访问环境变量。其他编程语言也提供了类似的机制来获取环境变量的值。

部署和持续集成

在部署应用程序时,你需要确保正确设置环境变量,以便应用程序在目标环境中能够正常运行。持续集成和持续部署工具(如 Jenkins、GitLib CI 等)通常提供了配置环境变量的功能,可以方便地管理和设置环境变量。

通过使用环境变量你可以轻松地在不同的环境中配置和管理应用程序的行为和设置。这种灵活性使得应用程序能够适应不同的需求和环境,简化了部署和配置的过程。在开发过程中,你应该根据具体的需求和框架,了解如何使用环境变量,并保持环境变量的安全性。

概念介绍-日志

在后端开发中,”日志”(Logging)是一种记录应用程序运行时信息的重要机制。日志可以帮助开发人员了解应用程序的行为、诊断问题和监控系统的运行状态。

日志的作用

日志是一种记录应用程序运行时信息的手段,可以用于多种目的,包括:

  • 诊断问题:当应用程序出现错误或异常时,日志可以提供有关问题发生的上下文信息,帮助开发人员定位和修复问题。
  • 监控系统:通过记录关键指标和事件,日志可以用于监控系统的运行状态,例如请求处理时间、资源利用率等。
  • 跟踪操作:日志可以记录用户操作或系统事件,以便追踪和审计应用程序的行为。
  • 分析和统计:通过分析日志数据,可以获取应用程序的使用情况、用户行为等有价值的信息。

日志级别

日志通常根据重要性和详细程度划分为不同的级别。常见的日志级别包括:

  • DEBUG:用于调试目的,记录详细的调试信息。
  • INFO:用于记录一般的信息,如应用程序启动、请求处理等。
  • WARN:用于记录警告信息,表示潜在的问题或异常情况。
  • ERROR:用于记录错误信息,表示应用程序出现了错误。
  • FATAL:用于记录严重错误,表示应用程序无法继续运行。

通过设置适当的日志级别,可以控制日志的详细程度,以适应不同的需求和环境。

日志格式

日志通常以一定的格式进行记录,以便后续的处理和分析。常见的日志格式包括:

  • 文本格式:简单的文本格式,每条日志记录占据一行,包含时间戳、日志级别、消息等信息。
  • JSON 格式:以 JSON 格式记录日志,可以包含更多的结构化信息。
  • 日志框架特定格式:一些日志框架提供了自定义的日志格式,可以根据需求进行配置。

日志框架和库

在后端开发中,通常使用日志框架或库来记录和管理日志。这些框架和库提供了一些功能,如日志级别控制、日志格式化、日志输出到文件或其他目标等。常见的日志框架和库包括:

  • log4j/logback(Java)
  • Winston(Node.js)
  • logrus(Go)
  • Serilog(.NET)

这些框架和库通常具有灵活的配置选项,可以根据需求进行定制。

日志存储和分析

日志通常被记录到文件或其他存储介质中。对于大规模系统或需要长期存储的日志,可以使用专门的日志存储和分析工具。这些工具提供了强大的搜索、过滤和可视化功能,以便更好地理解和分析日志数据。

通过合理使用日志,你可以更好地了解应用程序的状态和行为,方便排查问题和监控系统。在开发过程中,你应该根据需求选择合适的日志级别和格式,使用适当的日志框架或库,并考虑日志的存储和分析需求。

概念介绍-部署方式

在启动 Midway 应用程序时,你可以使用不同的方式,如使用 PM2 或 Docker。

PM2:

PM2 是一个流行的进程管理工具,可以用于启动、停止和监控 Node.js 应用程序。

应用程序将会在后台以守护进程的形式运行,并由 PM2 进行管理。你可以使用 PM2 的其他命令来停止、重启和监控应用程序。

Docker

Docker 是一种容器化平台,可以将应用程序及其依赖项打包成一个独立的容器,并在不同的环境中运行。

应用程序将会在 Docker 容器中运行,并可以通过指定的端口访问。

使用 PM2 或 Docker 启动 Midway 应用程序具有不同的优势和适用场景。PM2 适用于在主机上直接启动和管理应用程序,而 Docker 提供了更好的可移植性和隔离性,适用于在不同环境中部署和运行应用程序。你可以根据具体的需求和场景选择合适的启动方式。

推荐使用docker进行启动

概念介绍-CI自动化

CI自动化是指持续集成(Continuous Integration)的自动化过程。

在持续集成环境中,开发人员将频繁地提交代码到主干,并在提交后自动进行构建或者执行单元测试。

这些新提交的代码在最终合并到主线之前,都需要通过编译和自动化测试流程进行验证。

自动化测试验证结果在持续集成过程中非常重要。

本概念适用于 GitLab CI。

旧的CI流程痛点:

  • 环境复杂,win环境,shell环境,java项目的java环境,自建的阿里云镜像环境(内部作用位置是黑盒)。
  • 语言多样不统一,开发语言是一种环境,发布通知是专门的的python环境。

新的ci环境改变了这一点:

  • 统一环境,使用docker进行统一,统一了开发,测试,发布,部署。
  • 支持面广,不仅仅是后端的ci,包括了前端页面的ci,极大程度的做到了多种类统一。
  • 并移除了原有的python通知环境,改为node环境进行更改。

CI流程不适用于客户端CI,因为客户端CI需要编译 X64 和 X32 两种版本,并且需要使用 Ukey 进行签名。只能在win环境使用。

概念介绍-调试

常用并支持的调试模式有两种。

debug console 模式

此模式比较通用就不多介绍了

vscode编辑器debug模式

在VSCode中进行断点调试和上面的相比有很多优点:

  • 简易性和直观性:通过在源代码行号上简单点击即可设置断点,使得程序在该行执行时暂停。这种简单易用的操作方式,无需学习复杂的命令,大大提高了开发效率。
  • 强大的功能和灵活性:VSCode断点调试不仅可以在特定的条件下触发调试,还允许设置通知操作,如声音或弹出窗口,以便在断点被触发时及时通知开发人员,更快地发现和解决问题。
  • 与其他插件和工具的集成:VSCode断点调试可以轻松地与各种插件和工具集成,例如测试框架和调试器,以便更方便地进行调试。
  • 支持多种编程语言和环境:VSCode断点调试支持多种编程语言和环境,包括Node.js、JavaScript、TypeScript、Python等,使得开发者可以在一个统一的编辑器中进行调试。
  • 实时监视和变量检查:在调试过程中,VSCode可以实时监视程序的状态和变量的值,允许开发者检查程序在运行时的行为和状态。

使用vscode调试midway,进行断点等操作也很简单,只需要简单配置一些配置文件即可。

概念介绍-错误码

HTTP状态码是一种表示HTTP请求结果的三位数字代码。它们提供了有关请求是否成功、发生了什么错误以及如何处理请求的信息。以下是一些常用的HTTP状态码及其规范:

1xx(信息性状态码):指示请求已被接收并正在处理。

100 Continue:服务器已接收到请求的初始部分,客户端应继续发送剩余部分。
101 Switching Protocols:服务器已理解客户端的请求,将切换到不同的协议。

2xx(成功状态码):指示请求已成功处理。

200 OK:请求成功,服务器返回所请求的资源。
201 Created:请求成功,服务器创建了新的资源。
204 No Content:请求成功,但服务器没有返回任何内容。

3xx(重定向状态码):指示需要进一步操作以完成请求。

301 Moved Permanently:所请求的资源已永久移动到新位置。
302 Found:所请求的资源暂时移动到不同的位置。
304 Not Modified:客户端可以使用缓存的版本。

4xx(客户端错误状态码):指示客户端发生错误。

400 Bad Request:服务器无法理解请求的语法。
401 Unauthorized:请求需要身份验证。
404 Not Found:所请求的资源不存在。

5xx(服务器错误状态码):指示服务器在处理请求时发生错误。

500 Internal Server Error:服务器遇到了意外情况,无法完成请求。
503 Service Unavailable:服务器暂时无法处理请求。

这些状态码只是HTTP状态码的一部分,每个状态码都有特定的含义和用途。了解这些状态码可以帮助开发人员更好地理解和处理HTTP请求和响应。

根据实际项目经验来看,需要针对不同的项目大小和具体的情况来约束和定义状态码。

目前常用的状态码有:

  • 301 重定向
  • 400 参数错误,客户端错误
  • 404 未找到资源
  • 500 服务器状态错误

概念介绍-跨域

跨域(Cross-Origin)是指在浏览器中,当一个网页的脚本试图访问不属于该网页所在域的资源时,就会发生跨域请求。浏览器出于安全考虑,限制了跨域请求的执行,以防止恶意网站获取用户的敏感信息或进行其他不当操作。

跨域请求的限制主要体现在同源策略(Same-Origin Policy)上,同源策略要求网页的脚本只能访问与其来源相同的资源,即协议、域名和端口必须完全相同。如果脚本需要跨域访问其他域的资源,就需要使用跨域资源共享(Cross-Origin Resource Sharing,CORS)机制。

CORS是一种通过HTTP头部信息来告知浏览器是否允许当前网页的脚本跨域访问其他域的资源的机制。具体来说,当浏览器发起跨域请求时,服务器可以在响应中添加一些特定的HTTP头部,如”Access-Control-Allow-Origin”,来指定允许访问的域。如果服务器返回的响应中包含了合适的CORS头部,浏览器就会允许网页的脚本获取和处理响应数据。

CORS的使用通常涉及以下几个方面:

  • 服务器端配置:服务器需要正确设置响应头部,包括”Access-Control-Allow-Origin”、”Access-Control-Allow-Methods”、”Access-Control-Allow-Headers”等,以指定允许跨域请求的来源、允许的HTTP方法和允许的自定义头部等。
  • 客户端请求:在发起跨域请求时,浏览器会自动发送一个预检请求(OPTIONS请求)到服务器,检查服务器是否允许跨域访问。服务器需要正确处理预检请求并返回合适的响应头部。
  • 客户端处理:在脚本中发送跨域请求时,需要注意处理可能发生的跨域错误和异常,如使用合适的错误处理机制或使用JSONP等跨域技术。

总结起来,CORS是一种通过设置HTTP头部来允许跨域请求的机制,它允许服务器控制哪些域可以访问其资源,从而实现安全的跨域数据传输。在实际开发中,开发人员需要在服务器端和客户端分别进行相应的配置和处理,以实现跨域请求的安全和可靠性。

一般来说,在比较规范的和安全的开发环境中,CORS是一种比较好的跨域请求解决方案。

但是,如果项目规模较小,建议直接使用 * 做全域通用,在token等其他方面做安全限制。

概念介绍-上传文件

在Node.js中,可以使用各种模块和库来扩展其功能。其中,Multer是一个流行的Node.js中间件,用于处理HTTP请求中的文件上传。它简化了在Node.js服务器上处理文件上传的过程。

Multer提供了一种简单的API来处理文件上传,并支持多种存储方式,如本地磁盘存储、内存存储和云存储等。它可以轻松地将上传的文件保存到指定的目录或存储服务中,并提供了一些选项来控制文件的大小、数量和格式等。

使用Multer进行文件上传通常需要以下步骤:

  • 安装Multer:通过npm或yarn安装Multer模块。
  • 配置Multer:创建Multer实例,并设置上传的目标目录或存储服务选项。
  • 应用Multer中间件:将Multer作为中间件应用到Express或其他Node.js框架的路由中。
  • 处理文件上传:在路由处理函数中使用Multer来处理文件上传,并获取上传的文件信息。

Multer-OSS是Multer的一个扩展,它提供了将上传的文件直接存储到阿里云对象存储服务(OSS)中的功能。使用Multer-OSS可以方便地将上传的文件直接保存到阿里云OSS中,而无需将文件先保存到本地或服务器上。

要使用Multer-OSS,需要在配置Multer时设置存储选项为OSS存储,并提供阿里云OSS的相关配置,如AccessKeyId、AccessKeySecret、Bucket等。Multer-OSS会自动将上传的文件保存到指定的阿里云OSS存储空间中,并返回文件的访问URL等信息。

一种是有数据,有状态服务,一中是无状态服务,推荐使用无状态服务。

概念介绍-接口文档

当提到接口文档时,通常会涉及到以下常用工具(其他工具大同小异):

Swagger

Swagger是一个用于设计、构建、记录和使用RESTful API的开源工具集。它提供了一种规范和工具,使得开发人员可以轻松地定义、构建和测试API。Swagger的核心是OpenAPI规范,它允许开发人员描述API的各个方面,包括端点、请求参数、响应格式等。Swagger UI是Swagger的一个可视化界面,可以自动生成API文档,并提供一个交互式的界面来测试API。

VuePress

VuePress是一个基于Vue.js的静态网站生成器,它可以用来创建漂亮的文档网站。VuePress提供了一种简单的方式来编写和组织文档,并支持Markdown语法。它还提供了一些内置的主题和插件,可以帮助你快速搭建一个具有响应式布局和导航的文档网站。

Postman

Postman是一个流行的API开发工具,它提供了一个用户友好的界面,用于构建、测试和调试API。Postman允许开发人员发送HTTP请求,并查看请求的响应。它还提供了一些高级功能,如断言测试、环境变量和集合管理,以帮助开发人员更高效地开发和测试API。

这些工具在API开发和文档编写过程中都起到了重要的作用,可以帮助开发人员更好地设计、测试和记录API,并提供友好的界面和工具来简化开发流程。

针对不同接口文档的选择,有很多说法。但是我认为,接口文档要保持对代码的低侵入性,程序是程序,文档是文档。相互修改互不影响,所以这里舍弃掉了 Swagger 这类嵌入式的没看文档方案。

国外比较常用的的事 postman 的组织模式,可以保证接口文档的时效性和便利性,不过在此处没有必要。

本次后端架构搭建,使用的是。vuepress 展示, postman便于调试这种形式。简单和好用。

概念介绍-消息队列

消息队列是一个重要的概念。消息队列是一种用于在应用程序之间传递消息的中间件。它提供了一种异步通信的方式,允许发送者将消息发送到队列中,然后接收者可以从队列中获取消息并进行处理。

RabbitMQ和Kafka是两个常见的消息队列系统。

RabbitMQ

RabbitMQ是一个开源的消息代理,实现了AMQP(高级消息队列协议)标准。它使用队列模型来传递消息,并支持多种消息模式,如点对点、发布/订阅和工作队列。RabbitMQ提供了可靠的消息传递机制,具有高可用性和可扩展性。它适用于各种场景,包括任务分发、日志记录、事件驱动等。

Kafka

Kafka是一个分布式的流处理平台,也是一个高吞吐量的分布式发布/订阅消息系统。它设计用于处理实时数据流,并具有持久性、可扩展性和容错性。Kafka使用主题(topics)来组织消息,并将消息分区存储在多个服务器上。它支持高吞吐量的消息处理,适用于大规模的数据流处理和日志收集。

这两个消息队列系统在功能和设计上有一些区别。RabbitMQ更加注重消息的可靠性和灵活性,适用于传统的消息队列模式。而Kafka则更加注重高吞吐量和实时数据处理,适用于大规模的数据流处理和日志收集场景。

选择使用哪个消息队列系统取决于具体的需求和场景。如果需要可靠的消息传递和灵活的消息模式,可以选择RabbitMQ。如果需要处理大规模的数据流和实时数据处理,可以选择Kafka。

小型项目,根据使用的场景来确定消息队列,建议使用 rabbitmq 和 redis封装的一些消息队列。

概念介绍-模板渲染

在Node.js中,模板渲染是一种常见的技术,用于将动态数据与静态模板结合生成最终的HTML页面。两个常见的模板渲染概念是EJS和SSR。

EJS(Embedded JavaScript)

EJS是一种简单而灵活的模板引擎,允许在HTML模板中嵌入JavaScript代码。它使用<% %>标签来执行JavaScript代码,<%= %>标签来输出变量的值。通过EJS,可以将动态数据传递给模板,并在服务器端生成最终的HTML页面。EJS适用于小型项目和简单的页面渲染需求。

SSR(Server-Side Rendering)

SSR是一种将动态数据在服务器端渲染成HTML页面的技术。与传统的客户端渲染(Client-Side Rendering)相比,SSR在服务器端生成完整的HTML页面,并将其发送到客户端。这样可以提供更好的SEO(搜索引擎优化)和首次加载性能。在Node.js中,可以使用框架如Next.js或Nuxt.js来实现SSR,它们提供了服务器端渲染的能力,并且与前端框架(如React或Vue.js)集成得很好。

选择使用哪种模板渲染技术取决于项目的需求和复杂性。如果项目较小且只需要简单的模板渲染,可以选择使用EJS。如果需要更好的SEO和首次加载性能,以及更复杂的页面渲染需求,可以考虑使用SSR技术,如Next.js或Nuxt.js。

目前都是采用前后端分离技术,EJS模版逐渐被淘汰。采用SSR技术基本上是为了更好的SEO。这部分可以根据业务场景选择。

概念介绍-静态文件托管

静态文件托管是其中一个重要的概念。

  • 静态文件托管是指将静态文件(如HTML、CSS、JavaScript、图像等)直接提供给客户端,而无需经过应用程序的处理。这样可以提高应用程序的性能和效率,同时减轻服务器的负载。
  • 在Midway框架中,可以通过配置静态文件托管中间件来实现静态文件的访问。中间件是一种在请求和响应之间进行处理的机制,可以用于处理各种功能,包括静态文件托管。
  • 通过Midway框架的静态文件托管中间件,可以指定一个或多个目录作为静态文件的根目录,并定义访问这些文件的URL路径。当客户端请求这些URL路径时,中间件会自动查找对应的静态-文件并返回给客户端。
  • 静态文件托管在Web开发中非常常见,它可以用于提供网站的静态资源,如样式表、脚本文件、图像等。通过将这些静态文件托管到专门的服务器或CDN上,可以提高网站的加载速度和用户体验。

总之,Midway框架提供了方便的静态文件托管功能,可以帮助开发人员快速搭建高性能的Node.js应用程序,并提供静态文件的访问和管理。

在此项目中,使用静态文件托管内容是,指定路径的接口文档,通过CI自动构建。

概念介绍-对象关系映射框架

在后端服务应用中,我们常常会用到关系型数据库,

但是在面向对象的语言代码逻辑里,数据都是用对象的形式表示的。

当操作数据库的时候,需要将内存的对象序列化后存储到数据库中。

或者在读取数据库数据的时候,需要将读取的数据反序列化为对象,这种就面向对象与关系数据库互不匹配的现象使得开发和维护变得更加困难。

而对象关系映射就是解决这种问题的技术,通过描述对象和数据库之间映射的元数据,把程序中的对象自动持久化到关系数据库中,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。

Sequelize

是一个老牌ORM框架,它适用于Node.js环境,并且可以与Postgres, MySQL, MariaDB, SQLite和Microsoft SQL Server等数据库一起使用。它具有强大的事务处理能力,并且可以方便地进行模型定义、数据操作和关联处理等。Sequelize通过Promise.js或Koa等框架进行异步操作,使用的是非阻塞式API,因此它可以轻松地处理大量并发请求。此外,Sequelize还支持各种类型的数据验证、关联、事务、条件查询、分页、各种操作符、函数、集团、文本搜索、连锁删除、多租户等特性。它使用的是JS(JavaScript / Node.js)语言进行开发,因此对于Node.js开发者来说非常容易上手。同时,Sequelize还提供了对TypeScript的支持。

TypeORM

原生支持Typescript,是一个能在Node.js和浏览器中运行的ORM框架。它支持多种数据库,例如MySQL / MariaDB / Postgres / SQLite / Microsoft SQL Server / Oracle / sql.js等。

本次架构搭建使用的是 TypeORM.

概念介绍-关系型数据库

关系型数据库是一种将数据存储在相互关联的表格中的数据库类型。

关系型数据库管理系统(RDBMS)是一种用于管理关系型数据库的软件。

在市场上,有许多流行的关系型数据库管理系统,常用的有:

  • MySQL
  • Oracle
  • Microsoft SQL Server
  • PostgreSQL

MySQL

MySQL是最流行的关系型数据库管理系统之一,它由瑞典MySQL AB公司开发,现在属于Oracle旗下产品。MySQL是一种开源的关系型数据库管理系统,具有快速、可靠、易用和灵活的特性。MySQL使用结构化查询语言(SQL)进行数据操作和管理,使得用户可以方便地访问和管理数据库。

MySQL在Web应用方面是非常流行的数据库管理系统之一,它提供了高效、稳定、安全的数据存储和数据处理能力,被广泛应用于各种网站和应用程序的开发。MySQL支持大量的并发用户连接,可以高效率地处理大量数据,同时也提供了备份和恢复功能,保障了数据的安全性和完整性。

与其他关系型数据库管理系统相比,MySQL具有体积小、速度快、总体拥有成本低等特点,因此被广泛地应用于中小型网站和大型网站的开发。同时,MySQL也支持多种操作系统,如Windows、Linux、macOS等,这使得它可以在不同的平台上使用。

总的来说,MySQL是一种可靠、高效、灵活的关系型数据库管理系统,适用于各种规模的应用开发,特别是在Web开发领域,MySQL已经成为一种广泛使用的标准工具。

mysql一般分版本,一般使用 5.7 版本或者最新稳定版本。

PostgreSQL

PostgreSQL是一种强大、开源、全球化的关系型数据库管理系统,它与MySQL在以下方面存在一些差异:

  • SQL标准实现和功能严谨性:PostgreSQL对SQL标准的实现更为完善,功能也更严谨。这意味着PostgreSQL可以更好地处理和执行符合SQL标准的查询,以及提供更高级的功能。
  • 存储过程和执行计划缓存:PostgreSQL对存储过程的功能支持要比MySQL好,具备本地缓存执行计划的能力。这使得PostgreSQL在执行存储过程时,能够更快地完成任务,并减少CPU和内存的使用。
  • 表连接支持和复杂查询能力:PostgreSQL对表连接的支持较完整,优化器的功能较完整,支持的索引类型很多,复杂查询能力较强。这意味着PostgreSQL可以更好地处理多表之间的关联查询,并且在执行复杂查询时,能够提供更好的性能和准确性。
  • 数据存放方式:PG的主表采用堆表存放,而MySQL采用索引组织表。这种差异使得PostgreSQL能够支持比MySQL更大的数据量,更适合处理大规模的数据。
  • 主备复制方式:PG的主备复制属于物理复制,相对于MySQL基于binlog的逻辑复制,数据的一致性更加可靠,复制性能更高,对主机性能的影响也更小。这意味着在使用PostgreSQL进行数据备份和恢复时,可以更快速地完成任务,同时减少对主机性能的影响。
  • 存储引擎插件化机制:MySQL的存储引擎插件化机制,存在锁机制复杂影响并发的问题,而PG不存在。这意味着PostgreSQL在处理并发操作时,能够提供更好的性能和可靠性。

PostgreSQL 可以作为 mysql 的上位代替品,在很多方面拥有更好的优势。但是目前来说,通用性没有mysql强。

本次项目搭建使用的是 mysql5.7 数据库

概念介绍-非关系型数据库

非关系型数据库(NoSQL)是一种用于存储和检索数据的数据库系统,与传统的关系型数据库(如MySQL、Oracle)相比,它们采用了不同的数据模型和存储方式。

以下是几种常见的非关系型数据库:

  • 键值存储数据库(Key-Value Store):这种数据库将数据存储为键值对的形式,类似于字典或哈希表。键值存储数据库非常简单,适用于快速存储和检索数据,如Redis、Memcached。
  • 文档数据库(Document Store):文档数据库以类似于JSON或XML的文档格式存储数据。每个文档可以包含不同的字段和值,文档之间可以嵌套。文档数据库适用于存储半结构化数据,如MongoDB、CouchDB。
  • 列族数据库(Column Family Store):列族数据库以列的方式存储数据,每个列族可以包含多个列。列族数据库适用于大规模数据的存储和分析,如HBase、Cassandra。
  • 图数据库(Graph Database):图数据库使用图结构来存储数据,其中节点表示实体,边表示实体之间的关系。图数据库适用于复杂的关系和网络分析,如Neo4j、ArangoDB。

非关系型数据库在某些方面具有优势,例如可扩展性、高性能、灵活的数据模型等。它们适用于处理大规模数据、高并发访问和复杂的数据结构。然而,非关系型数据库也有一些限制,例如缺乏事务支持和较少的查询功能。

当涉及到以下场景时,非关系型数据库通常是一个很好的选择:

  • 大规模数据存储和分析:非关系型数据库在处理大规模数据时表现出色。例如,列族数据库(如HBase、Cassandra)适用于存储和分析海量数据,如日志、传感器数据等。
  • 实时数据处理:非关系型数据库通常具有低延迟和高吞吐量的特点,适用于实时数据处理场景。例如,键值存储数据库(如Redis、Memcached)可以用于缓存和快速访问频繁使用的数据。
  • 半结构化数据存储:文档数据库(如MongoDB、CouchDB)适用于存储半结构化数据,如JSON或XML格式的数据。这种类型的数据库可以灵活地存储和查询不同结构的文档。
  • 社交网络和关系图谱:图数据库(如Neo4j、ArangoDB)适用于存储和查询复杂的关系和网络数据。它们可以轻松处理社交网络、推荐系统、关系图谱等场景。
  • 缓存和会话存储:键值存储数据库(如Redis、Memcached)可以用于缓存常用数据,提高应用程序的性能。它们还可以用于存储会话数据,如用户登录信息、购物车数据等。
  • 日志和事件存储:非关系型数据库可以用于存储和分析日志和事件数据。例如,列族数据库(如HBase、Cassandra)可以用于存储大量的日志数据,并支持高效的查询和分析。

本次项目搭建使用的非关系形数据库是 redis。没有用到文档形(MongoDB)或者其他类型的非关系数据库,业务上没有必要。

概念介绍-微服务

微服务是一种架构风格,它将一个大型应用程序拆分为一组小型、独立的服务,每个服务都可以独立开发、部署和扩展。这些服务之间通过轻量级的通信机制进行交互,通常是通过HTTP/REST、消息队列或事件总线。

以下是一些与微服务相关的概念和特点:

  • 服务拆分:微服务架构将应用程序拆分为多个小型服务,每个服务负责特定的业务功能。这种拆分使得每个服务可以独立开发、部署和扩展,提高了开发效率和系统的灵活性。
  • 独立部署:每个微服务都可以独立部署,这意味着可以对某个服务进行更新或扩展,而不会影响其他服务。这种独立性使得系统更加容易维护和升级。
  • 松耦合:微服务之间通过轻量级的通信机制进行交互,它们之间的依赖关系较弱。这种松耦合性使得系统更加灵活,可以更容易地替换、添加或删除某个服务。
  • 独立技术栈:每个微服务可以使用不同的技术栈和编程语言,根据具体的需求选择最适合的工具和框架。这种灵活性使得团队可以根据自己的专长选择合适的技术栈。
  • 弹性和可伸缩性:由于每个微服务都是独立的,可以根据需要对其进行水平扩展。这种弹性和可伸缩性使得系统能够处理高负载和大规模的并发请求。
  • 增量开发和快速迭代:微服务架构支持增量开发和快速迭代,每个服务可以独立开发和测试。这种敏捷性使得团队能够更快地推出新功能和修复问题。

微服务架构适用于复杂的应用程序和大型团队,它可以提供更高的灵活性、可伸缩性和可维护性。然而,微服务架构也带来了一些挑战,如服务间通信的复杂性、分布式事务的处理等,需要仔细考虑和解决。

本次项目搭建没有用到微服务架构。主要是体量较小,用微服务增加系统复杂性,增加没有必要的负担。

概念介绍-Nginx

Nginx一个高性能的开源Web服务器和反向代理服务器。它具有轻量级、高并发处理能力和低内存消耗的特点,被广泛用于构建高性能的Web应用和服务。

  • 高性能:Nginx采用事件驱动的异步非阻塞架构,能够处理大量并发连接,具有出色的性能表现。它可以在相对较少的硬件资源下处理更多的请求,适用于高负载的Web应用场景。
  • 反向代理:Nginx可以作为反向代理服务器,将客户端请求转发给后端的多个服务器。它可以根据配置规则进行负载均衡,实现请求的分发和高可用性。
  • 静态文件服务:Nginx可以快速、高效地提供静态文件的服务。它可以直接从磁盘中读取文件并进行传输,减少了对动态处理的依赖,提高了性能。
  • 动态内容处理:Nginx支持与后端应用程序(如PHP、Node.js)进行集成,可以通过FastCGI、uWSGI等协议与后端应用程序进行通信,实现动态内容的处理和生成。
  • SSL/TLS支持:Nginx可以配置和管理SSL/TLS证书,提供安全的HTTPS连接。它支持多种加密算法和协议版本,可以保护数据的传输安全性。
  • 缓存和压缩:Nginx支持静态内容的缓存和压缩,可以减少网络传输的数据量,提高页面加载速度和用户体验。
  • 日志记录和监控:Nginx可以记录访问日志和错误日志,方便进行故障排查和性能分析。此外,Nginx还提供了一些监控指标和状态页面,用于实时监控服务器的运行状态。

Nginx的配置简单灵活,具有良好的可扩展性和可定制性。它被广泛应用于构建高性能的Web服务器、负载均衡器、反向代理、缓存服务器等。无论是小型网站还是大型企业应用,Nginx都是一个可靠的选择。

本次项目搭建原本准备使用 nginx 作为反向代理服务器,但是后面采用了阿里云的全栈加速功能,作为nginx的上位代替品。目前由于域名问题暂未国内备案,所以访问速度有点缓慢。

概念介绍-证书安全

HTTPS(Hypertext Transfer Protocol Secure)是一种通过加密和身份验证保护数据传输安全的网络通信协议。它是HTTP的安全版本,使用SSL(Secure Sockets Layer)或TLS(Transport Layer Security)协议来加密和保护数据的传输。

SSL证书是一种由可信任的第三方机构(称为证书颁发机构或CA)签发的数字证书,用于验证网站的身份和加密通信。它包含了网站的公钥、网站的信息以及证书颁发机构的数字签名。

以下是HTTPS和SSL证书的关键概念:

  • 数据加密:HTTPS使用SSL/TLS协议对传输的数据进行加密,确保数据在传输过程中不被窃听或篡改。加密过程使用公钥加密和私钥解密的方式,只有拥有私钥的服务器才能解密数据。
  • 身份验证:SSL证书用于验证网站的身份。证书颁发机构会对网站的所有者进行身份验证,并在证书中包含网站的信息。当用户访问一个使用HTTPS的网站时,浏览器会检查网站的证书是否有效和可信任。
  • 数字签名:SSL证书中包含了证书颁发机构的数字签名,用于验证证书的真实性和完整性。浏览器会使用证书颁发机构的公钥对签名进行验证,确保证书没有被篡改。
  • 信任链:浏览器内置了一组可信任的根证书颁发机构,称为信任锚点。当浏览器收到一个网站的证书时,它会检查证书的颁发机构是否在信任锚点列表中。如果是,浏览器会信任该证书;否则,浏览器会发出警告或拒绝连接。

使用HTTPS和SSL证书可以提供以下安全性和优势:

  • 数据保护:HTTPS加密传输可以防止敏感数据(如登录凭据、支付信息等)在传输过程中被窃听或篡改。
  • 身份验证:SSL证书可以验证网站的身份,确保用户连接到正确的网站,防止中间人攻击和钓鱼网站。
  • 搜索引擎优化:搜索引擎通常会优先显示使用HTTPS的网站,因为它们提供更安全的用户体验。
  • 用户信任:使用SSL证书可以增加用户对网站的信任度,提高用户的满意度和转化率。

为了使用HTTPS和SSL证书,网站管理员需要从可信任的证书颁发机构获取证书,并将其配置到Web服务器上。一旦配置完成,用户在访问网站时会通过HTTPS建立安全的加密连接。

Https 证书的配置多种多样,比如oss证书配置,全站加速证书配置,nginx证书配置,甚至于宝塔管理面板证书配置,这里不在赘述,有兴趣的可以去了解一下。

概念介绍-全站加速

阿里云全站加速(Alibaba Cloud CDN)是阿里云提供的一项内容分发网络服务,旨在提高网站的访问速度和用户体验。全站加速通过将网站的静态和动态内容分发到全球分布的边缘节点,使用户可以从离他们更近的节点获取内容,从而减少网络延迟和提高响应速度。

以下是全站加速的关键概念和功能:

  • 内容分发网络(CDN):全站加速利用阿里云的全球分布式CDN网络,将网站的静态资源(如图片、CSS、JavaScript文件等)缓存到离用户更近的边缘节点上。当用户请求访问网站时,内容将从最近的节点传送,减少了网络传输距离和延迟。
  • 动态加速:除了静态资源,全站加速还支持动态内容的加速。它可以缓存动态页面的响应结果,并根据用户的请求动态生成内容,从而减轻源站的负载压力,提高动态内容的访问速度。
  • 智能调度:全站加速具有智能调度功能,可以根据用户的地理位置、网络状况和节点负载等因素,自动选择最佳的边缘节点提供服务。这样可以确保用户从最优的节点获取内容,提供更快的响应速度和更好的用户体验。
  • 安全防护:全站加速提供了多种安全防护功能,包括DDoS攻击防护、Web应用防火墙(WAF)等。它可以帮助网站抵御各种网络攻击,保护网站的可用性和安全性。
  • 实时监控和统计:全站加速提供实时的监控和统计功能,可以查看网站的访问量、流量分布、缓存命中率等指标。这些数据可以帮助网站管理员了解网站的访问情况,进行性能优化和容量规划。

通过使用阿里云全站加速,网站可以获得以下好处:

  • 提高访问速度:全站加速通过将内容缓存到离用户更近的边缘节点,减少了网络延迟,提高了网站的访问速度。
  • 改善用户体验:快速的网页加载速度可以提升用户的满意度和留存率,改善用户的浏览体验。
  • 节省带宽成本:通过缓存和压缩静态资源,全站加速可以减少源站的带宽消耗,降低网站运营成本。

提高网站的可用性和稳定性:全站加速具有智能调度和安全防护功能,可以提高网站的可用性,并保护网站免受网络攻击的影响。

阿里云全站加速适用于各种类型的网站,包括电子商务、媒体、企业门户等。它可以帮助网站提供更快速、安全和可靠的访问体验,满足用户的需求。

我们主要使用此功能前端进行内容分发 CND(多地域访问),后端进行 API 接口全球加速。(域名未备案,访问暂时缓慢)

概念介绍-提交规范

提交规范(Conventional Commits)是一种用于规范化Git提交消息的约定。它定义了一套固定的格式和规则,使得提交消息更加清晰、易读和易于自动化处理。提交规范通常与工具和流程结合使用,以提高团队协作和代码质量。

git-cz

是一个用于帮助开发者生成符合提交规范的Git提交消息的工具。它提供了一组交互式的命令行提示,引导开发者填写提交类型、作用域、主题等信息,并生成符合规范的提交消息。

Husky

是一个Git钩子工具,用于在Git操作(如提交、推送等)前后执行自定义的脚本。Husky可以帮助开发者在代码提交前进行代码检查、测试等操作,以确保代码的质量和一致性。它可以与其他工具(如ESLint、Prettier)结合使用,实现自动化的代码检查和格式化。

ESLint

是一个用于检测和报告JavaScript代码中潜在问题的工具。它可以帮助开发者遵循一致的代码风格和最佳实践,提高代码质量和可维护性。ESLint提供了一系列可配置的规则,可以根据项目需求进行定制。

Prettier

是一个代码格式化工具,用于自动调整代码的缩进、换行、空格等格式,以保持一致的代码风格。Prettier可以与各种编程语言和编辑器集成,并提供了一系列可配置的选项,以满足不同项目的格式化需求。

综合使用这些工具和规范,可以帮助团队实现以下目标:

  • 提高代码质量:通过使用ESLint进行代码检查,可以发现和修复潜在的问题,提高代码的质量和可维护性。
  • 统一代码风格:通过使用Prettier进行代码格式化,可以确保团队成员的代码风格一致,减少代码审查和合并冲突的工作量。
  • 规范化提交消息:通过使用提交规范和git-cz工具,可以规范化提交消息的格式和内容,使得提交历史更加清晰和易于追踪。
  • 自动化流程:通过使用Husky和其他工具的钩子功能,可以在Git操作前后执行自定义的脚本,实现自动化的代码检查、测试和格式化等操作。

使用提交规范的思想来源于,StudioPro 软件开发,并在此基础上进行了优化和改进,针对不同的项目配置不同的提交规范,并加上不同的前置提交约束。

可以更好的帮助团队提高代码质量、统一代码风格,并实现自动化的代码检查和格式化流程。

概念介绍-接口设计

接口设计是指在软件开发中定义和设计应用程序之间的交互接口。接口设计的目标是确保不同组件、服务或系统之间的有效通信,并提供清晰、一致和易于使用的接口。

RESTful规范是一种用于设计和构建Web服务的架构风格。它基于HTTP协议,并遵循一组规范和约定,以实现可伸缩、可靠和可扩展的分布式系统。RESTful规范强调资源的概念,将系统中的数据和功能抽象为资源,并使用HTTP方法(如GET、POST、PUT、PATCH、DELETE等)对资源进行操作。

以下是RESTful规范的关键概念和原则:

  • 资源(Resources):在RESTful架构中,所有的数据和功能都被视为资源。每个资源都有一个唯一的标识符(URI),可以通过HTTP方法对其进行操作。
  • 统一接口(Uniform Interface):RESTful规范定义了一组统一的接口约束,包括使用HTTP方法对资源进行操作(GET、POST、PUT、PATCH、DELETE等)、使用URI标识资源、使用HTTP状态码表示操作结果等。
  • 无状态(Stateless):RESTful架构是无状态的,即服务器不会存储客户端的状态信息。每个请求都应该包含足够的信息,以便服务器可以理解和处理请求。
  • 超媒体(HATEOAS):RESTful规范鼓励使用超媒体(Hypermedia)来表示资源之间的关系。通过在响应中包含链接和相关资源的信息,客户端可以动态地导航和发现资源。
  • 缓存(Caching):RESTful架构支持缓存机制,可以减少网络传输和服务器负载。服务器可以在响应中包含缓存相关的头信息,以指示客户端是否可以缓存响应。

通过遵循RESTful规范,可以获得以下好处:

  • 可伸缩性:RESTful架构支持水平扩展和负载均衡,可以处理大量的并发请求。
  • 可靠性:RESTful架构使用HTTP协议,具有可靠的传输机制和错误处理机制。
  • 可扩展性:通过将功能和数据抽象为资源,可以轻松地添加新的资源和操作。
  • 可移植性:RESTful架构是基于标准的HTTP协议,可以在不同的平台和语言之间进行交互。

在本次系统开发中,参考RESTful规范进行接口设计,有助于提高系统的可维护性和可扩展性。

  • 版权声明: 本博客所有文章,未经许可,任何单位及个人不得做营利性使用!转载请标明出处!如有侵权请联系作者。
  • Copyrights © 2015-2024 翟天野

请我喝杯咖啡吧~