SpringCloud中@EnableDiscoveryClient的源码解析

SpringCloud中的@EnableDiscoceryClient和@EnableFeignClients注解的作用解析、RPC远程过程调用 Feign 是一个声明式的 REST 客户端,它的目的就是让 REST 调用更加简单。Feign 提供了 HTTP 请求的模板,通过编写简单的接口和插入注解,就可以定义好 HTTP 请求的参数、格式、地址等信息。而且 Feign 会完全代理 HTTP 请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。Spring Cloud 对 Feign 进行了封装,使其支持 SpringMVC 标准注解和 HttpMessageConverters。EnableDiscoveryClient、RPC 阅读详情
// 核心作用
// 导入具体的DiscoveryClient实现,例如: NacosDiscoveryClient
// DiscoveryClient: 可以获取所有实例信息,实例ID列表
@EnableDiscoveryClient
public class App {
}

@Import(EnableDiscoveryClientImportSelector.class)
public @interface EnableDiscoveryClient {
    // 如果为true, ServiceRegistry将自动注册本地服务器
    boolean autoRegister() default true;
}

@Order(Ordered.LOWEST_PRECEDENCE - 100)
public class EnableDiscoveryClientImportSelector extends SpringFactoryImportSelector<EnableDiscoveryClient> {

    @Override
    public String[] selectImports(AnnotationMetadata metadata) {
        // 从Spring.factories文件中加载EnableDiscoveryClient类型的数据导入
        String[] imports = super.selectImports(metadata);
        // 获取EnableDiscoveryClient注解信息
        AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(getAnnotationClass().getName(), true));
        // 获取自动注册标识
        boolean autoRegister = attributes.getBoolean("autoRegister");
        // 如果是自动注册
        if (autoRegister) {
            // 导入工厂类以及自动注册的配置类
            List<String> importsList = new ArrayList<>(Arrays.asList(imports));
            /**
             * {@link AutoServiceRegistrationConfiguration}
             */
            importsList.add("org.springframework.cloud.client.serviceregistry.AutoServiceRegistrationConfiguration");
            imports = importsList.toArray(new String[0]);
        } else {
            // 如果不是自动注册
            Environment env = getEnvironment();
            if (env instanceof ConfigurableEnvironment configEnv) {
                LinkedHashMap<String, Object> map = new LinkedHashMap<>();
                // 设置自动注册的属性值为false
                map.put("spring.cloud.service-registry.auto-registration.enabled", false);
                // 将该属性添加到上下文环境对象中
                MapPropertySource propertySource = new MapPropertySource("springCloudDiscoveryClient", map);
                configEnv.getPropertySources().addLast(propertySource);
            }

        }

        return imports;
    }

    // 开启标识: spring.cloud.discovery.enabled,默认为true
    @Override
    protected boolean isEnabled() {
        return getEnvironment().getProperty("spring.cloud.discovery.enabled", Boolean.class, Boolean.TRUE);
    }

    // 存在默认的工厂类,能处理该注解,说明存在默认处理DiscoveryClient的类
    // 默认为: SimpleDiscoveryClient,如果导入了其他的DiscoveryClient依赖,那么就会存在对应的DiscoveryClient实现
    // 例如: Nacos -> NacosDiscoveryClient
    @Override
    protected boolean hasDefaultFactory() {
        return true;
    }

}

public abstract class SpringFactoryImportSelector<T> implements DeferredImportSelector, BeanClassLoaderAware, EnvironmentAware {

    // Bean的类加载器
    private ClassLoader beanClassLoader;
    // 处理的注解类型(@EnableDiscoveryClient)
    private Class<T> annotationClass;
    // 上下文环境对象
    private Environment environment;

    protected SpringFactoryImportSelector() {
        // 类中的泛型注解信息(@EnableDiscoveryClient)
        this.annotationClass = (Class<T>) GenericTypeResolver.resolveTypeArgument(this.getClass(), SpringFactoryImportSelector.class);
    }

