Spring Cloud 之 Admin-微服务监控

admin server

  • 建立一个 spring boot 项目并添加 admin 依赖
1
2
3
4
5
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-server</artifactId>
<version>2.2.2</version>
</dependency>
  • 启动类加上注解:
1
2
3
4
5
6
7
8
@EnableAdminServer//开启 admin server
@SpringBootApplication
public class SpringcloudAdminServiceApplication {

public static void main(String[] args) {
SpringApplication.run(SpringcloudAdminServiceApplication.class, args);
}
}
  • 端口:
1
server.port=8091

启动项目 访问:http://localhost:8091/

image-20200517230826809

admin client

再新建一个 spring boot 项目

  • 依赖:
1
2
3
4
5
6
7
8
9
10
11
12
13
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>de.codecentric</groupId>
<artifactId>spring-boot-admin-starter-client</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
  • 配置
1
2
3
server.port=8092
# 指向 admin server 的地址
spring.boot.admin.client.url=http://localhost:8091

启动 client 项目。后访问:http://localhost:8091/

image-20200517231310927

已经发现了一个应用了

点击应用可看到简单的信息。

image-20200517231536152

在配置中 暴露 所有端点重启后再次访问:

1
2
#暴露所有端点
management.endpoints.web.exposure.include=*

就可以看到更多的信息了。

image-20200517231837244

整合 Eureka 监控所有服务。

在 admin-server 项目中添加 Eureka client 依赖

1
2
3
4
5
6
7
8
9
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
// 如果想同时监控自己的信息 添加 actuator 并暴露所有端点
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
1
2
3
4
5
6
7
8
9
10
11

server.port=8091
spring.application.name=spring-cloud-admin-service
#配置中心集群 地址
eureka.client.serviceUrl.defaultZone=http://WuZhiYong:123456@localhost:8761/eureka/,http://WuZhiYong:123456@localhost:8762/eureka/
#采用IP注册
eureka.instance.prefer-ip-address=true
#定义实例ID格式
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
#暴露所有端点
management.endpoints.web.exposure.include=*

启动注册中心并把一些服务注册到注册中心里。(重启所有项目)

访问 :http://localhost:8091/ 点击应用墙可看到多个服务的实例

image-20200517234245135

点击实例就可以看到每个实例的监控信息了

配置查看各个服务的日志

  • 例如一个服务 logback 配置的日志输出文件为:
1
<property name="LOG_FILE" value="D:/IdeaProjects/spring-cloud-study/springcloud-hystrix/sleuth-user-service.log" />

那么我在配置文件中加入:

1
2
logging.file=D:/IdeaProjects/spring-cloud-study/springcloud-hystrix/sleuth-user-service.log
logging.pattern.file=%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(%5p) %clr(${PID}){magenta} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n%wEx

重启服务,并打开 admin 中该服务的监控信息:即可看到实时日志。

image-20200518214301403

同时在这里可控制日志每个类的级别

image-20200518214714220

开启认证

在实际生产环境中,对服务的监控,自然是通过认证的才能够访问的。

  • 添加依赖
1
2
3
4
5
6
7
8
9
<!-- 添加 web 依赖 是因为,security 是基于 filter 的。而 filter 需要 web 依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
  • 配置用户名和密码
1
2
spring.security.user.name=wuzhiyong
spring.security.user.password=123456
  • 配置 config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@EnableWebSecurity
public class SpringSecurityCustomConfig extends WebSecurityConfigurerAdapter {

@Override
public void configure(HttpSecurity http) throws Exception {
http
//关闭 CSRF 保护(如果不关闭 访问logoutUrl 必须为post方式 见源码注释)
.csrf().disable()
.authorizeRequests()

//允许匿名访问
//若不放行 actuator 那么监控里看到自己是下线的。
.antMatchers("/actuator/**").permitAll()
.anyRequest().authenticated()
.and()
.formLogin()
.and()
.httpBasic()
;
}
}
  • 配置好后 启动。

image-20200518215607010

image-20200518222020519

《spring cloud 微服务 入门、进阶与实战》书中说。监控的服务中需要配置上与 admin 对应的用户名和密码,否则会注册失败。我这里尝试不配置重启后发现也是可以的。

1
2
spring.boot.admin.client.username=wuzhiyong
spring.boot.admin.client.password=123456

邮件警报

  • 添加依赖
1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-mail</artifactId>
</dependency>
  • 配置邮箱服务
1
2
3
4
5
6
7
8
9
10
11
#邮件
spring.mail.host=smtp.qq.com
spring.mail.username=563653092@qq.com
spring.mail.password= << 你的邮箱授权码 >>
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
# 发送给谁
spring.boot.admin.notify.mail.to=563653092@qq.com
# 是谁发送出去的
spring.boot.admin.notify.mail.from=563653092@qq.com

保存后重启 admin 。然后我们停掉一台服务。收到的邮件如下:

image-20200518225619623