Arganzheng's Blog

stay hungry, stay foolish

Thrift的序列化版本控制

在现实世界中,唯一的不变就是变化。即使是接口定义也不例外。所以,做好接口版本控制,升级和兼容是非常重要的一个指标。 The system must be able to support reading of old data from log files, as well as requests from out-of-date clients to new servers, and vice versa. 跟PB一样,都是通过Field Identifiers实现的。即,对IDL中定义的字段用一个唯一的数字进行标识。每个序列化字段的标识是由这个field id及其类型声明组合构成的。 Versioning in Thrift is implem...

BTrace实战

什么是BTrace 官方文档上有个非常简洁精辟的介绍。 BTrace is a safe, dynamic tracing tool for the Java platform. BTrace can be used to dynamically trace a running Java program (similar to DTrace for OpenSolaris applications and OS). BTrace dynamically instruments the classes of the target application to inject tracing code (“bytecode tracing”). Tracing...

循环引用序列化问题

假如一个对象里面引用了自己,那么序列化的时候如果不做特殊处理就会死循环了。在XStream中是采用reference处理的。反序列化的时候也根据reference来特殊处理。JSON也是类似的,不过貌似支持不是很好。 package me.arganzheng.study.xstream; import org.apache.commons.lang.StringUtils; import com.thoughtworks.xstream.XStream; import com.thoughtworks.xstream.io.json.JettisonMappedXmlDriver; /** * 循环引用序列化例子 * * @author argan...

mina学习笔记

Mina框架 mina的设计非常简单,由于几个模块组成: IoService: Acceptor or Connector IoProcessor,如果没有指定,默认是NioProcessor。 IoFilterChain IoHandler 其中IoAccetor主要负责监听绑定的端口,接收客户端连接。它有一个selector,对listener端口进行轮询select,如果有OP_ACCEPT事件发生,它会创建一个IoSession,然后调用IoProcessor的add方法,把这个IoSession放进IoProcessor的newSessions队列中,然后唤醒IoProcessor处理 NioSocketAcceptor是处...

多次编解码导致的的奇怪乱码问题

今天遇到一个诡异的编码问题:我们这边一个客户端A调用某个网关B,网关调用某个服务C,服务C又调用服务D。结果发现收到的数据有中文乱码。但是这个乱码和用错编码的乱码很不同:大部分都是正确的,就是几个字符是乱码(基本都是’?’)。在A直接调用D,编码没有问题。说明A和D都是同一种编码(确定是utf-8编码)。那么就是中间的B和C编码出问题了。于是确定了一下B和C的编码,果然B是utf-8,C是GBK。C的编码与大家都不一致,所以会出现这个问题。 但是这里有个诡异的问题,就是在一个调用串中,即使每个调用方的编解码都是约定好的,只要这条调用串的编码不一致(而且是多字节编码方式的),就会出现乱码问题。看下面这个例子: public class MultipleEncodi...

一个简单的性能优化和防止DOS攻击的示例

需求 提供一个根据商品ID(itemID)返回质检报告图片URL的链接。 问题与相应的解决方案 问题1. 根据商品ID获取质检报告图片URL需要查询DB 解决方案: 因为质检报告基本就是不会更新,另外,实时性也不是很高。所以可以考虑用Cache。本地化Cache或者Memcachd都可以。 问题2. 恶意用户使用随机商品ID拼凑URL进行调用攻击 解决方案:对于错误的商品ID,往Cache存入null值,下次直接返回,避免走DB。不过恶意用户可能可以拉取到真正的商品ID,所以中级解决方案要做一个调用鉴权(比如签名),不过这样对接入用户是一个伤害,所以这里只考虑错误商品ID的处理情况。 /** * 提供查询QT报告图片URL给商品组,不需要验证。 * ...

用Photoshop磨皮

需求:色斑、痘痘如何PS掉呢? 思路:斑点是由于色调和明度相对于光滑部分的皮肤而言比较暗淡,只要将他们的色调和明度调高就可以了。 关键:如何选择色斑。 方法:通道与选区的关系:黑不选中,白选中。 实战 步骤一:在通道中选择色斑比较明显的通道,如这里的green通道,复制该通道,得到green copy通道。 步骤二:对该通道进行更进一步的对比度强化。 使用FilterOtherHigh Pass(保留高反差) 使用ImageCalculations,在弹出菜单中将Blending(混合模式)选择为Hard Light(强光),这样以后得到一个Alpha1通道。 重复多次Calculations命令,知道色斑已经凸出的很明显为止。(还可...

如何实现用户认证授权系统

需求 用户注册 登陆(Authentication) 登出 访问权限控制(Authorization,匿名用户、普通用户、管理员) 实现 Authentication 一旦用户注册之后,用户信息就保存在服务器端(DB/Cache)。关键在于用户需要提供身份凭证,一般是用户名和密码。即常见的登陆页面:用户输入username和password,勾选Remember Me(可选,一般是记住一周),点击登陆,提交请求到服务端(这里一般是走HTTPS)。服务端根据用户名和密码到数据库查询是否匹配,如果匹配的话,说明身份认证成功。这是一次普通的身份认证过程。非常好理解。 关键在于HTTP是无状态的,用户登陆过一次,但是如果你没有做一些状态管理操作...

spring AOP internal

Spring AOP mechanisms in a word, Spring AOP is proxy-based. That’s, AOP by proxying. and Spring use one of the following two ways to create the proxy for a given target bean. JDK dynamic proxies, preferred wheneven the proxied target implements at least one interface. CGLIB, if the target object does not implement any inter...

使用curl和wget模拟REST请求

模拟HTTP请求一般使用curl,例如有这么一个REST接口 会员卡推送接口文档 1. 绑卡 开放平台POST消息格式: { "topic": "wecard", "event": "bindCard", "uin": 商家的uin, "data": { "openId": "用户的唯一标识", "mobile": "手机号", "cardNo": "卡号" } } 应用应该返回的消息格式: HTTP Status Code:200 { "errorCode": 0, // 必填。错误码(10000以上(不含),0为正常) ...

×