SpringCloud微服务踩坑系列之二
一.关于Eureka和Config服务的logback.xml配置文件问题注意:在eureka和config服务中,如果使用logback.xml配置文件,会导致在服务启动的时候出现如下warn警告信息,尤其是config服务,更严重的会导致服务无法启动.2018-10-09 15:09:32.738WARN 8176 --- [ost-startStop-1] c.n...
一.关于Eureka和Config服务的logback.xml配置文件问题
注意:在eureka和config服务中,如果使用logback.xml配置文件,会导致在服务启动的时候出现如下warn警告信息,尤其是config服务,更严重的会导致服务无法启动.
2018-10-09 15:09:32.738 WARN 8176 --- [ost-startStop-1] c.n.c.sources.URLConfigurationSource : No URLs will be polled as dynamic configuration sources.
2018-10-09 15:09:34.113 WARN 8176 --- [ main] o.s.c.n.a.ArchaiusAutoConfiguration : No spring.application.name found, defaulting to 'application'
2018-10-09 15:09:34.113 WARN 8176 --- [ main] c.n.c.sources.URLConfigurationSource : No URLs will be polled as dynamic configuration sources.
2018-10-09 15:09:34.971 WARN 8176 --- [ main] c.n.eureka.cluster.PeerEurekaNodes : The replica size seems to be empty. Check the route 53 DNS Registry
二.关于"Process finished with exit code 0"的问题
在SpringBoot项目启动时,控制台中可能会出现"Process finished with exit code 0"这样的日志信息,这样的信息意味着你的程序正常执行完毕并退出。
可以科普一下exit code,在大部分编程语言中都适用.
exit code 0 表示程序执行成功,正常退出;
exit code 1 表示程序执行执行过程中遇到了某些问题或者错误,非正常退出.
在SpringBoot启动时如果出现"Process finished with exit code 0",有可能是项目中没有添加spring-boot-starter-web依赖包导致的.
解决方法,引入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
三.RENEWALS ARE LESSER THAN THE THRESHOLD问题
启动两个client,过了一会,停了其中一个,访问注册中心时,界面上显示了上面的警告信息:
Eureka server和client之间每隔30秒会进行一次心跳通信,告诉server,client还活着。由此引出两个名词:
Renews threshold:server期望在每分钟中收到的心跳次数
Renews (last min):上一分钟内收到的心跳次数。
前文说到禁止注册server自己为client,不管server是否禁止,阈值(threshold)是1。client个数为n,阈值为1+2*n(此为一个server且禁止自注册的情况)
如果是多个server,且开启了自注册,那么就和client一样,是对于其他的server来说就是client,是要*2的
我开了两个server,自注册,相关数据如下
阈值:1+2*1
renews:
1)自注册 2 + 2*1
2)非自注册:2*1
Eurake有一个配置参数eureka.server.renewalPercentThreshold,定义了renews 和renews threshold的比值,默认值为0.85。当server在15分钟内,比值低于percent,即少了15%的微服务心跳,server会进入自我保护状态,Self-Preservation。在此状态下,server不会删除注册信息,这就有可能导致在调用微服务时,实际上服务并不存在。
这种保护状态实际上是考虑了client和server之间的心跳是因为网络问题,而非服务本身问题,不能简单的删除注册信息
stackoverflow上,有人给出的建议是:
1、在生产上可以开自注册,部署两个server
2、在本机器上测试的时候,可以把比值调低,比如0.49
3、或者简单粗暴把自我保护模式关闭
eureka.server.enableSelfPreservation=false
四.TransportException: Cannot execute request on any known server问题
升级到新版的SpringCloud之后,当eureka注册中心配置了security的依赖
<!--注意:SpringBoot项目遵循的是约定大于配置的原则,当此处添加了security的依赖后,就会自动启用eureka的安全验证功能,否则就不开启-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-security</artifactId>
</dependency>
之后,可能会导致一些问题,比如就可能会导致在启动eureka客户端的时候产生"TransportException: Cannot execute request on any known server"异常,使得eureka客户端无法连接注册中心.原因是新版的security默认启用了csrf检验,会对注册到注册中心的实例进行csrf拦截,所以在客户端连接eureka注册中心的时候,默认情况下会导致Cannot execute request on any known server问题
解决办法:
1.在eureka服务端代码中配置security的csrf检验为false;
2.客户端中以用户名密码形式登录:
client:
service-url:
defaultZone: http://admin:syc@localhost:1001/eureka/
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 新版的security默认启用了csrf检验,所以在客户端连接eureka注册中心的时候,默认情况下会导致
* Cannot execute request on any known server问题.
* 解决办法:
* 1.在eureka服务端代码中配置security的csrf检验为false;
* 2.客户端中以用户名密码形式登录:
* client:
* service-url:
* defaultZone: http://admin:syc@localhost:1001/eureka/
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
/*直接关闭crsf功能:http.csrf().disable();*/
/*对eureka的访问放行*/
http.csrf().ignoringAntMatchers("/eureka/**");
super.configure(http);
}
}
eureka:
client:
service-url:
#defaultZone: http://localhost:1001/eureka/
defaultZone: http://admin:syc@localhost:1001/eureka/
更多推荐
所有评论(0)