SpringBoot入门到出家

摘要:
SpringBoot的Actor监视Actor:系统的监视是SpringBoot提供的用于监视应用程序系统的集成功能。它可以用于配置和查看系统,统计相关功能等。在SpringCloud中,它主要完成对微服务的监控,并可以查看微服务之间的数据处理和调用。当发生异常时,它可以快速找到问题。它的功能类似于Dubbo的监控中心,不同之处在于需要专门部署一个监控中心,而这个监控中心存在于我以前不知道的每个Boot项目中。以下代码˂!

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

  SpringBoot入门到出家第1张

自定义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

  SpringBoot入门到出家第2张

SpringBoot入门到出家第3张

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

之前我们就说到监控系统默认开启的是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和处理器的映射关系,详细到处理器方法和对应的映射规则我们就访问几个比较有用的端点进行测试一下:作用与上面对应

  SpringBoot入门到出家第4张

SpringBoot入门到出家第5张我的处理器写的夜比较简单,参考参考

  SpringBoot入门到出家第6张

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

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

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

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

SpringBoot入门到出家第7张

  SpringBoot入门到出家第8张

SpringBoot中使用redis

基础环境

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

加入依赖

  SpringBoot入门到出家第9张

SpringBoot入门到出家第10张修改主配置文件

  SpringBoot入门到出家第11张

SpringBoot入门到出家第12张然后即使,我们要讲实体类缓存到redis中,这其中涉及到序列化和反序列化,需要实体类需要实现序列化接口Serializable接口

使用注解方式使用 redis

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

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

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

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

  • SpringBoot入门到出家第13张SpringBoot入门到出家第14张

使用API方式使用 redis

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

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

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

SpringBoot入门到出家第15张

  SpringBoot入门到出家第16张

至于操作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方法!

免责声明:文章转载自《SpringBoot入门到出家》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇虚IP解决程序连只读服务器故障漂移(转)简单的RPC java实现 .下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

redis的zset结构跳表

一、数据结构与算法——跳表 什么是跳表 跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连续元素的数据链表。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表,且每一层链表中的元素是前一层链表元素的子集(见右边的示意图)。一开始时,算法在最稀疏的层次进行搜索,直至需要查找的元素在该层两个相邻的元素中间。这时,算法...

.Net使用分布式缓存 C# 使用Redis

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。 Nuget添加StackExchange.Redis的引用 由于Redis封装类同时使用了...

Python 连接redis密码中特殊字符问题

连接方法: self.pool = redis.ConnectionPool.from_url(self.redis_url)opredis = redis.Redis(connection_pool=self.pool)redis_url = 'redis://:cot$#D4^&1234@172.31.26.174:6379/0' 直接连red...

关于Redis缓存预热的思考

系统上线时,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题。 这里我考虑2个问题: A、哪些数据需要预热? B、如何预热? 关于问题A,根据不同的业务系统有不同的方法。 可以将已知的热门数据加载到Redis,这种方法适合于基本不变化的数据; 使用redis-faina(https://github.co...

关于Spring注解开发教程,打包全送你

摘要:spring是我们web开发中必不可少的一个框架,基于传统的xml方式配置bean总觉得太过繁琐,从spring2.5之后注解的出现可以大大简化我们的配置。 本文分享自华为云社区《如何高效提升Java开发效率—Spring注解开发全套教程!》,作者: 灰小猿。 一、使用注解标识组件 为了不再在IOC中一个个的声明类对象,首先根据每一个类的功能的不同...

中间件(1)分布式缓存

为了提高网站性能,一般都会使用到缓存,缓存的数据源包括数据库,外部接口等,缓存一般分为两种,本地缓存和分布式缓存,这里主要总结的是分布式缓存。 Memcached vs Redis 最常用的分布式缓存是Redis和Memcached,它们都是分布式缓存技术中的一种,可能大部分的开发人员都听说或者接触过,但是很少有人认真分析它们之间有什么不同,以及使用场景。...