SpringCloud项目中遇到的问题
注册中心eureka配置问题
注册中心当然是最先配置的,之后的所有服务都会注册到这个服务中,在这里面会有很多意想不到的坑:
1.${}和@@的使用:
${}:用来获取你在配置文件中配置的参数,比如配置了eureka.instance.hostname=test
参数,那么获取test就可以使用 ${eureka.instance.hostname}
来代替.
@@:用来获取pom.xml文件标签中的值,比如在pom文件中配置了<artifactId>cashier-eureka</artifactId>
使用@artifactId@
便可取到文件中的值
2.配置文件方面:
配置文件有两种:yml和properties,区别也就是在排版上,yml更有层次感,properties则都是通过对象.参数的方式排列,个人还是建议使用ynl配置文件(看着爽!);
yml样式:
eureka:
instance:
hostname: test
properties样式:
eureka.instance.hostname=test
这里需要注意用yml配置时候,属于子集的参数前面都会有两个空格,然后对应的:符号后也有一个空格,这些在idea中如果写错都是会有提示,但是层级写错就不一定提示,需要注意。比如:
eureka:
instance:
hostname: ${spring.application.name}
写成
eureka:
instance:
hostname: ${spring.application.name}
”是不会提示错误的,不要犯这种最低级的错误。
在配置方面bootstrap.yml 是先于 application.yml 加载,需要优先配置的信息都配置在bootstrap.yml中,这方面详细分析之后会补充。
配置文件方面:
cashier:
eureka:
url: @eureka.url@
server:
port: 3000
spring:
security:
user:
name: shoubei
password: cashier
basic:
enabled: false
application:
name: @artifactId@
cloud:
config:
enabled: false
eureka:
instance:
hostname: ${spring.application.name}
prefer-ip-address: true
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${cashier.eureka.url}:${server.port}/eureka/
其中需要注意的是register-with-eureka:false
:检索服务选项,当设置为True(默认值)时,会进行服务检索,注册中心不负责检索服务所以设置false,fetch-registry: false
:将自己作为客户端来尝试注册自己,为true(默认)时自动生效,不过这两个参数在做注册中心集群的时候需要打开,不然其他服务是无法互相注册的,我这里没只有一个注册中心,都要设置成为false。
其中defaultZone
便是eureka注册中心的地址,这个地址后面必须要跟eureka,不然后续各种找不到路径的问题疯狂来袭。
当然defaultZone
和service-url
我在做的时候还看得有命名不同导致出现的问题,要保证eureka中的这两个参数跟其他服务的参数名相同。
org.springframework.security
依赖问题,我相信新手肯定会遇到这个问题,eureka服务启动了,其他服务永远是报Cannot execute request on any known server
错误,即使路径,什么的都是相同还是找不到,首先你需要检查这几个方面:
1.上面提到的register-with-eureka:false,fetch-registry: false
两个参数设置与否;
2.启动类上是否加了@EnableEurekaClient @SpringBootApplication
相关注解
3.如果没有用到security相关的校验,将pom文件中的以下等相关依赖直接删除,然后刷新maven依赖即可
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-core</artifactId>
<version>5.1.5.RELEASE</version>
</dependency>
4.还有就是网上所说的加上一个类,然后去掉这个检验,我这里没用到,去掉依赖就可以了。
找不到服务问题
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112)
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$1.execute(EurekaHttpClientDecorator.java:59)
at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77)
at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.register(EurekaHttpClientDecorator.java:56)
at com.netflix.discovery.DiscoveryClient.register(DiscoveryClient.java:829)
at com.netflix.discovery.InstanceInfoReplicator.run(InstanceInfoReplicator.java:121)
at com.netflix.discovery.InstanceInfoReplicator$1.run(InstanceInfoReplicator.java:101)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
1.注册中心路径问题:
检查bootstrap.yml文件下的注册中心路径配置
# 注册中心配置
eureka:
instance:
prefer-ip-address: true
client:
service-url:
defaultZone: http://localhost:3000/eureka/
1.您的主机中的软件中止了一个已建立的连接:调用查询数据超时,将查询时间修改长一点
#请求处理的超时时间
ribbon.ReadTimeout: 10000
#请求连接的超时时间(默认为2秒)
ribbon.ConnectTimeout: 7000
还有种情况是设置hystrix熔断超时
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 8000