Arganzheng's Blog

stay hungry, stay foolish

如何让java程序优先使用自定义的DNS nameserver

背景 以上省略1w字。基于这些原因,我们想指定我们信任的DNS name server。比如Google著名的8.8.8.8。通过BGP方式,可以让一个IP对应N台服务器,那么在权威DNS服务器够多够分散的情况下,绕过ISP提供的LocalDNS可以最大化的控制域名解析。 解决方案 JDK默认的DNS查询方式是具体参见 Understanding host name resolutio...

Redis的事务

Redis提供了一个乐观锁的事务机制,WATCH-MULTI-EXEC。其作用非常类似于DB的check-and-set(CAS)乐观锁实现: boolean success = false; do{ y = exec_sql("elect a from xxx"); x = y + n; success = exec_sql("udpate a = x where a = y");...

nginx URL rewrite自动增加请求参数问题

我们需要将一个URL在服务端进行重定向。比如请求: http://study.arganzheng.me/goto?targetUrl=http%3A%2F%2Freading.arganzheng.me%2Fbook%2Fshare&xxx=yyy,将重定向到targetUrl去:http://reading.arganzheng.me/book/share 去。 那么使用ngi...

应用如何记录集中日志

对于分布式系统,提供一个集中式的日志监控平台是非常有必要的,具体参见笔者前面的一片文章:日志监控系统。这里介绍一下客户端要怎么使用。 首先需要配置pom.xml,引入logging-client包: <dependency> <groupId>com.baidu.global.mobile.server.logging.client</groupId>...

kibana学习笔记

配置链接ElasticSearch数据源 If Kibana and Elasticsearch are on the same host, and you’re using the default Elasticsearch port, then you’re all set. Kibana is configured to use that setup by default! If ...

ElasticSearch如何实现按天翻滚索引

最近在做集中式日志,将应用的日志保存到Elasticsearch中,结合kibana实现集中化日志监控和报警。在设计ES存储的时候。考虑到日志的特殊性,打算采用Daily Indices方式。名称为:log-${application}-YYYY.MM.DD。每天会自动创建一个新的索引,类似于log4j的DailyRollingFileAppender,一来减少活跃索引的大小,二来方便存档和...

Spring MVC的异常处理机制

Spring MVC在找到你的handler之后,会通过反射调用handler的方法: public class InvocableHandlerMethod extends HandlerMethod { /** * Invoke the handler method with the given argument values. */ private Object inv...

如何防止表单重复提交

因为安全扫描的问题,它会把线上真实的访问流量进行重放,而且重发时间间隔比较短,导致一个请求变成多次请求,也就是重复提交了。那么怎样解决这个问题呢? 一般来说是通过request token来防止重复提交的。具体实现机制是: 当客户端请求页面时,服务器会通过token标签生成一个随机token,并且将该token放置到全局session当中,然后将该随机数发向客户端;如果客户第一次提交,那...

配置tomcat的access_log

一般应用都是跑在nginx后面,nginx本身就有access_log了,不需要重复配置tomcat的access_log。不过在测试环境,可能是直接访问tomcat。特别是一些别有用心的程序,比如安全扫描程序。 今天就发现一个tomcat应用有很多莫名其妙的请求。看了一下nginx的access_log,没有发现请求日志,但是应用配置的log4j日志确实很多异常的请求日志。于是配置了一下...

分布式RPC框架如何进行服务寻址和分发

所谓分布式,就是一个服务可能分布在多个Server上。另外,一个Server往往有多个Service,而每个Service有多个方法(服务)。为了对业务透明,服务框架一般会屏蔽远程分布式调用的细节,让用户觉得这就是一个本地服务,也就是说客户端可能就是这样一个调用: String result = HelloService.sayHello(); 至于这个HelloService的say...