看在给了我一个博客专家的份上就继续写写博客,实事求是的讲如果是工作之余去总结csdn写写技术博客,还想混个专家什么的,真的是精力不够。因为里面的灌水的实在太多,比不过的,写这个玩意必须得淡泊名利才能悠然自得,想写啥就写啥,想写多少是多少,写这种东西纯粹是保持对技术的新鲜度和敏感性,只要不违规就好,不必在乎这些虚的东西。
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 {
@Autowired
private AcctCardService acctCardService;
@ApiOperation(value = "分页查询卡账户主账户列表", notes = "分页查询卡账户主账户列表")
@PostMapping("pageList")
public ResponseData queryPage(@RequestBody Map param) {
PageUtils pageUtils = acctCardService.queryPage(param);
return ResponseData.success(pageUtils);
}
/**
* 查询所有卡账户主账户列表
* @param
* @return
*/
@ApiOperation(value = "查询所有卡账户主账户列表", notes = "查询所有卡账户主账户列表")
@PostMapping("searchAll")
public ResponseData> searchAll() {
List 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 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 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 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 deleteList(@RequestBody List 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 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)【版本检测】
上面的很多漏洞都是通过升级组件版本解决的 有些是通过网关 进行处理,也有些通过防火墙进行设置。
今年在csdn上写了100多篇博文吧,主要还是记录工作中遇到的一些问题,很多都没按照优秀博文的形式进行编写,我觉得这并不重要,主要还是加深对编程的理解和保持新鲜度,因为还是要靠这个技能活下去,混口饭吃。博客写的好,精力和回报也成不了正比,今年在csdn收入的100多块钱都拿来发红包了。谢谢各位大佬的关注和抬爱。哈哈哈,就写这么多吧。