一.关于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/

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