SpringCloud——Consul服务注册与发现
一、为什么要引入服务注册中心
(1)为什么引入

微服务硬编码 IP / 端口的核心问题总结
- 环境变更敏感:当支付微服务的 IP 或端口修改时,订单微服务必须同步修改所有调用该支付服务的代码或配置,否则将无法正常通信
- 无法实现负载均衡:若支付微服务部署了多个实例(如 3 台服务器),订单微服务硬编码固定 IP 只能访问其中一台,无法自动将请求分散到多个实例,导致部分服务器压力过大,另一部分闲置
- 扩展维护困难:当系统需要增加微服务实例(如新增 2 台支付服务器)时,硬编码的方式需要手动修改所有订单微服务的配置,操作繁琐且容易遗漏
解决方案方向
- 服务注册与发现:使用工具(如 Eureka、Consul)自动管理服务的 IP 和端口,调用方无需硬编码
- 负载均衡:结合 Ribbon、Nginx 等工具,自动将请求分发到多个微服务实例
- 配置中心:通过集中配置管理(如 Nacos、Apollo)动态更新服务地址,减少手动修改
(2)对照大纲
二、为什么不再使用传统老牌的Eureka
(1)Eureka停更进维

(2)Eureka对初学者不友好

(3)注册中心独立且和微服务解耦
目前主流服务中心,希望单独隔离出来而不是作为一个独立微服务嵌入到系统中

- 按照Netflix的之前的思路,注册中心Eureka也是作为一个微服务且需要程序员自己开发部署
- 实际情况,希望微服务和注册中心分离解耦,注册中心和业务无关的,不要混为一谈
- 提供类似tomcat一样独立的组件,微服务注册上去使用,是个成品
(4)阿里巴巴Nacos的崛起
Service discovery and configuration management
三、consul简介
(1)是什么
- consul官网地址Consul by HashiCorp
- What is Consul?

- 禁止使用问题:
- 条款链接:

- 放心用:

- 条款链接:
- spring consul:Spring Cloud Consul
(2)能干嘛
- 服务发现:提供HTTP和DNS两种发现方式
- 健康监测:支持多种方式,HTTP、TCP、Docker、Shell脚本定制化监控
- KV存储:key、value的存储方式
- 多数据中心:Consul支持多数据中心
- 可视化Web界面
(3)去哪下
Install | Consul | HashiCorp Developer
(4)怎么玩
- 网址:Spring Cloud Consul
- 两大作用:

四、安装并运行consul
(1)官网下载
(2)下载完成后只有一个cosul.exe文件,对应全路径下查看版本号信息
(3)使用开发模式启动
- consul agent -dev

- 通过以下地址可以访问Consul的首页:http://localhost:8500
- 结果页面

五、服务注册与发现
(1)服务提供者8001
5.1.1支付服务provider8001注册进consul
5.1.2POM
在原来POM文件的基础上,加上:
<!--SpringCloud consul discovery --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency>
配置来源:Quick Start :: Spring Cloud Consul
5.1.3YML
####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}

5.1.4主启动
添加@EnableDiscoveryClient,开启服务发现
5.1.5启动8001并查看consul控制台

(2)服务消费者80
5.2.1修改微服务cloud-consumer-order80
5.2.2POM
<!--SpringCloud consul discovery --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-discovery</artifactId></dependency>
5.2.3YML

spring:application:name: cloud-consumer-order####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:prefer-ip-address: true #优先使用服务ip进行注册service-name: ${spring.application.name}
5.2.4主启动类

5.2.5Controller


5.2.6启动80并查看consul控制台

5.2.7访问测试地址
- 访问http://localhost:80/consumer/pay/get/10
- 结果如何:
- 一个bug
- java.net.UnknownHostException: cloud-payment-service

5.2.8配置修改RestTemplateConfig




(3)三个注册中心异同点

5.3.1CAP
- C(Consistency):强一致性
- A(Availability):可用性
- P(Partition Tolerance):分区容错性
5.3.2经典CAP图
- 最多只能同时较好的满足两个
- CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求
- 因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:
- CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大
- CP - 满足一致性,分区容忍性的系统,通常性能不是特别高
- AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些

(1)AP(Eureka)

- 当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性
- 当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺牲了一致性结论:违背了一致性C的要求,只满足可用性和分区容错,即AP

