SpringClod所遇异常总结

SpringClod所遇异常总结

微服务启动Connection refused: connect

启动微服务时,出现了Connection refused: connect

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
java.net.ConnectException: Connection refused: connect
at java.base/java.net.PlainSocketImpl.connect0(Native Method) ~[na:na]
at java.base/java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:101) ~[na:na]
at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) ~[na:na]
at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242) ~[na:na]
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) ~[na:na]
at java.base/java.net.Socket.connect(Socket.java:591) ~[na:na]
at java.base/java.net.Socket.connect(Socket.java:540) ~[na:na]
at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:182) ~[na:na]
at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:474) ~[na:na]
at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:569) ~[na:na]
at java.base/sun.net.www.http.HttpClient.<init>(HttpClient.java:242) ~[na:na]
at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:341) ~[na:na]
at java.base/sun.net.www.http.HttpClient.New(HttpClient.java:362) ~[na:na]
at

原因

1.还没有配置eureka的时候引入了依赖忘了删除,导致eureka拦截。

2.80端口被占用

3.8001provider未启动

解决方法

删除eureka依赖,使用netstat -ano |more 查看80端口占用情况,使用任务管理器结束该进程,重启8001provider服务。

Flipping property: CLOUD-PROVIDER-HYSTRIX-PAYMENT.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647

在测试完服务端20000并发量访问后,添加消费端,超市设置等待3秒,Hystrix报错超时。

Flipping property: CLOUD-PROVIDER-HYSTRIX-PAYMENT.ribbon.ActiveConnectionsLimit to use NEXT property: niws.loadbalancer.availabilityFilteringRule.activeConnectionsLimit = 2147483647

image-20210112115344122

原因

Feign里面自带Ribbon,Ribbon默认超时时间为1s,这里手动等待3秒而出现超时。

解决方法

配置Ribbon超时时间

1
2
3
4
5
6
7
ribbon:  
httpclient:
enabled: true
MaxConnectionsPerHost: 500
MaxTotalConnections: 2000
ConnectTimeout: 60000
ReadTimeout: 60000

Nacos集群模式启动报错

版本:nacos:1.4.1 mysql:8.0.21

在单机模式切换集群模式,配置数据库等信息后,启动报错

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:156)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:544)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:141)
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:744)
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:391)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:312)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1215)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1204)
at com.alibaba.nacos.Nacos.main(Nacos.java:35)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:567)
at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:49)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:107)
at org.springframework.boot.loader.Launcher.launch(Launcher.java:58)
at org.springframework.boot.loader.PropertiesLauncher.main(PropertiesLauncher.java:467)
Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:124)
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:86)
at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:416)
at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:180)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:180)
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:153)
... 16 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'distroFilterRegistration' defined in class path resource [com/alibaba/nacos/naming/web/NamingConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.web.servlet.FilterRegistrationBean]: Factory method 'distroFilterRegistration' threw exception; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'distroFilter': Unsatisfied dependency expressed through field 'distroMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'distroMapper' defined in URL [jar:file:/D:/Enviroment/nacos/target/nacos-server.jar!/BOOT-INF/lib/nacos-naming-1.4.1.jar!/com/alibaba/nacos/naming/core/DistroMapper.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'serverMemberManager' defined in URL [jar:file:/D:/Enviroment/nacos/target/nacos-server.jar!/BOOT-INF/lib/nacos-core-1.4.1.jar!/com/alibaba/nacos/core/cluster/ServerMemberManager.class]: Bean instantiation via constructor failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.alibaba.nacos.core.cluster.ServerMemberManager]: Constructor threw exception; nested exception is ErrCode:500, ErrMsg:jmenv.tbsite.net

查询可能是因为nacos默认不支持mysql8.0,于是寻找网上方法下载mysql-connector-java-8.0.21.jar说放在plugins目录。但是1.4版本我咋也找不到plugins,后来打开target