    @Override
    public String[] selectImports(AnnotationMetadata metadata) {
        // 如果没有开启,不处理
        if (!this.isEnabled()) {
            return new String[0];
        }
        // 获取注解的属性信息
        AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(this.annotationClass.getName(), true));
        /**
         * 例如: 类似与这种效果,但是也可以通过其他方式,核心就是导入DiscoveryClient的实现
         * <pre>
         * org.springframework.cloud.client.discovery.EnableDiscoveryClient=\
         *  org.springframework.cloud.client.discovery.noop.NoopDiscoveryClientAutoConfiguration,\
         *  org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration,\
         *  org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration,\
         *  org.springframework.cloud.consul.discovery.ConsulDiscoveryClientConfiguration,\
         *  com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration,\
         *  org.springframework.cloud.zookeeper.discovery.ZookeeperDiscoveryClientConfiguration,\
         *</pre>
         */
        // 从Spring.factories文件中加载EnableDiscoveryClient为Key的自动配置类
        List<String> factories = new ArrayList<>(new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(this.annotationClass, this.beanClassLoader)));
        // 如果为空并且不包含默认的处理DiscoveryClient的工厂类,抛出异常,意思是: 找到注解找不到DiscoveryClient实现
        if (factories.isEmpty() && !hasDefaultFactory()) {
            throw new IllegalStateException("Annotation @" + getSimpleName() + " found, but there are no implementations. Did you forget to include a starter?");
        }
        // 应该只有一个DiscoveryClient,但可能不止一个处理DiscoveryClient的工厂
        if (factories.size() > 1) {
            this.log.warn("More than one implementation " + "of @" + getSimpleName() + " (now relying on @Conditionals to pick one): " + factories);
        }
        // 导入从Spring.factories文件中加载EnableDiscoveryClient类型的数据
        return factories.toArray(new String[factories.size()]);
    }


    // 给子类重写
    // 默认不存在工厂类,无法处理该注解
    protected boolean hasDefaultFactory() {
        return false;
    }

    protected abstract boolean isEnabled();

}

@Configuration(proxyBeanMethods = false)
// 导入自动注册的配置类
@EnableConfigurationProperties(AutoServiceRegistrationProperties.class)
// spring.cloud.service-registry.auto-registration.enabled开启则导入AutoServiceRegistrationProperties配置类,默认为true
@ConditionalOnProperty(value = "spring.cloud.service-registry.auto-registration.enabled", matchIfMissing = true)
public class AutoServiceRegistrationConfiguration {

}
// 导入了依赖,会自动注册DiscoveryClient的实现,下面是各种实现之一
// org.springframework.cloud.client.discovery.EnableDiscoveryClient=\
//        org.springframework.cloud.client.discovery.noop.NoopDiscoveryClientAutoConfiguration,\
//        org.springframework.cloud.client.discovery.simple.SimpleDiscoveryClientAutoConfiguration,\
//        org.springframework.cloud.netflix.eureka.EurekaDiscoveryClientConfiguration,\
//        org.springframework.cloud.consul.discovery.ConsulDiscoveryClientConfiguration,\
//        com.alibaba.cloud.nacos.discovery.NacosDiscoveryClientConfiguration,\
//        org.springframework.cloud.zookeeper.discovery.ZookeeperDiscoveryClientConfiguration,\

