回顾2023编程之旅

    一、前言

  看在给了我一个博客专家的份上就继续写写博客,实事求是的讲如果是工作之余去总结csdn写写技术博客,还想混个专家什么的,真的是精力不够。因为里面的灌水的实在太多,比不过的,写这个玩意必须得淡泊名利才能悠然自得,想写啥就写啥,想写多少是多少,写这种东西纯粹是保持对技术的新鲜度和敏感性,只要不违规就好,不必在乎这些虚的东西。

  二、回顾2023编程之旅       

1、应用的开发

       2023年我主要在开发一个小程序商城,通用的架构还是springCloud全家桶那一套的东西,底层数据库使用了mysql ,clickhouse ,pg 这些数据库,中间件 使用了redis ,rocketMq ,OSS 开发框架使用的是springBoot 3.0 , gateway ,  eureka, apollo 这些组件,前端使用的vue框架,部署框架主要使用nginx, docker ,软件应用层主要是小程序和H5的形式,还有后台管理系统几个。

     我的编程非常简单,因为使用的是springboot的后端框架,我自研了代码逆向生成工具,基本设计好表结构,就能生成整个微服务,基本的增删查改的代码功能都有,其他的是个性化开发。

比如设计好了表: acct_card

逆向工程生成的controller代码示例:

 /*** @Description: 卡账户主账户Controller* @Date: 2023-12-19*/
@RestController
@RequestMapping("acctCard")
@Slf4j
public class AcctCardController {@Autowiredprivate AcctCardService acctCardService;@ApiOperation(value = "分页查询卡账户主账户列表", notes = "分页查询卡账户主账户列表")@PostMapping("pageList")public ResponseData<PageUtils> queryPage(@RequestBody Map<String, Object> param) {PageUtils pageUtils = acctCardService.queryPage(param);return ResponseData.success(pageUtils);}/*** 查询所有卡账户主账户列表* @param  * @return*/@ApiOperation(value = "查询所有卡账户主账户列表", notes = "查询所有卡账户主账户列表")@PostMapping("searchAll")public ResponseData<List<AcctCard>> searchAll() {List<AcctCard> acctCardList = acctCardService.list();if(!CtgUtils.isCollectionNull(acctCardList)) {return  ResponseData.success(acctCardList);}else {log.info(AcctCardConstant.NOT_EXIST);return  ResponseData.success(acctCardList);}}/*** 保存卡账户主账户* @param acctCard* @return*/@ApiOperation(value = "保存卡账户主账户", notes = "保存卡账户主账户")@PostMapping("save")public ResponseData<String> save(@RequestBody AcctCard acctCard) {boolean res = acctCardService.save(acctCard);if(res) {return ResponseData.success(AcctCardConstant.SAVE_SUCCESS);}else {log.error(AcctCardConstant.SAVE_FAILED);return ResponseData.error(AcctCardConstant.SAVE_FAILED);}}/*** 删除卡账户主账户* @param acctCard* @return*/@ApiOperation(value = "删除卡账户主账户", notes = "删除卡账户主账户")@PostMapping("delete")public ResponseData<String> delete(@RequestBody AcctCard acctCard) {boolean res = acctCardService.removeById(acctCard);if(res) {return ResponseData.success(AcctCardConstant.DELETE_SUCCESS);}else {log.error(AcctCardConstant.DELETE_FAILED);return ResponseData.error(AcctCardConstant.DELETE_FAILED);}}/*** 根据主键ID更新卡账户主账户* @param acctCard* @return*/@ApiOperation(value = "根据主键ID更新卡账户主账户", notes = "根据主键ID更新卡账户主账户")@PostMapping("update")public ResponseData<Boolean> update(@RequestBody AcctCard acctCard) {boolean res = acctCardService.updateById(acctCard);if(res) {return  ResponseData.success(true);}else {log.error(AcctCardConstant.UPDATE_FAILED);return  ResponseData.error(AcctCardConstant.UPDATE_FAILED);}}/*** 批量删除卡账户主账户* @param acctCardList* @return*/@ApiOperation(value = "批量删除卡账户主账户", notes = "批量删除卡账户主账户")@PostMapping("deleteList")public ResponseData<String> deleteList(@RequestBody List<AcctCard> acctCardList) {boolean res = acctCardService.removeByIds(acctCardList);if(res) {return ResponseData.success(AcctCardConstant.DELETE_SUCCESS);}else {log.error(AcctCardConstant.DELETE_FAILED);return ResponseData.error(AcctCardConstant.DELETE_FAILED);}}/*** 根据主键ID查找卡账户主账户*/@ApiOperation(value = "根据主键ID查找卡账户主账户", notes = "根据主键ID查找卡账户主账户")@PostMapping("searchById")public ResponseData<AcctCard> searchById (@RequestBody AcctCard acctCard) {AcctCard acctCardRes = acctCardService.getById(acctCard.getId());if (ObjectUtil.isNotEmpty(acctCardRes)) {return ResponseData.success(acctCardRes);}else {log.error(AcctCardConstant.QUERY_FAILED);return ResponseData.error(AcctCardConstant.QUERY_FAILED);}}}

