• 一文浅入Springboot+mybatis-plus+actuator+Prometheus+Grafana+Swagger2.9.2开发运维一体化


    Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTFUL风格的Web服务,是非常流行的API表达工具。

    Swagger能够自动生成完善的 RESTFUL AP文档,,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API。

    Prometheus 是一个开源的服务监控系统和时序数据库,其提供了通用的数据模型和快捷数据采集、存储和查询接口。

    Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。

    Actuator同时还可以与外部应用监控系统整合,比如 Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等。

    把springboot+mybatis-plus+mysql+oracle+actuator+Prometheus+Grafana+Swagger做到的效果是开发运维一体化。

    环境介绍

    技术栈

    springboot+mybatis-plus+mysql+oracle+actuator+Prometheus+Grafana+Swagger

    软件

    版本

    mysql

    8

    oracle

    12C

    IDEA

    IntelliJ IDEA 2022.2.1

    JDK

    1.8

    Spring Boot

    2.7.13

    mybatis-plus

    3.5.3.2

    Swagger

    2.9.2

    Grafana

    10.2.0

    Prometheus

    2.16.0

    本地主机应用 192.168.1.8:8007

    Prometheus+Grafana安装在同一台主机

    http://192.168.68.131:9090/targets

    http://192.168.68.131:3000

    Prometheus安装

    1. #查看防火墙状态,我们测试机早就关闭了
    2. systemctl status firewalld
    3. #关闭防火墙
    4. systemctl stop firewalld
    5. #永久关闭selinux
    6. vi /etc/selinux/config
    7. #将SELINUX=enforcing改为SELINUX=disabled,然后重启
    8. #若不关闭防火墙,可打开端口,安如下修改端口号即可
    9. firewall-cmd --zone=public --add-port=端口号/tcp --permanent
    10. firewall-cmd --reload

    1. #通过wget下载prometheus
    2. wget https://github.com/prometheus/prometheus/releases/download/v2.16.0/prometheus-2.16.0.linux-amd64.tar.gz
    3. #同步时间
    4. yum install -y ntpdate && ntpdate time.windows.com
    1. #解压-安装
    2. ll
    3. tar -zxvf prometheus-2.16.0.linux-amd64.tar.gz -C /usr/local/
    4. mv /usr/local/prometheus-2.16.0.linux-amd64/ /usr/local/prometheus
    5. cd /usr/local/prometheus
    6. ll
    7. #启动Prometheus—使用默认配置文件启动
    8. /usr/local/prometheus/prometheus --config.file="/usr/local/prometheus/prometheus.yml" &

    1. #查看9090端口是否开启
    2. ss -anlt | grep 9090

    1. #通过浏览器进入页面
    2. IP:9090
    3. #数据展示
    4. IP:9090/metrics

    Grafana安装

    1. #安装go语言环境
    2. yum -y install go

    1. #下载grafana-7.2.0-1.x86_64.rpm
    2. wget https://dl.grafana.com/oss/release/grafana-7.2.0-1.x86_64.rpm
    3. #安装
    4. yum -y install grafana-7.2.0-1.x86_64.rpm

    1. #开机自启grafana-server
    2. systemctl enable grafana-server
    3. #开启grafana-server
    4. systemctl start grafana-server

    1. #浏览器输入IP:3000
    2. 账号密码默认admin/admin
    3. 设置新密码

    springboot应用搭建

    引入依赖:将springboot暴露的数据转为普罗米修斯的格式

    1. <dependency>
    2. <groupId>io.micrometer</groupId>
    3. <artifactId>micrometer-registry-prometheus</artifactId>
    4. <scope>runtime</scope>
    5. </dependency>

    引入swagger2

    1. <dependency>
    2. <groupId>io.springfox</groupId>
    3. <artifactId>springfox-swagger2</artifactId>
    4. <version>2.9.2</version>
    5. </dependency>
    6. <dependency>
    7. <groupId>io.springfox</groupId>
    8. <artifactId>springfox-swagger-ui</artifactId>
    9. <version>2.9.2</version>
    10. </dependency>

    pom.xml

    1. <dependencies>
    2. <dependency>
    3. <groupId>io.micrometer</groupId>
    4. <artifactId>micrometer-registry-prometheus</artifactId>
    5. <scope>runtime</scope>
    6. </dependency>
    7. <dependency>
    8. <groupId>org.springframework.boot</groupId>
    9. <artifactId>spring-boot-starter-actuator</artifactId>
    10. </dependency>
    11. <dependency>
    12. <groupId>io.springfox</groupId>
    13. <artifactId>springfox-swagger2</artifactId>
    14. <version>2.9.2</version>
    15. </dependency>
    16. <dependency>
    17. <groupId>io.springfox</groupId>
    18. <artifactId>springfox-swagger-ui</artifactId>
    19. <version>2.9.2</version>
    20. </dependency>
    21. <dependency>
    22. <groupId>org.springframework.boot</groupId>
    23. <artifactId>spring-boot-starter-web</artifactId>
    24. </dependency>
    25. <dependency>
    26. <groupId>com.baomidou</groupId>
    27. <artifactId>mybatis-plus-boot-starter</artifactId>
    28. <version>3.5.4.1</version>
    29. </dependency>
    30. <dependency>
    31. <groupId>org.springframework.boot</groupId>
    32. <artifactId>spring-boot-devtools</artifactId>
    33. <scope>runtime</scope>
    34. <optional>true</optional>
    35. </dependency>
    36. <dependency>
    37. <groupId>com.mysql</groupId>
    38. <artifactId>mysql-connector-j</artifactId>
    39. <scope>runtime</scope>
    40. </dependency>
    41. <dependency>
    42. <groupId>com.oracle.database.jdbc</groupId>
    43. <artifactId>ojdbc8</artifactId>
    44. <scope>runtime</scope>
    45. </dependency>
    46. <dependency>
    47. <groupId>org.springframework.boot</groupId>
    48. <artifactId>spring-boot-configuration-processor</artifactId>
    49. <optional>true</optional>
    50. </dependency>
    51. <dependency>
    52. <groupId>org.projectlombok</groupId>
    53. <artifactId>lombok</artifactId>
    54. <optional>true</optional>
    55. </dependency>
    56. <dependency>
    57. <groupId>org.springframework.boot</groupId>
    58. <artifactId>spring-boot-starter-test</artifactId>
    59. <scope>test</scope>
    60. </dependency>
    61. <dependency>
    62. <groupId>com.alibaba</groupId>
    63. <artifactId>druid-spring-boot-starter</artifactId>
    64. <version>1.1.14</version>
    65. </dependency>
    66. <dependency>
    67. <groupId>com.baomidou</groupId>
    68. <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    69. <version>3.5.0</version>
    70. </dependency>
    71. <dependency>
    72. <groupId>p6spy</groupId>
    73. <artifactId>p6spy</artifactId>
    74. <version>3.9.1</version>
    75. </dependency>
    76. </dependencies>

    application.yml

    1. server:
    2. port: 8007
    3. hxiot:
    4. swagger2:
    5. # 是否开启swagger2 开启为true,关闭为false
    6. enable: true
    7. management:
    8. server:
    9. port: 8008
    10. endpoints:
    11. web:
    12. exposure:
    13. include: "*"
    14. endpoint:
    15. prometheus:
    16. enabled: true
    17. health:
    18. show-details: always
    19. metrics:
    20. export:
    21. prometheus:
    22. enabled: true
    23. spring:
    24. mvc:
    25. path match:
    26. matching-strategy: ant_path_matcher
    27. profiles:
    28. active: dev
    29. spring:
    30. application:
    31. name: ProvideAPIServices
    32. datasource:
    33. dynamic:
    34. primary: sys2 #设置默认的数据源或者数据源组,默认值即为master
    35. strict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源
    36. datasource:
    37. oracle:
    38. username: system
    39. password: pwd
    40. url: jdbc:oracle:thin:@ip:1521:orcl
    41. driver-class-name: oracle.jdbc.driver.OracleDriver
    42. # driver-class-name: com.mysql.jdbc.Driver
    43. wms:
    44. url: jdbc:p6spy:mysql://ip:3306/Wms?useUnicode=true&characterEncoding=UTF-8
    45. username: root
    46. password: 1pwd
    47. driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    48. # driver-class-name: com.mysql.jdbc.Driver
    49. sys2:
    50. username: root
    51. password: pwd
    52. url: jdbc:p6spy:mysql://127.0.0.1:3306/sys?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8
    53. driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    54. mybatis-plus:
    55. configuration:
    56. #输出日志
    57. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    58. #配置映射规则
    59. map-underscore-to-camel-case: true #表示支持下划线到驼蜂的映射
    60. #隐藏mybatis图标
    61. global-config:
    62. banner: false
    63. db-config:
    64. logic-delete-field: status
    65. logic-not-delete-value: 1
    66. logic-delete-value: 0

    Application启动类需添加Bean

    1. @Bean
    2. MeterRegistryCustomizer configurer(@Value("spring.application.name") String applicationName) {
    3. return (registry) -> registry.config().commonTags("application", applicationName);
    4. }

    prometheus添加主机

    vim /usr/local/prometheus/prometheus.yml

    添加配置      

    #配置ProvideApiServicesApplication

      - job_name: "ProvideAPIServices"

        scrape_interval: 5s

        metrics_path: "/actuator/prometheus"

        static_configs:

          - targets: ["192.168.1.9:8007"]

    http://192.168.68.131:9090/targets

      

      

    demoController

     Controller需符合REST风格

    1. @Api(value = "ApiTest")
    2. @RestController("/demo")
    3. public class demoController {
    4. @Autowired
    5. private TAddressServiceImpl tAddressService;
    6. @ApiOperation(value = "测试")
    7. @GetMapping("/test")
    8. public List setTAddressService() {
    9. return tAddressService.list();
    10. }
    11. @ApiOperation(value = "上传文件")
    12. @PutMapping("/upload")
    13. //FileUploadDemo
    14. public void fileUp(@ApiParam("文件") MultipartFile file, HttpServletRequest request) throws IOException {
    15. //获取文件名称
    16. String originalFilename = file.getOriginalFilename();
    17. System.out.println(originalFilename);
    18. //获取web服务器运行目录
    19. String currentPath = request.getServletContext().getRealPath("/upload/");
    20. System.out.println(currentPath);
    21. saveFile(file,currentPath);
    22. System.out.println("ok");
    23. }
    24. public void saveFile(MultipartFile file,String path) throws IOException {
    25. File dir = new File(path);
    26. if (!dir.exists()) {
    27. dir.mkdirs();
    28. }
    29. File newFile = new File(path+file.getOriginalFilename());
    30. file.transferTo(newFile);
    31. }
    32. }

    Configuration

    1. @Configuration
    2. @EnableSwagger2
    3. public class SwaggerConfig {
    4. /**
    5. * Docket
    6. */
    7. @Bean
    8. public Docket createRestAPi() {
    9. // 构造函数传入初始化规范,这是swagger2规范
    10. return new Docket(DocumentationType.SWAGGER_2)
    11. //.pathMapping("/")
    12. // apiInfo:添加api的详情信息,参数为ApiInfo类型的参数,这个参数包含了基本描述信息:比如标题、描述、版本之类的,开发中一般都是自定义这些信息
    13. .apiInfo(apiInfo())
    14. // select、apis、paths、build 这四个是一组的,组合使用才能返回一个Docket实例对象,其中apis和paths是可选的。
    15. .select()
    16. // apis:添加过滤条件。RequestHandlerSelectors中有很多过滤方式;RequestHandlerSelectors.withMethodAnnotation(ApiOperation.class):加了ApiOperation注解的类,生成接口文档
    17. //扫描com.qgs.controller包下的API交给Swagger2管理
    18. .apis(RequestHandlerSelectors.any())
    19. .paths(PathSelectors.any())
    20. // paths:控制那些路径的api会被显示出来。
    21. //.paths(PathSelecto1rs.any())
    22. .build()
    23. // 是否开启swagger 如果是false,浏览器将无法访问,默认是true
    24. .enable(true);
    25. }
    26. /**
    27. * ApiInfo
    28. */
    29. private ApiInfo apiInfo() {
    30. return new ApiInfoBuilder()
    31. // 标题内容
    32. .title("ProvideAPIServicesAPI文档")
    33. // 描述内容
    34. .description("接口文档详情信息")
    35. // 版本
    36. .version("1.0")
    37. 联系人信息
    38. //.contact(new Contact("", "", ""))
    39. // 许可
    40. //.license("")
    41. // 许可链接
    42. //.licenseUrl("")
    43. .build();
    44. }

    http://192.168.1.8:8007/swagger-ui.html

    可能遇到的问题

    org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException

    1、Springboot2.7与Swagger3.0冲突,将Swagger降低降低

    2、没有配置actuator端口导致actuator抢占8007端口

    Actuator同时还可以与外部应用监控系统整合,比如 Prometheus, Graphite, DataDog, Influx, Wavefront, New Relic等。这些系统提供了非常好的仪表盘、图标、分析和告警等功能,使得你可以通过统一的接口轻松的监控和管理你的应用。
    ​ Actuator使用Micrometer来整合上面提到的外部应用监控系统。这使得只要通过非常小的配置就可以集成任何应用监控系统。Spring Boot Actuator作用:健康检查、审计、统计、监控、HTTP追踪。

    Prometheus 是一个开源的服务监控系统和时序数据库,其提供了通用的数据模型和快捷数据采集、存储和查询接口。它的核心组件Prometheus server会定期从静态配置的监控目标或者基于服务发现自动配置的自标中进行拉取数据,当新拉取到的数据大于配置的内存缓存区时,数据就会持久化到存储设备当中。
    每个被监控的主机都可以通过专用的exporter 程序提供输出监控数据的接口,它会在目标处收集监控数据,并暴露出一个HTTP接口供Prometheus server查询,Prometheus通过基于HTTP的pull的方式来周期性的采集数据。
    任何被监控的目标都需要事先纳入到监控系统中才能进行时序数据采集、存储、告警和展示,监控目标可以通过配置信息以静态形式指定,也可以让Prometheus通过服务发现的机制进行动态管理。
    Prometheus 能够直接把API Server作为服务发现系统使用,进而动态发现和监控集群中的所有可被监控的对象

    Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。
    特点:
        快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式;支持多数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等;通知提醒:以可视方式定义最重要指标的警报规则,Grafana将不断计算并发送通知,在数据达到阈值时通过Slack、PagerDuty等获得通知;4、混合展示:在同一图表中混合使用不同的数据源,可以基于每个查询指定数据源,甚至自定义数据源;5、注释标记:使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记;6、过滤器:Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询。

  • 相关阅读:
    fablic 矩形多边形展示删除按钮
    【非真实渲染】【卡通渲染技术点介绍】
    软考——软件工程基础知识
    蓝桥杯刷题-包子凑数
    【软件测试】测试人的职责,我就是不当背锅侠......
    【华为机试真题 Python实现】计算矩形面积
    马斯克:让我成功的其实是“第一性原理”(PM必读)
    Oracle/PLSQL: Abs Function
    深度学习笔记(5)——pytorch实现Att-BiLSTM
    iOS基础 自定义转场控制器上的动画 UIPresentationController
  • 原文地址:https://blog.csdn.net/weixin_47268883/article/details/134452984