微服务系列(三):服务注册与发现

1 微服务的注册与发现

微服务注册与发现类似于生活中的"电话通讯录"的概念,它记录了通讯录服务和电话的映射关系。在分布式架构中,服务会注册进去,当服务需要调用其它服务时,就这里找到服务的地址,进行调用。

步骤如下:

1、你先要把"好友某某"记录在通讯录中。

2、拨打电话的时候通过通讯录中找到"好友某某",并拨通回电话。

3、当好友某某电话号码更新的时候,需要通知到你,并修改通讯录服务中的号码。

从这个过程中我们看到了一些特点:

1、把 "好友某某" 的电话号码写入通讯录中,统一在通讯录中维护,后续号码变更也是更新到通讯录中,这个过程就是服务注册的过程。

2、后续我们通过"好友某某"就可以定位到通讯录中的电话号码,并拨通电话,这个过程理解为服务发现的过程。

而我们微服务架构中的服务注册与发现结构如下图所示:

image_6_1.png

图片中是一个典型的微服务架构,这个结构中主要涉及到三大角色:

provider - 服务提供者

consumer - 服务消费者

register center - 注册中心

它们之间的关系大致如下:

1、每个微服务在启动时,将自己的网络地址等信息(微服务的ServiceName、IP、Port、MetaData等)注册到注册中心,注册中心存储这些数据。

2、服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口。

3、各个微服务与注册中心使用一定机制(例如心跳)通信。如果注册中心与某微服务长时间无法通信,就会注销该实例。

优点如下:

1、解耦:服务消费者跟服务提供者解耦,各自变化,不互相影响

2、扩展:服务消费者和服务提供者增加和删除新的服务,对于双方没有任何影响

3、中介者设计模式:用一个中介对象来封装一系列的对象交互,这是一种多对多关系的中介者模式。

从功能上拆开主要有三块:服务注册、服务发现,和注册中心。我们一个一个来看。

1.1 服务注册

如图中,为Register注册中心注册一个服务信息,会将服务的信息:ServiceName、IP、Port以及服务实例MetaData元数据信息写入到注册中心。当服务发生变化的时候,也可以更新到注册中心。

image_6_2.png

服务提供者(服务实例) 的服务注册模型是一种简单、容易理解、流行的服务注册模型,其在多种技术生态中都有所体现:

1、在K8S生态中,通过 K8S Service服务信息,和Pod的 endpoint(用来记录service对应的pod的访问地址)来进行注册。

2、在Spring Cloud生态中,应用名 对应 服务Service,实例 IP + Port 对应 Instance实例。比较典型的就是A服务,后面对应有多个实例做负载均衡。

3、在其他的注册组件中,比如 Eureka、Consul,服务模型也都是 服务 -> 服务实例。

可以认为服务实例是一个真正的实体的载体,服务是对这些相同能力或者相同功能服务实例的一个抽象。

image_6_3.png

1.2 服务发现

服务发现实际就是我们查询已经注册好的服务提供者,比如 p->p.queryService(serviceName),通过服务名称查询某个服务是否存在,如果存在,

返回它的所有实例信息,即一组包含ip 、 port 、metadata元数据信息的endpoints信息。

这一组endpoints信息一般会被缓存在本地,如果注册中心挂掉,可保证段时间内依旧可用,这是去中心化的做法。对于单个 Service 后面有多个 Instance的情况(如上图),做 load balance。

服务发现的方式一般有两种:

1、拉取的方式:服务消费方(Consumer)主动向注册中心发起服务查询的请求。

2、推送的方式:服务订阅/通知变更(下发):服务消费方(Consumer)主动向注册中心订阅某个服务,当注册中心中该服务信息发生变更时,注册中心主动通知消费者。

1.3 注册中心

注册中心提供的基本能力包括:提供服务注册、服务发现 以及 健康检查。

服务注册跟服务发现上面已经详细介绍了, 健康检查指的是指注册中心能够感知到微服务实例的健康状况,便于上游微服务实例及时发现下游微服务实例的健康状况。采取必备的访问措施,如避免访问不健康的实例。

主要的检查方式包括:

1、服务Provider 进行 TTL 健康汇报(Time To Live,微服务Provider定期向注册中心汇报健康状态)。

2、注册中心主动检查服务Provider接口。

