super-diamond配置管理中心+Docker | 伈情的博客

作者:JerryXia | 发表于 , 阅读 (0)
super-diamond配置管理系统提供系统参数配置管理,例如数据库的配置信息等,配置参数修改以后可以实时推送到客户端(基于netty4),方便系统动态修改运行参数。可以建多个项目,每个项目分为三种profile(development、test、production), 能够控制profile 级别的权限。所有参数均由development profile配置,test和production profile继承development profile配置,也可以覆盖其配置。test和production profile只提供修改功能。client 备份配置信息到本地文件系统,如果server不可用,可以使用本地备份。client 能够定时重连server,保证client高可用。client 提供ConfigurationListener,当某个属性发生变化(add、update、clear), ConfigurationListener能够接收到ConfigurationEvent。server 备份配置文件系统系统,如果数据库不用,能够保证对客户端提供数据(待完善)。支持php项...阅读全文

中国移动517活动架构设计 | 伈情的博客

作者:JerryXia | 发表于 , 阅读 (0)
技术架构
基本设计思想:前端H5:a)  静态资源水平扩容到8台Nginx中;b)  将活动页面上的所有可以静态的元素全部静态化,并尽量减少动态元素;c)  将所有图片、样式、js脚本缓存至用户终端,页面采取懒加载模式;奖券池独立拆分,提高性能:a)  采用多进程+单线程提高处理能力,将奖券池水平拆分到5台Redis内存数据库中,5台应用逻辑服务器单独对应各自的奖券池Redis,每台节点数据彼此隔离;b)  单个节点的处理能力为1.2WTPS, 拆分5个独立节点的处理能力线性扩展为5WTPS(性能压测);用户信息使用Tedis+Zookeeper+Redis集群:a)  用户信息存入3台Redis集群,采用多写随机读的设计模式,提高并发访问的处理能力;b)  用户信息每天可用抽奖次数及当日分享状态使用Redis自身的定时失效特性,避免每日0时程序扫库处理;处理超卖超中问题:a)  用户个人信息为多线程处理,保证用户查询相应时间不超过10ms;b)  票池数据信息采用轻量级加锁,票池访问为多线程,票池修改采用加锁方式,当用户中奖时程序才进入加锁修改票池信息,用户未中奖情况下无加锁操作;...阅读全文

Dubbo架构分析 | 伈情的博客

作者:JerryXia | 发表于 , 阅读 (0)
Dubbo是阿里巴巴服务化治理的核心框架,并被广泛应用于阿里巴巴集团的各成员站点,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。
整体架构Dubbo整体设计如下图所示:

Dubbo框架设计一共划分了10个层,而最上面的Service层是留给实际想要使用Dubbo开发分布式服务的开发者实现业务逻辑的接口层。图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口,位于中轴线上的为双方都用到的接口。下面,结合Dubbo官方文档,我们分别理解一下框架分层架构中,各个层次的设计要点:
业务逻辑服务接口层(Service):该层是与实际业务逻辑相关的,根据服务提供方和服务消费方的业务设计对应的接口和实现。RPC模块配置层(Config):对外配...阅读全文

Javassist动态编程 | 伈情的博客

作者:JerryXia | 发表于 , 阅读 (0)
Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的 Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss 应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态”AOP”框架。
项目地址https://github.com/jboss-javassist/javassist
http://jboss-javassist.github.io/javassist
Javassist动态编程要想将编译时不存在的类在运行时动态创建并加载,通常有两种策略:
动态编译动态生成二进制字节码(.class)对于第二种策略,实际上已经有诸多比较成熟的开源项目提供支持,如CGLib、ASM、Javassist等。这些开源项目通常都具备两方面的功能:
动态创建新类或新接口的二进制字节码动态扩展现有类或接口的二进制字节码我们常用到的动态特性主要是反射,在运行时查找对象属性、方法,修改作用域,通过方法名称调用方法等。在线的应用不会频繁使用反射,因为反射的性能开销较大。其实还有一种和反射一样强大的特性...阅读全文

JVM调优 | 伈情的博客

作者:JerryXia | 发表于 , 阅读 (0)

类的生命周期包括这几个部分,加载、连接、初始化、使用和卸载,其中前三部是类的加载的过程,如下图:

加载,查找并加载类的二进制数据,在Java堆中也创建一个java.lang.Class类的对象;连接,连接又包含三块内容:验证、准备、初始化。1)验证,文件格式、元数据、字节码、符号引用验证;2)准备,为类的静态变量分配内存,并将其初始化为默认值;3)解析,把类中的符号引用转换为直接引用;初始化,为类的静态变量赋予正确的初始值;使用,new出对象程序中使用;卸载,执行垃圾回收;JVM的内存结构如下图:

Java堆(Heap),是Java虚拟机所管理的内存中最大的一块,Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配内存。方法区(Method Area),方法区(Method Area)与Java堆一样,是各个线程共享的内存区域,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。程序计数器(Program Counter Register),程序计数器(Progra...阅读全文