Arganzheng's Blog

stay hungry, stay foolish

Java虚拟机学习笔记

Java内存区域 程序计数器 对于一个运行中的Java程序而言,其中的每一个线程都有它自己的PC寄存器,它是该线程启动时创建的。 PC寄存器大小是一个字长,既能够持有一个本地指针,也能够持有returnAddress。 当线程执行某个Java方法时,PC寄存器总是指向下一条将被执行指令的“地址”。 如果一个线程正在执行一个...

海量服务之——灰度发布

为什么要灰度发布 互联网服务变动频繁,发布周期短。速度与质量总是难以双全。 灰度发布能降低发布风险,减少影响范围。 降低对测试的依赖,减少线下自测的数据构造成本。 方便集中监控日志,全量发布由于各层负载均衡的作用,很难跟踪一条完整的调用链路。 可以灰度测试帐号,测试账户通过之后再灰度真实用户帐号,进一步降低发布的风险和影响。 方便回滚。 不能...

HTTPS原理

HTTPS通讯流程 客户端发出安全会话请求(会同时将自己支持的一套加密规则发送给服务器) 服务器从中选出一组加密算法与HASH算法,并将自己的身份信息以证书的形式发回给客户端。证书里面包含了服务器地址,加密公钥,以及证书的颁发机构等信息。 客户端获得服务器CA证书之后浏览器要做以下工作: 用已知的CA列表来验证证书的合法性(颁发证书的机构是否合法,证...

巧用TheadLocal

应用场景 需要增加参数,但是不想或者不能修改接口。 放置一些线程不安全,但是反复构建会比较耗内存或者CPU的对象,同步访问又会导致锁竞争。比如SimpleDateFormat。 实现原理 本质上就是一个以threadId为key的Map。 实战例子——Spring Transaction Manager 事务管理可能会跨越好几个Service方法,如何在这些Servic...

SLA和QoS在RPC/OpenAPI容器中的作用

其实OpenAPI和RPC本质上是一样的,只是由于OpenAPI是对外开放的,而RPC一般是内部服务调用。两者的考虑点不同,所以在通信协议和序列化方式上有些不同。 作为一个RPC框架或者一个OpenAPI容器,它是连接服务消费者和服务器提供者的桥梁。他其实只是一个请求的转发而已。他的服务质量取决与服务提供者的服务质量。然而因为是一个容器,为了保证消费者的权利,同时也是为了保证其他服务提供者...

通讯协议序列化思考

由于我们现在的RPC框架原来的序列化方式太弱了,导致各种序列化问题。所以最近研究了一下相关的序列化方式。主要有: 二进制类的,一般采用TLV编码方式,如Protocol Buffers, Thrift。 文本类的,如JSON, XML。 混合型的,比如Avro,schema是JSON,data是二进制方式的。 序列化一般要么作为RPC传递,或者作为自描述的数据存储,比如数...

分布式系统常用思想和技术总结

一、分布式系统的难点 分布式系统比起单机系统存在哪些难点呢? 1. 网络因素 由于服务和数据分布在不同的机器上,每次交互都需要跨机器运行,这带来如下几个问题: 1. 网络延迟:性能、超时 同机房的网络IO还是比较块的,但是跨机房,尤其是跨IDC,网络IO就成为不可忽视的性能瓶颈了。并且,延迟不是带宽,带宽可以随便增加,千兆网卡换成万兆,只是成本的问题,但延迟是物理限制,基本不可能降...

Config Server和SLA在RPC中的作用

背景 在分布式系统中,经常会遇到这样的业务场景: 查找远程服务的地址 查找资源地址(如mc,redis等) 访问远程服务时,获取超时时间、Load balance策略、灰度策略、HA策略等配置 当系统规模较小时,地址信息和配置信息可以保存在本地的文件系统中,以达到简单高效的目的。但是随着系统的壮大和服务器数量的增加,配置和地址信息的变更可能需要重启大量的服务器,这将会是...

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

问题 输入一个Map[String, Any],要求过滤掉这个map中所有key=”version”的元素。 示例输入: val subMap = Map("version" -> "3", "hello" -> "world") val map = Map("version" -> 1, "query" -> "arganzheng", "pageNumb...

网络RPC编码协议学习

由于我们现在的RPC框架原来的序列化方式太弱了,导致各种序列化问题。所以最近研究了一下相关的序列化方式。主要有: 二进制类的,一般采用TLV编码方式,如Protocol Buffers, Thrift。 文本类的,如JSON, XML。 混合型的,比如Avro,schema是JSON,data是二进制方式的。 二进制编码 主要是TLV编码及其变体。 TLV是Tag-L...