综合我们前面的内容,可以总结下注册中心有如下几种能力:

1、高可用

这个主要体现在两个方面。一个方面是,注册中心本身作为基础设施层,具备高可用;第二种是就是前面我们说到的去中心化,极端情况下的故障,短时间内是不影响微服务应用的调用的

2、可视化操作

常用的注册中心,类似 Eureka、Consul 都有比较丰富的管理界面,对配置、服务注册、服务发现进行可视化管理。

3、高效运维

注册中心的文档丰富,对运维的支持比较好,并且对于服务的注册是动态感知获取的,方便动态扩容。

4、权限控制

数据是具有敏感性,无论是服务信息注册或服务是调用,需要具备权限控制能力,避免侵入或越权请求

5、服务注册推、拉能力

这个前面说过了,微服务应用程序(服务的Consumer),能够快速感知到服务实例的变化情况,使用拉取或者注册中心下发的方式进行处理。

image_6_4.png

2 主流注册中心选型

注册中心的选型直接影响微服务架构的可用性和运维复杂度。本节按推荐优先级从高到低排列:Nacos(国内首选)→ Consul(国际化首选)→ Etcd(云原生场景)→ ZooKeeper(Dubbo 存量系统)→ Eureka(已停止维护,仅作历史参考)。

2.1 Nacos(推荐)

2.1.1 介绍

Nacos(Dynamic Naming and Configuration Service)是阿里巴巴开源的一款集服务注册发现配置管理于一体的中间件,在中国互联网生态中已成为主流选择。

Nacos 的核心特性如下:

1、同时支持 CP 和 AP 模式:可根据业务场景灵活切换一致性模型。临时实例使用 AP 模式(Distro 协议),持久化实例使用 CP 模式(Raft 协议),兼顾可用性与一致性。

2、注册发现 + 配置管理一体化:不同于其他注册中心需要配合额外的配置中心(如 Spring Cloud Config),Nacos 原生集成了动态配置管理能力,减少基础设施依赖。

3、原生支持 Spring Cloud 和 Dubbo:对 Spring Cloud Alibaba 和 Dubbo 生态提供开箱即用的适配,迁移成本低。

4、丰富的管理界面:提供可视化控制台,支持服务列表查看、健康状态监控、配置在线编辑和灰度发布。

5、大规模生产验证:在阿里、字节等大厂的大规模实践验证下,Nacos 在国内技术社区拥有活跃的生态和丰富的文档支持。

2.1.2 整体架构

Nacos 集群由多个节点组成,核心架构分为三层:

1、Naming Service(注册发现):管理服务实例的注册、注销和健康检查。临时实例通过客户端心跳保活(AP 模式),持久实例通过服务端主动探测(CP 模式)。

2、Config Service(配置管理):管理配置的发布、变更和推送。支持命名空间(Namespace)、分组(Group)和数据ID(Data ID)三级隔离。

3、Consistency Protocol(一致性协议):底层同时实现了 Distro(AP,最终一致性,用于临时实例同步)和 Raft(CP,强一致性,用于持久实例和配置数据),根据数据类型自动选择。

2.1.3 接入 Spring Cloud 生态

Nacos 通过 spring-cloud-starter-alibaba-nacos-discovery 接入 Spring Cloud,服务提供者启动时自动注册到 Nacos,消费者通过服务名自动发现并负载均衡调用。详细的代码示例见本文第三章实战部分。

2.2 Consul

2.2.1 介绍

Consul是HashiCorp推出的一款软件,是一个Service Mesh解决方案,提供了功能丰富的控制面功能:

1、Service Discovery(服务发现)

2、Configuration(配置化)

3、Segmentation Functionality

这些功能可以根据需要独立使用,或者将它们一起使用用来构建完整的Service Mesh。

Consul提供的关键功能如下:

1、Service Discovery:服务注册/发现功能。

2、Health Checking:健康检查,丰富的健康检查方式;

3、KV Store:KV存储功能,可应用多种场景,如动态配置存储,分布式协调、leader选举等。

4、Multi DataCenter:多数据中心。

2.2.2 整体架构

image_6_12.png

如上图为Consul的架构,这边对技术点做一下说明:

1、Raft: 一种分布式一致性算法,Consul使用该算法保持强一致性,所以也是典型的CP模式

