一.关于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,自注册,相关数据如下 

SpringCloud微服务踩坑系列之二_spring

 

阈值: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>

原因是新版的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/