SpringCloud报Cannot execute request on any known server或者Connection refused

一、Service-url:DefaultZone配置不对

我们在选择SpringCloud的Eureka作为注册中心,让客户端去注册服务时经常会遇到因为一些配置的原因会报Cannot execute request on any known serve之类的错误。

本人用的SpringCloud的版本是Greenwich.SR1,Springboot是2.1.5的,这应该是在今年6月前最新的版本了。我在做服务的注册与发现的时候,想把service-url的DefaultZone这项的地址改为自定义的地址,如:http://localhost:10240/Register/.然后把eureka Server启动起来,进程没问题;但是当在客户端的Application.yml文件中把Service-url:DefaultZone的值指定成Server端的地址,即:http://localhost:10240/Register/,如下是我的配置:

Server端:

server:
  port: 9000

eureka:
  instance:
    hostname: localhost
    instance-id: Register
  client:
    service-url:
      defaultZone: http://localhost:9000/Register
    fetch-registry: false
    register-with-eureka: false
#    设置访问安全性
Client端:
server:
  port: 10240

eureka:
  client:
    service-url:
      defaultZone: http://localhost:9000/Register

spring:
  application:
    name: Login

此时,启动客户端就会报“无法在任何已知服务上执行请求”,或者“连接拒绝”(由于小弟对SpringCloud只是刚刚才看了几天,所以好些东西不太明白)。经过多翻试探之后,发现:Eureka的defaltZone的值,后缀只有是以“/eureka”结尾,即需要把Server端与客户端的service-url:defaultZone的值都统一改成:http://localhost:9000/eureka,再分别运行Server端,Client端,服务注册与发现Okay了。

本人现在还没有跟踪出能自定义这个Service-url后缀的方法,这点还得求网上的大神指点。

二、Eureka服务在加入Security Authentication时

旧版本的Springclound在Eureka Server端加入Spring-Boot的Security包后,在Application.yml文件里配置上如下行:

security:
    user:
        name: username
        password: pwd
       basic:
           enable: true
并且在服务端,客户端的Service-url:DefaultZone里配置成http://username:pwd@localhost:9000/eureka貌似就可以实现Eureka的服务注册请求加密了.但是在我使用的这个SprinCloud版本中,配置有所改动:原来的以Security开头的配置都过期了,而且安全认证这块默认就是开房的;运行Eureka Server端倒是能正常运行;但是当运行Client的时候,Client也会报“无法在任何已知服务上执行请求”,或者“连接拒绝”。

发生该问题的原因是SpringCloud在你往Maven里添加Spring-boot-Stater-Security包时就已经默认开启了密码认证这一功能,而且,根据官网的描述,只要开启了这一安全认证,Eureka默认每一个对当前服务的请求都需要一个CSRF Token被随着发送过来,因此解决办法是采用官网的推荐做法:扩展“WebSecurityConfigurerAdapter”类并重载Configure方法,拦截Http里所有类似“/eureka/**”的请求,然后忽略它就行,同时需要在这个类上添加EnableWebSecurity注册,如下:

@EnableWebSecurity
    public static class IgnoreEruekaClientSecurity extends WebSecurityConfigurerAdapter{
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().ignoringAntMatchers("/eureka/**");
            super.configure(http);
        }
    }

重新启动Server与Client,服务就能成功注册

你可能感兴趣的:(微服务,SpringCloud)