2.接口的开发

除了开发应用,在2023年中很多时间都在开发接口,主要就是我们的小程序商城需要和外部企业进行合作,进行流量互到,所以有很多接口需要开发。

对于外部接口我们还是使用http的方式

接口对接主要是几个步骤

1、提供一个获取token的接口、

2、接口参数的加解密

3、提供业务接口

接口传输标准:

调用方式(url)

POST,视具体接口定义,POST请求头(headers)需要携带 source参数,值为1

请求类型(ContentType)

application/json

响应类型(ContentType)

application/json

部分接口参数示例:

{"code": 200,"message": "成功","data": {"openId": null,"sessionKey": null,"userId": "6636b27895f80e3b23159","oneId": null,"state": 1,"token": null,"isAuthorPhone": "0","isRegUser": null,"userInfo": null},"encrypt": false
}

有的接口数据量和并发量比较大,对于实时性要求不高的我们才有走mq的形式,一方将数据发送到mq,另一方从mq进行消费。

3.应用维护

我们的小程序上线以后,就需要经常维护,比如服务器告警的处理,系统日志的归档,web安全漏洞等等,这些东西就占用了比较多的时间。有时候由于需要搞活动,还需要给应用进行扩容。对于扩容还比较简单,我们的系统支持横向无限扩容,但是最好规模是在100个服务以内,超过100个服务,那维护起来也是很麻烦的。

我们服务器的告警主要有带宽使用的告警,至于CPU,内存,磁盘这些告警,一年下来几乎没有,磁盘的告警也只是由于日志文件较多,占满了磁盘,日志一般保留半年就行。时间长的可以删除或者归档存储到其他地方去,这是主要的解决方案。至于web安全漏洞,就出现的比较多,一般有高危的和中低危的,高危的我们基本都修复了 ,有些低危的没有修复。下面列一下今年出现的部分系统漏洞

