点击上方“芋道源码”,选择“设为星标”
做积极的人,而不是积极废人!
源码精品专栏
摘要: 原创出处 http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Discovery/ 「芋道源码」欢迎转载,保留摘要,谢谢!
1. 概述
2. 注册中心原理
3. 快速入门
4. Nacos 概念详解
5. 更多的配置项信息
6. 多环境配置
7. 监控端点
666. 彩蛋
本文在提供完整代码示例,可见 https://github.com/YunaiV/SpringBoot-Labs 的 labx-01 目录。
原创不易,给点个 Star 嘿,一起冲鸭!
1. 概述
本文我们来学习 Spring Cloud Alibaba 提供的 Spring Cloud Alibaba Nacos Discovery 组件,基于 Spring Cloud 的编程模型,接入 Nacos 作为注册中心,实现服务的注册与发现。
服务注册/发现: Nacos Discovery
服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于服务的动态扩缩容。
Nacos Discovery 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。
除此之外,Nacos Discovery 也将服务实例自身的一些元数据信息-例如 host,port, 健康检查URL,主页等内容注册到 Nacos。
在开始本文之前,胖友需要对 Nacos 进行简单的学习。可以阅读《Nacos 安装部署》文章,将第一二小节看完,在本机搭建一个 Nacos 服务。
2. 注册中心原理
在开始搭建 Nacos Discovery 的示例之前,我们先来简单了解下注册中心的原理。
在使用注册中心时,一共有三种角色:服务提供者(Service Provider)、服务消费者(Service Consumer)、注册中心(Registry)。
在一些文章中,服务提供者被称为 Server,服务消费者被称为 Client。胖友们知道即可。
三个角色交互如下图所示:
Provider:
-
启动时,向 Registry 注册自己为一个服务(Service)的实例(Instance)。
同时,定期向 Registry 发送心跳,告诉自己还存活。
关闭时,向 Registry 取消注册。
Consumer:
-
启动时,向 Registry 订阅使用到的服务,并缓存服务的实例列表在内存中。
后续,Consumer 向对应服务的 Provider 发起调用时,从内存中的该服务的实例列表选择一个,进行远程调用。
关闭时,向 Registry 取消订阅。
Registry:
-
Provider 超过一定时间未心跳时,从服务的实例列表移除。
服务的实例列表发生变化(新增或者移除)时,通知订阅该服务的 Consumer,从而让 Consumer 能够刷新本地缓存。
当然,不同的注册中心可能在实现原理上会略有差异。例如说,Eureka 注册中心,并不提供通知功能,而是 Eureka Client 自己定期轮询,实现本地缓存的更新。
另外,Provider 和 Consumer 是角色上的定义,一个服务同时即可以是 Provider 也可以作为 Consumer。例如说,优惠劵服务可以给订单服务提供接口,同时又调用用户服务提供的接口。
3. 快速入门
示例代码对应仓库:
服务提供者:
labx-01-sca-nacos-discovery-demo01-provider
服务消费者:
labx-01-sca-nacos-discovery-demo01-consumer
本小节,我们来搭建一个 Nacos Discovery 组件的快速入门示例。步骤如下:
首先,搭建一个服务提供者
demo-provider
,注册服务到 Nacos 中。然后,搭建一个服务消费者
demo-consumer
,从 Nacos 获取到demo-provider
服务的实例列表,选择其中一个示例,进行 HTTP 远程调用。
3.1 搭建服务提供者
创建 labx-01-sca-nacos-discovery-demo01-provider
项目,作为服务提供者 demo-provider
。最终项目代码如下图所示:
3.1.1 引入依赖
在 pom.xml
文件中,主要引入 Spring Cloud Nacos Discovery 相关依赖。代码如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>labx-01</artifactId>
<groupId>cn.iocoder.springboot.labs</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>labx-01-sca-nacos-discovery-demo01-provider</artifactId>
<properties>
<spring.boot.version>2.2.4.RELEASE</spring.boot.version>
<spring.cloud.version>Hoxton.SR1</spring.cloud.version>
<spring.cloud.alibaba.version>2.2.0.RELEASE</spring.cloud.alibaba.version>
</properties>
<!--
引入 Spring Boot、Spring Cloud、Spring Cloud Alibaba 三者 BOM 文件,进行依赖版本的管理,防止不兼容。
在 https://dwz.cn/mcLIfNKt 文章中,Spring Cloud Alibaba 开发团队推荐了三者的依赖关系
-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>${spring.boot.version}</version>
<type