2、Client:Client是一种agent,其将会重定向所有的RPC 请求到Server。Client是无状态的,其主要参与LAN Gossip协议池。其占用很少的资源,并且消耗很少的网络带宽。

3、Server:Server是一种agent,其包含了一系列的责任包括:参与Raft协议写半数(Raft Quorum)、维护集群状态、响应RPC响应、和其他Datacenter通过WAN gossip交换信息和重定向查询请求至leader或者远端Datacenter。

4、Datacenter: Datacenter其是私有的、低延迟、高带宽的网络环境,去除了在公共网络上的网络交互。

5、Consensus: Consensus一致性在leader 选举、顺序执行transaction 上。当这些事务已经提交至有限状态机(finite-state machine)中,Consul定义consensus作为复制状态机的一致性。本质上使用实现了Raft协议,对于具体实现细节可参考 Consensus Protocol。

6、Gossip:Consul使用了Serf,其提供了Gossip协议多种用途,Serf提供成员关系、失败检查和事件广播。

7、LAN Gossip: Local Area Network Gossip其包含在同一个网络环境或Datacenter的节点。

8、WAN Gossip: Wide Area Network Gossip 其只包含Server节点,这些server分布在不同的datacenter中,其主要通过因特网或广域网相互交流。

9、RPC: 远程过程调用,用于服务之间的通信。

10、CAP抉择:在高可用方面,Consul使用Raft协议作为其分布式一致性协议,本身对故障节点有一定的容忍性,在单个DataCenter中Consul集群中节点的数量控制在2*n + 1个节点,其中n为可容忍的宕机个数,通常为3个节点。

所以是典型的CP模式。

image_6_13.png

根据Consul 的选举机制和服务原理,我们有两个注意点 :

1、部署Consul Service 节点应该奇数为宜,因为+1的偶数节点和奇数节点可容忍的故障数是一样的,比如上图3和4,另一方面,偶数个节点在选主节点的时候可能会出现二分选票的情况,还得重新选举。

2、Consul Service 节点数不是越多越好,虽然Server数量越多可容忍的故障数越多,但是Raft进行日志复制也是很耗时间的,而且Server数量越多,性能越低,所以结合实际场景,一般建议Server部署3个即可。

有兴趣的同学可以去Consul官网看看它的选举机制,还可以对比下Redis中Sentinel模式。

2.3 Etcd

2.3.1 介绍

Etcd 是由 CoreOS 团队开发的一款分布式键值存储系统,使用 Go 语言编写,基于 Raft 一致性协议实现数据的强一致性保证。Etcd 最广为人知的角色是 Kubernetes 的默认存储后端,负责存储集群的所有配置数据和状态信息。

Etcd 的关键特性如下:

1、强一致性:基于 Raft 协议,保证集群中所有节点的数据一致,属于典型的 CP 系统。

2、Watch 机制:客户端可以对某个 Key 或前缀设置 Watch,当数据发生变化时,Etcd 会主动推送通知,非常适合服务发现场景。

3、高性能读写:支持每秒数万次的读写操作,低延迟的响应保证了在高并发场景下的可用性。

4、Kubernetes 的默认存储后端:K8S 中 Service、Endpoint、Pod 等核心资源的注册与发现都依赖 Etcd。

2.3.2 整体架构

Etcd 集群通常由奇数个节点(建议 3 或 5 个)组成,通过 Raft 协议选举 Leader 节点:

1、Leader 选举:集群启动或 Leader 故障时,通过 Raft 协议在 Follower 中选举新的 Leader,所有写请求由 Leader 处理。

2、日志复制:Leader 将写请求以日志形式复制到多数 Follower 节点,当多数节点确认后,该写入才被提交,保证了强一致性。

3、数据模型:Etcd 使用扁平的 Key-Value 模型,支持前缀查询和范围查询,配合 Lease(租约)机制实现 TTL 过期,天然适合服务注册场景。

2.3.3 Kubernetes 中的服务发现

在 Kubernetes 生态中,Etcd 是服务发现的核心基础设施:

1、Pod 启动后,其 IP 和端口信息通过 Endpoint 资源写入 Etcd。

2、K8S Service 通过 Label Selector 关联 Pod,对应的 Endpoint 列表存储在 Etcd 中。

