版本:
- spring 安全:6.1.4
- 春舟:3.1.4
- 春雨: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上发现了一些与我的情况相同的问题.但有两种情况:
-
该解决方案不适合我的版本(正常情况下,它是旧版本):
-
该解决方案没有正确解决我的问题:
- -SpringBoot 3 -Eureka registry server -(username & password registration problem)个
- spring cloud eureka server example login challenge个
- Not able to register a service as Eureka Client个
- Unable to register client to eureka server个
- Unable to register services to the discovery server (EUREKA)个
- Spring Eureka asks for username password authentication个