当前位置: 首页 > news >正文

让开发回归简单模式-组件封装

        对于工作年限不长的程序员来说,知识储备是非常关键的。在开发中各种技术的应用已经非常普遍了,例如常见的各种ORM,各种中间件如Redis,MQ等等,又如WebApi路由配置等等,对于常常做开发的程序员来说,都是小事,我们就从小事说起。

        在微服务中,常用到MQ作为微服务之间通讯的桥梁,以RabbitMQ为例,其转发的方式有direct、fanout、topic,而在微服务中的应用,几乎不会使用direct这种交换模式。对于程序员来说,具体使用哪一种交换模式,需要开发时候双方去协商和沟通通讯的数据结构,还要处理通讯过程出现异常的情况,这样下来,从发送和校验到接收和处理,一系列下来,代码少说也有一百几十行,还要话费沟通成本,还需要程序员对mq的掌握。对于组织开发者来说,就是一大堆的培训工作,不培训就要花费时间成本。

        fanout这种交换模式,就如大喇叭,发出去的消息,只要愿意,都能够接收到,是一种比较开放的消息发布模式。例如一个员工的基础信息发生了改变,其他微服务需要更新这个员工的显示信息,那么都来接收就好了,至于接收到怎么处理,那是接收方的事情了,只要接收成功,回应一个ack信号就可以了。

        topic这种交换模式,是具有指定性的,只有匹配到topic字符串的接收方,才能收到消息,就向路由一样。例如做一个系统的内部通知消息,要通知到岗位或者个人,可以使用通配符:

#   匹配多个多个单词,例如message.pos1.emp1 使用message.# 所有消息都能成功匹配上;

*    匹配单个单词,例如message.pos1.* 在pos1下的所有人都能收到这个消息。

        程序员是否需要了解这些?我感觉不需要,我们把发送消息封装成一组类,一个是用于发送,一个是用于接收,例如:

        生产者接口

public interface MQProducer
{void Publish<T>(T body);}

         消费者接口

public interface MQConsumer
{//使用topic订阅消息void Consume(QueueDeclare queue, string topic,Action<string> action);//使用fanout订阅消息void Consume(QueueDeclare queue,Action<string> action);
}

上述方法,只要稍微了解MQ的,都知道这么封装,在微服务中的消息传递相对比较简单的,可以进一步封装。生产者这一端,可以使用AOP方法制作一个发布消息的标签,例如:

public class SaleSerivce : ServiceBase<SaleHdr,SaleDtl>
{//当成功保存单据后,当前微服务ID为AppId,以Sale为资源,SaveBill为action标记发送SaleHdr对象[MQPublish]public RValue<SaleHdr> SaveBill(SaleHdr hdr,List<SaleDtl> dtls){}//这里解释一下RValue<T>这个结构//当方法体出现异常,RValue<T>接收Exception对象,并设置Success=false;//当方法体返回字符串,RValue<T>.Message接收字符串值,并设置Success=false;//当方法体返回SaleHdr对象,RValue<T>.Value接收对象,并设置Success=true;//MQPublish标签,在Success==true时候把SaleHdr对象包装成一个标准的通讯数据格式后,转成json发送出去
}

        接收端就有点复杂了,对不同交换方式,要开发一套对应的数据接收和转发机制。 首先,接收到的消息,否存到一个消息对象中,然后塞到一个Queue对象中,只要向Queue中加元素,则触发出队列的方法,直到读取Queue完成才终止。

       

public class PurService : SeriveBase<PurHdr,PurDtl>
{[MQConsume("saleApp","sale","savebill")] //appid,resource,actionpublic RValue<PurHdr> MQSaleSave(SaleHdr saleHdr){//当新建销售单的时候,采购查询一下是否需要补货}
}

建立一个MQStarter来订阅MQ消息,并根据MQConsume标签上的参数,匹配到方法,可能会匹配到多个方法,没有关系,通通调用一次就可以了。如果RValue<PurHdr>.Success==false ,则做日志,并把消息方到另外一个容器中,允许重试规定次数后再手动重发。

        上述生产者和订阅者,都没有接触到MQ的具体对象和相关代码,只用了两个标签就完成了两个微服务之间的数据交互,只要框架的开发者能够在这个封装中充分考虑到各种情况和处理好各种异常,那么对于程序员来讲是非常轻松的事情,不用考虑通讯协议、结构、方法等等,集中精力编写业务逻辑代码。即使出现通讯问题,只需要反馈就可以了,让开发回归到本质。

        在微服务中,用得最多的就是httpClient、redis这两个组件。

        HttpClient可以根据封装好的WebApi标准接口进行封装,程序员只需要直接调用方法和给参数就可以完成api调用且方便处理好api返回值,转换成所需要的数据结构。

        Redis同理,可以封装成MemoryCache这样的操作方式,分别多String,Hash等数据结构操作。

        为了然程序员最大程度减少对技术依赖,把一些常用或者复杂的工作进行封装,转化为简单的操作方式,例如ORM,特别是使用EF的,往往需要程序员开发时候直接操作EF读写数据,带来的问题,往往没有处理读写时候的异常,导致程序在特定情况下卡死或者报错。这里建议把ORM用一层数据访问层包起来,而这个ORM对象只是一个protected层级的,把常规的读写操作都封装成方法,派生出来的对象,都是使用方法,而不使用ORM对象。即使那天把ORM换掉了,对原来的程序也没有一点影响,例如原来程序使用mysql,后面发现结构很简单,用mongo可能更合适,只要改变一下数据层的实现类就可以了,一般数据层都是注入到系统的,对于部署来说,就只是换了一个dll文件,对于程序员来说,几乎没有影响,除非操作了ORM。

        程序员连最基本的数据库操作对象都不需要了解,甚至可以不知道用了哪种ORM,程序员就纯粹写业务逻辑,可以把业务中的各种复杂情况都考虑仔细。让程序开发真正回归简单化。

        这样带来一个问题,非常不利于程序员的成长,这个就需要程序员在工作过程中注意细节、更多思考,从别人的案例中学习技术技巧,多尝试,转变成真正自己的知识。

        在我的框架中,把事务处理也封装成一个标签,这个是参照java中的写法,只是加了更多自己的想法,把事务嵌套、分布式事务都考虑进去了,例如:

        

