Eureka的基础使用: https://blog.csdn.net/qq_36110736/article/details/109027222
1.三种角色
图一 注册中心的三种角色
- Eureka Server:通过Register、Renew、Cancel等接口提供服务的注册与发现
- Service Provider:服务提供方,把自身的服务实例注册到 Eureka Server 上
- Srevice Consumer:服务调用方,通过Eureka Server 获取注册列表,消费服务
2.架构原理
- Register(服务注册):把自己的ip和端口号注册给Eureka
- Renew(服务续约):发送心跳包,每隔30s发送一次,告诉Eureka自己还活着,如果90s没有发送,宕机
- Cancale(服务下线):当Provider关闭时会向Eureka 发送消息,把自己从服务列表剔除,防止Consumer调用已经不存在的服务
- Get Registry(获取注册信息表)取其他服务列表
- Replicate(集群中心数据同步):Eureka集群中的数据同步与复制
- Make Remote Call(远程调用):完成服务的远程调用
注册、续约、下线的请求默认优先选择本区域内的Eureka Server,只有当本区内的Eureka Server都不可用,才会选择其他区的Eureka Server。
3.自我保护
自我保护机制的工作机制是:如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:
-
Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
-
Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
-
当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。
为什么要有自我保护?
为了防止EurekaClient可以正常运行,但是与Eureka网络不通情况下,EurekaServer不会立刻将EurekaClient服务剔除。
如何关闭?
Eureka服务添加如下配置:
eureka:
server:
# 关闭自我保护机制,保证不可用的服务被及时剔除
enable-self-preservation: false
# 如果60秒内没有收到某个微服务的心跳,那就剔除该微服务,单位为毫秒
eviction-interval-timer-in-ms: 60000
优雅停服
Provider(服务提供者)中添加如下依赖(版本号可能有差异)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>2.1.14.RELEASE</version>
</dependency>
配置文件中添加:
management:
endpoint:
shutdown:
enabled: true
endpoints:
web:
exposure:
include:
- shutdown
此时我们既可以通过访问 http://ip:端口号/actuator/shutdown 去关闭对应服务
注意:请求类型必须是POST
安全认证
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
<version>2.0.5.RELEASE</version>
</dependency>
注意:只要加入了security包则自动开启了默认安全认证,密码随机生成,在控制台可以看到。
修改Eureka Client配置文件
spring:
security:
user:
password: 123456
name: root
同时时Eureka defaultZone 配置改为http://${userName}:${password}@ip:端口号/eureka/
注意:(无论是Eureka Server 还是Eureka Client 都需要添加以下配置)
Eureka会自动配置CSRF防御机制,spring security认为post,put and delete http methods 都是有风险的,如果这些method发送过程中没有带上CSRF token,会被直接拦截并返回403 forbidden
首先注册中心配置一个@EnableWebSecurity配置类,继承WebSecurityConfigurerAdapter,然后重写configure方法
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 方案一 过滤指定路径
* @param http
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
//这句为了访问eureka控制台和/actuator时能做安全控制
super.configure(http);
//忽略指定路径的所有请求
http.csrf().ignoringAntMatchers("/eureka/**");
}
}
或者:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 方案二 保持密码验证的同时禁用CSRF防御机制
* @param http
* @throws Exception
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
//如果直接用disable()会把安全验证也警用掉
http.csrf().disable().authorizeRequests()
.anyRequest()
.authenticated()
.and()
.httpBasic();
}
}
参考
https://www.jianshu.com/p/cb7fa0aa47a8