Spring Boot 多数据源的另一种实现
Spring Boot提供了一套比较完善的多数据源的自动化配置机制,比如这里,但它的缺点是无法应对数据源不确定的场景,即软件在真正交付使用之前不知道到底会配置多少数据源。所以我这里提供多数据源自动化配置的另一种实现方法。可以把数据源配置放在库里或者放在配置文件里,程序启动时会自动根据你配置的多少初始化为对应的连接池供程序使用。
实现思路st=>start: 开始op0=>operation: 创建单例模式类:>https://www.lefer.cn/posts/10448/op1=>operation: 读取配置op2=>operation: 循环初始化连接池op3=>operation: 放入map中op4=>operation: 对外提供获取方法e=>end: 结束st->op0(right)->op1(right)->op2(right)->op3(right)->op4->e
核心代码初始化连接池这里使用的是hikar作为连接池。dataSourceMap是存放连接池的map。
Hika ...
disruptor的理解和应用
disruptor是一个大名鼎鼎的高性能的线程间的消息传递库,国内的资料不是很多。我近期在一个项目中使用了disruptor,有了一点理解,尝试着表达出来。可能不对,希望大家指正。
disruptor能干什么,不能干什么disruptor是Java阻塞队列,比如 ArrayBlockingQueue的替代,它在性能上高于阻塞队列。disruptor是线程级的,无法在进程间共享,也不会提供持久化、灾备等系统级的功能。disruptor的用处是通过线程级的消息传递来做线程间的解耦,通过发布订阅模式,去实现线程级的并发。但disruptor不是HQ,MQ等消息队列容器的替代品,没有监控API,没有宕掉后的自动恢复机制,也不能被其他程序访问。
为什么用disruptor,而不是queue下图是queue的处理示意。queue的线程安全的读写,至少需要维持3个变量:尾部位置,头部位置,容量。写入线程需要争用头部位置,以便写入数据;读取线程需要争用尾部位置,以便读到数据(假定是不重复读场景);同时都要争用容量,容量满了不能再写,容量空了,也不应再读,读写成功后容量要加减。此时在三个争用位置处, ...
自定义通用URL协议实现在浏览器中打开本机任意程序
以前写过一篇文章,总结了跨浏览器调用的方法。近期遇到一个场景,需要在浏览器中去打开本地的客户端程序,而且限定不允许使用IE。所以我实现了一个通用协议。通过这个协议,可以从浏览器去打开本机任意程序并支持传参数。以下是具体内容。
注册协议将以下文件保存为.reg文件。导入注册表项,注册协议ff。你可以将所有的ff替换成别的字符串,来实现自己的协议。
Windows Registry Editor Version 5.00[HKEY_CLASSES_ROOT\ff]"URL Protocol"=""@="Genaral Call"[HKEY_CLASSES_ROOT\ff\DefaultIcon]@=""[HKEY_CLASSES_ROOT\ff\shell][HKEY_CLASSES_ROOT\ff\shell\open][HKEY_CLASSES_ROOT\ff\shell\open\command]@="cmd /v:on /k set m=%1 &&call set n=%% ...
如何处理 gitlab fork pull request 冲突
gitlab提供了git的一个ui界面,但是在处理冲突方面表现的不好,一些复杂场景还需要通过命令行来解决。本文所述即是一例,解决过程记录如下。
问题背景repo A :http://ip:port/share/adminApi.git
repo B: http://ip:port/esb_dept/adminApi.git
B是从A里fork出来的。在实际软件开发过程中,A是框架工程,B是由A派生而出的一个实际项目。
现在A发生了更新,需要将A的变动合并到B中。
正常情况下,通过gitlab,在repo A中新建合并请求到B即可,但由于repo B中有工程师修改了框架代码,导致产生冲突,合并失败。
解决步骤
在本地 B 项目根目录,查看可用的远程仓库。默认情况下,只会有repo B
[web@localhost esbadminapi]$ git remote -vorigin http://ip:port/esb_dept/adminApi.git (fetch)origin http://ip:port/esb_dept/adminApi.git (push)
将 rep ...
解决 Centos7 IDEA IBUS 无法输入中文的问题
网上很多帖子都在说环境变量的事,说要在/etc/profile 或idea.sh中增加:
export XIM="ibus"export XIM_PROGRAM="ibus"export XMODIFIERS="@im=ibus"export GTK_IM_MODULE="ibus"export QT_IM_MODULE="ibus"
但很多时候问题并不出在这里,而是由于你的ibus包安装不完整,至少应该安装以下包:
ibus-setup-1.5.17-2.el7.noarchlibusbmuxd-1.0.10-5.el7.x86_64ibus-libs-1.5.17-2.el7.x86_64ibus-kkc-1.5.18-7.el7.x86_64ibus-gtk3-1.5.17-2.el7.x86_64libuser-python-0.60-9.el7.x86_64libusbx-1.0.21-1.el7.x86_64ibus-gtk2-1.5.17-2.el7.x86_64ibus ...
VMware内CentOS7 /dev/mapper/cl-root 扩容
刚遇到/dev/mapper/cl-root空间不足的问题,就看到了CSDN上Wang_Xin_SH写的文章,非常好,所以转载收藏 (已在原文末留言转载,侵删)。
简介CentOS7虚拟机原硬盘空间只分配了10GB,需要扩容到20GB。环境:VMware 10
VMware分配空间选中虚拟机->虚拟机设置->硬盘->实用工具->扩展->设置最大磁盘大小->点击扩展
CentOS7内部分配可以参考:http://jingyan.baidu.com/article/54b6b9c0fc8b0b2d583b47c6.html
查看当前磁盘空间,/dev/mapper/cl-root硬盘空间只有8GB,打算扩容:
# df -hFilesystem Size Used Avail Use% Mounted on/dev/mapper/cl-root 8.0G 3.8G 4.3G 47% /devtmpfs 482M 0 482M 0% /devtmpf ...
CentOS 7 直接安装 gcc 7
在一台没有安装过低版本gcc的系统里,如何安装gcc 7 ?以下是详细步骤。
使用开发工具集安装:
sudo yum install centos-release-sclsudo yum install devtoolset-7-gcc*scl enable devtoolset-7 bashwhich gccgcc --version
这种方法同样适用于安装gcc6,只需要将上面命令中7改成6即可。详情请参考:devtoolset
覆盖 Spring Boot 配置项
Spring Boot中的配置项默认是在application.properties中。如:
test.item=lefer
现在考虑两个场景:
场景1:不修改配置文件将test.item的值更改为另一个值
场景2:lefer 是一个密文,使用前需要做转换
下面说说这2个场景的实现方法。
通过命令行参数覆盖配置项场景1的实现非常简单,只要在启动时,指定对应参数就能覆盖配置项,比如:
java -Dtest.item=orous -jar test.jar
这时 Spring Boot 会自动将该配置项的值替换成 orous 。更进一步,如果在命令参数里指定的参数在配置文件中不存在,那么等同于在配置文件中新增了一个配置项和对应值。之所以会出现这种现象,是Spring Boot的配置加载机制决定的,从官方文档可以看到,Spring Boot 加载配置项的顺序如下:
home目录下的devtools全局设置属性(~/.spring-boot-devtools.properties,如果devtools激活)。
测试用例上的@TestPropertySource注解。
...
使用google jib实现java应用快速容器化
前天(2018年7月9日),谷歌宣布将其内部使用的 jib 正式开源。jib 是一个在 java 体系内部生成 docker 镜像的插件,它的设计初衷是将代码->可运行程序->docker image整个过程打通,无需编写 docker file,直接通过编译器生成 docker 镜像。因为刚出来,中文资料比较少,我撸了一个样例,第一时间体验一下这个新玩意。以下是整个过程。
环境说明我选定的是一个maven构建的spring boot项目,编译后是一个内嵌 tomcat 的可执行jar。目标是通过引入jib,直接生成该项目的镜像发布到阿里云镜像仓库。
引入依赖jib最新版本是0.9.4。通过在pom.xml的plugins标签下增加jib标签,引入依赖。
<build> <plugins> <plugin> <groupId>com.google.cloud.tools</groupId> <artifactId>jib-maven-p ...
使用nginx反向代理websocket
随着HTML5大大简化了websocket的开发,websocket的使用越来越广泛,毕竟它在实时交互场景下较http有很大的优势。websocket的协议为ws或wss,使用nginx能很方便的反向代理。
下面是一个典型的配置。原本这个站点只是支持将xxx.lefer.cn转发给http://127.0.0.1:7017处理。但在增加了11行,12行,13行后,就一并对websocket进行了转发。整个配置很简单,这得益于HTTP 中的 Upgrade 协议头将连接从HTTP升级到WebSocket,使得http和websocket的信息得以复用。
server { listen 80; server_name xxx.lefer.cn; ssl on; ... location / { proxy_pass http://127.0.0.1:7017; proxy_set_header Host $host; proxy_set_header X-Real- ...
