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

四、展望2024

        有回顾就要有展望,要不然这怎么进步呀。编程10年,真是10年生死两茫茫,2014年毕业的我,今年正好在这个行业混迹了10年,可以说我刚毕业的时候是互联网行业发展的鼎盛时期,然后一路走下坡路,可谓见证了国内互联网由盛转衰的过程,可以说如今互联网已死,犹如一潭死水,再也荡不起什么涟漪。脸书公司名都变成了meta,百度这样的公司也不知道整天再搞些什么东西,腾讯在家长眼中只会搞点小游戏祸害青少年,阿里也不是以前的阿里,华为也只是会吹牛逼的华为。现在就只有抖音整天在发布些垃圾视频,勾引原本不富裕的国人买货,能赚一点是一点。 2023年到2024年唯一有点进步的是搞了点大模型,但这已经不属于互联网的范围。可以说现在的阶段是混沌期,没有一个可以明确的未来发展场景,各个以前的IT公司都在搞新能源汽车,然后感觉没什么卵用,无非就是为了减排,但是以后的新能源汽车可能也是最大的污染源,辐射源,个人觉得机器人可能会才能下一次革命吧。最好是所有的人都不用上班,让机器人来养活我们。

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

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

相关文章

部署一款开源的交互审计系统—Next Terminal

博客地址 部署一款开源的交互审计系统—Next Terminal-雪饼 (xue6ing.cn)https://xue6ing.cn/archives/bu-shu-yi-kuan-kai-yuan-de-jiao-hu-shen-ji-xi-tong--next-terminal Next Terminal是什么&#xff1f; Next Terminal是一个开源的交互审计系统&#xff0c;具有以下主…

控制台console

js控制台打印 console.log()和console.group() console.group()指的是消息组的开始&#xff0c;在此之后的所有消息将写进该消息组中&#xff0c; console.groupEnd()指的是该消息组的结束&#xff0c;

SpringBoot请求参数加密、响应参数解密

SpringBoot请求参数加密、响应参数解密 1.说明 在项目开发工程中&#xff0c;有的项目可能对参数安全要求比较高&#xff0c;在整个http数据传输的过程中都需要对请求参数、响应参数进行加密&#xff0c;也就是说整个请求响应的过程都是加密处理的&#xff0c;不在浏览器上暴…

40道java集合面试题含答案(很全)

点击下载《40道java集合面试题含答案&#xff08;很全&#xff09;》 1. 什么是集合 集合就是一个放数据的容器&#xff0c;准确的说是放数据对象引用的容器集合类存放的都是对象的引用&#xff0c;而不是对象的本身集合类型主要有3种&#xff1a;set(集&#xff09;、list(列…

Unity文字转语音(使用RT-Voice PRO [2023.1.0])

参考文章Unity插件——文字转朗读语音RtVioce插件功能/用法/下载_rtvoice-CSDN博客 一、使用步骤 1.导入进Unity&#xff08;插件形式为 .unitypackage&#xff09; https://download.csdn.net/download/luckydog1120446388/88717512 2.添加所需Prefab 1&#xff09;.右键可…

后端 API 接口文档 Swagger 使用

Swagger 是什么 swagger是一款可以根据 restful 风格生成的接口开发文档&#xff0c;并且支持做测试的一款中间软件。 例如当我们在开发前后端分离项目时&#xff0c;当后端开发完一个功能想要测试时&#xff0c;若此时还没有相应的前端页面发起请求&#xff0c;可以通过 swag…

python炒股自动化(0),申请券商API接口

上次发了量化交易接口的区别&#xff0c;发现很多人根本不知道券商提供的API交易接口&#xff0c;这里补充一篇&#xff0c;关于券商接口的介绍。 现在市面上可以给个人账户接入的股票交易接口&#xff0c;用的最多的也就是QMT和Ptrade&#xff0c;以前接入量化交易需要机构或…

高压放大器设计要求是什么

高压放大器在科学研究和工程应用中扮演着至关重要的角色&#xff0c;特别是在需要处理高电压信号的实验和应用中。高压放大器设计要求的充分考虑至关重要&#xff0c;以确保其在各种环境中稳定、可靠地工作。下面将介绍设计高压放大器时需要考虑的关键要求和因素。 1.电压范围 …

赋能软件开发:生成式AI在优化编程工作流中的应用与前景

