个人工作项目总结记录2
目前参与的项目也已经上线了,业务性比较复杂并且涉及的系统比较多,但是单说技术,没什么亮点,SpringBoot、Elastic-Job(还是未分布式部署)、Shiro等,但是在开发期间还遇到了很多问题,比如:报文如何实现统一加解密并且验签?还有一个让我头疼很久的问题:Transactional注解失效以及wget命令来验证网络的连通性,以上几个问题值得记录一下
涉及到的技术点,均在该Demo中体现,代码地址:https://github.com/Simple-Coder/mt-demo
Maven项目结构如下:
一、报文实现加解密
一开始想的是写一个工具类,在每一个接口中进行加解密,后来觉得这个想法太蠢了……还有RestControllerAdvice注解,实现很简单:RestControllerAdvice注解+RequestBodyAdvice/ResponseBodyAdvice(2个对应接口即可),并重写接口方法,官方接口方法名通俗易通
1、请求解密逻辑
2、响应加密加签逻辑
二、AOP实现验签
由于工作项目要求必须验签,自然而然可以想到使用AOP来实现验签,验签通过则执行方法,未通过则重新组装报文返回;切面中也实现了非空字段校验的功能
三、多线程中事务控制(@Transactional实现)
在项目由于业务性比较复杂,需要在异步线程中添加事务的处理,我开始的处理方法就是在线程的run方法添加@Transactional注解,发现失效了,后来才发现@Transactional使用没那么简单,所以还是写了一些功夫看了看这个注解,属性说明:https://docs.spring.io/spring/docs/5.0.4.BUILD-SNAPSHOT/javadoc-api/org/springframework/transaction/annotation/Transactional.html
1、初始解决方案①
2、初始解决方案②
3、解决方案
新类代码如下:
较好的解决方案:
4、总结
①线程不属于Spring托管,故而线程也不能使用Spring的事务,也不能获取Spring注入的bean在声明式事务管理的方法内开启多线程,多线程内的方法不被事务控制
②线程的run方法,它不会抛出异常,但异常会导致线程终止运行,在线程中抛出的异常无法在主线程中通过try/catch来捕获(可用线程的UnCaughtExceptionHandler进行异常处理)
四、wget验证网络连通性(http协议)
1、如果访问的目的地址为https协议则使用如下命令
wget --no-check-certificate "目的连接地址" -e use_proxy=yes -e https_proxy=代理设备IP:端口
2、如果访问的目的地址为http协议则使用如下命令
wget "目的连接地址" -e use_proxy=yes -e http_proxy=代理设备IP:端口
3、结果分析
(1)如果结果显示 “正在保存至index.html 100%[==================================]”说明网络策略是可用的
(2)如果显示其他错误码可根据以下错误码排查:
①1xx:处理信息,服务器收到请求,需要请求者继续执行操作
②2xx:请求成功,操作被成功接收并处理
③3xx:重定向,需要进一步的操作以完成请求
④4xx:客户端错误,请求包含语法错误或无法完成请求
⑤5xx:服务器错误,服务器在处理请求的过程中发生了错误