Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口 ****
2017-01-06 15:19
1221 查看
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中要注册到服务端的。
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的复杂对象,只是得到用户关心的服务名即可。
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”;
...
完。
原创文章。为了维护文章的版本一致、最新、可追溯,转载请注明: 转载自idouba
本文链接地址:
Netflix源码解析之Eureka:Eureka 服务注册发现接口
***************************
先关注下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;
}
1 2 3 4 5 6 7 8 9 | 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; } |
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();
}
};
}
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(); } }; } |
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;
}
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; } |
其实现类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;
...
1 2 3 | public static class EurekaServiceInstance implements ServiceInstance { private InstanceInfo instance; ... |
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”;
...
1 2 3 4 | @RequiredArgsConstructor public class EurekaDiscoveryClient implements DiscoveryClient { public static final String DESCRIPTION = “Spring Cloud Eureka Discovery Client”; ... |
原创文章。为了维护文章的版本一致、最新、可追溯,转载请注明: 转载自idouba
本文链接地址:
Netflix源码解析之Eureka:Eureka 服务注册发现接口
相关文章推荐
- Spring-cloud & Netflix 源码解析:Eureka 服务注册发现接口 ****
- SpringCloud——服务注册与发现Eureka以及注册源码解析
- 《Spring Cloud Netflix》-- 服务注册和服务发现-Eureka的服务认证和集群
- 《Spring Cloud Netflix》 -- 服务注册和服务发现-Eureka 的使用
- 《Spring Cloud Netflix》--服务注册和服务发现-Eureka的深入了解
- 《Spring Cloud Netflix》-- 服务注册和服务发现-Eureka的服务认证和集群
- Spring Cloud Netflix Eureka组件服务注册及发现源码浅析
- 服务注册和服务发现-Eureka的服务认证和集群--Spring Cloud Netflix
- 《Spring Cloud Netflix》 -- 服务注册和服务发现-Eureka的常用配置
- 《Spring Cloud Netflix》-- 服务注册和服务发现-Eureka的服务认证和集群
- springcloud(第三篇)springcloud eureka 服务注册与发现 *****
- 服务注册发现Eureka之三:Spring Cloud Ribbon实现客户端负载均衡(客户端负载均衡Ribbon之三:使用Ribbon实现客户端的均衡负载)
- 【微服务架构】SpringCloud之Eureka(服务注册和服务发现基础篇)(二)
- springcloud(第三篇)springcloud eureka 服务注册与发现
- Spring Cloud构建微服务架构:Eureka服务注册与发现
- (二)SpringBoot+SpringCloud —— 使用Eureka实现服务注册与发现
- Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)【Dalston版】
- SpringCloud——Eureka服务注册和发现
- springcloud(第三篇)springcloud eureka 服务注册与发现 *****
- [Spring Cloud-01] eureka server 服务注册与发现