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

    xiaoxiao2025-04-22  24

    一、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,服务就能成功注册

    最新回复(0)