容器多机部署eureka及相关集群服务出现 Request execution failed with message: AuthScheme is null

预期部署方案:两个eureka+三个相关应用

注册时应用出现:Request execution failed with message: Cannot invoke "Object.getClass()" because "authScheme" is null,一开始认为未正确传递eureka配置的账户+密码,例:defaultZone: http://username:[email protected]:8761/eureka/,检查后发现一切正常,`后续排查后得出结论容器内部署hostname不能是127.0.0.1,必须为容器内ip(本次直接配置的是外部转发域名),调整为hostname: ${POD_IP},当然也可能是受多个因素影响,如集群网络不通、端口或eureka启动端口配置不正确等:`

yml 复制代码
spring:
  security:
    basic:
      enabled: true
    user:
      name: eureka
      password: abc123456

eureka:
  datacenter: user-server
  environment: prod
  instance:
    hostname: ${POD_IP}  # 容器部署必须填写docker容器的ip
    instance-id: ${random.uuid}
  client:
    #    For stand-alone deployment, the following is false 单机部署的话以下为false
    register-with-eureka: ${IS_CLUSTERED:false}
    fetch-registry: ${IS_CLUSTERED:false}
    service-url:
      defaultZone: http://eureka:[email protected]/eureka/

网上其他说法总结:

  • 降级jdk到8(本次是openjdk17)

  • 升级spring core(本次spring boot3.0,core已经达到6.0)

  • 添加禁用csrf:

    java 复制代码
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception 			{
        http.csrf().disable().httpBasic();
        return http.build();
    }
  • 禁用csrf方案2(来自stack overflow):

    java 复制代码
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .csrf(AbstractHttpConfigurer::disable)
            .authorizeHttpRequests(authConfig -> authConfig.anyRequest().authenticated())
            .httpBasic(httpBasic -> {
            })
            .logout(logout -> {
                logout.logoutUrl("/logout");
                logout.addLogoutHandler((request, response, authentication) -> authentication.setAuthenticated(false));
            });
        return http.build();
    }
  • 禁用csrf方案3:

    java 复制代码
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .authorizeHttpRequests()
            .anyRequest().authenticated() // 任何请求都不需要认证:.anyRequest().permitAll()
            .and()
            .httpBasic();
        return http.build();
    }

以上办法都没有成功,而且还导致额外出现Root name 'timestamp' does not match expected错误。

遇到的其他问题:eureka存在两个实例时相关服务注册完成后自动断开,排查后因为两个eureka没有将register-with-eureka和etch-registry同时设置为true,且defaultZone的地址不是相互注册状态eureka1填写eureka2的ip、eureka2填写eureka1的ip,可减少为1台或重新配置defaultZone的ip

相关推荐
weisian1516 分钟前
云原生--核心组件-容器篇-2-认识下Docker(三大核心之镜像,容器,仓库)
docker·云原生·容器
陈奕昆1 小时前
6.1腾讯技术岗2025面试趋势前瞻:大模型、云原生与安全隐私新动向
算法·安全·云原生·面试·腾讯
孔令飞2 小时前
Go 1.24 中的弱指针包 weak 使用介绍
人工智能·云原生·go
weisian1512 小时前
云原生--核心组件-容器篇-3-Docker核心之-镜像
docker·云原生·容器
南客先生3 小时前
Java在云计算、大数据、云原生下的应用和优势 - 面试实战
java·大数据·微服务·云原生·云计算·容器化·分布式计算
潘多编程4 小时前
Spring Boot 3.4 实战指南:从性能优化到云原生增强
spring boot·云原生·性能优化
迷路的小绅士12 小时前
防火墙技术深度解析:从包过滤到云原生防火墙的部署与实战
网络安全·云原生·防火墙技术·包过滤防火墙·状态检测防火墙
Leon-zy15 小时前
【云计算】云计算中IaaS、PaaS、SaaS介绍
云原生·云计算·paas
江畔独步17 小时前
docker容器监控&自动恢复
docker·容器·eureka
iangyu17 小时前
centos7部署k8s集群
云原生·容器·kubernetes