指标监控

yaml配置:

  1. **默认所有的Endpoint除过shutdown都是开启的**
  2. **需要开启或者禁用 , Endpoints 配置模式为:**
  1. #management : 是所有actuator的配置 (指标监控)
  2. management:
  3. #配置所有端点的默认行为
  4. endpoints:
  5. enabled-by-default: true #true : 开启所有指标监控
  6. web:
  7. exposure:
  8. include: '*' #设置以web方式暴露所有端点 指标监控
  1. **或者想指定开启某些指标**:
  1. #management.endpoints.端点名.xxx: 对某个端点的具体配置
  2. management:
  3. endpoints:
  4. enabled-by-default: false #关闭所有指标监控
  5. web:
  6. exposure:
  7. include: '*' #以web方式暴露所有端点
  8. #配置单个指标监控端点的默认行为
  9. endpoint:
  10. health:
  11. show-details: always #health的详细信息 always 显示health的详细信息
  12. enabled: true
  13. info:
  14. enabled: true
  15. beans:
  16. enabled: true
  17. metrics:
  18. enabled: true

Mevan : github 开源项目 admin web 显示指标监控

注意 : 要引入 spring-boot-starter-actuator : 指标监控功能

  1. 开启 指标监控以 **web** 方式暴露所有端点

分为 客户端服务端

  1. <!--引入 指标监控功能-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-actuator</artifactId>
  5. </dependency>
  6. <!-- 引入监控 客户端 github上开源项目 -->
  7. <dependency>
  8. <groupId>de.codecentric</groupId>
  9. <artifactId>spring-boot-admin-starter-client</artifactId>
  10. <version>2.5.1</version>
  11. </dependency>
  12. <!-- 另一个项目 -->
  13. <!-- 引入监控 服务端 github开源项目-->
  14. <dependency>
  15. <groupId>de.codecentric</groupId>
  16. <artifactId>spring-boot-admin-starter-server</artifactId>
  17. <version>2.5.1

自定义指标 —>health 注意(所有自定义指标监控 @Component 都要放入容器)

注意 : 当前类的命名规则是 : xxxxHealthIndicator

AbstractHealthIndicator 继承 HealthIndicator 封装好的抽象类

  1. @Component
  2. public class MyComHealthIndicator extends AbstractHealthIndicator {
  3. /**
  4. * 真实的检查方法
  5. * @param builder
  6. * @throws Exception
  7. */
  8. @Override
  9. protected void doHealthCheck(Health.Builder builder) throws Exception {
  10. //mongodb 获取连接进行测试
  11. Map<String,Object> map = new HashMap<>();
  12. if (1 == 1){
  13. // builder.up(); //健康
  14. builder.status(Status.UP);
  15. map.put("count",1);
  16. map.put("ms",100);
  17. }else {
  18. // builder.down(); //不健康
  19. builder.status(Status.OUT_OF_SERVICE);
  20. map.put("err","连接超时");
  21. map.put("ms",3000);
  22. }
  23. builder.withDetail("code",100)
  24. .withDetails(map);
  25. }
  26. }

声明指标监控 Endpoint

@Endpoint(id = “myservice”) : 声明设置这是一个 Endpoint 指标监控

@ReadOperation : 声明是一个端点的读操作

@WriteOperation : 声明是一个端点的写操作

  1. @Component
  2. @Endpoint(id = "myservice") //设置这是一个Endpoint
  3. public class MyServiceEndPoint {
  4. //@ReadOperation 声明是一个端点的读操作
  5. @ReadOperation
  6. public Map getDockerInfo(){
  7. return Collections.singletonMap("dockerInfo","docker started.....");
  8. }
  9. //@WriteOperation 声明是一个端点的写操作
  10. @WriteOperation
  11. public void stopDocker(){
  12. System.out.println("docker stopped....");
  13. }
  14. }

声明指标监控 info

继承 InfoContributor 自定义设置 info

  1. @Component
  2. public class AppInfoInfoContributor implements InfoContributor{
  3. @Override
  4. public void contribute(Info.Builder builder) {
  5. builder.withDetail("function","web")
  6. .withDetail("edition","1.0.0");
  7. }
  8. }

MyBatis-Plus 配置

Dao MyBatis-Plus 继承BaseMapper

BaseMapper 接口中 接口写出所有CRUD功能

IService

