Spring Cloud 服务治理-Eureka详解(二)

博客介绍了微服务架构中服务客户端的操作,包括向注册中心注册、获取服务列表、续约及下线告知等,默认周期为30秒。还提到Spring为服务客户端提供顶级接口,可切换服务治理框架,并以Eureka实现类为例,其操作依赖EurekaClient。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回想一下,对于微服务架构中,所有的服务需要到注册中心去注册服务,并将服务的信息发送给注册中心,然后它会按照一定的周期从服务中心获取服务信息列表,默认的时间为30秒,并且会将自身的服务按照一定的时间间隔向注册中心续约,这个时间默认也是30秒。那么抽象一下,服务客户端需要做这么几件事情:

1、向注册中心提交注册

2、从注册中心获取服务列表

3、按照一定的时间续约

4、如果下线了,则告诉注册中心,我要下线了。

 

Spring 对于发现服务服务客户端提供了顶级的接口,接口隐藏了实现的具体细节,以保障Spring Cloud可以任意的切换成任何服务治理框架。


public interface DiscoveryClient {
    //获取描述
    String description();
    //根据服务的ID获取服务实例列表
    //由于是微服务的架构,每个服务的实例有可能不只一个,所以这里会返回一个列表
    List<ServiceInstance> getInstances(String serviceId);
    //获取所有服务的集合
    List<String> getServices();
}

查看它的Eureka实现类如下

public class EurekaDiscoveryClient implements DiscoveryClient {
    public static final String DESCRIPTION = "Spring Cloud Eureka Discovery Client";
    private final EurekaInstanceConfig config;
    private final EurekaClient eurekaClient;

    public EurekaDiscoveryClient(EurekaInstanceConfig config, EurekaClient eurekaClient) {
        this.config = config;
        this.eurekaClient = eurekaClient;
    }

    public String description() {
        return "Spring Cloud Eureka Discovery Client";
    }

    public List<ServiceInstance> getInstances(String serviceId) {
        //从eurekaClient对象中获取实例的地址信息
        List<InstanceInfo> infos = this.eurekaClient.getInstancesByVipAddress(serviceId, false);
        List<ServiceInstance> instances = new ArrayList();
        Iterator var4 = infos.iterator();

        while(var4.hasNext()) {
            InstanceInfo info = (InstanceInfo)var4.next();
            instances.add(new EurekaDiscoveryClient.EurekaServiceInstance(info));
        }

        return instances;
    }

    public List<String> getServices() {
        //首先从eurekaClient获取所有的应用
        Applications applications = this.eurekaClient.getApplications();
        if (applications == null) {
            return Collections.emptyList();
        } else {
            //获取所有已经注册的应用
            List<Application> registered = applications.getRegisteredApplications();
            List<String> names = new ArrayList();
            Iterator var4 = registered.iterator();
            //遍历已经注册的应用的名称
            while(var4.hasNext()) {
                Application app = (Application)var4.next();
                if (!app.getInstances().isEmpty()) {
                    names.add(app.getName().toLowerCase());
                }
            }

            return names;
        }
}

从代码中不难发现,所有的操作都依赖一个对象,那就是EurekaClient。查看它的实现方式。

//向服务中心注册服务
boolean register() throws Throwable {
        logger.info("DiscoveryClient_{}: registering service...", this.appPathIdentifier);

        EurekaHttpResponse httpResponse;
        try {
            httpResponse = this.eurekaTransport.registrationClient.register(this.instanceInfo);
        } catch (Exception var3) {
            logger.warn("DiscoveryClient_{} - registration failed {}", new Object[]{this.appPathIdentifier, var3.getMessage(), var3});
            throw var3;
        }

        if (logger.isInfoEnabled()) {
            logger.info("DiscoveryClient_{} - registration status: {}", this.appPathIdentifier, httpResponse.getStatusCode());
}

       

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值