// 解析DiscoveryClient配置类,以Nacos为例
@Configuration(proxyBeanMethods = false)
// 对应的spring.cloud.discovery.enabled属性配置为true,才会加载,默认值都为true
@ConditionalOnDiscoveryEnabled
// 对应的spring.cloud.discovery.blocking.enabled属性配置为true,才会加载,默认值都为true
@ConditionalOnBlockingDiscoveryEnabled
// 对应的spring.cloud.nacos.discovery.enabled属性配置为true,才会加载,默认值都为true
@ConditionalOnNacosDiscoveryEnabled
// SimpleDiscoveryClientAutoConfiguration和CommonsClientAutoConfiguration需要在当前类加载之前加载
// 因为这两个配置是默认的提供的实现配置
@AutoConfigureBefore({SimpleDiscoveryClientAutoConfiguration.class, CommonsClientAutoConfiguration.class})
// NacosDiscoveryAutoConfiguration需要在当前类加载之后再进行加载
@AutoConfigureAfter(NacosDiscoveryAutoConfiguration.class)
public class NacosDiscoveryClientConfiguration {

    // 导入Nacos的服务发现客户端实现
    @Bean
    public DiscoveryClient nacosDiscoveryClient(NacosServiceDiscovery nacosServiceDiscovery) {
        return new NacosDiscoveryClient(nacosServiceDiscovery);
    }


    // 导入Nacos的监控类
    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnProperty(value = "spring.cloud.nacos.discovery.watch.enabled", matchIfMissing = false)
    public NacosWatch nacosWatch(NacosServiceManager nacosServiceManager, NacosDiscoveryProperties nacosDiscoveryProperties) {
        return new NacosWatch(nacosServiceManager, nacosDiscoveryProperties);
    }

    // 网关心跳检测的事件发布器
    // 使用定时线程池,在固定的时间间隔,发送心跳包
    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnProperty(value = "spring.cloud.gateway.discovery.locator.enabled", matchIfMissing = false)
    public GatewayLocatorHeartBeatPublisher gatewayLocatorHeartBeatPublisher(NacosDiscoveryProperties nacosDiscoveryProperties) {
        return new GatewayLocatorHeartBeatPublisher(nacosDiscoveryProperties);
    }

}

@Configuration(proxyBeanMethods = false)
@ConditionalOnDiscoveryEnabled
@ConditionalOnNacosDiscoveryEnabled
public class NacosServiceAutoConfiguration {

    @Bean
    public NacosServiceManager nacosServiceManager() {
        return new NacosServiceManager();
    }

}

@Configuration(proxyBeanMethods = false)
@ConditionalOnDiscoveryEnabled
@ConditionalOnNacosDiscoveryEnabled
public class NacosDiscoveryAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public NacosDiscoveryProperties nacosProperties() {
        return new NacosDiscoveryProperties();
    }

    @Bean
    @ConditionalOnMissingBean
    public NacosServiceDiscovery nacosServiceDiscovery(NacosDiscoveryProperties discoveryProperties, NacosServiceManager nacosServiceManager) {
        return new NacosServiceDiscovery(discoveryProperties, nacosServiceManager);
    }

}

// Nacos服务发现
public class NacosServiceDiscovery {

    // Nacos服务发现配置属性
    private NacosDiscoveryProperties discoveryProperties;
    // Nacos服务管理器
    private NacosServiceManager nacosServiceManager;

    public NacosServiceDiscovery(NacosDiscoveryProperties discoveryProperties, NacosServiceManager nacosServiceManager) {
        this.discoveryProperties = discoveryProperties;
        this.nacosServiceManager = nacosServiceManager;
    }

    // 根据实例ID返回所有的实例对象
    public List<ServiceInstance> getInstances(String serviceId) throws NacosException {
        String group = discoveryProperties.getGroup();
        List<Instance> instances = namingService().selectInstances(serviceId, group, true);
        // 将Nacos的实例信息转换为SpringCloud规定的实例信息
        return this.hostToServiceInstanceList(instances, serviceId);
    }

    // 返回所有的实例名称
    public List<String> getServices() throws NacosException {
        String group = discoveryProperties.getGroup();
        ListView<String> services = namingService().getServicesOfServer(1, Integer.MAX_VALUE, group);
        return services.getData();
    }