3、kube-proxy 或 CoreDNS 通过 Watch Etcd 中的 Service/Endpoint 变化,实时更新路由规则或 DNS 记录。

这种机制使得 Kubernetes 中的服务注册与发现完全自动化,无需业务代码介入。

2.4 ZooKeeper

介绍

作为一个分布式的、开源的协调服务,ZooKeeper 实现了一系列基础功能,包括简单易用的接口。这些接口被用来实现服务的注册与发现、数据同步、分布式锁、配置中心、集群选举、命名服务等。

image_6_8.png

在数据模型上,类似于传统的文件系统,节点类型分为:

1、持久节点:节点创建后一直存在,除非执行删除操作。

2、临时节点(注册中心场景下的主要实现机制):临时节点的生命周期和客户端会话绑定,客户端会话失效后节点自动清除。微服务启动时创建临时节点,停止后节点自动消失。

image_6_9.png

ZooKeeper 的核心特点:最终一致性、可靠性(消息被一台服务器接受则被所有服务器接受)、原子性(更新只能成功或失败)、顺序性(所有 Server 消息发布顺序一致)。

整体架构

image_6_10.png

ZooKeeper 集群通过选举产生 Leader,使用 Paxos/ZAB 强一致性算法,是典型的 CP 系统。多个节点组成分布式架构,每个 Server 在内存中存储一份数据,Leader 负责处理数据更新操作。

接入 Dubbo 生态

image_6_11.png

ZooKeeper 在注册中心方面对 Dubbo 生态支持较好。Provider 启动时向 ZooKeeper 注册信息,Consumer 启动时向 ZooKeeper 订阅,当 Provider 信息变化时 ZooKeeper 主动推送通知变更(与 Eureka 的定时拉取不同)。

注意:虽然 ZooKeeper 在 Dubbo 生态中仍有大量存量使用,但 Dubbo 3.x 已原生支持 Nacos 作为注册中心,新项目建议优先选择 Nacos。

2.5 Eureka(已停止维护)

Netflix Eureka 2.0 已停止开发,Eureka 1.x 处于维护模式。新项目不建议使用。本节仅作为历史参考。

Eureka 是 Netflix OSS 套件中的服务注册与发现组件,早期因 Spring Cloud 的集成和推广而被广泛采用。其核心设计思想(Peer-to-Peer 对等通信、AP 优先、自我保护机制)对后续注册中心产品有深远影响。

核心特点:去中心化架构(无 Master/Slave),节点间通过复制保持最终一致性,属于 CAP 中的 AP 系统。支持自我保护(大量心跳丢失时不立即剔除实例)。

不推荐的原因:不支持 Watch 推送(只能定时拉取,感知延迟高)、无内置配置管理能力、社区已停止活跃开发。

2.6 总结对比

指标 Eureka Zookeeper Consul Etcd Nacos
一致性协议 AP CP(Paxos算法) CP(Raft算法) CP(Raft算法) AP/CP(Distro+Raft)
健康检查 TTL(Time To Live) TCP Keep Alive TTL\HTTP\TCP\Script Lease TTL KeepAlive TTL\HTTP\TCP\Client Beat
watch/long polling 不支持 watch long polling watch long polling + push
雪崩保护 支持 不支持 不支持 不支持 支持
安全与权限 不支持 ACL ACL RBAC RBAC
是否支持多数据中心
是否有管理界面 否(可用第三方ZkTools)
Spring Cloud 集成 支持 支持 支持 支持 支持
Dubbo 集成 不支持 支持 支持 不支持 支持
K8S 集成 不支持 不支持 支持 支持 支持

Eureka是典型的AP类型,Zookeeper和Consul是典型的CP类型。如何选择取决你的业务是倾向A:高可用性 还是 C:强一致性。

当然,业务是复杂的,在真正的技术选型时,还是要根据自己的实际业务现状来判断。有一些倾向,比如你的系统是Spring Cloud体系下,那优先选择Nacos、Consul。

如果业务会更多向云原生对齐,则Consul、Etcd会是比较优先的选择。如果是国内 Spring Cloud 或 Dubbo 生态,Nacos 凭借注册发现与配置管理一体化的能力,已成为首选方案。

3 Spring Cloud 框架下实战

