Arganzheng's Blog

stay hungry, stay foolish

Config Server和SLA在RPC中的作用

背景 在分布式系统中,经常会遇到这样的业务场景: 查找远程服务的地址 查找资源地址(如mc,redis等) 访问远程服务时,获取超时时间、Load balance策略、灰度策略、HA策略等配置 当系统规模较小时,地址信息和配置信息可以保存在本地的文件系统中,以达到简单高效的目的。但是随着系统的壮大和服务器数量的增加,配置和地址信息的变更可能需要重启大量的服务器,这将会是十分“重量级”的操作。而这就是Config Service所要解决的问题。 Config Service Config Service是集配置服务和命名服务于一身的基础服务。它将地址信息和配置信息集中管理在云端,并且提供实时的变更通知。最常见的使用方是RPC服务。原则上来说,...

一个有意思的Scala函数式编程例子

问题 输入一个Map[String, Any],要求过滤掉这个map中所有key=”version”的元素。 示例输入: val subMap = Map("version" -> "3", "hello" -> "world") val map = Map("version" -> 1, "query" -> "arganzheng", "pageNumber" -> "1", "resultPerPage" -> "10", "data" -> subMap) 非函数式的写法 查看了一下scala的集合操作,是有一个filter的操作,但是这个函数只对当前map的元数据进行过滤,并没有递归处理子map。 ...

网络RPC编码协议学习

由于我们现在的RPC框架原来的序列化方式太弱了,导致各种序列化问题。所以最近研究了一下相关的序列化方式。主要有: 二进制类的,一般采用TLV编码方式,如Protocol Buffers, Thrift。 文本类的,如JSON, XML。 混合型的,比如Avro,schema是JSON,data是二进制方式的。 二进制编码 主要是TLV编码及其变体。 TLV是Tag-Length-Value的简称,其实它原来的名称为Type-Length-Value。顾名思义,就是把每个字段按照Type-Length-Value的顺序依次进行编码。有这三个信息,接收端就能够正确的将这个字段进行解码。Protobuf/thrift/ASN BER都属于这种。 ...

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...

tips for sublime text

Command Palette 类似于shell终端,提供了sublime text的所有支持命令。可以说是总入口,比如Package Control就是通过Command Palette调用出来的(Press ⌘⇧P to bring up the command palette, begin to type “install”, and select “Package Control: Install Package”. )。快捷键为Command-P(⌘⇧P)。 Package Control 安装完Sublime text之后,先安装一个插件管理器方便插件的安装和卸载。Sublime Package Control。内网安装插件要设置代理:Sublim...

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...

使用EC2和SSH翻墙

前提 拥有一台墙外的机器——这里是EC2。具体申请和配置过程请参考笔者的上一篇文章 使用亚马逊EC2搭建web工程 步骤 1. SSH配置 参考文章EC2 + SSH 翻墙 3/3— SSH 翻墙设置中有针对windows和linux详细的配置说明。笔者这里只针对mac做简要的说明: cd ~/.ssh vim config 输入以下内容 Host ec2-ami HostName 54.201.85.167 User ec2-user IdentityFile ~/.ssh/argan-aws-ec2.pem CompressionLevel 6 DynamicForward localhost:3128 其中 Host 为设定一个名...

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...

×