《Loy解说Eureka服务端源码(一)》

 Eureka服务端源码分析(一)

01 | Eureka服务端的作用

  • 服务注册

  • 提供服务注册表

  • 同步状态

    • Eureka Client 通过注册、心跳机制和Eureka Server 同步当前客户端的状态

  • Eviction 服务剔除

  • Cancel 服务下线

    • Eureka Client 在程序关闭时向Eureka Server 发送取消请求,发送请求后,该客户端实例信息将从Eureka Server 的实例注册表中删除

 

02 | 搭建Eureka服务端应用

  • 创建一个eureka-server-demo应用项目结构如下:

image.png    

  • 依赖的jar包

 <!-- 引入eureka服务端 -->
     <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
      </dependency>
  • 创建一个Eureka集群

    • 创建三个集群的配置,分别对应application-peer1.yml,application-peer2.yml,application-peer3.yml

      • 分别启动对应的服务

      • 访问eureka注册中心地址,效果如下

image.png

 

 

  • 版本说明:

   SpringCloud : Greenwich.SR1

   SpringBoot :   2.1.4.RELEASE

 

03 | 模拟客户端报文注册

  • 模拟请求报文

<instance>
        <instanceId>eureka-client:ee11acdbe8861d2fb34be72f992d83</instanceId>
        <hostName>192.168.31.126</hostName>
        <app>EUREKA-CLIENT-LOY1</app>
        <ipAddr>192.168.31.126</ipAddr>
        <status>UP</status>
        <overriddenstatus>UNKNOWN</overriddenstatus>
        <port enabled="true">8081</port>
        <securePort enabled="false">443</securePort>
        <countryId>1</countryId>
        <dataCenterInfo class="com.netflix.appinfo.InstanceInfo$DefaultDataCenterInfo">
            <name>MyOwn</name>
        </dataCenterInfo>
        <leaseInfo>
            <renewalIntervalInSecs>30</renewalIntervalInSecs>
            <durationInSecs>90</durationInSecs>
            <registrationTimestamp>1605022781675</registrationTimestamp>
            <lastRenewalTimestamp>1605023772048</lastRenewalTimestamp>
            <evictionTimestamp>0</evictionTimestamp>
            <serviceUpTimestamp>1605022781136</serviceUpTimestamp>
        </leaseInfo>
        <metadata>
            <management.port>8081</management.port>
        </metadata>
        <homePageUrl>http://192.168.31.126:8081/</homePageUrl>
        <statusPageUrl>http://192.168.31.126:8081/actuator/info</statusPageUrl>
        <healthCheckUrl>http://192.168.31.126:8081/actuator/health</healthCheckUrl>
        <vipAddress>eureka-client</vipAddress>
        <secureVipAddress>eureka-client</secureVipAddress>
        <isCoordinatingDiscoveryServer>false</isCoordinatingDiscoveryServer>
        <lastUpdatedTimestamp>1605022781675</lastUpdatedTimestamp>
        <lastDirtyTimestamp>1605022781120</lastDirtyTimestamp>
        <actionType>ADDED</actionType>
    </instance>
  • 请求注册路径

    • http://localhost:9081/eureka/apps/EUREKA-CLIENT-LOY1

  • 请求结果说明

    • 如果返回204,则说明注册成功,否则为失败

      • 如果注册成功,可以在eureka注册中心查看到注册的实例信息

image.png

 

04 | 源码分析

分析源码之前,先确定需要重点关注的几个问题

  • 客户端如何注册到服务端?

  • 服务端如何处理客户端的请求?

  • 如何剔除服务?

  • 注册的服务保存在哪里?

 

4-01 | 分析程序入口

  • Eureka服务端最重要的一个注解之一,也就是@EnableEurekaServer注解,该注解Import一个配置文件EurekaServerMarkerConfiguration.class,进入该配置文件类,可以发现该配置类,仅仅实例化了一个Maker类,该类没有做任何的事情。带着疑问,我们先放一边,稍后再返过来看这个配置类。

@Configuration
public class EurekaServerMarkerConfiguration 
    @Bean
    public Marker eurekaServerMarkerBean() {
        return new Marker();
    }

    class Marker {

    }
}
  • 在springboot的项目中,存在这样一个自动配置类的配置文件,所在位置,在对应项目的spring.factories文件下,我们找到Eureka Server端的该配置,可以发现如下一个EurekaServerAutoConfiguration的配置类。

image.png

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  org.springframework.cloud.netflix.eureka.server.EurekaServerAutoConfiguration
  • 进入EurekaServerAutoConfiguration可以发现,该配置文件类使用了一个条件@ConditionalOnBean(EurekaServerMarkerConfiguration.Marker.class),到此则说明EurekaServerMarkerConfiguration.class配置类的作用,只是作为Eureka服务端的一个开关,标志着该服务为Eureka服务端。

 

4-02 | EurekaServerAutoConfiguration源码分析

  • Eureka Server 的配置类

    • 该类下面存在一个内部配置类EurekaServerConfigBeanConfiguration,该配置类,加载了一个EurekaServerConfig配置类,EurekaServerConfig本身是一个接口,它的实现类是EurekaServerConfigBean,源码如下:

@Configuration
protected static class EurekaServerConfigBeanConfiguration {

    @Bean
    @ConditionalOnMissingBean
    public EurekaServerConfig eurekaServerConfig(EurekaClientConfig clientConfig) {
        // 服务端相关配置实现类
        EurekaServerConfigBean server = new EurekaServerConfigBean();
        if (clientConfig.shouldRegisterWithEureka()) {
            // Set a sensible default if we are supposed to replicate
            server.setRegistrySyncRetries(5);
        }
        return server;
    }
}

 

  • 面重点关注EurekaServerConfigBean类中需要配置的几个字段说明

    • 集群的刷新时间:     private int peerEurekaNodesUpdateIntervalMs = 10 * MINUTES;

    • 实例剔除时间配置: private long evictionIntervalTimerInMs = 60 * 1000;

05 | 总结

由于篇幅有限,该篇幅仅讲解Eureka的作用以及搭建过程,顺便讲解了一下Eureke的自动配置类,下一篇将重点讲解Eureka的实例注册过程,以及如何无效实例的剔除工程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值