SpringCloud微服务踩坑系列之二

Love The Way You Lie 2024-02-19 12:13 113阅读 0赞

一.关于Eureka和Config服务的logback.xml配置文件问题

注意:在eureka和config服务中,如果使用logback.xml配置文件,会导致在服务启动的时候出现如下warn警告信息,尤其是config服务,更严重的会导致服务无法启动.

  1. 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.
  2. 2018-10-09 15:09:34.113 WARN 8176 --- [ main] o.s.c.n.a.ArchaiusAutoConfiguration : No spring.application.name found, defaulting to 'application'
  3. 2018-10-09 15:09:34.113 WARN 8176 --- [ main] c.n.c.sources.URLConfigurationSource : No URLs will be polled as dynamic configuration sources.
  4. 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依赖包导致的.

解决方法,引入依赖:

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. </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、或者简单粗暴把自我保护模式关闭

  1. eureka.server.enableSelfPreservation=false

四.TransportException: Cannot execute request on any known server问题

升级到新版的SpringCloud之后,当eureka注册中心配置了security的依赖

  1. <!--注意:SpringBoot项目遵循的是约定大于配置的原则,当此处添加了security的依赖后,就会自动启用eureka的安全验证功能,否则就不开启-->
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-security</artifactId>
  5. </dependency>

之后,可能会导致一些问题,比如就可能会导致在启动eureka客户端的时候产生”TransportException: Cannot execute request on any known server”异常,使得eureka客户端无法连接注册中心.原因是新版的security默认启用了csrf检验,会对注册到注册中心的实例进行csrf拦截,所以在客户端连接eureka注册中心的时候,默认情况下会导致Cannot execute request on any known server问题

解决办法:

  1. 1.eureka服务端代码中配置securitycsrf检验为false;
  2. 2.客户端中以用户名密码形式登录:
  3. client:
  4. service-url:
  5. defaultZone: http://admin:syc@localhost:1001/eureka/
  6. @EnableWebSecurity
  7. public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  8. /**
  9. * 新版的security默认启用了csrf检验,所以在客户端连接eureka注册中心的时候,默认情况下会导致
  10. * Cannot execute request on any known server问题.
  11. * 解决办法:
  12. * 1.在eureka服务端代码中配置security的csrf检验为false;
  13. * 2.客户端中以用户名密码形式登录:
  14. * client:
  15. * service-url:
  16. * defaultZone: http://admin:syc@localhost:1001/eureka/
  17. */
  18. @Override
  19. protected void configure(HttpSecurity http) throws Exception {
  20. /*直接关闭crsf功能:http.csrf().disable();*/
  21. /*对eureka的访问放行*/
  22. http.csrf().ignoringAntMatchers("/eureka/**");
  23. super.configure(http);
  24. }
  25. }
  26. eureka:
  27. client:
  28. service-url:
  29. #defaultZone: http://localhost:1001/eureka/
  30. defaultZone: http://admin:syc@localhost:1001/eureka/

发表评论

表情:
评论列表 (有 0 条评论,113人围观)

还没有评论,来说两句吧...

相关阅读

    相关 服务系列SpringCloud01

    SpringCloud01 1.认识微服务 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。这些架构之间有怎样的差

    相关 SpringCloud服务 Eureka()

    前言 上一章节中我们学习了服务注册与发现的不同类型的机制以及各自的优劣势,本节我们将通过时间里来学习一下在SpringCloud构建的为服务中如何使用Eureka来实现服