http://www.idouba.net/spring-cloud-source-eureka-client-api/?utm_source=tuicool&utm_medium=referral
***************************
先關注下netflix eureka server 原生提供的接口。https://github.com/Netflix/eureka/wiki/Eureka-REST-operations 這是對非java的服務使用eureka時可以使用的rest接口。對於java應用,直接使用java的接口就可以
Netxflix 提供的主要操作定義在com.netflix.discovery.EurekaClient中。主要操作有:

其實現類是 com.netflix.discovery.DiscoveryClient。
Spring cloud中對其進行了封裝,定義在org.springframework.cloud.client.discovery.DiscoveryClient中,

可以看到比netflix原生的接口簡單了很多,其實現類是org.springframework.cloud.netflix.eureka.EurekaDiscoveryClient,里面所有的操作都是對netflix 原生的接口的封裝,可以認為這是eureka 客戶端需要向外提供的功能。
主要提供的服務如下:
1. 獲取服務名為serviceId的所有服務實例。實現就是調用netflix的eurekaClient來獲取。
|
public List<ServiceInstance> getInstances(String serviceId) {
List<InstanceInfo> infos = this.eurekaClient.getInstancesByVipAddress(serviceId,
false);
List<ServiceInstance> instances = new ArrayList<>();
for (InstanceInfo info : infos) {
instances.add(new EurekaServiceInstance(info));
}
return instances;
}
|
2. 獲取本地發服務實例。解析EurekaInstanceConfig類型的服務實例配置,是自己當前服務的配置,本來這個對象就是在client中要注冊到服務端的。
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
29
30
31
32
33
|
public ServiceInstance getLocalServiceInstance() {
return new ServiceInstance() {
@Override
public String getServiceId() {
return EurekaDiscoveryClient.this.config.getAppname();
}
@Override
public String getHost() {
return EurekaDiscoveryClient.this.config.getHostName(false);
}
@Override
public int getPort() {
return EurekaDiscoveryClient.this.config.getNonSecurePort();
}
@Override
public boolean isSecure() {
return EurekaDiscoveryClient.this.config.getSecurePortEnabled();
}
@Override
public URI getUri() {
return DefaultServiceInstance.getUri(this);
}
@Override
public Map<String, String> getMetadata() {
return EurekaDiscoveryClient.this.config.getMetadataMap();
}
};
}
|
3. 獲取所有的服務。不同於netflix的的eurekaClient需要得到一個Applications的復雜對象,只是得到用戶關心的服務名即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
public List<String> getServices() {
Applications applications = this.eurekaClient.getApplications();
if (applications == null) {
return Collections.emptyList();
}
List<Application> registered = applications.getRegisteredApplications();
List<String> names = new ArrayList<>();
for (Application app : registered) {
if (app.getInstances().isEmpty()) {
continue;
}
names.add(app.getName().toLowerCase());
}
return names;
}
|
spring cloud 前面接口中涉及的主要數據結構是ServiceInstance

其實現類org.springframework.cloud.netflix.eureka.EurekaDiscoveryClient.EurekaServiceInstance,定義在spring-cloud-netflix-eureka-client 包中,是EurekaDiscoveryClient的一個內部靜態類,可以看到是對netflix原生的com.netflix.appinfo.InstanceInfo的一種封裝。
|
public static class EurekaServiceInstance implements ServiceInstance {
private InstanceInfo instance;
...
|
看到實現的接口 org.springframework.cloud.client.ServiceInstance,定義在spring-cloud-commons中。也體現了spring clound的一種設計哲學,在common中只是規定(定義)行為,而實現在其他包中。
org.springframework.cloud.client.discovery.DiscoveryClient 也是定義在common中,而其實現類org.springframework.cloud.netflix.eureka.EurekaDiscoveryClient定義在spring-cloud-netflix-eureka-client中,即spring cloud需要有服務發現功能,eureka只是其中的一種選擇。
|
@RequiredArgsConstructor
public class EurekaDiscoveryClient implements DiscoveryClient {
public static final String DESCRIPTION = “Spring Cloud Eureka Discovery Client”;
...
|
完。