【SpringCloud】4. 服务注册中心

189 阅读4分钟

定义

所谓服务注册中心就是在整个的微服务架构中单独提出一个服务,这个服务不完成系统的任何的业务功能,仅仅用来完成对整个微服务系统的服务注册服务发现,以及对服务健康状态的监控和管理功能。

功能

  1. 可以对所有的微服务的信息进行存储,如微服务的名称、IP、端口等。
  2. 可以在进行服务调用时通过服务发现查询可用的微服务列表及网络地址进行服务调用(和调用的操作没有任何关系)。
  3. 可以对所有的微服务进行心跳检测,如发现某实例长时间无法访问,就会从服务注册表移除该实例。

常用的注册中心

Spring Cloud支持的多种注册中心EurekaConsulZookeeper、以及阿里巴巴推出Nacos组件。这些注册中心在本质上都是用来管理服务的注册和发现以及服务状态的检查的。

目前,Spring Cloud Netflix推出的Eureka已经停止维护,而Zookeeper常用于Dubbo的注册中心,所以本文只讲述目前Spring Cloud中较为流行的Consul组件。Nacos组件将在Spring Cloud Alibaba系列中讲解。

不同注册中心的区别

1. CAP原理

CAP定理又称CAP原则,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾

一致性(C)︰在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)

可用性(A)︰在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)

分区容忍性(P)︰就是高可用性,一个节点崩了,并不影响其它的节点。(100个节点,挂了几个,不影响服务,越多机器越好)

2. Eureka特点(AP)

Eureka中没有使用任何的数据强一致性算法保证不同集群间的Server的数据一致,仅通过数据拷贝的方式争取注册中心数据的最终一致性。虽然放弃数据强一致性但是换来了Server的可用性,降低了注册的代价,提高了集群运行的健壮性。

3. Consul特点(CP)

基于Raft算法,Consul提供强一致性的注册中心服务。但是由于Leader节点承担了所有的处理工作,势必加大了注册和发现的代价,降低了服务的可用性。通过Gossip协议,Consul可以很好地监控Consul集群的运行,同时可以方便通知各类事件。如Leader选择发生、Server地址变更等。

4. Zookeeper特点(CP)

基于Zab协议,Zookeeper可以用于构建具备数据强一致性的服务注册与发现中心。而与此相对地牺牲了服务的可用性和提高了注册需要的时间。

Zab协议:每当某服务集群中有节点的数据发生改变,该节点就会通知Leader节点,Leader节点发出原子广播通知该集群中所有节点修改数据。节点修改数据后响应Leader节点,如果有一个节点的响应Leader没有收到,那么该服务集群不可用。

Consul组件

1. 介绍

Consul是一个可以提供服务发现,健康检查,多数据中心,Key/Value存储等功能的分布式服务框架,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,使用起来也较为简单。ConsulGolang实现,因此具有天然可移植性(支持LinuxWindowsMacOS)。安装包仅包含一个可执行exe文件,方便部署。

2. 启动Consul服务

  1. 去官网下载:www.consul.io/downloads。
  2. 解压Consul压缩包得到执行文件。
  3. 在Consul执行文件的目录下打开cmd。
  4. cmd中输入:consul agent -dev。
  5. 浏览器中输入:localhost:8500。

3. Consul客户端开发模板

  1. porn.xml中引入Consul依赖

    <!--  consul client依赖  -->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-config</artifactId>
    </dependency>
    <!--  consul中提供心跳检测功能组件依赖  -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    
  2. 添加启动类注解

    @SpringBootApplication
    // Spring Cloud的原生注解,开启服务注册与发现,可加可不加
    @EnableDiscoveryClient
    public class ConsulClientApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ConsulClientApplication.class, args);
        }
    
    }
    
  3. 配置application.yml

    spring:
      application:
        # 应用名称
        name: consul-client
      cloud:
        consul:
          # consul注册中心的主机
          host: localhost
          # consul注册中心的端口号
          port: 8500
          discovery:
            # 是否需要注册
            register: true
            # 指定注册的服务名称(默认为应用名)
            service-name: ${spring.application.name}
            # 服务端口
            port: ${server.port}
            # 是否使用ip地址注册
            prefer-ip-address: true
            # 服务请求ip
            ip-address: ${spring.cloud.client.ip-address}
            # 设置consul服务的健康检查(默认开启)
            register-health-check: true
            # 健康检测的url,如果不配置,健康检测一定失败
            health-check-path: /actuator/health
            # 健康检测时间间隔
            health-check-interval: 10s