• Spring Cloud服务发现与注册的原理与实现


    一、简介

    1 服务发现的定义

    服务发现是指在一个分布式系统中,服务提供者将自己注册到系统中心,并且服务消费者可以从系统中心查询所有可用的服务的过程。

    2 服务发现的意义

    通过服务发现,服务消费者可以方便地获取可用的服务实例,而无需了解服务实例的具体位置和部署情况。同时,服务提供者也可以方便地将自己的服务注册到系统中心,让使用方更容易地找到服务。

    二、Spring Cloud服务注册与发现的实现

    1 Spring Cloud服务注册

    1.1 服务注册的基本框架

    服务注册的基本框架包括三部分:服务提供者、服务注册中心和服务消费者。其中,服务提供者将自己注册到服务注册中心,服务消费者从服务注册中心获取可用的服务列表。

    1.2 服务注册的实现方式

    Spring Cloud提供了几种服务注册的实现方式,包括:

    1. Eureka:Netflix公司开源的、最为流行的一种服务注册中心;
    2. Consul:由Hashicorp公司开发的一种服务发现组件,支持多数据中心;
    3. ZooKeeper:由Apache项目开发的一种分布式协调框架。

    这里以Eureka为例,介绍Spring Cloud服务注册的实现方式。

    首先需要在pom.xml文件中添加以下依赖:

    <dependency>
       <groupId>org.springframework.cloudgroupId>
       <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    接着,在启动类中加上@EnableEurekaServer注解,表明该服务作为Eureka Server运行:

    @SpringBootApplication
    @EnableEurekaServer
    public class EurekaServerApplication {
       public static void main(String[] args) {
          SpringApplication.run(EurekaServerApplication.class, args);
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在配置文件application.yml中指定服务端口、Eureka相关配置:

    server:
      port: 8761
    
    eureka:
      instance:
        hostname: localhost
      client:
        register-with-eureka: false
        fetch-registry: false
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    至此,Eureka Server配置完成。

    2 Spring Cloud服务发现

    2.1 服务发现的基本框架

    服务发现的基本框架也包括三部分:服务提供者、服务注册中心和服务消费者。其中,服务提供者将自己注册到服务注册中心,服务消费者从服务注册中心获取可用的服务列表。

    2.2 服务发现的实现方式

    同样以Eureka为例,介绍Spring Cloud服务发现的实现方式。

    服务提供者需要在pom.xml文件中添加以下依赖:

    <dependency>
       <groupId>org.springframework.cloudgroupId>
       <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    在启动类中加上@EnableDiscoveryClient注解,表明该服务需要作为Eureka Client运行,并向Eureka Server注册:

    @SpringBootApplication
    @EnableDiscoveryClient
    public class DemoServiceApplication {
       public static void main(String[] args) {
          SpringApplication.run(DemoServiceApplication.class, args);
       }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    同时,在配置文件application.yml中指定应用名称、Eureka相关配置:

    spring:
      application:
        name: demp-service
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    至此,服务提供者的配置完成。

    服务消费者需要在pom.xml文件中添加以下依赖:

    <dependency>
       <groupId>org.springframework.cloudgroupId>
       <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
    dependency>
    
    • 1
    • 2
    • 3
    • 4

    在需要调用服务的地方使用@LoadBalanced注解,让RestTemplate具有负载均衡的能力:

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
       return new RestTemplate();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    同时,在配置文件application.yml中指定应用名称、Eureka相关配置:

    spring:
      application:
        name: demp-service-consumer
    
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    至此,服务消费者的配置完成。

    通过以上配置,Spring Cloud可以实现服务注册和发现的功能。

    三、Spring Cloud服务注册与发现的原理

    3.1 Eureka的原理

    3.1.1 Eureka的基本概念

    注册中心:
    Eureka server是Spring Cloud的核心组件之一,它提供了服务注册和发现的功能。即服务提供者将自己的服务注册到Eureka Server,服务消费者从Eureka Server中查找所需的服务并进行调用。

    服务实例:
    服务实例是指暴露出来的某个服务,可以是普通的Java服务、也可以是Web Service服务等。

    3.1.2 Eureka的工作原理

    注册中心

    注册中心是一个基于REST的服务,主要实现服务注册、服务续约、服务下线以及查询功能。Eureka Server接收服务实例的注册请求,并将服务实例信息存储在内存中(HashMap)。当Eureka Server收到服务实例的续约请求时,会更新服务实例在内存中的信息,避免服务实例过期失效。也可以通过URL获取注册中心中所有可用的服务。

    服务实例

    服务实例启动后会向Eureka Server发送注册请求,告知Eureka Server自己的地址(ip:port)、服务名、健康状态以及一些元数据。同时服务实例会以心跳的方式向Eureka Server发送服务续约请求,在规定时间内没有接收到续约请求,则视为服务实例失效。

    3.2 Zookeeper的原理

    3.2.1 Zookeeper的基本概念

    Zookeeper是一个分布式协调服务,主要应用于高可用场景下的协调任务。Zookeeper提供了数据地址、配置管理、同步等功能。

    数据模型

    Zookeeper所有的数据都保存在一个树形结构中,每个节点称为一个Znode。每个Znode都有名称和数据两个部分组成。数据通常是空字符串,但是也可以存储数据。

    会话

    不同的客户端需要连接到Zookeeper集群进行交互,这些客户端与Zookeeper服务器建立会话。Zookeeper会话与传统应用服务器会话的概念类似,但具有独特的特征,如一些会话变量和超时机制。

    3.2.2 Zookeeper的工作原理

    Zookeeper集群中的各个节点通过Zab协议来实现数据一致性。集群中的一个Zookeeper节点被选举为leader,所有其它follower节点负责数据复制。当leader节点失效时,follower中的某一个节点会被选举为新的leader。

    3.3 Consul的原理

    3.3.1 Consul的基本概念

    Consul是一个分布式的高可用服务发现和配置管理系统。它提供了服务发现、健康检查、KV存储、安全服务等功能。

    服务发现

    Consul基于HTTP提供服务发现。服务消费者可以使用HTTP协议从Consul服务端获取服务提供者的地址和端口号。

    健康检查

    Consul通过健康检查确定哪些服务实例对外提供服务。Consul同时支持TCP、HTTP和Docker容器的健康检查方式。

    3.3.2 Consul的工作原理

    Consul集群实际上就是多个有状态的服务器管理和协调数据。这些节点中的一个被选为leader,所有其它follower节点负责数据复制。

    四、Spring Cloud服务注册与发现的应用场景

    4.1 微服务架构中的应用场景

    在微服务架构中,服务之间可能会随时发生变化,例如某个服务重启、一台机器下线等,因此服务访问地址的获取需要具备高度灵活性和实时性。服务注册中心的出现就是为了解决这个问题,它可以自动进行服务注册和服务发现,大大提高了系统的可扩展性和可维护性。

    4.2 服务治理与负载均衡的应用场景

    服务金丝雀发布、分阶段上线、AB测试等操作,都离不开服务治理,而服务治理又需要服务注册中心来协同实现。在这些高级应用场景中,服务注册中心还可以和负载均衡器等组件配合,提供更加全面的服务治理和负载均衡功能。

    4.3 分布式集群中的应用场景

    在分布式系统中,节点数量大、拓扑图复杂,因此需要一个中心化的配置管理中心。服务注册中心可以实现系统配置的自动管理和更新,同时由于各个服务的名称是由它们自己注册到注册中心上的,因此它能够帮助开发人员快速获得系统内部服务之间的依赖关系。

  • 相关阅读:
    AlGaN/GaN HFET 五参数模型
    SAP UI5 应用中 MockServer 的实例化方法
    JavaScript 设计模式及代码实现——代理模式
    Debian常用命令
    发布Android库至Maven Central详解
    数据库管理工具DBeaverUltimate mac中文高级功能
    Java虚拟机
    pandas plot函数:数据可视化的快捷通道
    layer.open再次渲染html,子页面调用在父页面打开弹出层,渲染html
    专题一:双指针【优选算法】
  • 原文地址:https://blog.csdn.net/u010349629/article/details/130737317