SpringCloud——Consul服务注册与发现

news2025/4/21 4:58:46

一、为什么要引入服务注册中心

(1)为什么引入

微服务硬编码 IP / 端口的核心问题总结

  1. 环境变更敏感:当支付微服务的 IP 或端口修改时,订单微服务必须同步修改所有调用该支付服务的代码或配置,否则将无法正常通信
  2. 无法实现负载均衡:若支付微服务部署了多个实例(如 3 台服务器),订单微服务硬编码固定 IP 只能访问其中一台,无法自动将请求分散到多个实例,导致部分服务器压力过大,另一部分闲置
  3. 扩展维护困难:当系统需要增加微服务实例(如新增 2 台支付服务器)时,硬编码的方式需要手动修改所有订单微服务的配置,操作繁琐且容易遗漏

解决方案方向 

  1. 服务注册与发现:使用工具(如 Eureka、Consul)自动管理服务的 IP 和端口,调用方无需硬编码
  2. 负载均衡:结合 Ribbon、Nginx 等工具,自动将请求分发到多个微服务实例
  3. 配置中心:通过集中配置管理(如 Nacos、Apollo)动态更新服务地址,减少手动修改

(2)对照大纲

二、为什么不再使用传统老牌的Eureka

(1)Eureka停更进维

(2)Eureka对初学者不友好

(3)注册中心独立且和微服务解耦

目前主流服务中心,希望单独隔离出来而不是作为一个独立微服务嵌入到系统中

  1. 按照Netflix的之前的思路,注册中心Eureka也是作为一个微服务且需要程序员自己开发部署
  2. 实际情况,希望微服务和注册中心分离解耦,注册中心和业务无关的,不要混为一谈
  3. 提供类似tomcat一样独立的组件,微服务注册上去使用,是个成品

(4)阿里巴巴Nacos的崛起

Service discovery and configuration management

三、consul简介

(1)是什么

  1. consul官网地址Consul by HashiCorp
  2. What is Consul?
  3. 禁止使用问题:
    1. 条款链接:
    2. 放心用:
  4. spring consul:Spring Cloud Consul

(2)能干嘛

  1. 服务发现:提供HTTP和DNS两种发现方式
  2. 健康监测:支持多种方式,HTTP、TCP、Docker、Shell脚本定制化监控
  3. KV存储:key、value的存储方式
  4. 多数据中心:Consul支持多数据中心
  5. 可视化Web界面

(3)去哪下

Install | Consul | HashiCorp Developer

(4)怎么玩

  1. 网址:Spring Cloud Consul
  2. 两大作用:

四、安装并运行consul

(1)官网下载

(2)下载完成后只有一个cosul.exe文件,对应全路径下查看版本号信息

(3)使用开发模式启动

  1. consul agent -dev
  2. 通过以下地址可以访问Consul的首页:http://localhost:8500
  3. 结果页面

五、服务注册与发现

