Eureka服务注册与发现(二)
接上一篇:Eureka服务注册与发现(一)
为Eureka Server添加用户认证
之前的Eureka Serverhi是可以匿名访问,接下来构造一个需要认证的项目
- 在之前的Eureka Server中添加依赖
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security
compile group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '2.1.6.RELEASE'
- 在
application.yml
中添加配置
spring:
profiles: peer1
security:
user:
name: root
password: root123
server:
port: 8761
eureka:
instance:
hostname: peer1
client:
serviceUrl:
defaultZone: http://peer2:8762/eureka/
- 访问
http://127.0.0.1:8761/
即可进入登陆页面
将微服务注册到需要认证的Eureka Server
- 修改用户微服务的配置文件如下:
eureka:
client:
serviceUrl:
defaultZone: http://root:root123@localhost:8761/eureka/
instance:
prefer-ip-address: true
但是这样启动会一直报错。无法将服务注册到Eureka Server,报错如下
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
- 通过查阅官方文档,找到解决办法,需要在Eureka Server增加以下配置类:
@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().ignoringAntMatchers("/eureka/**");
super.configure(http);
}
}
- 可以在Eureka Server上看到服务已经成功注册:
Eureka的自我保护模式
上一篇提到了Eureka的自我保护模式(红色的提示)。默认情况下,如果Eureka Server在一段时间内如果没有接收到某个微服务实例的心跳,Eureka Sserver会注销该实例(默认30S),但是当网络故障时,微服务与Eureka Server之间无法通信,但是服务确实正常的,如果立即注销服务那很不合理而且很危险。
Eureka Server通过“自我保护模式”解决这个问题——当Eureka Server节点在短时间内丢失过多客户端时,那么这个节点进入自我保护模式。一旦进入该模式,Eureka Server会保护服务注册表中的信息,不在删除服务。当网络故障回复后,该Eureka Server节点会自动退出自我保护模式。
在Spring Cloud中可通过添加如下配置,禁用自我保护模式:
eureka:
server:
enable-self-preservation: false
Eureka的健康检查
-
下图时Eureka Server中的服务状态信息。服务状态共有:UP、OUT_OF_SERVICE、UNKOWN等。
-
只有标记为UP的服务才是正常的,才能被其他服务请求。在Spring Boot中通过添加Spring Boot Actuator的/health节点能够看到服务的状态,在Eureka Client中通过简单的配置即可将服务的状态传播到Eureka Server,配置如下:
eureka:
client:
healthcheck:
enabled: true