开发SpringCloud微服务三年,我才知道@EnableEurekaServer注解到底做了什么(上)

全是干货的 Java 技术仓库:

  • https://github.com/Wasabi1234/Java-Interview-Tutorial
  • 服务注册发现示意图
  • 开发SpringCloud微服务三年,我才知道@EnableEurekaServer注解到底做了什么(上)
  • 当你在启动类上添加了启动 Eureka 服务注册中心注解时,到底发生了什么呢?
  • 开发SpringCloud微服务三年,我才知道@EnableEurekaServer注解到底做了什么(上)
  • 激活eureka服务器相关配置EurekaServerAutoConfiguration的注解
  • 开发SpringCloud微服务三年,我才知道@EnableEurekaServer注解到底做了什么(上)
  • EurekaServerMarkerConfiguration
  • 开发SpringCloud微服务三年,我才知道@EnableEurekaServer注解到底做了什么(上)
  • 点击到这里,我们发现 spring.factories文件
  • 开发SpringCloud微服务三年,我才知道@EnableEurekaServer注解到底做了什么(上)
  • 注意到如下注解
  • 开发SpringCloud微服务三年,我才知道@EnableEurekaServer注解到底做了什么(上)

@ConditionalOnBean - 条件注入

也就是当有EurekaServerMarkerConfiguration.Marker.class时,才会注入

所以@EnableEurekaServer就是个开关,只要写了该注解,spring 就会帮你把

EurekaServerAutoConfiguration类注入进来。

那么为什么注入他就行了?

EurekaServerAutoConfiguration#jerseyFilterRegistration

开发SpringCloud微服务三年,我才知道@EnableEurekaServer注解到底做了什么(上)

注意如下类:

ApplicationResource#addInstance

相当于 MVC 中的 controller

开发SpringCloud微服务三年,我才知道@EnableEurekaServer注解到底做了什么(上)

   /**
     * Registers information about a particular instance for an
     * {@link com.netflix.discovery.shared.Application}.
     *
     * @param info
     *            {@link InstanceInfo} information of the instance.
     * @param isReplication
     *            a header parameter containing information whether this is
     *            replicated from other nodes.
     */
    @POST
    @Consumes({"application/json", "application/xml"})
    public Response addInstance(InstanceInfo info,
                                @HeaderParam(PeerEurekaNode.HEADER_REPLICATION) String isReplication) {
        logger.debug("Registering instance {} (replication={})", info.getId(), isReplication);
        // validate that the instanceinfo contains all the necessary required fields
        if (isBlank(info.getId())) {
            return Response.status(400).entity("Missing instanceId").build();
        } else if (isBlank(info.getHostName())) {
            return Response.status(400).entity("Missing hostname").build();
        } else if (isBlank(info.getIPAddr())) {
            return Response.status(400).entity("Missing ip address").build();
        } else if (isBlank(info.getAppName())) {
            return Response.status(400).entity("Missing appName").build();
        } else if (!appName.equals(info.getAppName())) {
            return Response.status(400).entity("Mismatched appName, expecting " + appName + " but was " + info.getAppName()).build();
        } else if (info.getDataCenterInfo() == null) {
            return Response.status(400).entity("Missing dataCenterInfo").build();
        } else if (info.getDataCenterInfo().getName() == null) {
            return Response.status(400).entity("Missing dataCenterInfo Name").build();
        }

        // handle cases where clients may be registering with bad DataCenterInfo with missing data
        DataCenterInfo dataCenterInfo = info.getDataCenterInfo();
        if (dataCenterInfo instanceof UniqueIdentifier) {
            String dataCenterInfoId = ((UniqueIdentifier) dataCenterInfo).getId();
            if (isBlank(dataCenterInfoId)) {
                boolean experimental = "true".equalsIgnoreCase(serverConfig.getExperimental("registration.validation.dataCenterInfoId"));
                if (experimental) {
                    String entity = "DataCenterInfo of type " + dataCenterInfo.getClass() + " must contain a valid id";
                    return Response.status(400).entity(entity).build();
                } else if (dataCenterInfo instanceof AmazonInfo) {
                    AmazonInfo amazonInfo = (AmazonInfo) dataCenterInfo;
                    String effectiveId = amazonInfo.get(AmazonInfo.MetaDataKey.instanceId);
                    if (effectiveId == null) {
                        amazonInfo.getMetadata().put(AmazonInfo.MetaDataKey.instanceId.getName(), info.getId());
                    }
                } else {
                    logger.warn("Registering DataCenterInfo of type {} without an appropriate id", dataCenterInfo.getClass());
                }
            }
        }

        registry.register(info, "true".equals(isReplication));
        return Response.status(204).build();  // 204 to be backwards compatible
    }

注意如下继承体系图

开发SpringCloud微服务三年,我才知道@EnableEurekaServer注解到底做了什么(上)

上一篇:《PHP和MySQL Web开发从新手到高手(第5版)》一一1.6 第一个PHP脚本


下一篇:CSDN密码使用前10名