    // 将Nacos的实例信息转换为SpringCloud规定的实例信息
    public static List<ServiceInstance> hostToServiceInstanceList(List<Instance> instances, String serviceId) {
        List<ServiceInstance> result = new ArrayList<>(instances.size());
        // 遍历Nacos的实例信息
        for (Instance instance : instances) {
            // 将Nacos的实例信息转换为SpringCloud规定的实例信息
            ServiceInstance serviceInstance = this.hostToServiceInstance(instance, serviceId);
            if (serviceInstance != null) {
                result.add(serviceInstance);
            }
        }
        return result;
    }

    // 将Nacos的实例信息转换为SpringCloud规定的实例信息
    public static ServiceInstance hostToServiceInstance(Instance instance, String serviceId) {
        if (instance == null || !instance.isEnabled() || !instance.isHealthy()) {
            return null;
        }
        NacosServiceInstance nacosServiceInstance = new NacosServiceInstance();
        nacosServiceInstance.setHost(instance.getIp());
        nacosServiceInstance.setPort(instance.getPort());
        nacosServiceInstance.setServiceId(serviceId);
        nacosServiceInstance.setInstanceId(instance.getInstanceId());
        Map<String, String> metadata = new HashMap<>();
        metadata.put("nacos.instanceId", instance.getInstanceId());
        metadata.put("nacos.weight", instance.getWeight() + "");
        metadata.put("nacos.healthy", instance.isHealthy() + "");
        metadata.put("nacos.cluster", instance.getClusterName() + "");
        if (instance.getMetadata() != null) {
            metadata.putAll(instance.getMetadata());
        }
        metadata.put("nacos.ephemeral", String.valueOf(instance.isEphemeral()));
        nacosServiceInstance.setMetadata(metadata);
        if (metadata.containsKey("secure")) {
            boolean secure = Boolean.parseBoolean(metadata.get("secure"));
            nacosServiceInstance.setSecure(secure);
        }
        return nacosServiceInstance;
    }

    // 获取Nacos的名称服务对象,该对象负责管理所有的服务实例,包括注册,取消注册
    private NamingService namingService() {
        return nacosServiceManager.getNamingService();
    }

}

// Nacos的服务发现客户端
public class NacosDiscoveryClient implements DiscoveryClient {

    public static final String DESCRIPTION = "Spring Cloud Nacos Discovery Client";

    // Nacos的服务发现
    private NacosServiceDiscovery serviceDiscovery;

    // 是否启用容错机制,默认为false
    @Value("${spring.cloud.nacos.discovery.failure-tolerance-enabled:false}")
    private boolean failureToleranceEnabled;

    public NacosDiscoveryClient(NacosServiceDiscovery nacosServiceDiscovery) {
        this.serviceDiscovery = nacosServiceDiscovery;
    }

    @Override
    public String description() {
        return DESCRIPTION;
    }

    @Override
    public List<ServiceInstance> getInstances(String serviceId) {
        try {
            // 根据服务ID获取实例
            return Optional.of(serviceDiscovery.getInstances(serviceId))
                    // 如果获取到了,缓存起来
                    .map(instances -> {
                        ServiceCache.setInstances(serviceId, instances);
                        return instances;
                    }).get();
        } catch (Exception e) {
            // 如果获取失败,开启了容错机制,从缓存中获取服务实例
            if (failureToleranceEnabled) {
                return ServiceCache.getInstances(serviceId);
            }
            // 如果没有开启容错,抛出异常
            throw new RuntimeException("Can not get hosts from nacos server. serviceId: " + serviceId, e);
        }
    }

    // 获取服务名称ID
    @Override
    public List<String> getServices() {
        try {
            // 从服务发现中获取所有的实例ID,并缓存起来
            return Optional.of(serviceDiscovery.getServices()).map(services -> {
                ServiceCache.setServiceIds(services);
                return services;
            }).get();
        } catch (Exception e) {
            // 获取的过程发生异常
            // 如果开启了容器机制,返回缓存中的实例ID,否则返回空实例ID
            log.error("get service name from nacos server failed.", e);
            return failureToleranceEnabled ? ServiceCache.getServiceIds() : Collections.emptyList();
        }
    }

}