(2)CP(Zookeeper/Consul)
- 当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性
- Consul 遵循CAP原理中的CP原则,保证了强一致性和分区容错性,且使用的是Raft算法,比zookeeper使用的Paxos算法更加简单。虽然保证了强一致性,但是可用性就相应下降了,例如服务注册的时间会稍长一些,因为 Consul 的 raft 协议要求必须过半数的节点都写入成功才认为注册成功 ;在leader挂掉了之后,重新选举出leader之前会导致Consul 服务不可用。结论:违背了可用性A的要求,只满足一致性和分区容错,即CP

六、服务配置与刷新
(1)分布式系统面临的→配置问题
微服务架构下,由于服务拆分导致大量独立服务实例,每个服务都需配置信息。集中式动态配置管理可解决重复配置问题,例如统一管理各服务相同的数据库配置,当主机迁移时只需修改一处即可全局生效
(2)官网说明


(3)服务配置案例步骤
6.3.1需求
- 通用全局配置信息,直接注册进Consul服务器,从Consul获取
- 既然Consul获取自然要遵守Consul的配置规则要求
6.3.2修改cloud-provider-payment8001
6.3.3POM
<!--SpringCloud consul config-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-consul-config</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

6.3.4YML
(1)配置规则说明

(2)新增配置文件bootstrap.yml
- 是什么


- bootstrap.yml
spring:application:name: cloud-payment-service####Spring Cloud Consul for Service Discoverycloud:consul:host: localhostport: 8500discovery:service-name: ${spring.application.name}config:profile-separator: '-' # default value is ",",we update '-'format: YAML# config/cloud-payment-service/data # /cloud-payment-service-dev/data # /cloud-payment-service-prod/data
(3)application.yml


6.3.5consul服务器key/value配置填写
(1)参考规则

(2)创建config文件夹,以/结尾

(3)config文件夹下分别创建其它三个文件夹,以/结尾

(4)在上述三个文件夹下分别创建data内容,data不再是文件夹

6.3.6controller
@Value("${server.port}")
private String port;@GetMapping(value = "/pay/get/info")
private String getInfoByConsul(@Value("${atguigu.info}") String atguiguInfo){return "atguiguInfo:" + atguiguInfo + ",port:" + port;
}
6.3.7测试

(4)动态刷新案例步骤
6.4.1问题
接上一步,我们在consul的dev配置分支修改了内容,马上访问,结果无效

6.4.2步骤
- @RefreshScope主启动类添加
- bootstrap.yml修改下(只为教学,实际别改)spring.cloud.consul.config.watch.wait-time



- 测试:

(5)思考
- 截至到这,服务配置和动态刷新全部通过,假设我重启Consul,之前的配置还在吗?
- 试试(之前的配置不在了)


