微服务架构中的服务发现与 Consul 实践
在微服务架构中,服务之间的通信是核心问题之一。随着服务数量的增长,如何高效地管理和定位服务实例变得尤为重要。本文将介绍服务发现的基本概念,并详细讲解如何使用 Consul 进行服务注册、发现和健康检查。
1. 什么是服务发现?
在传统的单体架构中,服务调用通常是静态配置的,比如直接使用固定的 IP 地址或 DNS 名称。但是在微服务架构中,服务实例通常是动态创建和销毁的,这就需要一种机制来让服务能够自动发现彼此。
(1) 传统的服务定位方式
-
静态 IP 地址:手动配置,难以维护。
-
DNS 解析:可以使用负载均衡,但更新不够灵活,依赖 TTL。
(2) 现代的服务发现机制
-
基于注册中心的服务发现:如 Consul、Eureka、Zookeeper。
-
服务自动注册与动态更新,支持健康检查。
-
提供 REST API 和 DNS 解析,让服务能够方便地查找其他微服务。
Consul 是 HashiCorp 提供的一款强大的服务发现和健康检查工具,支持 DNS 和 HTTP 接口,同时具有内置的健康检查、KV 存储等功能,适用于大规模微服务架构。
2. 搭建 Consul 服务发现机制
(1) 启动 Consul
首先,我们需要在本地或服务器上运行 Consul:
consul agent -dev
然后可以通过 http://127.0.0.1:8500 访问 Consul Web 控制台,查看已注册的服务。
3. 服务注册:创建 loginService 并注册到 Consul
我们将创建一个简单的 loginService.js,监听 3000 端口,并提供一个 /health 接口。
(1) 创建 loginService.js
const express = require('express');
const app = express();app.get('/health', (req, res) => {res.status(200).send('OK');
});app.listen(3000, () => {console.log('loginService 运行在 http://127.0.0.1:3000');
});
运行:
node loginService.js
(2) 创建 loginServiceRegister.js 进行服务注册
现在,我们需要将 loginService 注册到 Consul。创建 loginServiceRegister.js,用于向 Consul 发送注册请求。
const consul = require('consul')({ host: '127.0.0.1', port: 8500 });const serviceId = 'login-service-3000';consul.agent.service.register({id: serviceId,name: 'loginService',address: '127.0.0.1',port: 3000,check: {http: 'http://127.0.0.1:3000/health',interval: '10s'}
}, (err) => {if (err) {console.error('服务注册失败:', err);} else {console.log('loginService 注册成功');}
});
运行:
node loginServiceRegister.js
注册成功后,可以在 http://127.0.0.1:8500 Consul 控制台中查看 loginService。
4. 服务发现:查找已注册的服务
创建 findServiceFromConsul.js,查询 loginService 的状态。
const consul = require('consul')({ host: '127.0.0.1', port: 8500 });consul.agent.service.list((err, services) => {if (err) {console.error('查询服务失败:', err);return;}console.log('已注册服务:', services);
});
运行:
node findServiceFromConsul.js
可以看到已注册的 loginService 及其详细信息。
5. 健康检查与动态更新
Consul 提供强大的健康检查机制,确保故障服务不会被继续调用。
-
健康检查的作用:
-
确保服务正常运行。
-
当
loginService停止时,Consul 会自动将其标记为不可用。
-
(1) 停止服务,观察 Consul 变化
-
先运行
loginService.js,确保服务正常。 -
停止
loginService.js,然后刷新 Consul 控制台。 -
你会发现
loginService状态变为 Critical(异常)。
(2) 重新启动 loginService.js,自动恢复
再次运行:
node loginService.js
然后刷新 Consul 控制台,你会发现 loginService 状态恢复为 Healthy(正常)。
6. 总结
| 方案 | 适用场景 | 优缺点 |
|---|---|---|
| DNS 解析 | 适用于静态服务 | 简单但不够动态 |
| Consul 服务发现 | 适用于微服务 | 动态注册,支持健康检查 |
(1) 主要收获
-
Consul 允许微服务动态注册和发现。
-
结合健康检查,提升系统可靠性。
-
可以通过 HTTP API 或 DNS 方式发现服务。
(2) 下一步优化方向
-
自动化部署 Consul(如 Kubernetes + Helm)。
-
结合负载均衡(如 Traefik、Nginx)进行服务均衡。
-
使用 ACL 进行服务访问控制。
至此,我们完成了 服务注册、发现和健康检查 的完整流程。希望这篇文章能帮助你理解 Consul 在微服务架构中的作用,并能够在项目中应用!🚀
相关文章:
微服务架构中的服务发现与 Consul 实践
在微服务架构中,服务之间的通信是核心问题之一。随着服务数量的增长,如何高效地管理和定位服务实例变得尤为重要。本文将介绍服务发现的基本概念,并详细讲解如何使用 Consul 进行服务注册、发现和健康检查。 1. 什么是服务发现? …...
医院挂号预约小程序|基于微信小程序的医院挂号预约系统设计与实现(源码+数据库+文档)
医院挂号预约小程序 目录 基于微信小程序的医院挂号预约系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、小程序用户端 2、系统服务端 (1) 用户管理 (2)医院管理 (3)医生管理 …...
Emacs 折腾日记(十九)——配置输入法和vim操作方式
上一篇文章中,我们将Emacs变得稍微好看了点。换成了自己喜欢的主题和颜色,这样每天用起来也比较养眼,不会特别排斥。本篇文章的主要任务就是配置输入法方便输入中文以及将vim的操作模式搬到Emacs中。进一步提到Emacs的可用性 配置中文输入法…...
蓝桥杯第十届 特别的数
题目描述 小明对数位中含有 2、0、1、9 的数字很感兴趣(不包括前导 0),在 1 到 40 中这样的数包括 1、2、9、10 至 32、39 和 40,共 28 个,他们的和是 574。 请问,在 1 到 n 中,所有这样的数的…...
Qt开发:QInputDialog的使用
文章目录 一、QInputDialog的介绍二、 QInputDialog的基本用法三、使用 QInputDialog的实例四、QInputDialog的信号与槽 一、QInputDialog的介绍 QInputDialog 是 Qt 提供的一个对话框类,用于获取用户输入的文本、整数或浮点数。它提供了简单易用的静态方法和可定制…...
redis--JavaSpring客户端
目录 一、引言 二、配置 三、相关操作 四、总结 一、引言 本篇文章会将redis与spring项目进行结合,看看再spring项目中,redis是如何使用的 二、配置 三、相关操作 四、总结 在spring项目中的使用和在基础项目上的使用有差异,但是差异并不大…...
2、二分和贪心
一、二分 这里有个小技巧,你会发现,只要是求最大最小最多等等的贪心过程,我们就有3种方法:①二分②贪心算法③动态规划 我们先讲二分和贪心,动态规划比较麻烦,留到后期。 1、了解 2、模版 class Solution …...
QuecPython 网络协议之TCP/UDP协议最祥解析
概述 IP 地址与域名 IP 地址是网络中的主机地址,用于两台网络主机能够互相找到彼此,这也是网络通信能够成功进行的基础。IP 地址一般以点分十进制的字符串来表示,如192.168.1.1。 我们日常访问的网站,其所在的服务器主机都有…...
ISIS-2 邻居建立关系
上一章我们介绍了ISIS的基础概念以及报文内容和作用在什么样的场景下面的 这一章我们来介绍IS-IS的邻居建立关系 一、概念 IS-IS中路由器的角色可分为L1、L2、L1/2这三种类型其中的L1/L2有点类似与我们OSPF中的ABR IS-IS中的邻居关系分为L1与L2邻居关系,其中所有建立L2邻居关…...
Nature Machine Intelligence 嵌入式大语言模型使机器人能够在不可预测的环境中完成复杂的任务
近期英国爱丁堡大学发表Nature Machine Intelligence研究工作,提出了一种名为ELLMER(具身大型语言模型支持机器人)的创新框架,通过整合大型语言模型(如GPT-4)、检索增强生成(RAG)、视…...
Springboot整合elasticsearch详解 封装模版 仓库方法 如何在linux里安装elasticsearch
目录 版本 下载地址 ElasticSearch频繁报503错误 开放 9300 和 9200 两个端口 测试联通性 改动包装类 elasticsearchTemplate getAllRespRepository 封装elasticsearchService 业务逻辑 版本 首先要对应版本 这是我在官网找到的版本信息 一定要 springboot 和 es 相…...
【矩阵快速幂】P6601 「EZEC-2」机器|普及+
本文涉及知识点 【矩阵快速幂】封装类及测试用例及样例 P6601 「EZEC-2」机器 题目背景 tlx 喜欢科幻小说。 小宇宙中只剩下漂流瓶和生态球。漂流瓶隐没于黑暗里,在一千米见方的宇宙中,只有生态球里的小太阳发出一点光芒。在这个小小的生命世界中,几只清澈的水球在零重力环…...
FPGA助力智能机器人应用
今年开年AI机器人引爆科技圈,都说FPGA是“万能芯”,在AI方向上已经挣扎了几年,仍旧不能“破圈”,那么在机器人方向呢? 个人观点我是不太看好目前FPGA能在机器人方面能“破圈”,但是一切皆有可能,…...
如何在jupyter notebook中使用django框架
(最好以管理员身份进入,否则在安装某些内容时会报错) 一.创建一个名为new_env虚拟环境 输入以下指令创建名为new_env的虚拟环境: conda create -n new_env python3.8 回车,出现以下内容,输入y确认安装,等待安装完毕…...
Axure RP9.0教程: 多级联动【设置选项改变时->情形->面板状态】(给动态面板元件设置相关交互事件的情形,来控制其他面板不同的状态。)
文章目录 引言I 多级联动(省、市、区)实现思路添加三省、市、区下拉列表给省下拉框添加数据源将市、区下拉框添加不同状态,分别以省、市命名给省下拉控件设置选项改变时的交互事件省下拉控件的交互事件情形市下拉交互事件的配置II 知识扩展: 展示省 → 地级市 → 区县的多级…...
速卖通vs亚马逊SP-API:接口权限、数据字段与采集成本对比测评
以下是关于速卖通和亚马逊 SP - API 在接口权限、数据字段与采集成本方面的对比测评: 接口权限 速卖通 申请流程:需在速卖通平台注册账号,创建应用后获取 API Key 和 Secret 等凭证。一般要填写企业或个人的相关信息,经过平台审…...
Rabbitmq消息被消费时抛异常,进入Unacked 状态,进而导致消费者不断尝试消费(下)
一、消费流程图 消息在消费出现异常的时候,将一直保留在消息队列,所以你会看到以下奇怪的现象: 消息队列仅有5个消息, 投递速度也非常快,结果却一直无法消费掉。 二、重试策略 重试机制的使用场景:重试机制…...
Java 基础入门代码示例解析
在 Java 编程的学习过程中,理解函数(方法)的使用以及简单系统功能的实现是非常重要的基础。本文将对一系列 Java 代码进行详细解析,这些代码涵盖了菜单驱动的功能选择、数据查询以及简单的 RBAC(基于角色的访问控制&am…...
AI 的“幻觉”现象:深入解析 Hallucination 的成因与应对之道
文章目录 一、啥是 AI 的 Hallucination?二、啥时候容易出现幻觉?1. 知识边界之外的问题2. 模糊或不明确的输入3. 生成长篇内容4. 多模态任务中的误解5. 过度自信的语气要求 三、幻觉为啥会出现?原理是啥?1. 概率预测的本质2. 训练…...
核心知识——论文详解
引入 在2010年,来自Berkeley的博士生 Matei Zaharia 发表了一篇论文《Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing》。伴随着这篇论文的,是一个开源系统,也就是 Spark。在之后的几年里&…...
LeetCode hot 100 每日一题(15)——48.旋转图像
这是一道难度为中等的题目,让我们来看看题目描述: 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 提示…...
屏幕后处理Post-Processing安装及使用
一、安装Post-Processing插件 在 Window --- PackageManager 中搜索并安装 Post-Processing 二、添加后处理效果步骤 给场景中的相机Camera添加 Post - process Layer,只有添加了该组件的相机才会进行相应的后处理,此组件允许您为该后处理层配置抗锯齿…...
探索Halo:不止是博客,更是创作新宇宙
开篇:邂逅 Halo 作为一名热爱写作与分享的博主,拥有一个称手的博客系统一直是我的追求。在探索博客系统的旅程中,我尝试过不少平台,从 WordPress 到 Hexo ,每一次转换都是为了寻找那个最完美的 “写作伴侣”。 WordP…...
吐血整理:Air8201如何使用LuatOS进行电源管理功能!
在物联网应用场景中,设备续航能力直接影响其部署成本与运维效率。LuatOS操作系统通过软件层面的精细化控制,为Air8201提供了灵活且高效的电源管理策略。本文将从系统架构、API接口、实战配置三个维度,解析如何利用LuatOS实现Air8201的智能电源…...
开源视觉语言模型MiniMax-VL-01:动态分辨率+4M超长文本,性能比肩GPT-4o
在人工智能领域,构建能够像人类一样理解、思考和行动的智能体(AI Agent)一直是研究人员的终极目标之一。而实现这一目标的关键在于模型是否具备足够强大的感知能力、记忆能力和推理能力。近期,国内人工智能公司MiniMax重磅开源了其…...
数据库:一文掌握 Neo4J 的各种指令(Neo4J指令备忘)
文章目录 入门Neo4J运行 Neo4J 使用进入管理页面 图数据库概念 Neo4j 语法读取查询结构仅写入查询结构读取-写入查询结构 Neo4j 读取数据MATCHWHERERETURNWITHUNION Neo4j 写入数据CREATESETMERGEDELETEREMOVEFOREACH调用子查询调用存储过程导入运算符nullPatternsUSESHOW FUNC…...
Java面试第十三山!《设计模式》
大家好,我是陈一。如果文章对你有帮助,请留下一个宝贵的三连哦~ 万分感谢! 一、设计模式入门指南 1. 什么是设计模式? 设计模式是可复用的解决方案模板,用于解决软件开发中常见的架构问题。如同建筑领域的…...
从 @SpringBootApplication 出发,深度剖析 Spring Boot 自动装配原理
在 Spring Boot 的开发旅程中,SpringBootApplication 注解堪称开启便捷开发之门的钥匙。它不仅是一个简单的注解,更是理解 Spring Boot 自动装配原理的重要入口。接下来,我们将以SpringBootApplication 为切入点,深入探究 Spring …...
使用vue3和vue-router实现动态添加和删除cachedViews数组
以下是一个使用 Vue 3 和 Vue Router 实现动态添加和删除 cachedViews 数组的代码示例,该示例结合 keep-alive 组件来动态控制路由组件的缓存。 src/ ├── App.vue ├── router/ │ └── index.js ├── views/ │ ├── Home.vue │ ├── About.v…...
vue 点击放大,图片预览效果
背景: 在使用vue框架element组件的背景下,我们对图片的展示需要点击放大(单张);如果是多张图片,要支持左右滑动查看多张图片(多张)。 单张图片放大,el-image图片组件,或者原生的img标签。 多张图片放大&…...