Spring Cloud是微服务架构的一站式解决方案,我们平时构建微服务的过程中需要做的如配置管理、服务发现、负载均衡、断路器、智能路由、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作。Spring Cloud 为我们提供了一套简易的编程模型,使我们能在 Spring Boot 的基础上轻松地实现微服务项目的构建。

Spring Cloud 为服务治理做了一层抽象,支持多种注册中心的无缝切换(Nacos、Consul、Eureka 等),不影响业务代码中的注册、发现、调用逻辑。下面以当前主流的 NacosConsul 为例,演示 Spring Cloud 下的服务注册与发现实战。

3.1 Spring Cloud Nacos 实战

Nacos 作为注册中心接入 Spring Cloud 非常简便,通过 Spring Cloud Alibaba 提供的 spring-cloud-starter-alibaba-nacos-discovery 即可完成集成。

3.1.1 启动 Nacos Server

Nacos 官方 Release 下载最新稳定版,解压后启动:

# 单机模式启动(开发环境)
sh startup.sh -m standalone

启动后访问 http://localhost:8848/nacos,默认账号密码均为 nacos,可以看到 Nacos 控制台。

3.1.2 创建服务提供者

创建 Spring Boot 项目,pom.xml 中引入依赖:

<dependencies>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

application.yml 配置:

server:
  port: 8001
spring:
  application:
    name: nacos-provider          # 服务名称,注册到 Nacos 后其他服务通过此名称发现
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848   # Nacos Server 地址
        namespace: public              # 命名空间(多环境隔离)

主类无需额外注解(Spring Cloud Alibaba 会自动启用服务注册):

@SpringBootApplication
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}

提供一个简单的接口:

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello(@RequestParam String name) {
        return "Hello, " + name + " from Nacos Provider!";
    }
}

启动后,在 Nacos 控制台的"服务列表"中可以看到 nacos-provider 已注册。

3.1.3 创建服务消费者

创建另一个 Spring Boot 项目作为消费者,同样引入 nacos-discovery 依赖。application.yml

server:
  port: 8002
spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

通过 @LoadBalanced + RestTemplate 实现基于服务名的调用:

@SpringBootApplication
public class ConsumerApplication {
    @Bean
    @LoadBalanced   // 开启客户端负载均衡
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}
@RestController
public class ConsumerController {
    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/call")
    public String call() {
        // 直接使用服务名 nacos-provider 替代 IP:Port
        return restTemplate.getForObject(
            "http://nacos-provider/hello?name=Consumer", String.class);
    }
}

访问 http://localhost:8002/call,返回 Hello, Consumer from Nacos Provider!。整个过程中,消费者不需要知道提供者的 IP 和端口——通过 Nacos 注册中心自动发现。

3.1.4 Nacos 的额外能力

相比其他注册中心,Nacos 在 Spring Cloud 生态中还提供以下开箱即用的能力:

能力 说明
配置管理 spring-cloud-starter-alibaba-nacos-config,无需额外部署 Spring Cloud Config
命名空间隔离 通过 namespace 实现多环境(dev/staging/prod)隔离
服务分组 通过 group 实现同一命名空间内的逻辑分组
权重路由 在控制台直接调整实例权重,实现流量调配
健康检查 同时支持客户端心跳(临时实例)和服务端主动探测(持久实例)

3.2 Spring Cloud Consul 实战

Consul 用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案,Consul 的方案更具"一站式"特征,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其它工具(比如 ZooKeeper 之类的)。

而Spring Cloud Consul ,是将其作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置的工具。

3.2.1 Consul 的优势

1、使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接。

2、支持多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟, 分片等情况等。 zookeeper 和 etcd 均不提供多数据中心功能的支持,上面表格中有体现。

3、支持健康检查。

4、支持 http 和 dns 协议接口。 zookeeper 的集成较为复杂, etcd 只支持 http 协议。

5、官方提供 web 管理界面, etcd 无此功能。

3.2.2 安装Consul注册中心

1、官方下载64版本 :https://www.consul.io/downloads.html

2、解压后复制到目录 /usr/local/bin 下

3、启动终端,先看下啥版本的

liyifei@MacPro ~ % consul --version
Consul v1.10.4
Revision 7bbad6fe
Protocol spoken by default, understands to (agent will automatically use protocol >when speaking to compatible agents)

