Iterm2 proxy
Iterm2 设置代理Mac用户大多对Iterm2都不陌生,颜值不错,用起来也顺手,但是大家肯定也都遇到过这样的场景:
更新的时候,被墙了
无法使用Git命令从Github上clone代码
我自己搭了个梯子,从Chrome上访问Github是没有问题,如何能够让Iterm2中的Git命令也可以访问外网呢?如果Iterm2支持代理就好了,直接把配个代理服务器,但是Iterm2本身并不支持代理设置
我本地安装了Shadowsocks,打开『偏好设置』可以看到socks5和http代理分别监听了1086和1080端口,如果把Iterm2中的请求转发到这些端口上,是不是就可以满足我们想要的功能呢?
为了验证代理是否成功,先测试一下IP地址,在Iterm中输入:
1curl ip.sb
此时返回的是目前机器的IP地址,可以去搜索一下IP所在地。
接下来打开Shadowsocks,在Iterm中输入如下内容:
12345alias proxy_http='export http_proxy=http://127.0.0.1:1080;export https_proxy=htt ...
数据库事物和MQ一致性问题
最近生产环境出现了一些NPE问题(微服务架构),上游保存了数据库之后,发送MQ消息通知下游,下游服务查询不到上游保存的数据,从而导致了NPE问题。
架构图大致如下:
怀疑一:数据库主从同步延时可以确定的是数据库是多实例的,如果下游服务在当时读取不到数据,很有可能是数据库主从同步延时,下游服务去从库查询的时候,主库的数据还没有同步到从库,这样就出现了NPE问题。处理这样的问题也简单,让下游读方法强制去读主库就可以了。
按照这个思路调整了代码之后,再次部署到生产环境,第二天没有出问题,但是第三天同样的问题又出现了,也就是说,并不是数据库主从同步延时引起的NPE问题(或者说引起NPE问题的不仅仅是数据库主从同步延时)。为了缩小问题的范围,我去找DBA了解生产环境的数据库架构,得到的答案是:我们生产环境的确有两个实例,但是读写都是一个实例上,另一个实例仅仅作为灾备使用。
怀疑二:下游服务MQ消费过快上游服务的伪代码如下:
123456@Transactional(rollbackFor = Exception.class)public void process{XXXDAO.sav ...
SpringBoot中线程池使用
最近接手的项目遇到一个这样的问题:我们服务的一个接口需要循环查询另一个服务的接口,这样如果数据量较多的时候,我们服务的接口响应时间可能就会超时,伪代码如下:
12345678List<String> listOfResult = new ArrayList<>();listOfData.stream().forEach(t -> {// 调用其他微服务查询数据String result = queryOtherServer(t);if (null != result){listOfResult.add(result);}});
这里先不讨论为什么不能让对方服务提供一个批量查询接口,然后通过一次调用获取数据结果,历史原因就是这样,短期只能我们系统先优化。
好吧,头疼医头吧。
这里如果要提高性能,最直接的办法就是并发查询,然后汇总查询结果。
优化步骤:
在项目中增加线程池配置,如下:
12345678910111213141516171819202122232425262728293031/** * @descri ...
一文带你读懂AQS
在JAVA中大多数的同步类(比如ReentrantLock、CountDownLatch、Semaphore等)都是基于AbstractQueuedSynchronier(简称AQS)来实现的。AQS是一个提供了原子式的管理状态同步、线程阻塞以及线程唤醒的简单框架,他内部使用了模板方法模式,这就使得其他的同步类都可以有自己的实现(ReentrantLock、CountDownLatch等都是通过变相继承AQS来实现同步功能的,注意看源码的Sync的实现)。
AQS可以做什么借助于AQS,我们可以实现哪些功能呢?
比如我们可以自己写一个排他锁,可以自己实现公平锁和非公平锁,比如可以自己写一个共享读锁等等。
为什么AQS可以完成这些功能呢?它内部是如何实现的呢?
要回答上面的问题,我们需要了解AQS内部的几个重要的属性以及他们的数据存储结构。
在AQS内部,有三个特别重要的属性:
state
源码如下(为了减少篇幅,删减了注释部分):
123456789101112/** * The synchronization state. */private volatile int stat ...
模板方法
功能描述封装了算法的骨架,让子类去做算法的实现。和建造者模式很像。
代码结构UML类图
代码示例假设需要做一份黄金蛋炒饭,鸡蛋和米饭怎么获取,这个由各个厨师自己决定,为了能够做出黄金蛋炒饭,厨师长控制了炒饭的制作步骤…
厨师长定义的做黄金蛋炒饭的步骤
123456789101112131415161718192021222324252627public abstract class FriedRice { abstract void getEgg(); abstract void getRice(); final void doFriedRice(){ System.out.println("准备制作黄金炒饭:先炒米饭,然后倒入鸡蛋液!"); this.getRice(); System.out.println("米饭下锅翻炒..."); this.getEgg(); System.out.println("将鸡蛋液倒入锅中翻 ...