SpringBootAdmin监控程序
SpringBootAdmin监控程序
一、介绍
Spring Boot Admin 是一个用于监控和管理 SpringBoot 应用程序的开源项目。它提供了一个可视化的用户界面,通过该界面可以实时监控应用程序的运行状态、性能指标等信息。
Spring Boot Admin可以监控多个 SpringBoot 应用程序,它提供了以下功能:
简单的集成:Spring Boot Admin提供了一个易于集成的客户端库,可以方便地将应用程序连接到监控服务器。
实时监控:可以查看应用程序的运行状态、线程池、内存使用情况、请求指标等实时信息,帮助开发人员及时发现和解决问题。
健康检查:Spring Boot Admin可以监测应用程序的健康状态,包括数据库连接、缓存服务、消息队列等组件的可用性。
日志管理:可以查看和管理应用程序的日志,包括实时查看日志、搜索和过滤日志等功能。
通知与告警:Spring Boot Admin支持通过邮件、Slack 等方式发送通知和告警,例如当应用程序发生异常或出现性能问题时。
总之,Spring Boot Admin提供了一个便捷的监控和管 ...
junit4整合PowerMockito进行单元测试
junit4整合PowerMockito进行单元测试
一、介绍
在单元测试中,代码里面往往有一些需要连接数据库、调用第三方远程的代码。
由于没有环境,这些代码的存在,会给单元测试造成影响。
所以我们在单测中,往往会使用mock的方式对这些代码做一个数据的模拟,从而达到对代码进行测试的一个目的。
所以单测需要满足以下几点
可复用:单测代码可以重复执行
无环境:不要依赖数据库,第三方接口等外部的环境依赖
方法级细粒度:单测代码应该针对具体一个方法的测试,
高覆盖率:如果代码中复杂度过高,单测要覆盖到方法中的每一行代码
自动断言:每一段单测代码都应该有自己的断言方法,而不是通过打印再人工查看正确性
所以我们就有了Mockito,它可以模拟对象,模拟对象方法的返回值,来完成mock。
本文使用的是PowerMockito,它是由Mockito的基础上开发而来,语法规则基本一致,同时也有一些自己的增强,可以对静态方法,局部变量进行mock。
二、初步入门
假设我们有下面这两段代码PowerMockitoServiceImpl.java和PowerMockitoMapper ...
MySQL的MVCC是什么,有什么用?
MySQL的MVCC是什么,有什么用?
一、介绍
面试被问到了MVCC,我不知道啊,一脸懵逼!
于是回家查询了资料,记录一下
实际上,MVCC的全称是Multi Version ConCurrency Control,翻译过来就是多版本并发控制。
二、概念
1)隔离级别
指的是一种提高并发的技术。最早的数据库系统,只有读读之间可以并发,读写,写读,写写都要阻塞。引入多版本之后,只有写写之间相互阻塞,其他三种操作都可以并行。在MySQL中,这样大幅度提高了InnoDB的并发度。在内部实现中,InnoDB通过undo log保存每条数据的多个版本,并且能够找回数据历史版本提供给用户读,每个事务读到的数据版本可能是不一样的。在同一个事务中,用户只能看到该事务创建快照之前已经提交的修改和该事务本身做的修改。
首先我们先了解一下数据库事务的隔离级别
未提交读(READ UNCOMMITED):也就是脏读,当一个事务读取到另外一个事务修改但未提交的数据时
已提交读 (READ COMMITED):简称RC
可重复读(REPEATABLE READ):简称RR
可串行化(SERIAL ...
Redis相关底层面试题
Redis相关底层面试题
一、介绍
Redis是一个开源的高性能键值对存储系统,具有快速、灵活和可扩展的特性。它是一个基于内存的数据结构存储系统,可以用作数据库、缓存和消息代理。Redis支持多种类型的数据结构,如字符串(strings),散列(hashes),列表(lists),集合(sets)等。
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。同时,Redis还支持数据的备份,即master-slave模式的数据备份。
Redis的应用场景非常广泛。虽然Redis是一个key-value的内存数据库,但在实际场景中,Redis经常被作为缓存来使用,如面对数据高并发的读写、海量数据的读写等。具体而言,分布式缓存Redis可用于以下场景:
页面缓存:Redis可将Web页面的内容片段,包括HTML,CSS和图片等静态数据,缓存到Redis实例,提高网站的访问性能。比如在电商类应用中,热销商品展示、秒杀推荐等数据面临高并发读的压力,分布式缓存Redis的高并发及灵活扩展,可轻松支持此类应用 。
消息队列:Redis可以作为消息代理, ...
关于JVM中的几大面试题
关于JVM中的几大面试题
一、介绍
本文介绍JVM中的几个面试题,十分有用
主要有几题
Java类的加载过程
双亲委派机制是什么
jvm内存模型
二、答疑
1)Java类的加载过程
简单来说,可以这样理解分类
类的加载
获取二进制文件,将.class文件加载至JVM中
类的连接,验证,准备,解析合称连接
分配空间
静态属性赋值(赋初始值,而不是我们给予的值,如int是0,包装类为null)
类的初始化,(是初始化,不是实例化)
静态属性赋值,这时候就是赋我们给予的值了
什么是符号引用,什么又是直接引用
可以这样进行理解,我们有一个A类和B类,A类中使用到了B类
在字节码中,会用一个符号代表这是B类,这就是符号引用
而在B类进行类加载后,JVM成功的加载了这个B类,使得堆内存中有对应的B.class的对象,同时方法区中有静态方法与属性。
这个时候,A类就会将之前的符号引用,改为直接引用,设置为上面堆内存的B.class对象,或者方法区中的静态方法与属性
类加载的时机
实例化类对象
调 ...
自定义枚举Validated校验注解
自定义枚举Validated校验注解
一、介绍
在以前的文章中,有解释使用过@Valid注解的使用
Valid注解使用及扩展 | 半月无霜 (banmoon.top)
Validated分组校验及扩展 | 半月无霜 (banmoon.top)
本篇分享一个自定义校验注解,可以配合枚举使用,对入参的有效值进行校验。
比如说一些状态值,入参必须要符合定义的状态值
二、代码
注解
123456789101112131415161718192021222324252627282930package com.banmoon.validator;import com.banmoon.business.enums.MyEnum;import javax.validation.Constraint;import javax.validation.Payload;import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy; ...
kafka的架构及常见面试题
kafka的架构及常见面试题
一、介绍
Kafka是一种高吞吐量、持久性、分布式的发布订阅的消息队列系统。它最初由LinkedIn(领英)公司发布,使用Scala语言编写,与2010年12月份开源,成为Apache的顶级子项目 。
Kafka是一个多分区、多副本且基于zookeeper协调的分布式消息系统。也是一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流数据处理等多种特性而被广泛使用 。
二、架构
1)生产、消费
首先得了解这个,比较简单的一个集群图
生产者(Producer):生产消息,发送消息的服务
消费者(Comsumer):消费消息,处理消息的服务
2)每一个kafka实例中有什么
如上图,只画了其中一个,具体看看里面是什么
broker:一个kafka进程就是一个broker,也就可以这样理解,集群中每一台kafka服务就是broker
主题(topic):在发布订阅的模式下,我们需要对消息进行一个区分,同一个功能的消息,我们发往同一个主题下
分区(Partition):可以看到每一个主题topic下,有多个分区。消息会推送到这 ...
Java中关于线程池的几道面试题
Java中关于线程池的几道面试题
一、介绍
以前就讲过线程池的使用,本文中介绍深挖线程池中的几道面试题
Java线程池 | 半月无霜 (banmoon.top)
在上面可以找到
线程池的核心参数都有什么,代表什么含义?
线程池的拒绝策略有哪些?
二、线程池
1)任务添加流程
当一个线程池在添加一个任务时,它是怎么分配线程去执行这个任务的
12345678910111213141516171819202122232425262728293031323334353637383940414243public class ThreadPoolExecutor extends AbstractExecutorService { public void execute(Runnable command) { // 判断是否为空 if (command == null) throw new NullPointerException(); // 判断当前正在运行的线程数是否小于 ...
Java中锁的分类
Java中锁的分类
一、介绍
在Java中的锁可以分为以下这四类
可重入锁、不可重入锁
乐观锁、悲观锁
公平锁、非公平锁
互斥锁、共享锁
二、详解
1)可重入锁、不可重入锁
当一个线程持有一个锁后,又想再持有这个锁时,发生的情况。
可重入锁:允许再次持有,多少次都没问题。
不可重入锁:不允许再次持有,已经持有了锁后,再次去获取时,会造成死锁的情况。
没必要给自己增加负担,所以Java中的锁基本都是可重入锁
2)乐观锁、悲观锁
他们两之间的区别主要体现在访问资源时,要不要进行上锁
乐观锁:假定多个线程同时访问同一个资源时,并不会彼此产生干涉和冲突,因此在多线程并发时,每个线程都可以自由访问共享资源,只在更新时检查数据是否被其他线程修改。如果数据未被修改,乐观锁会直接进行更新。常见的乐观锁实现包括版本号机制和CAS机制。Java中的Atomic相关的类,底层正是使用的CAS。
悲观锁:每个线程在访问,都要先进行上锁,这样其他线程就无法访问。悲观锁适用于对数据更新操作比较频繁的场景。当锁被别人占用时,线程只能进入等待阻塞阶段了。在Java中,synch ...
关于Java中引用的面试题
关于Java中引用的面试题
一、介绍
在Java中,有以下四种类型的引用:强软弱虚
强引用(Strong Reference):最常见的引用类型,也是默认的引用类型。如果一个对象具有强引用,那么垃圾回收器就不会回收这个对象。
软引用(Soft Reference):如果一个对象具有软引用,那么当系统内存不足时,垃圾回收器会尝试回收该对象。软引用通常用于缓存中,以便在内存紧张时释放一些缓存。
弱引用(Weak Reference):如果一个对象具有弱引用,那么它的生命周期更短,它在任何时候都可能被垃圾回收器回收。弱引用通常用于外部引用内部对象时使用,以免内存泄漏。
虚引用(Phantom Reference):虚引用是所有引用类型中最弱的一种。如果一个对象具有虚引用,那么它就像没有被引用一样,随时会被垃圾回收器回收。虚引用主要用于跟踪对象被回收的状态。
上面属于Java的面试八股文,那么在面试之中,我们该如何进行理解输出呢?
二、引用
1)强引用(Strong Reference)
在日常开发中最为平常的引用,因为我们直接new出来的对象就属于强引用。
那么,如果一个 ...