4、执行安装命令,可以看到他的 Client Addr 的端口为8500。所以访问 8500端口站点,http://127.0.0.1:8500/ui/dc1/services

  liyifei@MacPro ~ % consul agent -dev
  ==> Starting Consul agent...
             Version: '1.10.4'
             Node ID: '6db154b4-62ff-e67d-e745-1a7270fa1ce8'
           Node name: 'B000000147796DS'
          Datacenter: 'dc1' (Segment: '<all>')
              Server: true (Bootstrap: false)
         Client Addr: [127.0.0.1] (HTTP: 8500, HTTPS: -1, gRPC: 8502, DNS: 8600)
        Cluster Addr: 127.0.0.(LAN: 8301, WAN: 8302)
           Encrypt: Gossip: false, TLS-Outgoing: false, TLS-Incoming: false, Auto-Encrypt-TLS: false

image_7_4.png

我们可以看到,现在没有客户端注册上来,只有一个自身的实例。

3.2.3 创建服务提供者

由于Spring Cloud Consul项目的实现,我们可以轻松的将基于Spring Boot的微服务应用注册到Consul上,并通过此实现微服务架构中的服务治理。

我们在micro-service-center下新建一个cloud项目consul-client,该项目pom文件添加如下:

<xml>
  <!--    在子工程中添加父工程名称-->
  <parent>
    <groupId>com.microservice</groupId>
    <artifactId>center</artifactId>
    <version>1.0.0</version>
  </parent>

  <dependencies>
    <!--        Consul服务发现-->
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-consul-discovery</artifactId>
    </dependency>
    <!--        Consul健康检查-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
  </dependencies>
</xml>

然后修改一下application.yml的配置信息,将consul配置写入,注释应该很清楚了,如下:

spring:
  application:
    name: consul-producer # 当前服务的名称
  cloud:
    consul: # 以下为Consuk注册中心的地址,如果安装的不是这个host和port,这边可以调整
      host: localhost
      port: 8500
server:
  port: 8501 # 当前服务的端口

同样的,我们要在应用主类Application文件中通过加上@EnableDiscoveryClient注解,该注解保证当前服务被Consul当成provider发现。

大家看到这个做法跟Eureka一样,因为Spring Cloud对服务治理做的一层抽象,所以可以屏蔽Eureka和Consul服务治理的实现细节,

程序上不需要做改变,只需要引入不同的服务治理依赖,并配置相关的配置属性 就能轻松的将微服务纳入Spring Cloud的各个服务治理框架中。

@SpringBootApplication
@EnableDiscoveryClient
public class ConsulClientApplication {
    public static void main(String[] args) {
        SpringApplication.run(ClientApplication.class, args);
    }
}

修改完成之后,我们就可以把这个服务提供者启动了,然后再去注册中心查看服务的注册情况,就可以看到被注册进来的Provider(consul-producer):

image_7_5.png

3.2.4 生态对接 Spring Cloud

image_6_14.png

Consul作为注册中心,集成在Spring Cloud生态。可以看出,跟Eureka对接到Spring Cloud 生态的过程很像。

但是这边的健康检查更丰富,可以有多种不同的的Check方式:

  • Script check(Script+ Interval)
  • 基于HTTP请求
  • 基于tcp请求
  • 基于grpc请求

4 总结

无论何种注册中心技术,本质上都是为了解决微服务中的如下问题:

解耦服务之间相互依赖的细节

我们知道服务之间的远程调用必须要知道对方的IP、端口信息。我们可以在调用方直接配置被调用方的IP、端口,这种调用方直接依赖IP、端口的方式存在明显的问题,如被调用的IP、端口变化后,调用方法也要同步修改。

通过服务发现,将服务之间IP与端口的依赖转化为服务名的依赖,服务名可以根据具微服务业务来做标识,因此,屏蔽、解耦服务之间的依赖细节是服务发现与注册解决的第一个问题。

对微服务进行动态管理

在微服务架构中,服务众多,服务之间的相互依赖也错综复杂,无论是服务主动停止,意外挂掉,还是因为流量增加对服务实现进行扩容,这些服务数据或状态上的动态变化,都需要尽快的通知到被调用方,被调用方才采取相应的措施。因此,对于服务注册与发现要实时管理者服务的数据与状态,包括服务的注册上线、服务主动下线,异常服务的剔除。


系列导航

加载导航中...

评论