0%

构建Eureka服务端和客户端

前置需求

Git 1.7.11.3或更高版本

构建步骤

  1. 安装最新版Git

  2. 从Github获取Eureka最新源码。

    git clone https://github.com/Netflix/eureka.git

  3. 在你获取的源码目录中执行构建命令。

    ./gradlew clean build

  4. 正确构建之后,你将获得以下文件:

    Eureka服务端程序:./eureka-server/build/libs/eureka-server-XXX.war

Eureka客户端程序:./eureka-client/build/libs/eureka-client-XXX.jar

第三方依赖包:./eureka-server/testlibs/*.jar

概述

类加载机制:虚拟机把描述类的数据从Class文件(来源可以是文件,或者文件流等)加载在内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的java类型。
java中,类的加载、连接和初始化过程都是在程序运行期间完场的,与其他在编译期就完成连接的语言不通,这样以牺牲前期一些性能的方式提供了动态扩展。

类加载的时机

类的生命周期:加载,验证,准备,解析,初始化,使用,卸载。其中加载、验证、准备、初始化和卸载5个阶段的顺序是确定的,类的加载过程严格按照这种顺序进行。验证、准备、解析3个阶段统称为连接。解析阶段某些情况下则会在初始化后才开始。
什么时候开始类加载虚拟机规范没有规定,依赖虚拟机自身实现。
虚拟机规范规定以下5类情况必须立即对类进行“初始化”,在此之前类的加载,验证,准备已经完成:

1
2
3
4
5
1. 遇到new、getstatic、putstatic、invokestatic这四条字节码指令时,如果类没有进行过初始化,则需要先触发其初始化。对应的java代码场景是:使用new关键字实例化对象,读取或设置一个类的静态字段(被final修饰,已在编译期把结果放入常量池的静态字段除外),调用一个类的静态方法。
2. 使用reflect包的方法对类进行反射调用时,如果类没有进行过初始化则需要先触发其初始化。
3. 当初始化一个类时,发现其父类还没有初始化,则需要先触发其父类进行初始化。
4. 当虚拟机启动时,用户指定了一个要执行的主类(包含要执行的main()方法,程序入口),虚拟机会先初始化这个类。
5. 使用JDK1.7及以上版本时,如果一个java.lang.invoke.MethodHandle实例最后的解析结果为REF_getStatic、REF_putStatic、REF_invokeStatic方法句柄,且方法句柄对应的类没有初始化过,则需要先触发其初始化。
Read more »

垃圾收集

并行收集器:多个GC线程同时运行,在GC线程运行时,挂起用户线程。

并发收集器:多个GC线程同时运行,在某个GC阶段GC线程和用户线程同时运行,但有的阶段还需要挂起用户线程。

程序计数器,虚拟机栈,本地方法栈和方法区内存回收

程序计数器,虚拟机栈和本地方法栈内存自动完成回收。方法区内存在full gc时被回收。

判断对象是否需要回收

计算对象是否需要回收2种判断方法,引用计数法和可达性分析法。
引用计数算法:对一个对象被引用的次数计数,为0则可以回收,缺点时但存在循环引用时无法真正彻底回收。
可达性分析算法:将称为GC Roots的对象作为起始点,向下搜寻,搜寻经过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连时,这个对象可以回收。

1
2
3
4
5
可作为GC Roots的对象:
1. 虚拟机栈里栈帧中本地变量表中引用的对象。
2. 方法区中类静态属性引用的对象。
3. 方法区中常量引用的对象。
4. 本地方法栈中JNI(native方法)引用的对象。

java采用的是可达性分析算法。

Read more »

Eureka Server配置说明

  • {eureka}.awsAccessId: AWSAccessId AWS Access Id,用来绑定到EIP,默认值null
  • {eureka}.awsSecretKey: AWSSecretKey 密钥 默认值null
  • {eureka}.eipBindRebindRetries: EIPBindRebindRetries 绑定到EIP的重试次数 默认值3
  • {eureka}.eipBindRebindRetryIntervalMsWhenUnbound: 单位毫秒 EIPBindingRetryIntervalMsWhenUnbound 检查绑定状态的时间间隔 默认值60 * 1000
  • {eureka}.eipBindRebindRetryIntervalMs: 单位毫秒 EIPBindingRetryIntervalMs 绑定稳定状态检查时间间隔 默认值300秒
  • {eureka}.enableSelfPreservation: shouldEnableSelfPreservation 是否开启自我保护(当接收到客户端的心跳小于阈值时server会进入自我保护模式)默认值true
  • {eureka}.renewalPercentThreshold: renewalPercentThreshold 期待从客户端获取的心跳阈值百分比 默认值0.85
  • {eureka}.renewalThresholdUpdateIntervalMs 单位毫秒 renewalThresholdUpdateIntervalMs 更新心跳阈值的时间间隔 默认值15分钟
  • {eureka}.peerEurekaNodesUpdateIntervalMs: 单位毫秒 peerEurekaNodesUpdateIntervalMs 集群里eureka节点的变化信息更新的时间间隔,单位为毫秒,默认为10 * 60 * 1000
  • {eureka}.enableReplicatedRequestCompression: shouldEnableReplicatedRequestCompression 复制的数据在发送时是否压缩 默认值false
  • {eureka}.numberOfReplicationRetries: NumberOfReplicationRetries 集群里服务器尝试复制数据的次数 默认值5
  • {eureka}.peerEurekaStatusRefreshTimeIntervalMs: PeerEurekaStatusRefreshTimeIntervalMs 服务器节点状态信息更新的时间间隔 默认值30*1000
  • {eureka}.waitTimeInMsWhenSyncEmpty: WaitTimeInMsWhenSyncEmpty 服务器获取不到集群里对等服务器实例时,需要等待的时间 默认值1000 * 60 * 5
    Read more »

Eureka客户端配置说明

EurekaInstanceConfig

  • instanceId:client唯一标识,将此实例从相同appName的集群中区分开来。
  • appName:注册到eureka server的服务名,相同appName的实例组成集群。
  • appGroupName:实例所在群组名,用于划分服务。
  • instanceEnabledOnit:实例启动后是否立即注册到eureka server,因为有的实例启动后需要处理一些额外的事情才能对外提供服务。
  • nonSecurePort:非安全端口。
  • securePort:安全端口。
  • nonSecurePortEnabled:是否启用非安全端口。
  • securePortEnabled:是否启用安全端口。
    Read more »

配置Eureka

阅读简介以更好的理解设置的概念。

Eureka共有2个组件-Eureka Client和Eureka Server。在使用Eureka时,你的架构中通常有2个应用:

  • Application Client通过Eureka Client请求应用服务端。
  • Application Server接受客户端的请求并发送响应。

设置涉及以下内容:

  • Eureka Server
  • Application Client中的Eureka Client
  • Application Server中的Eureka Client

Eureka在AWS环境中和非AWS环境中都能运行。

如果在云环境中运行,则需要传入java commandline属性-Deureka.datacenter=cloud,以便Eureka客户端/服务器知道如何初始化AWS云的特定信息。

Read more »

Eureka简介

Eureka是什么?

Eureka是一个基于REST(Representational State Transfer:表述性状态转移)的服务,主要用于对部署在AWS云环境中的服务进行定位、负载均衡和故障转移的中间层服务。我们称这个服务为Eureke Server。Eureka同时提供JAVA客户端组件,Eureka Client,使与eureka服务交互变得更容易。客户端同样内置了基于循环策略(round-robin)的负载均衡。在Netflix,一个更为复杂的负载均衡器封装了Eureka,以提供基于流量,资源使用,错误条件等因子为加权的负载均衡,以提供优越的弹性。

为什么需要Eureka?

在AWS中,由于固有的性质,服务器间交互的负载均衡并不像传统的物理服务器之间那样通过已知的IP地址和主机名,在AWS中,负载均衡需要更为复杂的服务注册和服务发现。由于AWS并没有提供中间层负载均衡,Eureka填补可这一巨大空白。

Eureka和AWS ELB之间有什么区别?

AWS ELB是为终端用户网络流量提供的边缘服务负载均衡解决方案(ELB像通常使用nginx一样,在用户和server之间进行负载均衡)。Eureka填补了中间层负载平衡的需要。理论上,您可以将您的中间层服务放在AWS ELB后面,但在EC2 classic中,您将它们暴露给外部世界,并失去AWS安全组的所有安全控制。

AWS ELB也是一种传统的基于代理的负载均衡解决方案,与之不同的是,Eureka是对实例/服务器/主机级别间进行负载均衡。客户端实例能够感知需要与哪些服务器进行交互的所有信息。这样的好坏取决于你看待它的方式。如果你正在寻找一个基于粘性用户会话的负载均衡,AWS已经提供了,Eureka并没有提供一个解决方案。在Netflix,我们偏向于使用无状态服务。这样有利于可扩展模型并且更加契合Eureka。

另一个eureka和传统的基于代理的负载均衡的区别是,应用在负载均衡服务中断后继续对外提供服务,这是因为可用服务器的相关信息已经缓存在了客户端上。这些缓存只需要占用客户端很小的内存,却能带来非常好的弹性(可用性)。

Read more »

二分查找

在看Map源码的时候看到了红黑树,去了解了之后发现水太深了,去捡起大学时候的数据结构与算法恶补,顺便做下笔记。学无止境啊。

原理

二分查找依赖于一个有序列表,当查找一个元素A时,先用此元素和有序列表中点的元素B比较大小:
如果A<B则说明需要查找的元素A位于B元素的左侧子序列中。
如果A>B则说明需要查找的元素A位于B元素的右侧子序列中。
然后根据情况,分别再用A和上面确定的子序列的中点元素比较,再次得到A的位于的子序列,重复直至找到A。
可以看到,因为每次查找都会剔除剩余序列的一半元素,因而性能为log(n)。

Read more »

双层循环优化

底层数据存储方式:

1
2
3
4
行优先存储:
a[0][0],a[0][1],a[0][2]...
列优先存储:
a[0][0],a[1][0],a[2][0]...

对于双层循环,行优先保证外层循环比内层循环小,对于列优先保证内层循环比外层循环小,简而言之,谁不变谁循环次数小。

Druid数据源加密

首先说下意见,druid数据源加密其实可有可无,只不过是多了一点破解时间,因为公钥和密文都知道,破解非常简单。不过加密下还是有些许必要的,至少逼格档次和心里安慰是有的:)。

ConfigTools.java加密

druid的加密类为ConfigTools,全路径为:

com.alibaba.druid.filter.config.ConfigTools.java

里面有个main方法,随机生成私钥和公钥,并加密密码生成密文。所以使用时只需要传入密码即可,运行后会输出公钥,私钥和密码密文。

java -cp druid-1.0.26.jar com.alibaba.druid.filter.config.ConfigTools root

Read more »