SpringBoot3-快速入门
简介
Java17
Spring、SpringMVC、MyBatis
Maven、IDEA
环境要求
环境&工具
版本(or later)
SpringBoot
3.0.5+
IDEA
2021.2.1+
Java
17+
Maven
3.5+
Tomcat
10.0+
Servlet
5.0+
GraalVM Community
22.3+
Native Build Tools
0.9.19+
SpringBoot是什么SpringBoot 帮我们简单、快速地创建一个独立的、生产级别的 Spring 应用(说明:SpringBoot底层是Spring)
大多数 SpringBoot 应用只需要编写少量配置即可快速整合 Spring 平台以及第三方技术
特性:
快速创建独立 Spring 应用
SSM:导包、写配置、启动运行
直接嵌入Tomcat、Jetty or Undertow(无需部署 war 包)【Servlet容器】
linux java tomcat mysql: war 放到 tomcat 的 webap ...
kubesphere3.0搭建教程
kubesphere3.0的安装文档基于kubernetes1.17.3环境安装kubesphere3.0的安装文档
本文档主要是在centos7系统下基于kubernetes1.17.3环境安装kubesphere3.0的安装文档。
环境准备系统要求本地虚拟机三台
要求:centos7.6~7.8,以下为
https://kuboard.cn/install/install-k8s.html#%E6%A3%80%E6%9F%A5-centos-hostname 网站的检验结果。
CentOS 版本
本文档是否兼容
备注
7.8
是
已经验证
7.7
是
已经验证
7.6
是
已经验证
7.5
否
已证实会出现 kubelet 无法启动的问题
7.4
否
已证实会出现 kubelet 无法启动的问题
7.3
否
已证实会出现 kubelet 无法启动的问题
7.2
否
已证实会出现 kubelet 无法启动的问题
本次安装使用的是CentOS Linux release 7.9.2009 (Core)版本,本人验证能安装成功。
虚拟机安装步骤安装 ...
Docker搭建常用中间件集群
MySQL主从复制
介绍
MySQL数据库默认是支持主从复制的,不需要借助于其他的技术,我们只需要在数据库中简单的配置即可。
MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的 二进制日志 功能。就是一台或多台MySQL数据库 从另一台MySQL数据库进行日志的复制,然后再解析日志并应用到自身,最终实现 从库 的数据和 主库 的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。
二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。此日志对于灾难时的数据恢复起着极其重要的作用,MySQL的主从复制, 就是通过该binlog实现的。默认MySQL是未开启该日志的。
简单来说就是一台服务器中的mysql数据库根据另一台服务器中的mysql数据库的日志文件进行分析然后执行sql语句进行数据复制。
集群实现
下载mysql:5.7镜像。
创建Master实例并启动,指定密码为root。
123456docker run -p 3307:3306 --name mysql- ...
ConcurrentHashMap源码和数据结构分析
ConcurrentHashMap 1.7存储结构
Java 7 中 ConcurrentHashMap 的存储结构如上图,ConcurrnetHashMap 由很多个 Segment 组合,而每一个 Segment 是一个类似于 HashMap 的结构,所以每一个 HashMap 的内部可以进行扩容。但是 Segment 的个数一旦初始化就不能改变,默认 Segment 的个数是 16 个,你也可以认为 ConcurrentHashMap 默认支持最多 16 个线程并发。
初始化通过 ConcurrentHashMap 的无参构造探寻 ConcurrentHashMap 的初始化流程。
1234567/** * Creates a new, empty map with a default initial capacity (16), * load factor (0.75) and concurrencyLevel (16). */public ConcurrentHashMap() { this(DEFAULT_INITIAL_CAPACITY, DEFAULT_ ...
Java常见并发容器总结
JDK 提供的这些容器大部分在 java.util.concurrent 包中。
ConcurrentHashMap : 线程安全的 HashMap
CopyOnWriteArrayList : 线程安全的 List,在读多写少的场合性能非常好,远远好于 Vector。
ConcurrentLinkedQueue : 高效的并发队列,使用链表实现。可以看做一个线程安全的 LinkedList,这是一个非阻塞队列。
BlockingQueue : 这是一个接口,JDK 内部通过链表、数组等方式实现了这个接口。表示阻塞队列,非常适合用于作为数据共享的通道。
ConcurrentSkipListMap : 跳表的实现。这是一个 Map,使用跳表的数据结构进行快速查找。
ConcurrentHashMap我们知道 HashMap 不是线程安全的,在并发场景下如果要保证一种可行的方式是使用 Collections.synchronizedMap() 方法来包装我们的 HashMap。但这是通过使用一个全局的锁来同步不同线程间的并发访问,因此会带来不可忽视的性能问题。
所以就有了 HashMa ...
分布式缓存与分布式锁
适合放入缓存的数据
即时性、数据一致性要求不高的。
访问量大且更新频率不高的数据(读多,写少)。
举例:
1.电商类应用,商品分类,商品列表等适合缓存并加一个失效时间(根据数据更新频率来定)。
2.后台如果发布一个商品,买家需要5分钟才能看到新的商品一般还是可以接受的。
3.物流信息。
读模式缓存使用流程
本地缓存与局限性集群情况下,每个节点的本地缓存可能会不一致(数据一致性)
分布式缓存使用缓存中间件:redis(集群、分片)
缓存失效读模式,会存在缓存失效问题:缓存穿透、雪崩、击穿
缓存穿透缓存穿透:查询一个一定不存在的数据,导致一定会查询缓存+查询DB,缓存失去意义(大并发过来时任然会查询db)。
风险:利用不存在的数据进行攻击,数据库顺时压力增大。
最终导致崩溃解决:
方法1:将null结果缓存,并加入短暂过期时间 弊端:查询条件使用UUID生成,仍然出现缓存穿透问题,并且redis存满了null。
方法2:布隆过滤 ...
观察者模式
定义观察者(Observer)模式的定义:指多个对象间存在一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。这种模式有时又称作发布-订阅模式、模型-视图模式,它是对象行为型模式。
结构观察者模式的主要角色如下。
抽象主题(Subject)角色:也叫抽象目标类,它提供了一个用于保存观察者对象的聚集类和增加、删除观察者对象的方法,以及通知所有观察者的抽象方法。
具体主题(Concrete Subject)角色:也叫具体目标类,它实现抽象目标中的通知方法,当具体主题的内部状态发生改变时,通知所有注册过的观察者对象。
抽象观察者(Observer)角色:它是一个抽象类或接口,它包含了一个更新自己的抽象方法,当接到具体主题的更改通知时被调用。
具体观察者(Concrete Observer)角色:实现抽象观察者中定义的抽象方法,以便在得到目标的更改通知时更新自身的状态。
类图
代码实现抽象观察者Observer
12345public interface Observer { void response();}
具体观察者1C ...
责任链模式
介绍在现实生活中,一个事件需要经过多个对象处理是很常见的场景。例如,采购审批流程、请假流程等。公司员工请假,可批假的领导有部门负责人、副总经理、总经理等,但每个领导能批准的天数不同,员工必须根据需要请假的天数去找不同的领导签名,也就是说员工必须记住每个领导的姓名、电话和地址等信息,这无疑增加了难度。
定义责任链(Chain of Responsibility)模式(也叫职责链模式)的定义:为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链;当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止。
结构职责链模式主要包含以下角色。
抽象处理者(Handler)角色:定义一个处理请求的接口,包含抽象处理方法和一个后继连接。
具体处理者(Concrete Handler)角色:实现抽象处理者的处理方法,判断能否处理本次请求,如果可以处理请求则处理,否则将该请求转给它的后继者。
客户类(Client)角色:创建处理链,并向链头的具体处理者对象提交请求,它不关心处理细节和请求的传递过程。
类图
我们用责任链模式来实现一下请 ...
策略模式
介绍策略模式(Strategy Pattern):该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式,它通过对算法进行封装,把使用算法的责任和算法的实现分割开来,并委派给不同的对象对这些算法进行管理。最主要的特点是一个类的行为或其算法可以在运行时更改。
类图
类图说明:
策略(PayMethod):策略是一个接口,该接口定义算法标识。
具体策略(WeChatPay、AliPay、AliPay):具体策略是实现策略接口的类。具体策略实现策略接口所定义的抽象方法,即给出算法标识的具体算法。
环境类(Pay):持有一个策略类的引用,最终给客户端调用。
我们用支付来演示一下策略模式,PayMethod为支付方式接口,定义了支付方式,WeChatPay为微信支付,实现了PayMethod接口,AliPay为支付宝支付,实现了PayMethod接口,BankCardPay为银行卡支付,也实现了PayMethod接口。三种不同的类都实现了同一个接口,只是内部实现不一样。Pay为支付接口,定义了支付功能,Pay组合了PayM ...
代理模式
介绍代理模式(Proxy Pattern)又叫委托模式,是为某个对象提供一个代理对象,并且由代理对象控制对原对象的访问。代理对象在客户端和目标对象之间起到中介作用,代理模式属于结构性设计模式。使用代理模式主要有两个目的:一是保护目标对象,二是增强目标对象(执行目标方法前后都可以做额外的处理)。
分类
静态代理:由程序员创建或工具生成代理类的源码,再编译代理类。所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
动态代理:动态代理类的源码是在程序运行期间由JVM根据反射等机制动态的生成,所以不存在代理类的字节码文件(字节码在内存中动态生成的),代理类和委托类的关系是在程序运行时确定。
静态代理类图
类图说明Subject:抽象主题角色:可以是抽象类,也可以是接口。抽象主题是一个普通的业务类型,无特殊要求。
RealSubject: 具体主题角色:也叫做被委托角色或被代理角色,是业务逻辑的具体执行者。
Proxy:代理主题角色:也叫做委托类或代理类。它负责对真实角色的应用,把所有抽象主题类定义的方法限制委托给真实主题角色实现,并且在具体主题角色 ...