144 lines
6.1 KiB
Markdown
144 lines
6.1 KiB
Markdown
|
> 原文地址 [www.cnblogs.com](https://www.cnblogs.com/jpfss/p/11314742.html)
|
|||
|
|
|||
|
* #### Eureka 自我保护机制
|
|||
|
|
|||
|
接着以上篇文章建立的三个工程为基础(eureka-server,uerreg,myweb), 默认 Eureka 是开启自我保护的。我们来做个测试,我们先启动三个工程,我们访问注册中心 [http://localhost:8761/](http://localhost:8761/),
|
|||
|
|
|||
|
![[Pasted image 20220406220855.png]]
|
|||
|
可以看到,实例是成功注册到中心的。此时我们将 uerreg 服务关闭,刷新注册中心,我们会发现如下界面
|
|||
|
![[Pasted image 20220406220914.png]]
|
|||
|
我们除了看到了一行红色的警告信息,还发现了一件神奇的事情,就是我们的服务实例虽然被 kill 了,但是在服务注册中心他还是存在的。这就是 Eureka 自我保护机制,他不会剔除已经挂掉的服务,他会认为这个服务是在尝试重新连接的。
|
|||
|
我们在开发过程中肯定是不希望这样的,不利于开发。我们可以关闭 Eureka 的自我保护机制(实际生产环境不建议关闭)。
|
|||
|
|
|||
|
* eureka-server 服务端
|
|||
|
配置文件中我们添加如下配置
|
|||
|
|
|||
|
```properties
|
|||
|
#关闭保护机制,以确保注册中心将不可用的实例正确剔除
|
|||
|
eureka.server.enable-self-preservation=false
|
|||
|
#(代表是5秒,单位是毫秒,清理失效服务的间隔 )
|
|||
|
eureka.server.eviction-interval-timer-in-ms=5000
|
|||
|
```
|
|||
|
|
|||
|
* userreg 客户端
|
|||
|
配置文件中我们添加如下配置
|
|||
|
|
|||
|
```properties
|
|||
|
# 心跳检测检测与续约时间
|
|||
|
# 测试时将值设置设置小些,保证服务关闭后注册中心能及时踢出服务
|
|||
|
# 配置说明
|
|||
|
# lease-renewal-interval-in-seconds 每间隔10s,向服务端发送一次心跳,证明自己依然”存活“
|
|||
|
# lease-expiration-duration-in-seconds 告诉服务端,如果我20s之内没有给你发心跳,就代表我“死”了,将我踢出掉。
|
|||
|
eureka.instance.lease-renewal-interval-in-seconds=10
|
|||
|
eureka.instance.lease-expiration-duration-in-seconds=20
|
|||
|
```
|
|||
|
|
|||
|
我们重新启动服务,然后关闭 userreg 客户端进行测试。
|
|||
|
![[Pasted image 20220406220933.png]]
|
|||
|
此时我们发现,红色警告变成了自我保护被关闭的警告,且实例被注册中心剔除,表明此时自我保护机制被关闭。
|
|||
|
|
|||
|
* #### 健康检查
|
|||
|
|
|||
|
人会生病,就像人一样服务有时候也会出现异常情况,我们也需要知道某个服务的健康状况。我们可以通过添加如下依赖,开启某个服务的健康检查。以 userreg 服务为例
|
|||
|
pom 文件中添加如下依赖
|
|||
|
|
|||
|
```xml
|
|||
|
<!--健康检查依赖-->
|
|||
|
<dependency>
|
|||
|
<groupId>org.springframework.boot</groupId>
|
|||
|
<artifactId>spring-boot-starter-actuator</artifactId>
|
|||
|
</dependency>
|
|||
|
```
|
|||
|
|
|||
|
ok, 其他的什么都不变,我们来访问一下这个接口 [http://localhost:9001/health](http://localhost:9001/health)
|
|||
|
我们看到了一个很简短的健康报告:{"description":"Spring Cloud Eureka Discovery Client","status":"UP"},类似的还有
|
|||
|
|
|||
|
> info 显示任意的应用信息
|
|||
|
> metrics 展示当前应用的指标信息 true
|
|||
|
> mappings 显示所有 @RequestMapping 路径的整理列表
|
|||
|
> trace 显示 trace 信息(默认为最新的一些 HTTP 请求)
|
|||
|
> health 展示应用的健康信息
|
|||
|
> beans 显示一个应用中所有 Spring Beans 的完整列表
|
|||
|
|
|||
|
这其中有一些是敏感信息,出于安全考虑,如果不设置
|
|||
|
|
|||
|
```properties
|
|||
|
#关掉认证(公网下的生产环境不建议,内网部署可以)
|
|||
|
#management.security.enabled=false
|
|||
|
```
|
|||
|
|
|||
|
默认是无法访问的。
|
|||
|
如果我们要访问查看而且想保证一定的安全性,我们应该做什么呢?我们在 userreg 的 pom 文件中引入
|
|||
|
|
|||
|
```xml
|
|||
|
<!--安全认证依赖-->
|
|||
|
<dependency>
|
|||
|
<groupId>org.springframework.boot</groupId>
|
|||
|
<artifactId>spring-boot-starter-security</artifactId>
|
|||
|
</dependency>
|
|||
|
```
|
|||
|
|
|||
|
此时我们访问 / beans 敏感信息时,弹出如下信息,需要我们进行身份认证
|
|||
|
|
|||
|
![[Pasted image 20220406220957.png]]
|
|||
|
|
|||
|
仅仅引入依赖其实是有问题的,因为我们请求正常的业务接口他也会要求进行认证,解决办法可以在 userreg 工程的配置文件中添加如下设置:
|
|||
|
|
|||
|
```properties
|
|||
|
#(增加了访问路径)
|
|||
|
management.context-path=/admin
|
|||
|
security.user.name=root
|
|||
|
security.user.password=123
|
|||
|
#只对/admin进行安全认证
|
|||
|
security.basic.path=/admin
|
|||
|
```
|
|||
|
|
|||
|
重启服务,我们访问 [http://localhost:9001/admin/beans](http://localhost:9001/admin/beans),注意哦,我们在配置文件中添加了相对路径,只对 admin 进行验证,此时我们输入正确的用户名和密码(已在配置文件中配置)会显示我们需要的信息。
|
|||
|
|
|||
|
* #### 实战健康检查
|
|||
|
|
|||
|
|
|||
|
健康检查在实际应用场景中有哪些呢?举个例子,我们配置 userreg 工程数据源
|
|||
|
在 pom 文件中引入以下依赖
|
|||
|
|
|||
|
```xml
|
|||
|
<dependency>
|
|||
|
<groupId>org.springframework.boot</groupId>
|
|||
|
<artifactId>spring-boot-starter-jdbc</artifactId>
|
|||
|
</dependency>
|
|||
|
<dependency>
|
|||
|
<groupId>mysql</groupId>
|
|||
|
<artifactId>mysql-connector-java</artifactId>
|
|||
|
</dependency>
|
|||
|
```
|
|||
|
|
|||
|
然后建立一个配置类,配置数据源 DataSource
|
|||
|
|
|||
|
```java
|
|||
|
@Configuration
|
|||
|
public class Myconfig {
|
|||
|
@Bean
|
|||
|
public DataSource dataSource()
|
|||
|
{
|
|||
|
org.apache.tomcat.jdbc.pool.DataSource dataSource=new org.apache.tomcat.jdbc.pool.DataSource();
|
|||
|
dataSource.setUrl("jdbc:mysql://localhost/test?characterEncoding=UTF-8");
|
|||
|
dataSource.setUsername("root");
|
|||
|
dataSource.setPassword("mysql");
|
|||
|
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
|
|||
|
return dataSource;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
```
|
|||
|
|
|||
|
这个在 springboot 中已经学习过,后续我会把 springboot 学习过程以博客的方式记录下来,配置完成数据源之后,我们启动服务,访问 [http://localhost:9001/admin/health](http://localhost:9001/admin/health) 查看健康情况
|
|||
|
![[Pasted image 20220406221207.png]]
|
|||
|
|
|||
|
我们可以看到 db 的健康情况。假如此时我们的 mysql 服务挂掉,会怎样呢?
|
|||
|
![[Pasted image 20220406221107.png]]
|
|||
|
|
|||
|
我们手动停止 mysql 服务,然后再看健康情况
|
|||
|
|
|||
|
![[Pasted image 20220406221125.png]]
|
|||
|
发现 db 状态已经由 “UP” 变成了 “DOWN” 并显示了错误信息,这样就很方便我们查看服务的健康情况了。
|