extends ServiceImpl

  1. /**
  2. * 继承BaseMapper<Bean>
  3. */
  4. @Mapper
  5. public interface User1Dao extends BaseMapper<User1> {
  6. }
  7. public interface User1Service extends IService<User1> {
  8. }
  9. @Service
  10. public class User1ServiceImpl extends ServiceImpl<User1Dao, User1> implements User1Service {
  11. }

分页插件

  1. @Autowired
  2. private User1Service user1Service;
  3. @GetMapping("/dynamic_table") //RequestParam 获取表单中的pn , 没有的话默认是1
  4. public String dynamic_table(Model model,@RequestParam(value = "pn",defaultValue = "1")Integer pn){
  5. //分页查询数据
  6. Page<User1> userPage = new Page<>(pn, 2);
  7. //分页查询结果
  8. Page<User1> page1 = user1Service.page(userPage, null);
  9. //当前页
  10. long current = page1.getCurrent();
  11. //总页数
  12. long pages = page1.getPages();
  13. //总条记录
  14. long total = page1.getTotal();
  15. //查出数据库的数据
  16. List<User1> records = page1.getRecords();
  17. model.addAttribute("page",page1);
  18. return "table/dynamic_table";
  19. }

MyBatis-plus Configuration MyBatis-Plus 分页配置

  1. @Configuration
  2. public class MyBatisConfig {
  3. /**
  4. * MybatisPlusInterceptor
  5. * @return
  6. */
  7. @Bean
  8. public MybatisPlusInterceptor paginationInterceptor(){
  9. MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
  10. //这是分页拦截器
  11. PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
  12. //设置请求的页面大于最大页后操作, true 调回到首页, false 继续请求 默认false
  13. paginationInnerInterceptor.setOverflow(true);
  14. //设置最大单页限制数量, 默认500条, -1 不受限制
  15. paginationInnerInterceptor.setMaxLimit(500L);
  16. mybatisPlusInterceptor.addInnerInterceptor(paginationInnerInterceptor);
  17. return mybatisPlusInterceptor;
  18. }
  19. }

HandlerInterceptor接口 Spring 拦截器

  1. /**
  2. * 登录检查
  3. * 1,配置好拦截器要拦截哪些请求
  4. * 2,把这些配置放在容器中
  5. */
  6. public class LoginInterceptor implements HandlerInterceptor {
  7. /**
  8. * 目标方法执行之前 返回true or false
  9. * @param request
  10. * @param response
  11. * @param handler
  12. * @return
  13. * @throws Exception
  14. */
  15. @Override
  16. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {}
  17. /**
  18. * 目标方法执行完成以后
  19. * @param request
  20. * @param response
  21. * @param handler
  22. * @param modelAndView
  23. * @throws Exception
  24. */
  25. @Override
  26. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
  27. }
  28. /**
  29. * 页面渲染以后
  30. * @param request
  31. * @param response
  32. * @param handler
  33. * @param ex
  34. * @throws Exception
  35. */
  36. @Override
  37. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
  38. }
  39. }

HandlerInterceptor Configurtion

  1. /**
  2. * 1,编写一个拦截器实现 HandlerInterceptor 接口
  3. * 2,拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors)
  4. * 3,指定拦截规则[如果是拦截所有,静态拦截也会被拦截]
  5. */
  6. @Configuration
  7. public class AdMainWebConfig implements WebMvcConfigurer {
  8. /**
  9. * Filter,Interceptor 几乎拥有相同的功能?
  10. * 1,Filter: 是servlet定义的原生组件.好处,脱离Spring应用也能使用
  11. * 2,Interceptor: 是Spring定义的接口.可以Spring的自动装配等功能
  12. */
  13. @Autowired
  14. RedisUrlCountInterceptor redisUrlCountInterceptor;
  15. @Override
  16. public void addInterceptors(InterceptorRegistry registry) {
  17. //可以 new 对象 或者 放入容器直接拿容器中的对象
  18. registry.addInterceptor(new LoginInterceptor())
  19. .addPathPatterns("/**")
  20. .excludePathPatterns("/","/login","/css/**","/fonts/**","/images/**","/js/**,","/error/**"); //放行的请求
  21. //可以 new 对象 或者 放入容器直接拿容器中的对象
  22. registry.addInterceptor(redisUrlCountInterceptor)
  23. .addPathPatterns("/**")
  24. .excludePathPatterns("/css/**","/fonts/**","/images/**","/js/**,");
  25. }
  26. }