java 应用如何接入 eureka

源码地址

引入依赖

首先引入对 eureka-client 的依赖,在 pom.xml 中添加

1
2
3
4
5
6
7
8
9
10
11
12
13
<!-- eureka-client -->
<dependency>
<groupId>com.netflix.eureka</groupId>
<artifactId>eureka-client</artifactId>
<version>1.7.2</version>
</dependency>
<!--稍后测试使用 junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>

新建 EurekaRegister

1
2
3
4
5
6
7
8
public class EurekaRegister {
public void register(){
DiscoveryManager.getInstance().initComponent(
new MyDataCenterInstanceConfig(),
new DefaultEurekaClientConfig());
ApplicationInfoManager.getInstance().setInstanceStatus(InstanceInfo.InstanceStatus.UP);
}
}

添加配置文件

在 resource 目录下添加 config.properties 文件

ps:在源码中看到的应该是 eureka-client.properties,但是经过实践与各方面查找,发现需要用 config.properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
###Eureka Client configuration for Sample Eureka Service


#Properties based configuration for eureka client. The properties specified here is mostly what the users
#need to change. All of these can be specified as a java system property with -D option (eg)-Deureka.region=us-east-1
#For additional tuning options refer <url to go here>

#部署应用程序的区域
eureka.region=default

#服务指定应用名,这里指的是eureka服务本身(相当于boot中的app.name)
eureka.name=eureka-client-example

#客户识别此服务的虚拟主机名,这里指的是eureka服务本身(相当于boot中的serviceId)
eureka.vipAddress=eureka-client-example

#服务将被识别并将提供请求的端口(web服务部署的tomcat端口)
eureka.port=8080

#设置为false,因为该配置适用于eureka服务器本身的eureka客户端。
#在eureka服务器中运行的eureka客户端需要连接到其他区域中的服务器。
#对于其他应用程序,不应设置(默认为true),以实现更好的基于区域的负载平衡。
eureka.preferSameZone=true

#如果要使用基于DNS的查找来确定其他eureka服务器(请参见下面的示例),请更改此选项
eureka.shouldUseDns=false
#由于shouldUseDns为false,因此我们使用以下属性来明确指定到eureka服务器的路由(eureka Server地址)
eureka.serviceUrl.default=http://localhost:8761/eureka

启动项目

因为是直接新建的 maven 项目,什么都没有,所以采用简单写法

1
2
3
4
5
6
7
8
9
10
public class EurekaRegisterTest {

private EurekaRegister eurekaRegister = new EurekaRegister();

@Test
public void register() throws InterruptedException {
eurekaRegister.register();
Thread.sleep(400000);
}
}

在服务端可以看到已经注册成功。

优化

由于配置文件名称定死了,在实际项目中可能会有许多不方便,如果想修改,可以通过反射的方式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public class EurekaRegister{
public void register() throws NoSuchFieldException, IllegalAccessException {
//通过反射获取到该字段
Class aClass = MyDataCenterInstanceConfig.class.getSuperclass();
Field configInstance = aClass.getDeclaredField("configInstance");
configInstance.setAccessible(true);

//修改该字段的值,将文件名设置为 test
MyDataCenterInstanceConfig instanceConfig = new MyDataCenterInstanceConfig();
DynamicPropertyFactory propertyFactory = Archaius1Utils.initConfig("test");
configInstance.set(instanceConfig, propertyFactory);

DiscoveryManager.getInstance().initComponent(
instanceConfig,
new DefaultEurekaClientConfig()); ApplicationInfoManager.getInstance().setInstanceStatus(InstanceInfo.InstanceStatus.UP);
}
}

参考文档

eureka wiki