[Transaction]  //事务标签,若当前没有在事务中,则发起事务,否则这个标签相当于透明
publice RValue<StoreInHdr> SaveStoreIn(StoreHdr,List<StoreDtl> dtls)
{//这里要处理进仓的操作,同时发起分布式事务标记到货单和采购单//完成库存的更新
}

这样让程序员完全不用考虑事务过程的处理,至于是提交还是回滚,那就看RValue的返回值。

        对于企业来说,用人是一个很大的风险,找水平高的,不愿意带人,写的代码一般程序员还不一定能看懂,自己还有自己的一套风格,换个人维护就很难了。找水平低的,又不按规则来,考虑问题不仔细,会出很多乱子。通过封装,除了简化了开发难度,也制定了开发规则,使用统一标准,有利于项目的持久迭代和发展。

相关文章:

让开发回归简单模式-组件封装

对于工作年限不长的程序员来说&#xff0c;知识储备是非常关键的。在开发中各种技术的应用已经非常普遍了&#xff0c;例如常见的各种ORM,各种中间件如Redis&#xff0c;MQ等等&#xff0c;又如WebApi路由配置等等&#xff0c;对于常常做开发的程序员来说&#xff0c;都是小事&…...

LED显示屏安全亮度参数设置方法和防护

随着LED显示屏应用领域越来越广&#xff0c;但其高亮度造成的光污染&#xff0c;常受到的人们的诟病。为了更好的避免光污染&#xff0c;我整理了一些关于LED显示安全亮度参数设置方法和安全防护措施。你知道LED广告牌是如何工作的吗&#xff1f; 设置LED显示屏的安全亮度参数和…...

数据库sql--关于计算方圆5公里点位编写

当我们计算两个地球上任意两点之间的距离时&#xff0c;可以使用Haversine公式。 下面是每个函数和数值的详细解释&#xff1a; RADIANS(target_latitude)&#xff1a;将目标纬度值转换为弧度制。这是因为Haversine公式以弧度为单位计算角度。RADIANS(latitude)&#xff1a;将…...

嵌入式基础知识-DMA

本篇来介绍DMA的一些基础知识。 1 DMA简介 DMA&#xff08;Direct Memory Access&#xff09;,中文名为直接内存访问&#xff0c;它是一些计算机总线架构提供的功能&#xff0c;能使数据从附加设备&#xff08;如磁盘驱动器&#xff09;直接发送到计算机主板的内存上。对应嵌…...

STM32 软件IIC 控制OLED 显示屏

1. 硬件IIC 实在是太难用了&#xff0c;各种卡死&#xff0c;各种发不出来数据&#xff0c;没那么多时间折腾了&#xff0c;还是用软件IIC 先吧&#xff0c;初始化 void OLED_Software_IIC_Init(void) {GPIO_InitTypeDef GPIO_InitStruct;RCC_AHBPeriphClockCmd(OLED_SOFTWARE…...

【系统设计系列】 DNS和CDN

系统设计系列初衷 System Design Primer&#xff1a; 英文文档 GitHub - donnemartin/system-design-primer: Learn how to design large-scale systems. Prep for the system design interview. Includes Anki flashcards. 中文版&#xff1a; https://github.com/donnemarti…...

thinkphp中使用Elasticsearch 7.0进行多表的搜索

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、thinkphp中使用Elasticsearch 7.0进行多表的搜索二、使用步骤1.引入库2.读入数据 总结 前言 提示&#xff1a;thinkphp中使用Elasticsearch 7.0进行多表的…...

说说 TCP的粘包、拆包

分析&回答 拆包和粘包是在socket编程中经常出现的情况&#xff0c; 在socket通讯过程中&#xff0c;如果通讯的一端一次性连续发送多条数据包&#xff0c;tcp协议会将多个数据包打包成一个tcp报文发送出去&#xff0c;这就是所谓的粘包。如果通讯的一端发送的数据包超过一…...

PowerToys安装

