【源码】Spring Cloud —— Eureka Client 1 核心组件

前言

Spring Cloud,基于 Spring Boot 实现的云应用开发工具,其下有大量的子工程,提供了 微服务 架构下的各种 组件,比如

  • 服务注册与发现组件EurekaZookeeperConsul
  • 服务调用组件RibbonOpenFeignHystrix
  • 路由和过滤组件ZuulSpring Cloud Gateway
  • 配置中心组件Spring Cloud Config
  • 消息组件Spring Cloud StreamSpring Cloud Bus
  • 安全控制组件Spring Cloud Security
  • 链路监控组件Spring Cloud Sleuth
  • 其他

本系列章节结合源码解读 Spring Cloud Netflix 工程下的 Eureka Client 组件,该组件提供了 服务发现 的功能

该系列章节需要相关的内容做铺垫,传送门:

SpringBoot —— 关于 Starter 和 自动装配

关于 Spring Boot 整合 Spring Cloud —— BootstrapApplicationListener

版本

Spring Cloud Netflix 版本:2.2.3.RELEASE
对应 Netflix-Eureka 版本:1.9.21

spring.factories

Spring Boot 整合 Eureka Client 需要引入依赖 spring-cloud-starter-netflix-eureka-client,借由 Starter 引入的便是核心依赖 spring-cloud-netflix-eureka-client

了解 Spring BootStarter 机制和 自动装配 后,我们直接看 spring.factories

spring.factories
Eureka Client 相关的核心组件主要在 EurekaClientAutoConfiguration EurekaDiscoveryClientConfiguration 等配置类中被引入

Eureka Client 部分核心组件

先对引入的部分核心组件做一个大体的了解

EurekaClientConfigBean

封装 Eureka ClientEureka Server 交互所需要的配置信息

/**
 * 封装所有 eureka.client 前缀的属性
 */
@ConfigurationProperties(EurekaClientConfigBean.PREFIX)
public class EurekaClientConfigBean implements EurekaClientConfig, Ordered {

	// 属性前缀
	public static final String PREFIX = "eureka.client";

	//...
}

基于 @ConfigurationProperties,我们可以在应用中通过 eureka.client 前缀对其属性进行配置

EurekaInstanceConfigBean

封装 Eureka Client 自身服务实例的配置信息,主要用于构建 InstanceInfo

InstanceInfo 封装 服务实例 信息

@ConfigurationProperties("eureka.instance")
public class EurekaInstanceConfigBean
		implements CloudEurekaInstanceConfig, EnvironmentAware

基于 @ConfigurationProperties,我们可以在应用中通过 eureka.instance 前缀对其属性进行配置

EurekaServiceRegistry

Spring Cloud NetflixServiceRegistry 的实现,ServiceRegistry 是由 spring-cloud-commons 提供的接口,是对 服务实例 注册的抽象,提供以下方法

public interface ServiceRegistry<R extends Registration> {

	// 服务实例注册
	void register(R registration);

	// 服务实例注销
	void deregister(R registration);

	// 生命周期相关
	void close();

	// 服务实例状态维护
	void setStatus(R registration, String status);

	// 服务实例状态获取
	<T> T getStatus(R registration);

}

其中 Registration 是对 服务实例 的封装,Spring Cloud Netflix 提供的对应实现类即 EurekaRegistration

EurekaAutoServiceRegistration

	@Bean
	@ConditionalOnBean(AutoServiceRegistrationProperties.class)
	@ConditionalOnProperty(
			value = "spring.cloud.service-registry.auto-registration.enabled",
			matchIfMissing = true)
	public EurekaAutoServiceRegistration eurekaAutoServiceRegistration(
			ApplicationContext context, EurekaServiceRegistry registry,
			EurekaRegistration registration) {
		return new EurekaAutoServiceRegistration(context, registry, registration);
	}

该组件基于

  • 容器中存在 AutoServiceRegistrationPropertiesbean
  • 属性 spring.cloud.service-registry.auto-registration.enabled 不为 false

实际上,AutoServiceRegistrationProperties 组件类由 @EnableDiscoveryClient 注解引入

EurekaAutoServiceRegistration 组件类负责 服务实例自动注册

ApplicationInfoManager

管理服务实例信息 InstanceInfo 和服务实例配置信息 EurekaInstanceConfig

EurekaDiscoveryClient

org.springframework.cloud.client.discovery.DiscoveryClient 的实现,该接口封装了 服务实例 的获取,注意跟后文介绍的 com.netflix.discovery.DiscoveryClient 区分

public interface DiscoveryClient extends Ordered {

	//...
	
	// 获取指定服务下的所有实例
	List<ServiceInstance> getInstances(String serviceId);

	// 获取所有服务
	List<String> getServices();

	//...

}

EurekaDiscoveryClient 的方法实现则都是委托给成员属性 EurekaClient eurekaClient 实现的,比如实例获取

	@Override
	public List<ServiceInstance> getInstances(String serviceId) {
		List<InstanceInfo> infos = this.eurekaClient.getInstancesByVipAddress(serviceId,
				false);
		List<ServiceInstance> instances = new ArrayList<>();
		for (InstanceInfo info : infos) {
			instances.add(new EurekaServiceInstance(info));
		}
		return instances;
	}

EurekaClient

EurekaClient 是原生 com.netflix.eureka 提供的接口,同时也提供了实现类 DiscoveryClient,该类是 服务注册、发现 的核心类,对其进行重点解读

DiscoveryClient

关系图如下
DiscoveryClient

Application

封装 服务实例 列表,所有的 实例 都挂在相同的 appName

Applications

注册表中 所有服务 的集合

LookupService

public interface LookupService<T> {

	// 获取指定 appName 的服务信息
    Application getApplication(String appName);

	// 获取所有服务集合
    Applications getApplications();

	// 获取指定服务实例集合
    List<InstanceInfo> getInstancesById(String id);

	// 轮询主机获得下一个实例
    InstanceInfo getNextServerFromEureka(String virtualHostname, boolean secure);
}

顶层接口,抽象 服务、实例获取 的相关方法

EurekaClient

LookupService 基础上拓展了

  • 多种方式获取 实例信息 的方法
  • 健康检查 相关
  • 其他

DiscoveryClient

服务注册、发现 的核心类,该类的逻辑主要贯穿于 构造方法,限于篇幅,我们在下个章节结合源码解读该类如何实现 服务注册、发现

总结

本章对 Spring Cloud Netflix Eureka Client 提供的 核心组件类 做了大致的了解,其中最为核心的 DiscoveryClient 再下一章节重点解读

下一篇:【源码】Spring Cloud —— Eureka Client 2 DiscoveryClient

参考

《Spring Cloud 微服务架构进阶》 —— 朱荣鑫 张天 黄迪璇

©️2020 CSDN 皮肤主题: 精致技术 设计师:CSDN官方博客 返回首页