Apache Commons Text StringLookup 远程代码执行漏洞( 
Spring Cloud Gateway spel 远程代码执行 
Apache Spark 管理员后台未授权访问
Spring Data MongoDB SpEL表达式注入漏洞 
fastjson <= 1.2.68 反序列化远程代码执行漏洞
Apache Spark RPC协议反序列化漏洞 
Spring Cloud Gateway spel 远程代码执行 
Apache POI <= 4.1.0 XSSFExportToXml XXE漏洞
Jackson 最新反序列化漏洞(CVE-2019-14361和CVE-2019-14439)【版本检测】

上面的很多漏洞都是通过升级组件版本解决的 有些是通过网关 进行处理,也有些通过防火墙进行设置。

三、2023在csdn的创作之旅

今年在csdn上写了100多篇博文吧,主要还是记录工作中遇到的一些问题,很多都没按照优秀博文的形式进行编写,我觉得这并不重要,主要还是加深对编程的理解和保持新鲜度,因为还是要靠这个技能活下去,混口饭吃。博客写的好,精力和回报也成不了正比,今年在csdn收入的100多块钱都拿来发红包了。谢谢各位大佬的关注和抬爱。哈哈哈,就写这么多吧。

 

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

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

相关文章

ROS-[ERROR] [1704543158.960463911]: length [stent_height] is not a valid float

出现如图所示报错 原因&#xff1a;未能正确调用&#xff0c;忘记加${}了

我建立了一个资源分享群

我建立了一个资源分享群 在为寻找资源犯愁&#xff1f; 在为分享资源犯愁&#xff1f; 一起加入分享资源群&#xff08;是wx群哦&#xff09;吧&#xff01;你可以分享自己的资源帮助他人。你可以在群组里需求资源获取别人的帮助。发广告请绕行&#xff0c;会被拉黑哦 微信…

<HarmonyOS主题课>1~3课后习题汇总

&#xff1c;HarmonyOS第一课&#xff1e;1~10课后习题汇总 1使用DevEco Studio高效开发 单选题 用哪一种装饰器修饰的组件可作为页面入口组件&#xff1f;&#xff08;B&#xff09; A. ComponentB. EntryC. PreviewD. Builder ArkTS Stage模型支持API Version 9&#xf…

网络请求 - 异步编程详解

一、概述 网络管理模块主要提供以下功能&#xff1a; HTTP数据请求&#xff1a;通过HTTP发起一个数据请求。WebSocket连接&#xff1a;使用WebSocket建立服务器与客户端的双向连接。Socket连接&#xff1a;通过Socket进行数据传输。 HTTP和WebSocket都是啥&#xff1f; 比如我…

MongoDB索引详解

概述 索引是一种用来快速查询数据的数据结构。BTree 就是一种常用的数据库索引数据结构&#xff0c;MongoDB 采用 BTree 做索引&#xff0c;索引创建 colletions 上。MongoDB 不使用索引的查询&#xff0c;先扫描所有的文档&#xff0c;再匹配符合条件的文档。使用索引的查询&…

web期末作业数字时钟,实时更新,音乐播放

文章目录 月球动态引导页加载引导页主页面主页面html需要完整代码私信我 月球动态引导页 加载引导页 主页面 主页面html <!DOCTYPE html> <html lang"zh-CN"><head><meta http-equiv"X-UA-Compatible" content"IEedge,chrome1&…

Socket closed 异常解决方案:如何解决 JMeter 压测中的问题

问题描述 JMeter 压测时会报 java.net.SocketException: Socket closed java.net.SocketException: Socket closed at java.net.PlainSocketImpl.socketConnect(Native Method) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.ne…

关于vite的glob坑

我先展示一段代码&#xff1a; /*** function 根据pages路径动态生成路由* param {Array} 基础路由*/ export default function (routes) {const modules import.meta.glob("../pages/**/page.js", { eager: true, import: "default" });const newRoutes…

centos用yum安装mysql详细教程

1 查询安装mysql的yum源,命令如下 ls /etc/yum.repos.d/ -l 界面如下图所示&#xff0c;未显示mysql的安装源 2 安装mysql相关的yum源,例如&#xff1a; 例如&#xff1a;rpm -ivh mysql57-community-release-el7.rpm 要注意 mysql的版本和系统的版本匹配 mysql57-communi…

北京大学漏洞报送证书

获取来源&#xff1a;edusrc&#xff08;教育漏洞报告平台&#xff09; url&#xff1a;教育漏洞报告平台(EDUSRC) 兑换价格&#xff1a;30金币 获取条件&#xff1a;北京大学任意中危或以上级别漏洞

使用定时器setInterval,在Moment.js 时间格式化插件基础上完成当前时间持续动态变化

1、引入插件 npm install moment --save 2、js配置&#xff1a;当前需要使用的文件中直接引入 import moment from moment; 3、代码实现&#xff1a;定义一个变量进行回显 3.1、dom部分 <span> {{ timeData }} </span> 3.2、js代码 <script> import mo…

MongoDB聚合操作

聚合操作概述 聚合操作允许用户处理多个文档并返回计算结果。聚合操作组值来自多个文档&#xff0c;可以对分组数据执行各种操作以返回单个结果。聚合操作包含三类&#xff1a;单一作用聚合、聚合管道、MapReduce。 单一作用聚合 提供了对常见聚合过程的简单访问&#xff0c…