PowerToys 是微软开发者开发的免费实用工具集&#xff0c;可以用于高级用户调整和简化 Windows 操作&#xff0c;以提高效率。 官网安装方法&#xff1a; https://learn.microsoft.com/zh-cn/windows/powertoys/install 目前安装文件路径&#xff1a; https://github.com/m…...

Unity——LitJSON的安装

一、LitJSON介绍 特点 LitJSON是一个轻量级的C# JSON库&#xff0c;用于在Unity游戏开发中进行JSON数据的序列化和反序列化操作。它提供了简单而高效的接口&#xff0c;帮助开发者处理JSON数据。 以下是LitJSON库的一些主要特点和功能&#xff1a; 1. 高性能&#xff1a;Lit…...

YOLOv5:对yolov5n模型进一步剪枝压缩

YOLOv5&#xff1a;对yolov5n模型进一步剪枝压缩 前言前提条件相关介绍具体步骤修改yolov5n.yaml配置文件单通道数据&#xff08;黑白图片&#xff09;修改models/yolo.py文件修改train.py文件 剪枝后模型大小 参考 前言 由于本人水平有限&#xff0c;难免出现错漏&#xff0c;…...

大数据(八):Pandas的基础应用详解(五)

专栏介绍 结合自身经验和内部资料总结的Python教程,每天3-5章,最短1个月就能全方位的完成Python的学习并进行实战开发,学完了定能成为大佬!加油吧!卷起来! 全部文章请访问专栏:《Python全栈教程(0基础)》 再推荐一下最近热更的:《大厂测试高频面试题详解》 该专栏对…...

【算法】归并排序 详解

归并排序 详解 归并排序代码实现1. 递归版本2. 非递归版本 排序&#xff1a; 排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a; 假定在待排序的记录序列中&#xff0c;存在多个具有相…...

linux 进程隔离Namespace 学习

一、linux namespace 介绍 1.1、概念 Linux Namespace是Linux内核提供的一种机制&#xff0c;它用于隔离不同进程的资源视图&#xff0c;使得每个进程都拥有独立的资源空间&#xff0c;从而实现进程之间的隔离和资源管理。 Linux Namespace的设计目标是为了解决多个进程之间…...

【MySQL】事务 详解

事务 详解 一. 为什么使用事务二. 事务的概念三. 使用四. 事务的特性原子性&#xff08;Atomicity&#xff09;一致性&#xff08;Consistency&#xff09;隔离性&#xff08;Isolation&#xff09;持久性&#xff08;Durability&#xff09; 五. 事务并发所带来的问题脏读问题…...

爬虫到底难在哪里?

目录 爬虫到底难在哪里 怎么学习爬虫 注意事项 爬虫工具 总结 学习Python爬虫的难易程度因人而异&#xff0c;对于具备编程基础的人来说&#xff0c;学习Python爬虫并不困难。Python语言本身比较简单易学&#xff0c;适合初学者使用。 爬虫到底难在哪里 爬虫的难点主要包…...

linux常用命令行整理

1、linux的以及目录 bin 二进制可执行文件sbin 二进制可执行文件(root用户权限)etc 系统管理和配置文件,例如常见host文件home 用户文件的根目录usr 用户存放系统应用程序(共享系统资源)opt 可选的应用程序proc 虚拟文件系统root 超级用户dev 存放设备文件mnt 系统管理员安装临…...

python字符串相关

python字符串相关 一、reverse() 函数 只能反转 列表二、reversed() 反转元组字符串等等 返回迭代器三、join和reversed反转字符串四、join串联字符串&#xff08;join连接对象仅限字符串、储存字符串的元组、列表、字典&#xff09;数字对象可通过str()转化为字符串⭐对象为字…...

JavaScript学习笔记01

JavaScript笔记01 什么是 JavaScript JavaScript 是一门世界上最流行的脚本语言&#xff0c;它是一种弱类型的脚本语言&#xff0c;其代码不需要经过编译&#xff0c;而是由浏览器解释运行&#xff0c;用于控制网页的行为。 发展历史 参考&#xff1a;JavaScript的起源故事…...

golang 通用的 grpc http 基础开发框架

go-moda golang 通用的 grpc http 基础开发框架仓库地址: https://github.com/webws/go-moda仓库一直在更新,欢迎大家吐槽和指点 特性 transport: 集成 http&#xff08;echo、gin&#xff09;和 grpc。tracing: openTelemetry 实现微务链路追踪pprof: 分析性能config: 通用…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:

一、属性动画概述NETX 作用&#xff1a;实现组件通用属性的渐变过渡效果&#xff0c;提升用户体验。支持属性&#xff1a;width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项&#xff1a; 布局类属性&#xff08;如宽高&#xff09;变化时&#…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)

本文把滑坡位移序列拆开、筛优质因子&#xff0c;再用 CNN-BiLSTM-Attention 来动态预测每个子序列&#xff0c;最后重构出总位移&#xff0c;预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵&#xff08;S…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机&#xff08;无人驾驶飞行器&#xff0c;UAV&#xff09;技术的快速发展&#xff0c;其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统&#xff0c;无人机的“黑飞”&…...