您当前的位置: 首页 >  微服务

一一哥Sun

暂无认证

  • 3浏览

    0关注

    622博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

SpringCloud微服务踩坑系列之二

一一哥Sun 发布时间:2019-03-21 10:43:08 ,浏览量:3

一.关于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依赖包导致的.

解决方法,引入依赖:


   org.springframework.boot
   spring-boot-starter-web
三.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的依赖



   org.springframework.cloud
   spring-cloud-starter-security

 之后,可能会导致一些问题,比如就可能会导致在启动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/

 

关注
打赏
1665624836
查看更多评论
立即登录/注册

微信扫码登录

0.0416s