metaService这个服务是用来提供“元服务”的,我们可以看到源码中只有一个DiscoveryService和一个ServiceController,DiscoveryService封装了三个方法,通过EurekaClient分别获取
Admin Service服务列表(IP+Port)
Config Service服务列表(IP+Port)
meta Service服务列表(IP+Port)
我们来看一下其中一个方法:
public List<InstanceInfo> getMetaServiceInstances() {
Application application = eurekaClient.getApplication(ServiceNameConsts.APOLLO_METASERVICE);
if (application == null) {
Tracer.logEvent("Apollo.EurekaDiscovery.NotFound", ServiceNameConsts.APOLLO_METASERVICE);
}
return application != null ? application.getInstances() : Collections.emptyList();
}
返回的是应用实例信息。而ServiceController则是进一步封装,提供3个接口获取服务信息。接口信息如下:
http://localhost:8080/services/meta
返回值:[]
http://localhost:8080/services/admin
返回值:
[
{
"appName": "APOLLO-ADMINSERVICE",
"instanceId": "HQ-PAB41602.sdb.local:apollo-adminservice:8090",
"homepageUrl": "http://172.16.3.147:8090/"
}
]
这个接口是获取adminService服务的接口
http://localhost:8080/services/config
返回值:
[
{
"appName": "APOLLO-CONFIGSERVICE",
"instanceId": "HQ-PAB41602.sdb.local:apollo-configservice:8080",
"homepageUrl": "http://172.16.3.147:8080/"
}
]
同样的我们看一下其中一个方法:
@RequestMapping("/meta")
public List<ServiceDTO> getMetaService() {
List<InstanceInfo> instances = discoveryService.getMetaServiceInstances();
List<ServiceDTO> result = instances.stream().map(new Function<InstanceInfo, ServiceDTO>() {
@Override
public ServiceDTO apply(InstanceInfo instance) {
ServiceDTO service = new ServiceDTO();
service.setAppName(instance.getAppName());
service.setInstanceId(instance.getInstanceId());
service.setHomepageUrl(instance.getHomePageUrl());
return service;
}
}).collect(Collectors.toList());
return result;
}
仅仅是提供了一个简单的封装而已。
Meta Server从Eureka获取metaService,Config Service和Admin Service的服务信息,相当于是一个Eureka Client。
增设一个Meta Server的角色主要是为了封装服务发现的细节,对Portal和Client而言,永远通过一个Http接口获取Admin Service和Config Service的服务信息,而不需要关心背后实际的服务注册和发现组件。
Meta Server只是一个逻辑角色,在部署时和Config Service是在一个JVM进程中的,所以IP、端口和Config Service一致。
由于和Config Service部署在一个JVM中,所以相应的metaService也是都是多实例、无状态部署,保证了服务的高可用性。
网友评论