系统架构设计师论文分享-论微服务架构

我的软考历程

摘要

2023年2月,我所在的公司通过了研发纱线MES系统的立项,该系统为国内纱线工厂提供SAAS服务,旨在提高纱线工厂的数字化和智能化水平。我在该项目中担任系统架构设计师一职,负责该项目的架构设计工作。本文结合我在该项目中的实践,详细论述了微服务架构及其应用。微服务架构把系统分为一个个独立的模块,每个模块单独管理、开发、部署和运行,所以它具有技术异构型、容错性、高可用性、模块独立性等特点。本项目采用微服务架构开发,提高了项目的开发和迭代速度,让项目的性能、可用性、可修改性、安全性、可维护性得到了保障。最终在2023年12月,该项目正式上线并对外提供服务,目前已经有563家工厂接入了该系统,系统运行良好,得到了客户的一致赞扬。

项目背景

随着我国从制造业大国向制造业强国的转换以及工厂数字化和智能化的持续推进,我所在的某地某科技公司基于自研的物联网平台相继开发了染整一体化和织布一体化平台,这些平台上线后,得到了工厂的追捧,也为公司带来了丰厚的经济回报。基于此,我司于2023年2月开始研发纱线MES系统,该系统预算730万,建设工期10个月,涵盖纱线工厂从清花、梳棉、并条、精梳、粗纱、细纱到络筒的全流程工序,将为纱线工厂提供全面的生产管理解决方案以及基于数据的智能决策分析能力。该项目为物联网层次架构,整体分为感知层、网络层和应用层。其中网络层为公司已有的物联网平台,这次重点建设内容为感知层和应用层,感知层使用Golang语言开发,作为联网网关部署在工厂侧,负责工厂数据的采集和云端指令的下发。应用层为纱线MES系统主体,采用Java语言开发,使用Spring Cloud微服务架构,数据库使用Mysql,缓存使用Redis,前端框架使用vue.js,日志、监控和链路追踪采用skywalking、prometheus、grafana和ELK,最终通过devops的方式部署在kubernetes集群中。系统上线后,将提供以下:基础管理、数据接入、工单排产、数字孪生、工资计算、智控中心和数据分析等等功能,通过以上功能,可以全面提升纱线工厂的数字化和智能化水平,使其运营水平和生产效率得到质的飞跃。

论述内容

该系统涉及模块众多,如果采用单体架构,在开发效率和部署上会面临问题,单体架构中每一个模块进行改动都要进行整体的测试和部署,这很影响开发和部署的效率,造成服务的不稳定性。而微服务架构相对于单体架构具有以下特点:1、模块独立性,可以独立管理、开发、测试和部署并独立运行。2、技术异构性,由于每个微服务互相不影响,所以每个微服务都可以采用不同的技术实现。3、容错性、可用性,微服务之间不存在紧密耦合,一个微服务出现问题,不影响其他微服务。4、可扩展性,微服务之间是独立的,所以可以独立的扩展,不影响其他微服务,具有良好的扩展性。不过微服务也存在如下问题:1、分布式下的复杂性,由于微服务采用分布式的模式,就存在服务管理,注册,发现、服务依赖等问题。2、微服务的数据一致性,由于每个微服务采用独立的数据库,当有依赖事务时,就需要保证数据的一致性,这在分布式下是比较困难的。3、运维的复杂性,传统的手工部署在微服务模式下难以实施。本文结合我在该项目中的实践,详细论述微服务架构的实施以及相应问题的解决方案。

1、分布式下的复杂性。

为了解决微服务在分布式下的复杂性,我们采用Spring Cloud架构,使用nacos作为服务的配置和注册中心,每一个服务启动时都会把自己的ip和端口相关信息推送到nacos中,这样nacos就维护了全部的微服务实例信息。当一个微服务有请求时,就会通过nacos获取对应的ip和端口信息,然后通过ribbon实现负载均衡,通过open-feign进行远程调用。同时,微服务还面临分布式配置的问题,如果没有全局的配置中心,在发布服务时会因为配置的不一致或者手工的错误而导致失败,有了nacos作为分布式配置中心,免去了手工维护配置的不稳定性,让系统不会因为配置而产生错误,同时nacos可以按环境保存配置,在不同的环境之间做了隔离,避免了因为环境而导致的问题。

2、数据的一致性问题。