Sentinel配置统一降级方法时出现Wrong state for SentinelResource annotation

由于使用@SentinelResource去在每个方法上配置太麻烦,并且增加代码冗余度,于是使用统一的处理方法对url进行限流。

首先写异常处理器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class CustomUrlBlockHandler implements UrlBlockHandler {
@Override
public void blocked(HttpServletRequest request, HttpServletResponse response, BlockException e) throws IOException {
CommonResult result = null;
// 被限流
if (e instanceof FlowException){
result=new CommonResult().setCode(429).setCurrentPage(1)
.setMessage("系统繁忙,请稍后再试--限流")
.setTotal(1);
}
// 降级异常
else if (e instanceof DegradeException){
result=new CommonResult().setCode(430).setCurrentPage(1)
.setMessage("系统异常,请稍后再试--降级")
.setTotal(1);
}
else if (e instanceof ParamFlowException){
result=new CommonResult().setCode(431).setCurrentPage(1)
.setMessage("该资源访问繁忙,请稍后再试--热点")
.setTotal(1);
}
response.setStatus(500);
response.setCharacterEncoding("utf-8");
response.setHeader("Content-Type","application/json;charset=utf-8");
response.setContentType("application/json;charset=utf-8");
new ObjectMapper().writeValue(response.getWriter(),result);
}
}

然后将拦截器注册。

1
2
3
4
@PostConstruct	// 会在servlet服务器加载Servlet的时候运行,并且只会被服务器执行一次。PostConstruct在构造函数之后执行,init()方法之前执行。
public void init() {
WebCallbackManager.setUrlBlockHandler(new CustomUrlBlockHandler());
}

去掉@SentinelResource注解然后访问资源出现了

1
{"code":500,"message":"Wrong state for SentinelResource annotation","currentPage":1,"total":1,"data":null}

解决方法

找到出现该异常的代码块,在SentinelResourceAspect中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
@Pointcut("@annotation(com.alibaba.csp.sentinel.annotation.SentinelResource)")
public void sentinelResourceAnnotationPointcut() {
}

@Around("sentinelResourceAnnotationPointcut()")
public Object invokeResourceWithSentinel(ProceedingJoinPoint pjp) throws Throwable {
Method originMethod = this.resolveMethod(pjp);
SentinelResource annotation = (SentinelResource)originMethod.getAnnotation(SentinelResource.class);
if (annotation == null) {
throw new IllegalStateException("Wrong state for SentinelResource annotation");
} else {
String resourceName = this.getResourceName(annotation.value(), originMethod);
EntryType entryType = annotation.entryType();
int resourceType = annotation.resourceType();
Entry entry = null;

Object var10;
try {
Object var18;
try {
entry = SphU.entry(resourceName, resourceType, entryType, pjp.getArgs());
Object result = pjp.proceed();
var18 = result;
return var18;
} catch (BlockException var15) {
var18 = this.handleBlockException(pjp, annotation, var15);
return var18;
} catch (Throwable var16) {
Class<? extends Throwable>[] exceptionsToIgnore = annotation.exceptionsToIgnore();
if (exceptionsToIgnore.length > 0 && this.exceptionBelongsTo(var16, exceptionsToIgnore)) {
throw var16;
}
}

if (!this.exceptionBelongsTo(var16, annotation.exceptionsToTrace())) {
throw var16;
}

this.traceException(var16, annotation);
var10 = this.handleFallback(pjp, annotation, var16);
} finally {
if (entry != null) {
entry.exit(1, pjp.getArgs());
}

}

return var10;
}
}

方法的pointcut是标注了@SentinelResource注解的方法,但是奇怪的是我并没有标注这个注解,访问资源的时候进到了这个切面。

一开始以为是热部署问题,然后重启了服务,再次访问。。。。

居然可以了。。。。

好吧,这个问题实在是不值得记录,写都写了,就这样吧,还需要提升自己处理bug的能力。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!