死磕源码系列【springcloud之@EnableDiscoveryClient More than one implementation及加不加@EnableDiscoveryClient注解都可 最近做consul作为注册中心主方法main上添加与不添加@EnableDiscoveryClient启用服务发现注解都可以正常的使用服务发现及注册功能,这点上有些疑惑,所以就扒拉扒拉源码,看看实现原理到底是什么; 1.看下注解@EnableDiscoveryClient源码 @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Documented @Inherited @Import(EnableDiscoveryClientImp 阅读详情

相关推荐

MBD-从一个示例看代码生成过程(rtw文件、TLC语言)

大概介绍了MBD代码生成流程,rtw文件、TLC语言

小胡同学的工程师学习之路 4210

springcloud @EnableDiscoveryClient注解作用

相信熟悉Spring Cloud的读者对注解@EnableDiscoveryClient 及@EnableEurekaClient 并不陌生。   要想将一个微服务注册到Eureka Server(或其他服务发现组件,例如Zookeeper、Consul等),Eureka 2.0闭源之后,Consul慢慢会成为主流。 只需: 添加Eureka Client(或其他服务发现组件的Cl...

zheng199172的博客 25万+

OFDM时频脉冲形状与子载波正交性的理解

从多载波调制的角度来理解子载波间正交,首先要明确OFDM默认的脉冲成型是时域矩形窗,时域上每个子载波 ej2πfnte^{j2πf_nt}ej2πfn​t 都被一个矩形窗脉冲gT(t)g_T(t)gT​(t)成型。其次,OFDM子载波间隔 等于 OFDM符号周期的倒数,这是子载波正交的条件。 ​ 根据时频脉冲形状,可以从时域上理解如左图(注意是矩形脉冲 乘 复指数),从频域上理解如右图(sinc脉冲 卷 频点)。 ​

weixin_43803202的博客 2213

Spring Boot 中的 @EnableDiscoveryClient 注解

服务注册中心是微服务架构中的一个关键组件,它用于管理所有的服务实例。服务注册中心提供了一个服务注册表,其中包含了所有可用的服务实例信息,包括服务的名称、地址、端口等信息。当一个服务实例启动时,它会向注册中心注册自己的信息,当一个服务需要调用其他服务时,它可以通过服务注册中心获取到其他服务的信息,然后进行调用。

徐师兄的博客 1万+

西门子与汇川伺服脉冲连接(速度模式)

如何使用西门子PLC与汇川伺服进行脉冲连接

2301_77347966的博客 1万+

从零开始:用AutoLisp为AutoCAD定制专属工具栏(2023最新版)

本文详细介绍了如何利用AutoLisp语言为AutoCAD定制专属工具栏,以提升绘图效率。内容涵盖从环境配置、AutoLisp基础语法到实战开发的全过程,指导用户编写自动化脚本、封装功能函数,并最终通过CUI编辑器创建和部署个性化工具栏按钮,是2023年CAD用户实现工作流自动化与个性化的实用指南。

4k5l6j7h8的博客 299

SpringCloud(三):@EnableDiscoveryClient 注解如何实现服务注册与发现

@EnableDiscoveryClient 注解如何实现服务注册与发现@EnableDiscoveryClient 是如何实现服务注册的?@EnableDiscoveryClient 注解做了什么事?EnableDiscoveryClientImportSelector 类做了什么事?nacos 是如何根据标准去实现服务注册的?NacosDiscoveryAutoConfiguration类做了...

平头哥的技术博文 2万+

android 14.0 去掉usb授权提示框 默认给予权限

在14.0的系统rom产品开发中,在进行iot关于插入usb设备的开发过程中,在插入usb设备时会弹出usb授权提示框,也带来一些不便, 这个需要默认授予USB权限,插拔usb都不弹出usb弹窗所以这要从usb授权相关管理页默认给与usb权限,接下来分析下 相关的实现功能流程

安卓兼职framework和app工程师的博客 2261

@EnableDiscoveryClient注解

使用@EnableDiscoveryClient的好处在于,它具有一定的抽象性,可以与多种服务发现实现兼容,比如Eureka、Consul、Zookeeper等。当你在Spring Boot应用的主配置类上使用这个注解时,Spring Cloud会自动配置一个客户端,这个客户端能够与服务注册中心通信,获取服务实例的信息。在这个例子中,MyApplication 类启用了服务发现功能,使得应用能够参与到微服务架构中的服务发现流程中。3、通过服务名而不是硬编码的IP地址和端口来引用其他服务,提高服务间的解耦。

宽带你的世界 4995

车载以太网-TC8测试

TC8测试的用例数量 TC8测试基本流程 TC8测试内容

天赐好车的博客 3613

特别章节-0.1 SolidWorks导出机械臂的URDF模型各个关节坐标系设置

通过Solidworks导出机械臂的URDF模型文件,建立机械臂的各个关节坐标系的规则以及注意点,详细步骤

六眼飞鱼的博客 1万+

SpringCloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient

下文是从stackoverflow上面找到的对这两者的解释: There are multiple implementations of "Discovery Service" (eureka, consul, zookeeper). @EnableDiscoveryClient lives in spring-cloud-commons and picks the implementation...

myroncham的博客 1572

【教程4>第2章>第19节】 GMSK解调系统的FPGA开发与matlab对比验证

MSK(Minimum Shift Keying,最小频移键控)和GMSK(Gaussian Minimum Shift Keying,高斯最小频移键控)都是数字调制技术,主要用于无线通信系统中将数字信号转换为模拟信号进行传输。它们都是连续相位移键控(Continuous Phase Shift Keying, CPK)的一种形式,意味着相邻码元之间没有相位跳变的突变,而是连续过渡,这有助于减少信号带宽和降低邻道干扰。GMSK的解调过程与MSK类似,我们这里还是采用和MSK解调一样的1bit解调方法。

FPGA/MATLAB学习教程/源码/项目合作开发 1219

springcloud注解@EnableDiscoveryClient与@EnableEurekaC

spring cloud中discovery service有许多种实现(eureka、consul、zookeeper等等),@EnableDiscoveryClient基于spring-cloud-commons, @EnableEurekaClient基于spring-cloud-netflix。 其实用更简单的话来说,就是如果选用的注册中心是eureka,那么就推荐@EnableEure...

weixin_30783629的博客 141

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

SpringCloud——Eureka源码分析

1.Eureka Client如何实现服务注册? 基于Spring Cloud的eureka的client端在启动类上加上@EnableDiscovertClient注解,就可以用NetFilx提供Eureka Client。下面以@EnableDiscoveryClient为入口,进行源码分析。 @EnableDiscoveryClient,通过源码发现这是一个标记注解 /** * Annotation to enable a DiscoveryClient implementation. *

努力找工作呀 802

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

SpringCloud(9)之@EnableDiscoveryClient 注解如何实现服务注册与发现

一、前言 在新的2020年,Eureka社区网站已经公布了对Eureka2.0版本的更新,但是Eureka1.0版本仍然可以使用,那现在主流的服务注册中心看下图: 我们在每个引导类上都使用了@EnableDiscoveryClient这个注解,这个注解的作用是让该服务放注册中心注册和从注册中心获取其他服务。那它内部是如何实现的呢?今天我们就来聊聊@EnableDiscoveryClient注解是如何进行服务注册与服务发现。 二、@EnableDiscoveryClient 是如何实现服务注册 我

jokeMqc的博客 9893

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

@EnableDiscoveryClient和@EnableEurekaClient的区别

@EnableEurekaClient只适用于使用Eureka作为注册中心的场景,@EnableDiscoveryClient可以适用于其他注册中心的场景比如nacos等。 在Spring Cloud的Dalston及其之前的版本中:  1、从2014年的Spring Cloud 1.0.0.RC1版本开始,官方就推荐使用EnableDiscoveryClient来取代EnableEureka...

学亮编程手记 5821

SpringCloud Alibaba 2021微服务实战十九 源码理解之@EnableDiscoveryClient 是如何实现服务注册的

@EnableDiscoveryClient 是如何实现服务注册的? 我们首先需要了解 Spring-Cloud-Commons 这个模块,Spring-Cloud-Commons 是 Spring-Cloud 官方提供的一套抽象层,类似于 JDBC 一样,提供了一套规范,具体的实现有实现厂商去根据标准实现, Spring-Cloud-Commons 共提供了6个模块标准规范。 actuator circuitbreaker discovery hypermedia loadbalancer servic

liuerchong的博客 895

SpringCloud Eureka源码分析

一:注册服务 源码: 先从服务注册开始梳理,Eureka Client启动的时候就去Eureka Server注册服务。通过在启动类上添加@EnableDiscoveryClient这个注解,来声明这是一个Eureka Client。 以下是启动类代码: package com.example.eurekaclient; import org.springframework.boot.Sprin...

weixin_40991408的博客 296

注解@EnableDiscoveryClient,@EnableEurekaClient的区别

在之前的一篇文章Spring Cloud feign使用中在使用服务发现的时候提到了两种注解,一种为@EnableDiscoveryClient,一种为@EnableEurekaClient,用法上基本一致,今天就来讲下两者,下文是从stackoverflow上面找到的对这两者的解释: There are multiple implementations of "Discovery Servic

爬虫 的博客 2114

Eureka源码解析

SpringCloud版本Greenwich.SR2 Eureka结构,关系 LookupServiceEurekaClientnetflix 的 DiscoveryClientEurekaDiscoveryClientDiscoveryClient LookupService中定义的方法 /** *通过appName获取Application */ Application getApplic...

Ellen_Tangxiang的博客 609

spring cloud服务发现注解之@EnableDiscoveryClient与@EnableEurekaClient

在之前的一篇文章Spring Cloud feign使用中在使用服务发现的时候提到了两种注解,一种为@EnableDiscoveryClient,一种为@EnableEurekaClient,用法上基本一致,今天就来讲下两者,下文是从stackoverflow上面找到的对这两者的解释:There are multiple implementations of "Discovery Service"...

攻城狮Luke 3202

springcloud五大组件?注解_Spring Cloud 到底是怎么运行的?

导读,在这篇文章和大家一起通过梳理下Spring Cloud的运行原理来相对全面的了解下Spring Cloud。随着微服务架构在越来越多的公司得到实践和应用,基于Spring Cloud的这一套微服务生态框架体系,也在这个过程中得到大量的实践和运用。虽然目前Service Mesh的概念也越来越得到关注,但是目前微服务开源框架中运用的比较广泛的还是基于Spring Cloud的一套体系。从技术本...

weixin_39669629的博客 473

SpringCloud源码学习(一) Eurake服务注册的实现细节

SpringCloud微服务治理模块Eurake是开发SpringCloud项目必须要面对的。我们都知道我们要想将我们的服务注册到Eurake注册中心就必须要在项目中加入相关的依赖jar...

tianjingle 426

Spring cloud中常用注解

Spring cloud中常用注解(新手) 一、@SpringBootApplication注解 该注解是springboot启动类,包括三个注解,他们的作用分别是: @Configuration:表示将该类作用springboot配置文件类 @EnableAutoConfiguration:表示程序启动时,自动加载springboot默认的配置 @...

qq_38775369的博客 1万+
上一篇: SpringCloudOpenFeign的详解
下一篇: SpringCloud中动态配置刷新@RefreshScope的源码解析
安缇吖
博客等级 码龄9年 411粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值