springboot之bean别名
事件起因近期在工作中,遇到了相同的bean映射到多个名称的需求;经过了一番资料查找和研究,最后找到了解决方法,遂做一下记录。
程序原先的逻辑是这样的:程序中会有多种资源,每种资源都会有创建和销毁操作,但各个资源的具体操作是不相同的,为了避免使用过多的if…else…判断,增加系统的扩展性,采用了模版方法和简单工厂模式,创建了抽象的处理类,每种资源都有对应的实现类来实现对应的创建和销毁逻辑,代码示例如下:
public interface Operation {
/**
* 执行方法
* @param param 参数
*/
void op(Param param) throws Exception;
}
@Component("XXX_CREATE")
public class XXXCreateOperation implements Operation {
@Override
public void op(Param param) throws Exception {
System.out.p ...
云计算之kvm
KVM简介KVM与QEMUKVM与Libvirt
AssertJ
AssertJ起因我们在使用JUnit测试的时候,一般情况下会使用它的Assert类下的各种assertXXX方法。JUnit包含了一个依赖Hamcrest,这是一个断言库。我们可以使用断言库来进行复杂的断言操作。
但是Hamcrest有几个缺点:
缺乏更新,我看了看MavenCentral上,Hamcrest库最近更新还是2019年,因此对新的Java 新版本支持可能不够充分;
Matcher分散在多个类中,编写困难,我们为了编写类似assertThat(resultString, anyOf(containsString("name"), containsString("lastname")));这样的代码,需要静态引入多个类;
JUnit仅依赖了Hamcrest核心包,只附带了最基本的断言功能,如果我们希望断言数字大小之类的话,还需要自己引入Hamcrest完整包,比较麻烦。
基于以上原因,出现了AssertJ库 AssertJ - fluent assertions java library。
使用引包AssertJ有1、2、3 ...
ceph部署
ceph-deploy部署三节点ceph集群
ceph版本Ceph:Nautilus(14.2.22)Ceph-deploy:2.0.1
机器信息操作系统版本
[root@node-1 ~]# cat /etc/centos-release
CentOS Linux release 7.9.2009 (Core)
IP地址
主机名
附加磁盘(OSD)
集群角色
172.16.214.169
node-1
一块20G磁盘(/dev/sdb)
mon,mgr,osd0(主节点)
172.16.214.170
node-2
一块20G磁盘(/dev/sdb)
osd1
172.16.214.171
node-2
一块20G磁盘(/dev/sdb)
osd2
如果环境允许,可以用一个 ceph-admin 节点专门放置 mon,mgr,mds 等这些组件,osd 放置在其他节点,更便于管理
关闭防火墙和selinuxsed -i "s/SELINUX=enforcing/SELINUX=permi ...
JUnit
JUnit5JUnit 5
JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage
架构
第一层 :开发人员 (这里只进行业务开发撰写单元测试) 使用 junit-jupiter-api 等测试框架 api 编写单元测试。
第二层 : 测试引擎,JUnit 或其他测试框架实现引擎 API 的框架,jupiter-engine 和 vintage-engine 分别是 junit5 和 junit4 对测试引擎 API 的实现,其他的测试框架也可以通过实现引擎 API 从而接入 JUnit 平台。
第三层: 平台引擎 junit-platform-engine 是上一层各种引擎实现的抽象,即引擎的接口标准。
第四层: 启动器 通过 ServiceLoader 发现测试引擎的实现并安排其执行。 它为 IDE 和构建工具提供了 API,因此 IDE 可以与测试执行交互,例如,通过启动单个测试并显示其结果。
import static org.junit.jupiter.api.Assertions.fail;
im ...
单元测试
什么是单元测试一个单元测试是一段代码,这段代码调用一个工作单元,并检验该工作单元的一个具体的最终结果。如果关于这个最终结果的假设是错误的,单元测试就失败了。一个单元测试的范围可以小到一个方法,大到一个类。
单元测试意义很多人经常以 “时间紧,任务重” 或者 “单元测试没用” 为借口来拒绝编写单元测试。但是 BUG 在软件的生命周期越早阶段发现,付出的代价越少。单元测试可以让很多 BUG 在编码阶段就能够及时发现并解决,而不需要交给测试人员兜底,如果测试人员兜底失败,可能造成线上故障。有了单元测试作保障,我们还可以放心对函数进行重构,如果重构代码导致单元测试运行失败,则说明重构的代码有问题。长远来看,单元测试对编码的益处(如提高代码质量和避免 BUG)远比编写单元测试的投入所花费的代价要大的多。
单元测试标准
好的单元测试必须遵守 AIR 原则。
单元测试在线上运行时,感觉像空气(AIR)一样并不存在,但在测试质量的保障上,却是非常关键的。好的单元测试宏观上来说,具有自动化、独立性、可重复执行的特点。
A: Automatic(自动化)单元测试应该是全自动执行的,并且非交互式的。测试用 ...
MariaDB+Galera集群+haproxy+keepalived
Galera集群环境要求Galera集群至少需要三个节点的服务器硬件,以下操作在三个节点执行。安装后,在任意一个节点执行SQL,都是同步的。
现有三台服务器,ip分别为10.30.1.14、10.30.1.15、10.30.1.16。
安装
3台服务器的主机名修改:
hostnamectl set-hostname node1
hostnamectl set-hostname node2
hostnamectl set-hostname node3
3台服务器的hosts文件修改:
10.30.1.14 node1
10.30.1.15 node2
10.30.1.16 node3
建立3台服务器之间的SSH免密通信(3台服务器执行):
ssh-keygen -t rsa
ssh-copy-id node1
ssh-copy-id node2
ssh-copy-id node3
3台服务器关闭Selinux:
setenforce 0
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
3台服务 ...
rabbitMQ集群
单一模式参考https://blog.haomingzx.top/2020/02/22/RabbitMQ%E5%AD%A6%E4%B9%A0/
登录rabbitmq报错User can only log in via localhost?
配置文件/etc/rabbitmq/添加 如下配置
loopback_users = none
普通模式默认的集群模式。
环境
IP地址
主机名
操作系统
防火墙和SELinux
用途
192.168.56.114
mq1
CentOS7(64位)
关闭
磁盘节点
192.168.56.115
mq2
CentOS7(64位)
关闭
内存节点
RabbitMQ集群节点必须在同一网段里,如果是跨广域网,效果会变差。
配置
修改主机名 vi /etc/hostname,mq2相同操作,修改后需要重启系统生效。
mq1.localdomain
修改hosts文件 vi /etc/hosts
192.168.56.114 mq1
192.168.56.125 mq2
拷贝erlang.coo ...
redis高可用方案
单机安装
下载安装包
http://download.redis.io/releases/redis-4.0.14.tar.gz
解压文件
tar -xzvf redis-4.0.14.tar.gz
编译安装
make && make install
配置
在/usr/local/redis/redis4.0.14目录下复制redis.conf到/etc/redis/目录下,修改配置文件
端口:port 6379
后台启动:daemonize yes
日志文件输出名字:logfile ./redis.log (需要手动创建文件)
文件存储目录:dir /usr/local/redis/log (需要手动创建文件夹)
连接redis密码:requirepass dcits001!
允许任何人连接redis:bind 0.0.0.0
tcp-backlog修改为2048并执行echo 511 > /proc ...
mysql高可用方案
galera集群环境要求galera集群至少需要三个节点的服务器硬件,以下操作在三个节点执行。安装后,在任意一个节点执行SQL,都是同步的。
安装
添加RPM源 vi etc/yum.repos.d/galera.repo
[galera]
name = Galera
baseurl = https://releases.galeracluster.com/galera-3/DIST/RELEASE/ARCH gpgkey = https://releases.galeracluster.com/GPG-KEY-galeracluster.com gpgcheck = 1
[mysql-wsrep]
name = MySQL-wsrep
baseurl=https://releases.galeracluster.com/mysql-wsrep-VERSION/DIST/RELEASE/ARCH
gpgkey = https://releases.galeracluster.com/GPG-KEY-galeracluster.com
gpgcheck = ...
echart+百度地图
最近使用echart在地图上绘制散点图,总结一下,防止以后忘记。
注意:使用了django框架,如果使用其他技术,需要修改路径。
引入文件echart<script src="js/echarts.js"></script>
百度地图扩展<script src="js/bmap.js"></script>
源码地址、使用文档
百度地图api<script src="http://api.map.baidu.com/api?v=2.0&ak=#{在百度地图开放平台申请的ak}"></script>
开放平台地址
使用方式ECharts 将百度地图部分配置集成在了 bmap 中,包括:
参数
说明
格式
center
中心点的百度坐标
坐标数组, 如:[116.307698, 40.056975]
zoom
初始缩放比
number
roam
是否允许用户缩放操作
boolean
mapStyle
地图自 ...
vue-cli4快速搭建项目详解
安装卸载旧版本,并安装vue-cli4npm uninstall vue-cli -g
npm install -g @vue/cli //vue-cli2.x的安装命令是 cnpm install -g vue-cli
vue -V //校验是否安装成功
如图,表示安装成功
配置创建项目vue create 项目名
选择配置
default:默认配置(只有babel和eslint)Manually select features:手动配置一般做项目默认配置是不够的,我们选第二项。
进行配置
选项
解释
Babel
一种能让浏览器自动识别向后兼容各版本JavaScript的功能(选)
TypeScript
一种.ts后缀兼容js的语法(不选)
Progressive Web App(PWA)Support
渐进式网络应用(不选)
Router
vue的路由管理组件(选)
Vuex
vue的状态仓库管理组件(选)
CSS Pre-processors
CSS预编译(选)
Linter/Formatter
代码检验 格式检 ...