zoukankan      html  css  js  c++  java
  • SpringBoot入门到出家

    SpringBoot的Actuator监控

    Actuator:对系统的监控

    • 是SpringBoot提供的对应用系统监控的集成功能,可以对系统进行配置查看,相关功能统计等,在Spring Cloud中,主要完成微服务的监控,可以查看微服务之间的数据处理和调用,当出现异常时,可以快速定位问题所在

    • 其功能和Dubbo的监控中心类似,区别就是一个需要专门部署,而这个是存在每一个Boot工程中的

    这个我之前没了解过,下面上代码

    <!--SpringBoot的 Actuator-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    application.properties

    server:
    port: 8082
    management:
    server:
    port: 9999
    endpoints:
    web:
    base-path: /test

    然后我们启动项目,准备访问 :http://localhost:9999/test/health

      

    自定义info

    默认开启的是 health和 info 两个节点,下面我们在配置文件中自定义info数据,通过监控终端进行查看

    spplication.yml中定义以下数据进行测试

    info: 
      #自定义数据,随便取值
      username: laodaye
      urlhttps: //www.baidu.com
      #获取pom.xml文件中读取相应值,固定格式
      project:
        groupId: @project.groupId@
        artifactId: @project.artifactId@
        version: @project.version@
        name: @project.name@

    然后我们进行访问测试:http://localhost:9999/test/info

      

    其他监控端点的开放与关闭

    之前我们就说到监控系统默认开启的是health和info两个端点,我们可以手动开启其他端点

    修改配置文件application如下

    management:
      server:
        port: 9999
      endpoints:
        web:
          base-path: /test
          exposure:
            #开放所有的监控终端,在yml中*为关键字,需要我们手动双引号引起来
            include: "*"

    开放了所有端点后,我们就必须得知道有哪些端点,每个端点监控的内容又是什么?

    HTTP方法路径描述鉴权
      GET   /autoconfig   查看自动配置的使用情况 true
      GET   /configprops 查看配置属性,包括默认配置 true
      GET   /beans 查看bean及其关系列表 true
      GET   /dump 获取线程活动的快照,打印线程栈 true
      GET   /env 查看所有环境变量 true
      GET   /env/{name} 查看具体变量值 true
      GET   /health 查看应用健康指标 false
      GET   /info 获取自定义信息,这些信息由info打头 false
      GET   /mappings 查看所有url映射 true
      GET   /metrics 查看应用基本指标 true
      GET   /metrics/{name} 查看指定名称的应用的程序度量值 true
      POST   /shutdown 关闭应用,{要求endpoints.shutdown.enable设置为true} true
      GET   /trace 提供基本的http请求跟踪信息{时间戳,http头...} true


    mappings端点:可以查看到当前项目中所有URL和处理器的映射关系,详细到处理器方法和对应的映射规则我们就访问几个比较有用的端点进行测试一下:作用与上面对应

      

    我的处理器写的夜比较简单,参考参考

      

    还有一些其他的端点比如 :beans、env...可按照上面对应进行测试

    玩到这里,我们开启了全部的终端,如果我们想关闭某个指定的终端如何操作呢?

    management:
      server:
        port: 9999
      endpoints:
        web:
          base-path: /test
          exposure:
            #开放所有的监控终端,在yml中*为关键字,需要我们手动双引号引起来
            include: "*"
            #单独关闭某一个监控终端
            exclude: env

    当我们再次访问的时候就是 404 了,当然其他开放的终端还是可访问的

      

    SpringBoot中使用redis

    基础环境

    一般我们使用redis作为缓存服务器使用,在获取数据时,先从redis中获取数据,获取到数据则返回,若是没有获取到数据,则去数据库查询,并在得到查询结果后,将结果缓存到redis中,如果对数据一致性的要求比较高,我们还应该设置较短的缓存有效时间

    加入依赖

      

    修改主配置文件

      

    然后即使,我们要讲实体类缓存到redis中,这其中涉及到序列化和反序列化,需要实体类需要实现序列化接口Serializable接口

    使用注解方式使用 redis

    • 在工程入口类上开启 @EnableCaching注解,开启缓存功能

    • 在查询方法上添加@Cacheable注解,指定key、指定缓存空间

    • 在增删该上添加@CacheEvict注解,指定缓存空间或者key、allEntries属性指定为true方法调用后,立即清除缓存

    • 在主配置文件中注册缓存空间名称

    使用API方式使用 redis

    • 在导入整合包以后,我们就可以导入模版了,模版的key和value要求类型相同,一般我们设为Obj,通用性好,还可以为String

    • 在Service中通过模版对象获取到redis操作对象,然后对redis数据进行操作

    • 为了避免热点key问题,一般要手动使用手段避免意外发生,下面为使用使用双重检测锁解决热点缓存问题

      

    至于操作redis的话,可以看看我写得另一篇文章:https://www.cnblogs.com/msi-chen/p/10719083.html

    读取自定义配置

    可以读取主配置文件中的数据,也可以读取自定义配置文件中的属性

    Java方式的属性注入

    • PS : 创建一个jdbc.properties文件
      • jdbc.driverClassName=com.mysql.jdbc.Driver
        jdbc.url=jdbc:mysql://127.0.0.1:3306/test
        jdbc.username=root
        jdbc.password=root
    • 然后编写代码如下,用一个类来装属性 :
      • @Configuration
        @PropertySource("classpath:jdbc.properties",encoding="UTF-8")
        public class JdbcConfig {
             @Value("${jdbc.url}")
             String url;
             @Value("${jdbc.driverClassName}")
             String driverClassName;
             @Value("${jdbc.username}")
             String username;
             @Value("${jdbc.password}")
             String password;
        
             @Bean
             public DataSource dataSource() {
                      DruidDataSource dataSource = new DruidDataSource();
                      dataSource.setUrl(url);
                      dataSource.setDriverClassName(driverClassName);
                      dataSource.setUsername(username);
                     dataSource.setPassword(password);
                     return dataSource;
             }
        }
    • 解读为:
      • @Configuration :声明我们 JdbcConfig 是一个配置类
        @PropertySource :指定属性文件的路径是: classpath:jdbc.properties
        通过 @Value 为属性注入值
        通过@Bean将 dataSource() 方法声明为一个注册Bean的方法,Spring会自动调用该方法,将方法的
        返回值加入Spring容器中。
        然后我们就可以在任意位置通过 @Autowired 注入DataSource了。

      需要注意的就是:这种方式只能读取properties文件,不能读取yml文件

    SpringBoot的属性注入

    • 上面的通过@Value方式注入属性的方式不够强大,只能注入基本类型值

    • SpringBoot提供了一种新的注入方式,支持基本上数据类型和复杂数据类型的注入

    想要读取这样的自定义属性,我们定义一个Student对象来装属性, 提供相应属性和get,set

    • 我们创建一个类用来作为属性注入的目标 :
    • @ConfigurationProperties(prefix = "jdbc")
      public class JdbcProperties {
           private String url;
           private String driverClassName;
           private String username;
           private String password;
           // ... 略
           // getters 和 setters
      }
    • @ConfigurationProperties(prefix = "jdbc") : 声明当前类为属性读取类
    • 这里值得注意的就是,这种方式没有指定要读取的配置文件,SpringBoot默认读取application.properties,所有需要将配置文件名改一下
    • 其次就是配置文件中的属性名不一定得和类中的字段名一致,支持驼峰、下划线、中划线,
    • 还支持对象引导,比如:user.friend.name:代表的是user对象中的friend属性中的name属性,显然friend也是对象。@value注解就难以完成这样的注入方式。

    要使用这些属性的时候:

      @Configuration
      @EnableConfigurationProperties(JdbcProperties.class)
      public class JdbcConfig {
        @Bean
        public DataSource dataSource(JdbcProperties jdbc) {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setUrl(jdbc.getUrl());
        dataSource.setDriverClassName(jdbc.getDriverClassName());
        dataSource.setUsername(jdbc.getUsername());
        dataSource.setPassword(jdbc.getPassword());
        return dataSource;
        }
      }

    然后你可以通过以下方式注入JdbcProperties:

      //@Autowired注入
      @Autowired
      private JdbcProperties prop;

    构造函数注入

      private JdbcProperties prop;
      public JdbcConfig(Jdbcproperties prop){
      this.prop = prop;

    声明有@Bean的方法参数注入

      @Bean
      public Datasource dataSource(JdbcProperties prop){
      // ...

    我们这里采用的是第三种,直接在方法参数中注入

    更优雅的注入

    • 如果一段属性只有一个Bean需要使用,我们无需将其注入到一个类(JdbcProperties)中。而是直
      接在需要的地方声明即可,如下 : 

    • @Configuration
      public class JdbcConfig {
          @Bean
          // 声明要注入的属性前缀,SpringBoot会自动把相关属性通过set方法注入到DataSource中
          @ConfigurationProperties(prefix = "jdbc")
          public DataSource dataSource() {
              DruidDataSource dataSource = new DruidDataSource();
              return dataSource;
          }
      }
    • 直接把 @ConfigurationProperties(prefix = "jdbc") 声明在需要使用的 @Bean 的方法上,然后
      SpringBoot就会自动调用这个Bean(此处是DataSource)的set方法,然后完成注入。使用的前提是:
      该类必须有对应属性的set方法!

  • 相关阅读:
    PHPStrom 设置终端字体大小
    PostgreSQL 9 夸库查询
    弹性布局
    sql中的 where 、group by 和 having 用法解析
    数据库面试中常问的几个问题
    SQL中 UNION 和 UNION ALL 操作符小结
    SQL里 inner JOIN、 left (OUTER) JOIN 、right (OUTER) JOIN、 full (OUTER) JOIN 之间的区别
    MYSQL中LIMIT用法
    Java集合框架小结
    jQuery$.each循环遍历详解,各种取值对比,$.each遍历数组、对象、Dom元素、二维数组、双层循坏、类json数据等等
  • 原文地址:https://www.cnblogs.com/msi-chen/p/10947125.html
Copyright © 2011-2022 走看看