随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;特别是生成式AI模型如GPT-3/4的出现&#xff0c;软件开发行业正经历一场变革&#xff0c;这些模型通过提供代码生成、自动化测试和错误检测等功能&#xff0c;极大地提高了开发效率和软件质量。 本文旨在深入…

Android readelf 工具查找函数符号

ELF&#xff08;Executable and Linkable Format&#xff09;是一种执行文件和可链接文件的格式。它是一种通用的二进制文件格式&#xff0c;用于在各种操作系统中存储可执行程序、共享库和内核模块。 Android 开发当中的 so 库本质上就是一种特殊类型的 ELF 文件&#xff0c;…

文章解读与仿真程序复现思路——电工技术学报EI\CSCD\北大核心《考虑灵活性补偿的高比例风电与多元灵活性资源博弈优化调度》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题涉及到高比例风电与多元灵活性资源在博弈优化调度中考虑灵活性补偿的问题。以下是对标题各个部分的解读&#xff1a; 高比例风电&#xff1a; …

【模拟IC学习笔记】Cascode OTA 设计

辅助定理 增益Gm*输出阻抗 输出短路求Gm 输入置0求输出阻抗 求源极负反馈的增益 随着Vin的增加&#xff0c;Id也在增加&#xff0c;Rs上压降增加&#xff0c;所以&#xff0c;Vin的一部分电压体现在Rs上&#xff0c;而不是全部作为Vgs&#xff0c;因此导致Id变得平滑。 Rs足…

【数据结构篇】数据结构中的 R 树和 B 树

数据结构中的 R 树和 B 树 ✔️关于R树&#xff08;RTree&#xff09;✔️什么是B树&#xff08;B-tree&#xff09;✔️B树和B树的区别✔️B树和B树在数据存储方面的具体差异 ✔️拓展知识仓✔️R树和B树的区别✔️ 那在内存消耗上有什么区别&#xff1f;✔️ R树有哪些优点和…

【算法与数据结构】509、LeetCode斐波那契数

文章目录 一、题目二、递归&#xff0c;动态规划解法2.1 递归解法2.2 动态规划解法 三、完整代码 所有的LeetCode题解索引&#xff0c;可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、递归&#xff0c;动态规划解法 2.1 递归解法 思路分析&#xff1a;斐波…

【Leetcode】240. 搜索二维矩阵 II

一、题目 1、题目描述 编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性: 每行的元素从左到右升序排列。每列的元素从上到下升序排列。示例1: 输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21…

【REST2SQL】05 GO 操作 达梦 数据库

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 信创要求用国产数据库&#xff0c;刚好有项目用的达梦&#xff0c;研究一下go如何操作达梦数据库 1 准备工作 1.1 安…

ros2 基础学习 15- URDF:机器人建模方法

URDF&#xff1a;机器人建模方法 ROS是机器人操作系统&#xff0c;当然要给机器人使用啦&#xff0c;不过在使用之前&#xff0c;还得让ROS认识下我们使用的机器人&#xff0c;如何把一个机器人介绍给ROS呢&#xff1f; 为此&#xff0c;ROS专门提供了一种机器人建模方法——…

软件测试|SQL中的UNION和UNION ALL详解

简介 在SQL&#xff08;结构化查询语言&#xff09;中&#xff0c;UNION和UNION ALL是用于合并查询结果集的两个关键字。它们在数据库查询中非常常用&#xff0c;但它们之间有一些重要的区别。在本文中&#xff0c;我们将深入探讨UNION和UNION ALL的含义、用法以及它们之间的区…

Ubuntu 22.04 编译安装 Qt mysql驱动

参考自 Ubuntu20.04.3 QT5.15.2 MySQL驱动编译 Ubuntu 18.04 编译安装 Qt mysql驱动 下边这篇博客不是主要参考的, 但是似乎解决了我的难题(找不到 libmysqlclient.so) ubuntu18.04.2 LTS 系统关于Qt5.12.3 无法加载mysql驱动&#xff0c;需要重新编译MYSQL数据库驱动的问题以…

【代码随想录】刷题笔记Day45

前言 早上又赖了会床......早睡早起是奢望了现在&#xff0c;新一年不能这样&#xff01;支棱起来&#xff01; 377. 组合总和 Ⅳ - 力扣&#xff08;LeetCode&#xff09; 这一题用的就是完全背包排列数的遍历顺序&#xff1a;先背包再物品&#xff0c;从前往后求的也是有几…