(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 Discovery
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        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 Discovery
  cloud:
    consul:
      host: localhost
      port: 8500
      discovery:
        prefer-ip-address: true #优先使用服务ip进行注册
        service-name: ${spring.application.name}

5.2.4主启动类

5.2.5Controller

5.2.6启动80并查看consul控制台

5.2.7访问测试地址

  1. 访问http://localhost:80/consumer/pay/get/10
  2. 结果如何:
    1. 一个bug
    2. java.net.UnknownHostException: cloud-payment-service

5.2.8配置修改RestTemplateConfig

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

5.3.1CAP

  1. C(Consistency):强一致性
  2. A(Availability):可用性
  3. P(Partition Tolerance):分区容错性

5.3.2经典CAP图

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

  1. 当网络分区出现后,为了保证可用性,系统B可以返回旧值,保证系统的可用性
  2. 当数据出现不一致时,虽然A, B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息时如果请求A查不到,但请求B就能查到。如此保证了可用性但牺牲了一致性结论:违背了一致性C的要求,只满足可用性和分区容错,即AP
(2)CP(Zookeeper/Consul)
  1. 当网络分区出现后,为了保证一致性,就必须拒接请求,否则无法保证一致性
  2. Consul 遵循CAP原理中的CP原则,保证了强一致性和分区容错性,且使用的是Raft算法,比zookeeper使用的Paxos算法更加简单。虽然保证了强一致性,但是可用性就相应下降了,例如服务注册的时间会稍长一些,因为 Consul 的 raft 协议要求必须过半数的节点都写入成功才认为注册成功 ;在leader挂掉了之后,重新选举出leader之前会导致Consul 服务不可用。结论:违背了可用性A的要求,只满足一致性和分区容错,即CP

六、服务配置与刷新

(1)分布式系统面临的→配置问题

微服务架构下,由于服务拆分导致大量独立服务实例,每个服务都需配置信息。集中式动态配置管理可解决重复配置问题,例如统一管理各服务相同的数据库配置,当主机迁移时只需修改一处即可全局生效

(2)官网说明

(3)服务配置案例步骤

6.3.1需求

  1. 通用全局配置信息,直接注册进Consul服务器,从Consul获取
  2. 既然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
  1. 是什么
  2. bootstrap.yml
    spring:
      application:
        name: cloud-payment-service
        ####Spring Cloud Consul for Service Discovery
      cloud:
        consul:
          host: localhost
          port: 8500
          discovery:
            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步骤

  1. @RefreshScope主启动类添加
  2. bootstrap.yml修改下(只为教学,实际别改)spring.cloud.consul.config.watch.wait-time
  3. 测试:

(5)思考

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2312045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C语言_数据结构总结5:顺序栈

纯C语言代码&#xff0c;不涉及C 想了解链式栈的实现&#xff0c;欢迎查看这篇文章&#xff1a;C语言_数据结构总结6&#xff1a;链式栈-CSDN博客 这里分享插入一下个人觉得很有用的习惯&#xff1a; 1. 就是遇到代码哪里不理解的&#xff0c;你就问豆包&#xff0c;C知道&a…

人工智能之数学基础:正交矩阵

本文重点 正交矩阵是线性代数中一个重要的特殊矩阵&#xff0c;它在许多领域都有广泛的应用。 什么是正交矩阵 如图所示&#xff0c;当矩阵A满足如上所示的条件的时候&#xff0c;此时我们就可以认为是正交矩阵&#xff0c;需要注意一点矩阵A必为方阵。 正交矩阵的充要条件 …

抓包分析工具介绍

什么是抓包分析工具&#xff1f; 抓包分析工具&#xff0c;也称为网络数据包嗅探器或协议分析器&#xff0c;用于捕获和检查网络上传输的数据包。这些数据包包含了网络通信的详细信息&#xff0c;例如请求的资源、服务器的响应、HTTP 头信息、传输的数据内容等等。通过分析这些…

2025/3/8 第 27 场 蓝桥入门赛 题解

1. 38红包【算法赛】 签到题&#xff1a; 算倍数就行了 #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。如果未安装&#xff0c;可以通过以下链接下载并安装适合我们操作系…

deepseek 3FS编译

3FS在ubuntu22.04下的编译&#xff08;记录下编译过程&#xff0c;方便后续使用&#xff09; 环境信息 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…

每日一练之移除链表元素

题目&#xff1a; 画图解析&#xff1a; 方法&#xff1a;双指针 解答代码&#xff08;注&#xff1a;解答代码带解析&#xff09;&#xff1a; //题目给的结构体 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* }…

力大砖飞,纯暴力搜索——蓝桥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…

如何计算两个向量的余弦相似度

参考笔记&#xff1a; https://zhuanlan.zhihu.com/p/677639498 日常学习之&#xff1a;如何计算两个向量或者矩阵的余弦相似度-CSDN博客 1.余弦相似度定理 百度的解释&#xff1a;余弦相似度&#xff0c;又称为余弦相似性&#xff0c;是通过计算两个向量的夹角余弦值来评估…

OkHttp:工作原理 拦截器链深度解析

目录 一、OKHttp 的基本使用 1. 添加依赖 2. 发起 HTTP 请求 3. 拦截器&#xff08;Interceptor&#xff09; 4. 高级配置 二、OKHttp 核心原理 1. 责任链模式&#xff08;Interceptor Chain&#xff09; 2. 连接池&#xff08;ConnectionPool&#xff09; 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 名称&#xff1a;MNIST手写数字数据集 数据类型&#xff1a;灰度图 &#xff08;一通道&#xff09; 图像大小&#xff1a;28*28 类别数&#xff1a;10类&#xff08;数字0-9&#xff09; 1.通过torchvision.datasets.MNIST下载并保存到本地…

Day4 C语言与画面显示练习

文章目录 1. harib01a例程2. harib01b例程3. harib01e例程4. harib01f例程5. harib01h例程 1. harib01a例程 上一章主要是将画面搞成黑屏&#xff0c;如果期望做点什么图案&#xff0c;只需要再VRAM里写点什么就好了&#xff0c;使用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 网络角色&#xff08;Network Role&#xff09;》 的学习笔记&#xff0c;该系列教学视频为计算机工程师、程序员、游戏开发者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; Stephe…

手写简易Tomcat核心实现:深入理解Servlet容器原理

目录 一、Tomcat概况 1. tomcat全局图 2.项目结构概览 二、实现步骤详解 2.1 基础工具包&#xff08;com.qcby.util&#xff09; 2.1.1 ResponseUtil&#xff1a;HTTP响应生成工具 2.1.2 SearchClassUtil&#xff1a;类扫描工具 2.1.3 WebServlet&#xff1a;自定义注解…

mac本地安装运行Redis-单机

记录一下我以前用的连接服务器的跨平台SSH客户端。 因为还要准备毕设...... 服务器又过期了&#xff0c;只能把redis安装下载到本地了。 目录 1.github下载Redis 2.安装homebrew 3.更新GCC 4.自行安装Redis 5.通过 Homebrew 安装 Redis 安装地址&#xff1a;https://git…

【ThreeJS Basics 09】Debug

文章目录 简介从 dat.GUI 到 lil-gui例子安装 lil-gui 并实例化不同类型的调整改变位置针对非属性的调整复选框颜色 功能/按钮调整几何形状文件夹调整 GUI宽度标题关闭文件夹隐藏按键切换 结论 简介 每一个创意项目的一个基本方面是能够轻松调整。开发人员和参与项目的其他参与…

【笔记】STM32L4系列使用RT-Thread Studio电源管理组件(PM框架)实现低功耗

硬件平台&#xff1a;STM32L431RCT6 RT-Thread版本&#xff1a;4.1.0 目录 一.新建工程 二.配置工程 ​编辑 三.移植pm驱动 四.配置cubeMX 五.修改驱动文件&#xff0c;干掉报错 六.增加用户低功耗逻辑 1.设置唤醒方式 2.设置睡眠时以及唤醒后动作 ​编辑 3.增加测试命…

类和对象:

1. 类的定义&#xff1a; 1. 类定义格式&#xff1a; 对于我们的类的话&#xff0c;我们是把类看成一个整体&#xff0c;我们的函数里面没有找到我们的成员变量&#xff0c;我们就在我们的类里面找。 我们看我们的第二点&#xff1a; 我们的类里面&#xff0c;我们通常会对…