前言
今年进入了个新公司,接手代码时遇到了比较蛋疼的事情,本地代码调试遇到了层层阻碍,无法一键简单启动就算了,我就忍了,一番操作终于启动起了了,启动又慢,启动了2~3分钟,后面调本地接口,还feign调用失败。出师未捷身先死啊,又没人整改下,好奇项目负责人也不改,他们是怎么进行调试和自测的,靠感觉和代码自信吗?
上图:
问题
- 本地启动时间慢
- feign调用失败
分析
- 看启动日志,看看究竟慢在哪里
找出如下卡住一分钟左右,弹出的后面几段日志
[2023-12-22 14:11:35.116]|WARN|main|||N/A|N/A|N/A|c.n.d.s.t.d.RetryableEurekaHttpClient#execute:130|Request execution failed with message: I/O error on GET request for "http://qz:123456@10.23.11.55:7000/eureka/apps/": Connect to 10.23.11.55:7000 [/10.23.11.55] failed: Operation timed out (Connection timed out); nested exception is org.apache.http.conn.HttpHostConnectException: Connect to 10.23.11.55:7000 [/10.23.11.55] failed: Operation timed out (Connection timed out)
[2023-12-22 14:11:35.120]|WARN|main|||N/A|N/A|N/A|c.netflix.discovery.DiscoveryClient#get:304|Using default backup registry implementation which does not do anything.
日志中很明显写着连接eureka Connection timed out。
- 找出feign 为什么不能调用
其实根据上个分析已经可以看出,本地服务并没有连接到eureka注册中心,那他肯定拉不到注册中心的服务列表,自然就调不通了,从调用日志也可以直观的看出 Load balancer does not contain an instance for the service
[2023-12-22 14:11:36.979]|WARN|pool-20-thread-1|||N/A|N/A|N/A|c.qz.common.config.CommonInitialize#lambda$run$0:57|[503] during [GET] to [http://qz-usercenter/getDataDictByType/message] [UserCenterFeign#getDataDictByType(String)]: [Load balancer does not contain an instance for the service qz-usercenter]
根本原因
因为本地和eureka是网络隔离的,所以不存在eureka问题或者本地程序问题,只是网络问题而已,但是这个是无解的,所以放弃挣扎,需要曲线救国
目的
很简单的目的,就是快速启动,顺利调试(OS:这不是个正常项目应该有的吗?)
解决方案
- 解决feign调用问题
使用url重写的方法,解决本地调用问题,让本地服务调用测试环境的接口
原代码:
修改之后:
图中用一种“可配置”并且“默认在没配置的情况下采用默认的注册中心的跳转”,这样的好处是,如果上生产或者其他环境,不用配这个url可以按照原来的方式进行调用,如果配置了url则安url的调用路径走,而且是可配置的,可以更改调用,对代码不具有侵入性
单独弄个本地的配置文件application-local.yml,供本地调试用
到这里feign调用是解决了,本地调试是没问题了 - 解决启动时间慢问题
其实很简单,整个日志中,他就是在等待eureka连接超时了,在根本原因中提到了,本地和eureka的网络是隔离的,这个无法改变。那我们都进行feign的url定向重写了,注册中心在这就没用了,而且本地调试,其实不想影响测试环境的服务,最好别注册上去。如果你们有自己的开发环境可以忽略这个考虑,如果只有测试环境的话,分分钟会影响测试结果,因为连接到注册中心会让测试环境的调用,调用到你本机。
从根源上入手,提供给大家一个断开eureka的配置,在启动程序的vm参数加入如下:
-Deureka.client.register-with-eureka=false
-Dspring.autoconfigure.exclude=org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration,org.springframework.cloud.netflix.eureka.EurekaClientAutoConfiguration
- idea配置(最终的配置展示)
结果展示
从140s->62s,提升54%的启动速度,1分钟启动还可以接受,后面看到主要花在连接数据库上,这个就不优化了,最主要是可以进行本地调用接口了。