spring-boot-ws从.wsdl到?wsdl
spring-boot-starter-web-services 发布的webservice默认url是http://xx:xx/xxx.wsdl,不符合常规的http://xx:xx/xxx?wsdl格式,我们可以利用urlrewritefilter去做一下转发,让一切都回到熟悉的样子。详情如下: 添加依赖<dependency> <groupId>org.tuckey</groupId> <artifactId>urlrewritefilter</artifactId> <version>4.0.4</version></dependency> 实现UrlRewriteFilterimport org.springframework.beans.factory.annotation.Value;import org.springframework.core.io.Resource;import org.springframework.stereotype.Comp...
SQL Server 使用SQL获取建表语句
SQL Server 没有提供函数或存储过程直接查看建表语句(?),当然它的DBMS客户端提供了这个功能,但只为了这点小事就安装那个大玩意?…还是自己写一个更快。 完整代码create Procedure sp_helptable( @table varchar(100))-- exec sp_helptable tablename-- 增加获取注释信息(感谢 袁罗)AS Begindeclare @sql table(s varchar(1000), id int identity)-- 创建语句insert into @sql(s) values ('create table [' + @table + '] (')--获取注释SELECTA.name AS table_name,B.name AS column_name,C.value AS column_descriptioninto #columnspropertiesFROM sys.tables AINNER JOIN sys.columns B ON B.obj...
Spring boot starter开发指南
Spring boot一大特色就是提供了许多启动器,比如spring-boot-starter-web,spring-boot-starter-cache等,这些启动器实现了自动配置,方便用户更快的聚焦于实际业务。对于我们来说,这也提供了一个新的思路去实现组件化:将过往的jar包封装提供类/方法依赖的模式改进成bean注入的模式。而这是通过我们可以开发自己的启动器去实现的。下面就说说如何去做。 创建工程starter工程可以不是spring boot,只需要是一个maven工程即可。此时,我们需要在pom中指明依赖管理器。当然,如果你用spring boot去构建starter工程就不需要再声明这点。 <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boo...
在 Centos 7 中使用shadowsocks
本文不讨论,如何搭建或者获取shadowsocks服务,仅仅从技术角度探讨下如何在centos 7中使用这种socks5代理。 安装shadowsocks-qt5 wget https://copr.fedorainfracloud.org/coprs/librehat/shadowsocks/repo/epel-7/librehat-shadowsocks-epel-7.reposudo mv librehat-shadowsocks-epel-7.repo /etc/yum.repos.d/sudo yum updatesudo yum install -y shadowsocks-qt5 安装proxychains wget https://github.com/rofl0r/proxychains-ng/archive/master.zipunzip master.zipcd master./configuremakesudo make installsudo cp ./src/proxychains.conf /etc/proxychains.conf 配置p...
使用wrk测试api性能
Restful Api 压力测试有很多专业工具,但那些工具对于开发人员说过于复杂了(我觉得那些是给测试人员用的)。wrk 是一个简单的多线程的基于命令行的测试工具,它的一个很好的特性是用很少的线程压出很大的并发,能快速的验证接口的性能,比较适合开发场景。下面是使用过程记录。需要注意的是 wrk 只能运行在 linux 平台。 安装wrk需要从github拉代码并编译 git clone https://github.com/wg/wrk.git cd wrk make 编译成功后,会在当前目录中生成可执行的wrk。将其copy到bin目录。 sudo cp wrk /usr/local/binwhick wrk 使用wrk简单使用 命令 wrk -t4 -c10 -d10s -T3s --latency http://www.lefer.cn -t4 开启四个线程 -c10 保持10个连接 -d10s 持续测试10秒 -T3s 超时设置为3秒 –latency 统计延迟分布 执行结果 [web@localhost ~]$ wrk -t4 -c10 -...
Centos7安装最新内核并开启BBR
Google 开源了 TCP BBR 拥塞控制算法,并提交到了 Linux 内核(> 4.9)。据悉,特别适用于网速不稳定的场景。根据网上的测试,在开启BBR后,网速甚至可以提升好几个数量级。 以下是我在GCP上开启BBR的步骤。系统版本是Centos 7。 # 更新系统yum update -y# 安装内核rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.orgrpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpmyum --enablerepo=elrepo-kernel install kernel-ml# 查看安装内核并设置,从返回结果中找到版本号最大的一行的序号,设置为默认启动awk -F\' '$1=="menuentry " {print i++ " : " $2}' /etc/grub2.cfg# 0是版本号最大的一...
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。 H...
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:8080/share/adminApi.git repo B: http://ip:8080/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) 将 ...