相关文章:
SpringCloud——Consul服务注册与发现
一、为什么要引入服务注册中心 (1)为什么引入 微服务硬编码 IP / 端口的核心问题总结 环境变更敏感:当支付微服务的 IP 或端口修改时,订单微服务必须同步修改所有调用该支付服务的代码或配置,否则将无法正常通信无法…...
C语言_数据结构总结5:顺序栈
纯C语言代码,不涉及C 想了解链式栈的实现,欢迎查看这篇文章:C语言_数据结构总结6:链式栈-CSDN博客 这里分享插入一下个人觉得很有用的习惯: 1. 就是遇到代码哪里不理解的,你就问豆包,C知道&a…...
人工智能之数学基础:正交矩阵
本文重点 正交矩阵是线性代数中一个重要的特殊矩阵,它在许多领域都有广泛的应用。 什么是正交矩阵 如图所示,当矩阵A满足如上所示的条件的时候,此时我们就可以认为是正交矩阵,需要注意一点矩阵A必为方阵。 正交矩阵的充要条件 …...
前端打包优化相关 Webpack
前端打包优化相关 Webpack 打包时间的优化(基于 Vue CLI 4 Webpack 5) 1. Webpack 配置减少打包时间 1.1 对 JS 配置:排除 node_modules 和 src 中的打包内容 在开发环境下,修改 Webpack 的 JS 规则,排除 /node_m…...
抓包分析工具介绍
什么是抓包分析工具? 抓包分析工具,也称为网络数据包嗅探器或协议分析器,用于捕获和检查网络上传输的数据包。这些数据包包含了网络通信的详细信息,例如请求的资源、服务器的响应、HTTP 头信息、传输的数据内容等等。通过分析这些…...
Linux第一课
一、Linux背景与发展 1. 发展史 1968年,研究人员开发了Multics操作系统,为后续发展奠定了基础。 1969−1970年,Ken Thompson和Dennis Ritchie在Multics基础上开发了UNIX系统。 1991年,Linus Torvalds发布了Linux操作系统&#…...
2025/3/8 第 27 场 蓝桥入门赛 题解
1. 38红包【算法赛】 签到题: 算倍数就行了 #include <bits/stdc.h> using namespace std; int main() {int ans0;for(int i1;i<2025;i){if(i % 3 0)ans;else if(i % 8 0)ans;else if(i % 38 0)ans;}cout<<ans<<endl;return 0; } 2. 祝福…...
使用Node.js从零搭建DeepSeek本地部署(Express框架、Ollama)
目录 1.安装Node.js和npm2.初始化项目3.安装Ollama4.下载DeepSeek模型5.创建Node.js服务器6.运行服务器7.Web UI对话-Chrome插件-Page Assist 1.安装Node.js和npm 首先确保我们机器上已经安装了Node.js和npm。如果未安装,可以通过以下链接下载并安装适合我们操作系…...
deepseek 3FS编译
3FS在ubuntu22.04下的编译(记录下编译过程,方便后续使用) 环境信息 OS ubuntu 22.04内核版本 6.8.0-52-genericlibfuse 3.16.1rust 1.75.0FoundationDB 7.1.66meson 1.0.0ninja 1.10.1 libfuse编译 以下建议均在root下执行 pip3 install…...
网安知识点
1.SQL注入漏洞产生的原因是? 前端传到后端的数据,没有经过任何处理,直接当作sql语句的一部分来执行 2.讲一下sql注入,写入webshell需要哪些前提条件 开启导入导出权限secure-file-priv 站点根目录位置/路径 mysql用户对站点根目…...
UniApp 运行的微信小程序如何进行深度优化
UniApp 运行的微信小程序如何进行深度优化 目录 引言性能优化 1. 减少包体积2. 优化页面加载速度3. 减少 setData 调用4. 使用分包加载 代码优化 1. 减少不必要的代码2. 使用条件编译3. 优化图片资源 用户体验优化 1. 优化交互体验2. 预加载数据3. 使用骨架屏 调试与监控 1. …...
leetcode-sql数据库面试题冲刺(高频SQL五十题)
题目: 577.员工奖金 表:Employee -------------------- | Column Name | Type | -------------------- | empId | int | | name | varchar | | supervisor | int | | salary | int | -------------------- empId 是该表中具有唯一值的列。 该表的每一行…...
图片分类实战:食物分类问题(含半监督)
食物分类问题 simple_class 1. 导入必要的库和模块 import random import torch import torch.nn as nn import numpy as np import os from PIL import Image #读取图片数据 from torch.utils.data import Dataset, DataLoader from tqdm import tqdm from torchvision impo…...
Java初级入门学习
JAVA学习 @[TOC](JAVA学习)**一、Java初级入门学习路径****1. Java基础语法****2. 面向对象编程(OOP)****3. 数据库与JDBC****4. Java Web基础****二、主流框架推荐与学习建议****1. Spring框架****2. Spring MVC****3. MyBatis****4. Spring Boot****三、后续学习建议****1.…...
每日一练之移除链表元素
题目: 画图解析: 方法:双指针 解答代码(注:解答代码带解析): //题目给的结构体 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* }…...
BM25原理概述
1️⃣设定:对于查询 Q { q 1 , q 2 , . . . , q n } Q\text{}\{q_1,q_2,...,q_n\} Q{q1,q2,...,qn}和段落集 P { P ( 1 ) , P ( 2 ) , … , P ( N ) } \mathscr{P}\text{}\left\{P^{(1)},P^{(2)},\ldots,P^{(\text{N})}\right\} P{P(1),P(2),…,P(N)}&#…...
PAT乙级真题(2014·冬)
大纲 1031、查验身份证-(解析)-简单题 1032、挖掘机技术哪家强-(解析)-细节题(┬┬﹏┬┬),太抠细节了 1033、旧键盘打字-(解析)-输入格式!这才是重点(┬┬﹏┬┬),让…...
力大砖飞,纯暴力搜索——蓝桥p2110(写着玩的)
#include<bits/stdc.h>const int N1000000;using namespace std;bool mp[2][N];int cnt0; int n;void dfs(int row,int col){cntcnt%1000000007;if(coln && row2){cnt;return ;}if(row>2){ //下一列 dfs(0,col1);return;}if(mp[row][col]1){ //下一行 dfs(row…...
如何计算两个向量的余弦相似度
参考笔记: https://zhuanlan.zhihu.com/p/677639498 日常学习之:如何计算两个向量或者矩阵的余弦相似度-CSDN博客 1.余弦相似度定理 百度的解释:余弦相似度,又称为余弦相似性,是通过计算两个向量的夹角余弦值来评估…...
OkHttp:工作原理 拦截器链深度解析
目录 一、OKHttp 的基本使用 1. 添加依赖 2. 发起 HTTP 请求 3. 拦截器(Interceptor) 4. 高级配置 二、OKHttp 核心原理 1. 责任链模式(Interceptor Chain) 2. 连接池(ConnectionPool) 3. 请求调度…...
python: DDD+ORM using oracle 21c
sql script: create table GEOVINDU.School --創建表 ( SchoolId char(5) NOT NULL, -- SchoolName nvarchar2(500) NOT NULL, SchoolTelNo varchar(8) NULL, PRIMARY KEY (SchoolId) --#主鍵 );create table GEOVINDU.Teacher ( TeacherId char(5) NOT NULL , TeacherFirstNa…...
基于 LeNet 网络的 MNIST 数据集图像分类
1.LeNet的原始实验数据集MNIST 名称:MNIST手写数字数据集 数据类型:灰度图 (一通道) 图像大小:28*28 类别数:10类(数字0-9) 1.通过torchvision.datasets.MNIST下载并保存到本地…...
Day4 C语言与画面显示练习
文章目录 1. harib01a例程2. harib01b例程3. harib01e例程4. harib01f例程5. harib01h例程 1. harib01a例程 上一章主要是将画面搞成黑屏,如果期望做点什么图案,只需要再VRAM里写点什么就好了,使用nask汇编语言实现一个函数write_mem8&#…...
一周热点-OpenAI 推出了 GPT-4.5,这可能是其最后一个非推理模型
在人工智能领域,大型语言模型一直是研究的热点。OpenAI 的 GPT 系列模型在自然语言处理方面取得了显著成就。GPT-4.5 是 OpenAI 在这一领域的又一力作,它在多个方面进行了升级和优化。 1 新模型的出现 GPT-4.5 目前作为研究预览版发布。与 OpenAI 最近的 o1 和 o3 模型不同,…...
《UE5_C++多人TPS完整教程》学习笔记34 ——《P35 网络角色(Network Role)》
本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P35 网络角色(Network Role)》 的学习笔记,该系列教学视频为计算机工程师、程序员、游戏开发者、作家(Engineer, Programmer, Game Developer, Author) Stephe…...
手写简易Tomcat核心实现:深入理解Servlet容器原理
目录 一、Tomcat概况 1. tomcat全局图 2.项目结构概览 二、实现步骤详解 2.1 基础工具包(com.qcby.util) 2.1.1 ResponseUtil:HTTP响应生成工具 2.1.2 SearchClassUtil:类扫描工具 2.1.3 WebServlet:自定义注解…...
ES Filter Query 区别
在 Elasticsearch(ES) 中,Filter 和 Query 是两种常用的数据检索方式,它们的主要区别在于 是否计算相关性分数(Score) 以及 是否使用缓存。以下是它们的详细区别和应用场景: 1. 核心区别 特性F…...
Java多线程与高并发专题——关于CopyOnWrite 容器特点
引入 在 CopyOnWriteArrayList 出现之前,我们已经有了 ArrayList 和 LinkedList 作为 List 的数组和链表的实现,而且也有了线程安全的 Vector 和Collections.synchronizedList() 可以使用。 首先我们来看看Vector是如何实现线程安全的 ,还是…...
春节面对大流量并发,系统该如何设计
基于6个层次进行系统设计以解决大流量瞬时并发问题:CDN层,Nginx层,服务层,缓存层,数据库层,全链路压测监控。以下为具体设计参考 1. CDN(内容分发网络) 作用:静态资源&…...
mac本地安装运行Redis-单机
记录一下我以前用的连接服务器的跨平台SSH客户端。 因为还要准备毕设...... 服务器又过期了,只能把redis安装下载到本地了。 目录 1.github下载Redis 2.安装homebrew 3.更新GCC 4.自行安装Redis 5.通过 Homebrew 安装 Redis 安装地址:https://git…...

