1. eureka-server
维护最新的服务列表,通过接收心跳的方式
如果某个服务超出30s仍未发送心跳,不会立马从服务列表中删除服务,等待90s之后才会删除
也可以通过下面这个配置,在运行期间会去统计心跳失败比例在 15 分钟之内是否低 于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来
eureka.server.renewal-percent-threshold=0.85
eureka.instance.lease-expiration-duration-in-seconds=90
2. eureka-client
eureka客户端每30秒向阳eureka服务端发送心跳
每个客户端都会在固定时间请求eureka服务端 拉取服务列表,存储在本地
在调用其他服务时,会根据服务列表,选择状态up的去调用
3. eureka用户认证
连接到 eureka的时候需要带上连接的用户名和密码 ,eureka 服务端改造
3.1 eureka 服务端改造
3.1.1 添加启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
3.1.2 代码配置,关闭csrf验证
@EnableWebSecurity
//这里采坑了,一定要加哦,不然会失效
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable(); //关闭csrf
http.authorizeRequests().anyRequest().authenticated().and().httpBasic(); //开启认证
}
}
3.1.3 application.properties 配置
开启 basic校验,设置登录用户名密码
security.basic.enabled=true
spring.security.user.name=admin
spring.security.user.password=admin
登录eureka界面就需要登录密码了
3.2 Eureka 客户端改造
跟 eureka 连接的时候要带上用户名密码
#注册到eureka-server的地址
eureka.client.serviceUrl.defaultZone=http://admin:admin@localhost:9001/eureka/
4. 服务续约保活
当客户端启动像 eureka服务端 注册了本身服务列表后,需要隔段时间发送一次心跳给 eureka 服务端来证明自己还活着,当 eureka 收到这个心跳请求后才会知道客户端还活着,才会维护该客户端的服务列表信息。一旦因为某些原因导致客户端没有按时发送心跳给 eureka 服务端,这时候 eureka可能会认为你这个客户端已经挂了,它就有可能把该服务从服务列表中删除掉。
有关续约保活的配置
4.1 客户端配置
#服务续约,心跳的时间间隔
eureka.instance.lease-renewal-interval-in-seconds=30
#表示 eureka client 间隔多久去拉取服务注册信息,默认为 30 秒
eureka.client.registry-fetch-interval-seconds=30
4.2 服务端配置
#如果从前一次发送心跳时间起,90 秒没接受到新的心跳,讲剔除服务
eureka.instance.lease-expiration-duration-in-seconds=90
#自我保护模式,当出现出现网络分区、eureka 在短时间内丢失过多客户端时,会进入自我保护模式,即一个服务长时间没有发送心跳,eureka 也不会将其删除,默认为 true
eureka.server.enable-self-preservation=true
#Eureka Server 在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来
eureka.server.renewal-percent-threshold=0.85
#eureka server 清理无效节点的时间间隔,默认 60000 毫秒,即 60 秒
eureka.server.eviction-interval-timer-in-ms=60000
5. Eureka 健康检测(client)
Eureka 默认的健康检测只是你校验服务连接是否是 UP 还是 DOWN 的,然后客户端只会调用状态为 UP 状态的服务,但是有的情况下,虽然服务连接是好的,但是有可能这个服务的某些接口不是正常的,可能由于需要连接 Redis,mongodb 或者 DB 有问题导致接口调用失败,所以理论上服务虽然能够正常调用,但是它不是一个健康的服务。所以我们就有必要对这种情况做自定义健康检测.
5.1 Application.properties 配置
#健康检测
eureka.client.healthcheck.enabled=true
5.2 自定义健康检测代码
@Configuration
public class MicroWebHealthIndicator implements HealthIndicator {
@Override
public Health health() {
//这个状态就是数据库是否连接OK
if (OrderController.canVisitDb) {
return new Health.Builder(Status.UP).build();
} else {
return new Health.Builder(Status.DOWN).build();
}
}
}
我们可以在 health 方法里面去连接数据库,如果连接异常了则返回 DOWN,如果没异常则方法 UP,这个 health 方法是线程去掉的,隔一段时间掉一次。
5.3 检测检测依赖的 jar 包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
image.png
6. 服务下线
比如有些情况是服务主机意外宕机了,也就意味着服务没办法给 eureka 心跳信息了,但是eureka 在没有接受到心跳的情况下依赖维护该服务 90s,在这 90s 之内可能会有客户端调用到该服务,这就可能会导致调用失败。所以我们必须要有一个机制能手动的立马把宕机的服务从 eureka服务列表中清除掉,避免被服务调用方调用到。
6.1 调 用服务下线的接口:
这个接口是调用 eureka 服务端的接口,DELETE请求
http://localhost:9001/eureka/apps/MICRO-WEB/localhost:micro-web:9002
image.png
这样该服务就会从服务列表删除。
7. Eureka 高可用
Eureka 热备份的架构图如下:
image.png
整个微服务中存在多个 eureka 服务,每个 eureka 服务都是相互复制的,会把客户端注册进来的服务复制到 eureka 集群中的其他节点里面来。其实简单来说就是 eureka 每个节点相互复制。
具体配置如下:
1. 端口为 9002 的 eureka 服务端把自己注册到 9003 的 eureka 服务端
server.port=9002
eureka.instance.hostname=Eureka9002
# eureka服务端单实例配置 ,不需要像eureka注册自己,不需要从eureka注册自己
#eureka.client.register-with-eureka=false
#eureka.client.fetchRegistry=false
#eureka.client.serviceUrl.defaultZone=http://localhost:9001/eureka/
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true
# 注册自己到服务名为Eureka9003的实例上去,并指定端口
eureka.client.serviceUrl.defaultZone=http://admin:admin@Eureka9003.com:9003/eureka/
2. 同样的道理,端口为 9003 的 eureka 服务端把自己注册到 9002 的 eureka 服务端
server.port=9003
eureka.instance.hostname=Eureka9003
# eureka服务端单实例配置 ,不需要像eureka注册自己,不需要从eureka注册自己
#eureka.client.register-with-eureka=false
#eureka.client.fetchRegistry=false
#eureka.client.serviceUrl.defaultZone=http://localhost:9001/eureka/
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true
# 注册自己到服务名为Eureka9002的实例上去,并指定端口
eureka.client.serviceUrl.defaultZone=http://admin:admin@Eureka9002.com:9002/eureka/
3. 两个配置文件
image.png4. 在/ect/hosts 文件中配置添加实例和IP地址的映射关系,不然注册的时候 根据实例名找不到对应的ip,会报错
127.0.0.1 Eureka9002.com
127.0.0.1 Eureka9003.com
5. 启动的时候按照指定配置文件启动
java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=9002
java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=9003
打开两个eureka服务的监控地址,发现自身都成为对方的复制品。
image.png image.png6. 注册一个订单服务到这两台eureka服务端上,发现两台eureka服务端会相互复制,持有相同同的服务列表。
客户端注册到这两台实例上
eureka.client.serviceUrl.defaultZone=http://admin:admin@Eureka9002:9002/eureka/,http://admin:admin@Eureka9003:9003/eureka/
image.png
image.png
由于集群里的每个eureka服务端都维护了相同的完整的服务列表,所以当其中一台eureka服务端挂掉后, 其他的服务还能从其他存活的eureka服务端获取到服务列表, 达到了eureka集群之间的高可用。其他服务因此得以继续保持对其他服务的发现,从而达到微服务之间的高可用。
网友评论