微服务采用多实例部署,当一个请求的业务涉及多个微服务时,就会存在不同微服务修改数据的可能,在单体情况下,可以采用一个事务进行处理,但是在微服务下就没法这样做了。为了解决这个问题,我们采用了多种方式:1、批处理。2、seata。3、基于消息队列。第一种方式比较简单,比如纱线的前纺数据,这一部分数据对于业务不那么重要,所以我们每日都会通过批量处理的方式进行校验,如果数据不对再触发边端的重复上报。第二种方式是通过阿里开源的seata,它是一个开源的分布式事务解决方案,通过它,我们使用AT模式可以做到对业务没有侵入而实现分布式事务。当然这种方式对性能有很大影响,在使用时要对重要的事务进行处理,比如在纱线业务中,工单排产是一个复杂过程,这个过程会涉及到不同微服务的数据调整,一旦出现错误,会造成严重的后果,那这种就需要用seata来保证处理过程的分布式事务性。第三种是采用消息队列,比如我们采用RocketMQ消息队列,它提供了一种特性的消息:事务消息,通过它可以实现分布式下的数据一致性。比如在纱线业务中,我们对工资做计算时,就是通过生产的数据进行触发消息执行的。

3、运维的复杂性。

在微服务架构情况下,如果采用手工部署,基本时不可能完成,也会对项目的进度造成重大影响。基于此,我们采用了docker和kubernetes以及cicd技术,当我们的代码在提交后,就会触发cicd的自动编译,自动代码扫码和执行单元测试,当这一步骤完成后,就会进行docker镜像的制作,并把生成的镜像提交到镜像仓库中。最后,我们就可以一键进行镜像的部署,把微服务部署到kubernetes集群中。通过这种方式,我们有效地保障了项目的进度,同时减少了人工导致的错误,保障了项目的质量。

总结

通过采用微服务架构模型,我们提升了开发和迭代速度,保障了项目的性能、可用性、安全性、可修改性等质量指标,确保了项目的按时上线。最终在2023年12月,该项目正式上线并对外提供服务,目前已经有563家工厂接入了我们的系统,系统运行良好,表现优异,得到了客户工厂和公司领导的一致好评。项目虽然获得了成功,但是也遇到过一些问题,在项目初期,由于产品对纱线业务的不熟悉,导致了多次功能的调整和返工,这让开发人员产生了抵触情绪。为了解决这个问题,我提出两个解决方案:1、派产品去工厂一线,熟悉纱线工厂操作流程,与工人交流,掌握纱线业务的难点和痛点,保障需求质量。2、开发人员也要参与需求的整理过程,有问题反馈给产品,同时在做设计时,采用灵活的设计模式,为需求的变更留下可操作的空间。通过这两个方法,最终解决了这个问题。得益于本次项目的实践,我不仅学到了微服务相关的知识,也锻炼了自己的架构和管理能力,我意识到只有不断地学习和实践才能让知识融汇于自己的技术体系之中,才能在未来的工作中游刃有余、勇担大任,为祖国的信息化建设贡献自己的力量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/913714.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/913714.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

The History of Big Data

数据洪流悄然重塑世界的进程中,大数据的历史是技术迭代与需求驱动的交响。从 2003 年分布式系统雏形初现,到 Hadoop 掀起开源浪潮,再到 Spark、容器化技术与深度学习的接力革新,以及 Hadoop 生态的兴衰起落,大数据发展…

【JS逆向基础】数据分析之正则表达式

前言:前面介绍了关于JS逆向所需的基本知识,比如前端三件套等,从这里开始就要进入到数据分析的范围内了,当然对于一些小白而言一些基本的知识还是需要知道的,比如正则,XPATNY与BS4;三个内容用三篇…

Mac mini 高性价比扩容 + Crossover 游戏实测 全流程手册

Mac mini 高性价比扩容 Crossover 游戏实测 全流程手册 本文将图文并茂地指导你如何: 为 M4 Mac mini 外置扩容(绿联 USB4 硬盘盒 致态 TiPlus7100)安装并配置 Crossover/Whisky 运行 Windows 应用实测游戏运行性能、诊断常见异常一、准备工…

【PyTorch】PyTorch中torch.nn模块的卷积层

