-
是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: "*"
开放了所有端点后,我们就必须得知道有哪些端点,每个端点监控的内容又是什么?
路径 | 描述 | 鉴权 | |
---|---|---|---|
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 了,当然其他开放的终端还是可访问的
基础环境
一般我们使用redis作为缓存服务器使用,在获取数据时,先从redis中获取数据,获取到数据则返回,若是没有获取到数据,则去数据库查询,并在得到查询结果后,将结果缓存到redis中,如果对数据一致性的要求比较高,我们还应该设置较短的缓存有效时间
加入依赖
修改主配置文件
然后即使,我们要讲实体类缓存到redis中,这其中涉及到序列化和反序列化,需要实体类需要实现序列化接口Serializable接口
使用注解方式使用 redis
-
在工程入口类上开启 @EnableCaching注解,开启缓存功能
-
在查询方法上添加@Cacheable注解,指定key、指定缓存空间
-
在增删该上添加@CacheEvict注解,指定缓存空间或者key、allEntries属性指定为true方法调用后,立即清除缓存
-
在主配置文件中注册缓存空间名称
使用API方式使用 redis
-
在导入整合包以后,我们就可以导入模版了,模版的key和value要求类型相同,一般我们设为Obj,通用性好,还可以为String
-
在Service中通过模版对象获取到redis操作对象,然后对redis数据进行操作
-
为了避免热点key问题,一般要手动使用手段避免意外发生,下面为使用使用双重检测锁解决热点缓存问题
读取自定义配置
可以读取主配置文件中的数据,也可以读取自定义配置文件中的属性
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方法!