架构师论文备考-论云原生架构及其应用
摘要
2022年3月,我有幸参与了公司的新智慧公交系统的研发工作。该系统基于B/S架构设计,并以多租户SaaS平台化为发展目标,旨在创建一个功能更全面、性能更卓越、稳定性更强、用户体验更佳的公交调度一体化平台。在这一项目中,我主要参与了系统的整体架构决策以及新智慧公交平台中调度模块的设计与开发工作。文本详细阐述了智慧公交系统在云原生架构方面的具体实践,智慧公交系统在云原生架构的应用上,不仅体现了现代微服务设计理念和云原生技术趋势,还通过综合运用多种开源技术和工具,构建了一个高性能、高可用、易于扩展和维护的智慧交通解决方案。
正文:
云原生架构的三大核心技术——容器、微服务和DevOps,共同构建了现代云计算应用的基础。这些技术遵循服务化、弹性、可观测性和自动化四大设计原则,以确保应用在云环境中的高性能、高可用性和高效运维。
服务化原则通过将应用拆分为一组小型、独立且松耦合的服务,每个服务专注于应用的一个功能模块,并通过API进行通信,实现了快速迭代和部署。这种设计促进了敏捷开发和持续交付,允许开发团队在不干扰其他服务的情况下独立升级和扩展每个服务。
弹性原则确保了应用能够根据需求动态扩展或缩减资源,以应对云环境中的流量波动。应用可以自动调整服务器实例、存储和带宽等资源,以优化性能和成本效率,保持稳定运行。
可观测性原则要求系统提供充足的信息,使外部观察者能够理解其内部状态。通过收集、分析和展示应用性能指标、日志及跟踪数据,良好的可观测性帮助运维团队实时监控应用状态,快速诊断和解决问题,从而提升性能。
自动化原则通过软件工具和脚本自动执行重复性任务和流程,减少手动操作,提高效率和一致性。在云原生环境中,自动化包括自动部署、测试、监控、故障恢复和资源管理,是实现持续集成和持续部署(CI/CD)的关键。
这四大原则共同铸就了云原生应用的设计理念,使应用更加适应云环境,充分运用云资源的弹性和可扩展性,同时确保应用的可靠性和运维的效率。通过这种设计,云原生应用能够提供更加灵活、可靠和高效的服务,满足现代数字化业务的需求。
智慧公交系统构建在公司业务中台和数据中台之上,采用微服务架构设计,并以敏捷开发模式为指导,采用小团队协作模式,实现了系统的功能开发和迭代。
智慧公交系统作为一个物联网平台,需要与多种设备进行频繁的交互。其交互架构设计分为三层:感知层负责接收来自各种设备(如终端、客流仪、GPS定位系统)的消息;S17作为消息中间层,对设备消息进行封装,并按照通用协议进行处理和转换;服务层由智慧公交系统的tap服务组成,主要负责设备信令消息的接收与发送,采用Kafka消息队列以事件驱动的方式完成设备交互。事件被封装为IOT Schema和biz Schema两种交互事件,分别用于对接设备和上层业务事件。项目选择MQTT协议作为与设备通信的标准,因为MQTT更适合于频繁交互且信号移动的物联网设备。
为了实现高效的服务请求处理和流量管理,系统采用了Nginx作为服务代理和转发组件,确保了服务的稳定性和高可用性。 在内部组件的交互方面,智慧公交系统选择了Dubbo作为RPC框架,以实现系统内部服务间的解耦和高效通信。而对于与外部服务的交互,系统则使用了Fegin客户端,通过声明式REST客户端简化了与外部API的集成。
服务治理方面,系统采用了Nacos作为服务注册和发现中心,实现了服务的动态注册、发现和负载均衡。调度服务的设计采用了事件驱动模式,借助Kafka消息队列完成了消息的发布和订阅,有效提升了系统的异步处理能力和解耦性。
在分布式系统的监控和追踪方面,项目初期通过traceId实现了日志链路追踪,为后续的故障排查和性能优化提供了重要依据。为了进一步提升链路追踪的完善性和项目的可观测性,项目计划集成SkyWalking开源框架,以实现更加细粒度和全面的服务追踪。
智慧公交平台基于公司中台网关构建,通过网关地址对外提供统一的访问入口,增强了服务的安全性和访问控制。同时,利用中台的能力,项目实现了单点登录、熔断降级和友好性提示等功能,提升了用户体验和系统的稳定性。
在部署和运维方面, 智慧公交项目的部署策略经历了几次迭代和优化。最初,项目使用Jenkins进行打包和通过自建部署脚本完成部署流程。随着项目的发展,公交智慧平台项目统一增加了installer模块,用于自动部署多语言词条、页面菜单资源配置、Nacos配置和SQL脚本的版本迭代。随着公司新的CI/CD平台的建成,智慧公交项目开始整合到这一平台,实现了通过统一CI/CD平台的一键化部署,简化了部署流程并提高了效率。
整体而言,智慧公交系统的项目架构设计充分考虑了可扩展性、模块化和高性能,通过微服务架构和领域驱动设计,实现了系统的灵活性和可维护性,为公交系统的智能化升级提供了坚实的技术基础。
在智慧公交项目的开发过程中,版本迭代和CI/CD自动化部署的问题曾是项目正式上线的重大挑战。由于平台是新开发的,且迭代频繁,不同版本间有时会存在显著的差异,如第13版本实现了数据库租户的SaaS化功能,导致数据库结构发生重大变化。为应对这种情况,我们制定了详尽的升级文档,并编写了数据库迁移脚本,以确保系统升级的顺利进行。运维和开发团队保持密切沟通,共同确保项目升级的稳定性。
另一个问题是,由于领导层变更和核心人员离职,团队缺乏具有全局视野的成员,这导致系统初始设计存在不足,需要不断优化。为此,我们以项目经理提出的需求为基础,专注于实现这些需求,并在后续版本中不断进行功能性改进和维护。系统上线前进行了全面测试,以避免严重问题的发生。
随着项目的落地,我们收集了用户反馈和需求,通过对系统现有问题的分析,我们不断迭代改进智慧公交系统,致力于打造一个满足公交用户需求的一体化智慧公交平台。通过这些努力,我们确保了系统能够稳定运行,并且能够不断适应和满足用户的变化需求。相信通过时间和经验的积累,在多元化的云原生架构的支撑下,我们的项目也将变得越来越完善,以提供更智能、更满意的用户体验。
相关文章:
架构师论文备考-论云原生架构及其应用
摘要 2022年3月,我有幸参与了公司的新智慧公交系统的研发工作。该系统基于B/S架构设计,并以多租户SaaS平台化为发展目标,旨在创建一个功能更全面、性能更卓越、稳定性更强、用户体验更佳的公交调度一体化平台。在这一项目中,我主要…...
12.java面向对象:java构造器
构造器 一个类即使什么都不写,也会存在一个方法。 假如我创建了一个类叫Student里面什么都不写,然后使用StudentDemo创建对象,运行没有结果,也没有报错。 public class Student {}public class StudentDemo {public static voi…...
微服务之间的安全通信
在微服务架构中,服务之间的通信是系统的核心部分。然而,由于服务的分布式和独立性,确保它们之间的通信安全至关重要。如果没有适当的安全机制,微服务系统可能会暴露在各种网络攻击和安全漏洞中。本文将讨论几种常见的微服务间安全…...

全面掌握 Jest:从零开始的测试指南(下篇)
在上一篇测试指南中,我们介绍了Jest 的背景、如何初始化项目、常用的匹配器语法以及钩子函数的使用。这一篇篇将继续深入探讨 Jest 的高级特性,包括 Mock 函数、异步请求的处理、Mock 请求的模拟、类的模拟以及定时器的模拟、snapshot 的使用。通过这些技…...
如何利用UML进行领域建模
如何利用UML进行领域建模 领域建模是通过创建抽象模型来反映业务领域中的核心概念、实体及其之间的关系。UML(统一建模语言)是进行领域建模的常用工具,它能帮助我们可视化地设计系统架构和业务逻辑。在这篇讲解中,我们将详细解释…...

Vue实用操作篇-1-第一个 Vue 程序
安装 Vue 非常的简便,只需下载好 Vue 对应的 .js 文件,在 html 中引入 vue.js 即可使用 Vue 下载好了 vue.js 我们便可以编写我们的第一个 vue 程序了 <!doctype html> <html lang"zh-CN"><head><meta charset"utf…...
Qwen2-VL的微调及量化
一、Qwen2-VL简介 Qwen2-VL是Qwen-VL的升级版本,能力更强,性能全面提升。尤其是72B参数的版本更是取了惊人的成绩。它可以读懂不同分辨率和不同长宽比的图片,在 MathVista、DocVQA、RealWorldQA、MTVQA 等基准测试创下全球领先的表现…...

[数据集][目标检测]车窗状态检测车窗开关检测数据集VOC+YOLO格式299张3类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):299 标注数量(xml文件个数):299 标注数量(txt文件个数):299 标注类别…...