PyTorch深度学习总结 第七章 PyTorch中torch.nn模块的卷积层 文章目录PyTorch深度学习总结前言一、torch.nn模块1. 模块的基本组成部分1.1 层(Layers)1.2 损失函数(Loss Functions)1.3 激活函数(Activation Functions…

Rust简洁控制流:if let与let else高效编程指南

文章目录Rust简洁控制流:if let与let else高效编程指南🎯 if let:专注单一匹配场景💡 if let核心优势:🔄 if let与else搭配使用🚀 let else:错误处理与提前返回💎 let el…

upload-labs靶场通关详解:第19关 条件竞争(二)

一、分析源代码//index.php // 初始化变量:标记上传状态和错误消息 $is_upload false; $msg null;// 检查是否通过POST方式提交了表单 if (isset($_POST[submit])) {// 引入自定义上传类require_once("./myupload.php");// 生成基于时间戳的文件名&…

一天两道力扣(3)

解法一:class Solution(object):def invertTree(self, root):if not root:return Noneroot.left, root.right root.right, root.leftself.invertTree(root.right)self.invertTree(root.left)return root解析:递归解法二:class Solution(obje…

jenkins2025安装、插件、邮箱发送使用

Tips:卸载从新安装(需要在C盘线先删除.jenkins文件),然后换个默认浏览器从新安装推荐的插件(不然安装插件这一步会报错,连接不到jenkins) 一、jenkins安装 访问jenkins官网:https://www.jenkins.io/download/ 双击war包开始下载…

vue中通过tabs 切换 时 显示不同的echarts 特殊处理

需要进行特殊处理 比如强制 进行resize 的方法 不然 大小显示会出现问题我先把全部的代码弄上<script setup lang"ts"> import { ref, onMounted, onBeforeUnmount, nextTick } from vue import { useRoute } from vue-router import { message } from ant-des…

浅度解读-(未完成版)浅层神经网络-深层神经网络

文章目录浅层神经网络的前向传播计算流程矩阵在运算时形状的变化激活函数的作用为什么要有激活函数反向传播深层神经网络参数超参数参数初始化初始化权重的值选择浅层神经网络的前向传播 计算流程 #mermaid-svg-tMPs4IUCtqxvhJ24 {font-family:"trebuchet ms",verda…

【vben3源码解读】【useEcharts】【VueUse】详解useEcharts这个hooks的作用与相关库的使用(VueUse)

源代码 import type { EChartsOption } from echarts;import type { Ref } from vue;import type { Nullable } from vben/types;import type EchartsUI from ./echarts-ui.vue;import { computed, nextTick, watch } from vue;import { usePreferences } from vben/preference…

报错 400 和405解决方案

今天出了好多这个错误&#xff0c;Uncaught (in promise) AxiosError {message: Request failed with status code 400 , name: AxiosError , code: ERR_BAD_REQUEST , config: {…}, request: XMLHttpRequest, …}反正就是前后端的参数不匹配&#xff0c;要不就是请求方式不…

Java源码的前端编译

Java源码的前端编译 欢迎来到我的博客&#xff1a;TWind的博客 我的CSDN:&#xff1a;Thanwind-CSDN博客 我的掘金&#xff1a;Thanwinde 的个人主页 0.前言 当一份Java代码写好时&#xff0c;将其进行编译&#xff0c;运行&#xff0c;并不是简单把这个Java源码从头到尾执行…

JWT6报错误 kid empty unable to lookup correct key

JWT5和jwt6在加密和解密和时候还明些区别的 &#xff0c;在5中&#xff0c;是不需要这个kid的&#xff0c;加解都不需要。但6中是需要这个keyId。 所以在使用的时候要做个区别&#xff0c;参考下面链接&#xff1a; ThinkPhp5.0.24 JWT报错 ‘“kid“ empty, unable to lookup…

高效学习之一篇搞定分布式管理系统Git !

一、Git是什么1&#xff0e;Git是目前世界上最先进的分布式版本管理系统 2&#xff0e;工作原理/流程workspace&#xff1a;工作区 Index/Stage&#xff1a;暂存区 Repository&#xff1a;仓库区&#xff08;本地仓库&#xff09; Remote&#xff1a;远程仓库二、SVN和Git的最主…

AdsPower API 新增查询环境 Cookies 接口,自动化更进一步!

你是不是有过这样的经历&#xff1f;账号在 AdsPower 环境中已经成功登录&#xff0c;但你还要花时间手动导出 Cookies、再整理处理&#xff0c;过程繁琐、效率低下。 现在&#xff0c;我们上线了 API 查询环境 Cookies 的接口&#xff0c;支持通过 API 直接获取已登录环境的 …

Craftium游戏引擎中的客户端同步机制解析

Craftium游戏引擎中的客户端同步机制解析 craftium A framework for creating rich, 3D, Minecraft-like single and multi-agent environments for AI research based on Minetest 项目地址: https://gitcode.com/gh_mirrors/cr/craftium 游戏状态同步的核心问题 在分…

spring cloud负载均衡之FeignBlockingLoadBalancerClient、BlockingLoadBalancerClient

本文主要分析被 FeignClient 注解的接口类请求过程中负载均衡逻辑&#xff0c;流程分析使用的源码版本信息如下&#xff1a;<spring-boot.version>3.2.1</spring-boot.version><spring-cloud.version>2023.0.0</spring-cloud.version>背景 平常我们代码…

提示工程(Prompt Engineering)研究进展

提示工程(Prompt Engineering)研究进展 以及它如何帮助大语言模型(LLMs)和视觉语言模型(VLMs)更好地工作。用简单的话说,就是通过设计巧妙的“提示”(比如指令、例子),让模型在不修改内部参数的情况下,更精准地完成各种任务,比如回答问题、推理、生成内容等。 文档…

【ARM】AI开发板A7处理器JTAG实现指南

一、文档背景尽管开发板原厂提供了相关文档&#xff0c;但可能缺乏对 A7 处理器 JTAG 功能的详细说明。这可能会导致以下问题&#xff1a;开发人员难以理解和利用 A7 处理器的基本功能&#xff0c;阻碍调试和开发进度。在进行Uboot移植过程中&#xff0c;无法应用图形界面的调试…