版本:

  1. spring 安全:6.1.4
  2. 春舟:3.1.4
  3. 春雨:2022.0.4

用户需要登录才能访问Eureka服务器的仪表板.因此,我为Eureka服务器配置了Spring安全性,如下所示.

Eureka服务器:

请注意,情况并非如此.

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Value("${app.eureka.username}")
    private String username;
    @Value("${app.eureka.password}")
    private String password;

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.csrf(csrf->csrf.ignoringRequestMatchers("/eureka/**"))
                .authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated())
                .httpBasic(Customizer.withDefaults())
                .formLogin(Customizer.withDefaults());
        return http.build();
    }

    @Bean
    public UserDetailsService userDetailsService() {
        PasswordEncoder encoder = PasswordEncoderFactories.createDelegatingPasswordEncoder();
        UserDetails user = User
                .withUsername(username)
                .password(encoder.encode(password))
                .roles("USER")
                .build();
        return new InMemoryUserDetailsManager(user);
    }
}

主打APP:

@SpringBootApplication
@EnableEurekaServer
public class DiscoveryServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(DiscoveryServerApplication.class, args);
    }

}

应用程序.属性:

eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

server.port=8761
app.eureka.username=eureka
app.eureka.password=password

我只有一项服务:产品服务

主打APP:

@SpringBootApplication
@EnableDiscoveryClient
public class ProductServiceApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProductServiceApplication.class, args);
    }

}

应用程序.属性:

spring.data.mongodb.uri=mongodb://127.0.0.1:27017/product

eureka.client.service-url.defautZone=http://eureka:password@localhost:8761/eureka
eureka.client.fetch-registry=true
eureka.client.register-with-eureka=true
eureka.instance.prefer-ip-address=true
spring.application.name=product-service
server.port=8080

如果我从eureka服务器上删除auth Layer并将eureka.client.service-url.defautZone改回http:/localhost:8761/eureka,我的系统就能正常工作.

完整的错误消息:

2023-10-03T03:05:39.446+07:00 ERROR 36620 --- [tbeatExecutor-0] com.netflix.discovery.DiscoveryClient    : DiscoveryClient_PRODUCT-SERVICE/host.docker.internal:product-service:8080 - was unable to send heartbeat!

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
    at com.netflix.discovery.shared.transport.decorator.RetryableEurekaHttpClient.execute(RetryableEurekaHttpClient.java:112) ~[eureka-client-2.0.1.jar:2.0.1]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.sendHeartBeat(EurekaHttpClientDecorator.java:89) ~[eureka-client-2.0.1.jar:2.0.1]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator$3.execute(EurekaHttpClientDecorator.java:92) ~[eureka-client-2.0.1.jar:2.0.1]
    at com.netflix.discovery.shared.transport.decorator.SessionedEurekaHttpClient.execute(SessionedEurekaHttpClient.java:77) ~[eureka-client-2.0.1.jar:2.0.1]
    at com.netflix.discovery.shared.transport.decorator.EurekaHttpClientDecorator.sendHeartBeat(EurekaHttpClientDecorator.java:89) ~[eureka-client-2.0.1.jar:2.0.1]
    at com.netflix.discovery.DiscoveryClient.renew(DiscoveryClient.java:837) ~[eureka-client-2.0.1.jar:2.0.1]
    at com.netflix.discovery.DiscoveryClient$HeartbeatThread.run(DiscoveryClient.java:1401) ~[eureka-client-2.0.1.jar:2.0.1]
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539) ~[na:na]
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136) ~[na:na]
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635) ~[na:na]
    at java.base/java.lang.Thread.run(Thread.java:833) ~[na:na]

我怎么才能解决这个问题呢?

我在Stack Overflow上发现了一些与我的情况相同的问题.但有两种情况:

  1. 该解决方案不适合我的版本(正常情况下,它是旧版本):

  2. 该解决方案没有正确解决我的问题:

推荐答案

我遇到了类似的问题,我通过更改我的application.yaml文件解决了它.之前是这样的:

eureka:
   client:
     service-url:
       default-zone: http://eureka:password@localhost:8761/eureka

我把它改成:

eureka:
   client:
     serviceUrl:
       defaultZone: http://eureka:password@localhost:8761/eureka

Java相关问答推荐

是否可以从@ TrustMapping中删除特定方法的基路径?

获取拦截器内部的IP地址

Mongo DB Bson和Java:在子文档中添加和返回仅存在于父文档中的字段?

Java中不同包中的类之间的配置共享

JsonPath在多个线程中返回错误的值

如何使用jooq generator将表名和列名映射为人类可读的?

使用Java Streams API比较两个不同的Java集合对象和一个公共属性

使用java访问具体子类特定方法的最佳方法是什么?

错误:在Liferay7.4中找不到符号导入com.liferay.portal.kernel.uuid.PortalUUID;";

存根基类的受保护方法

我无法获取我的Java Spring应用程序的Logback跟踪日志(log)输出

CompleteableFuture是否运行在不同的内核上?

查找剩余的枚举

try 判断可选参数是否为空时出现空类型安全警告

如何在Application.yaml中连接字符串?

GetChildren().emoveAll()不会删除 node

在权限列表中找不到我的应用程序

根据应用程序 Select 的语言检索数据

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

URI构造函数错误?