自动泊车系统中的YOLOv8 pose关键点车位线检测
自动泊车系统中的YOLOv8关键点车位线检测技术解析 引言 随着智能驾驶技术的快速发展,自动泊车功能成为了现代汽车的重要组成部分。它不仅能够提高驾驶的安全性,还能在一定程度上解决城市停车难的问题。在自动泊车系统中,准确识别停车位的位置…...
Java html生成pdf和图片
在 Java 项目中将 HTML 生成图片是一项常见需求,特别是用于生成报告、预览页面截图等。不同的库和工具在渲染能力、性能以及支持的功能上有所不同。以下是几种主流的技术选型和对比,帮助你选择适合的解决方案。 技术对比总结 技术名称优点缺点适用场景…...

JavaWeb笔记整理——Redis
目录 Redis数据类型 各种数据类型的特点 Redis常用命令 字符串操作命令 哈希操作命令 列表操作命令 集合操作命令 有序集合操作命令 通用命令 在Java中操作Redis Spring Data Redis的使用方式 操作字符串类型的数据 编辑操作hash类型的数据 编辑 操作列表类…...
数据库(mysql)常用命令
一.常见的数据库端口号 Mysql默认端口:3306 oracle 默认端口:1521 Sql server 默认端口:1433 注:Mysql采用 的是C/S(客户端/服务器端)架构 二.sql 语法基础 服务器,数据库,数据表,记录,字段之间的关系: 一台Mysql服务器可以管理多个数据库 一个数据库可以存在多张二维表…...

源网荷储一体化新型电力系统解决方案
风光装机快速增长,加剧电力系统不可控性。截至2023H1,我国风电装机389.21GW,太阳能装机470.67GW,风光合计占总装机的31.76%。其中,2023年H1我国风电新增装机22.99GW,对比22年同期新增12.94GW,同…...
树莓派安装 OpenCV 教程
以下是在树莓派上安装 OpenCV 的教程: 笔者当前Python版本:3.7.3 一、更新树莓派系统 在终端中运行以下命令: sudo apt update sudo apt upgrade二、安装必要的依赖项 安装构建工具和图像 I/O 库: sudo apt install build-e…...

01,大数据总结,zookeeper
1 ,zookeeper :概述 1.1,zookeeper:作用 1 ,大数据领域 :存储配置数据 例如:hadoop 的 ha 配置信息,hbase 的配置信息,都存储在 zookeeper 2 ,应用领…...

伪工厂模式制造敌人
实现效果 1.敌人方实现 敌人代码 using UnityEngine; using UnityEngine.UI;public class EnemyBasics : MonoBehaviour {public int EnemySpeed { get; internal set; }public int EnemyAttackDistance { get; internal set; }public int EnemyChaseDistance { get; interna…...
【linux】pwd命令
pwd 命令在 Linux 和类 Unix 系统中用于显示当前工作目录的完整路径。它是 "print working directory" 的缩写。 当你在终端或命令行界面中工作时,你可能会在不同的目录(或文件夹)之间切换。pwd 命令帮助你确定你当前位于哪个目录…...

Python 如何封装工具类方法,以及使用md5加密
第一步:封装使用方法 在utils目录中,编写我的md5加密的方法,如下: import re import hashlib from os import path from typing import Callable from flask import current_app# 这里封装的是工具类的方法def basename(filenam…...
网络编程的应用
目录 1.单机程序和网络程序 2.客户端与服务端 3.网络编程三要素 3.1 IP地址 3.2 port端口 4.TCP编程 5.UDP编程 1.单机程序和网络程序 之前编写的程序都是单机程序,所有的业务功能实现及数据存储都在一个主机上完成,我们称为单机程序 我们在生活…...

佰朔资本:国内海风加速招标 船舶行业景气上行
昨日,沪指盘中一度下探失守2700点,尾盘在地产、银行等板块的带动下发力上扬,深证成指亦翻红。到收盘,沪指涨0.49%报2717.28点,深证成指涨0.11%报7992.25点,创业板指跌0.11%报1533.47点,上证50指…...
Spring Boot 实现流式响应(兼容 2.7.x)
在实际开发中,我们可能会遇到一些流式数据处理的场景,比如接收来自上游接口的 Server-Sent Events(SSE) 或 流式 JSON 内容,并将其原样中转给前端页面或客户端。这种情况下,传统的 RestTemplate 缓存机制会…...

JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...

大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...