当前位置: 首页 > article >正文

SpringCloud——Consul服务注册与发现

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

(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 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访问测试地址

  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 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步骤

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

(5)思考

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

相关文章:

SpringCloud——Consul服务注册与发现

一、为什么要引入服务注册中心 &#xff08;1&#xff09;为什么引入 微服务硬编码 IP / 端口的核心问题总结 环境变更敏感&#xff1a;当支付微服务的 IP 或端口修改时&#xff0c;订单微服务必须同步修改所有调用该支付服务的代码或配置&#xff0c;否则将无法正常通信无法…...

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

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

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

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

前端打包优化相关 Webpack

前端打包优化相关 Webpack 打包时间的优化&#xff08;基于 Vue CLI 4 Webpack 5&#xff09; 1. Webpack 配置减少打包时间 1.1 对 JS 配置&#xff1a;排除 node_modules 和 src 中的打包内容 在开发环境下&#xff0c;修改 Webpack 的 JS 规则&#xff0c;排除 /node_m…...

抓包分析工具介绍

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

Linux第一课

一、Linux背景与发展 1. 发展史 1968年&#xff0c;研究人员开发了Multics操作系统&#xff0c;为后续发展奠定了基础。 1969−1970年&#xff0c;Ken Thompson和Dennis Ritchie在Multics基础上开发了UNIX系统。 1991年&#xff0c;Linus Torvalds发布了Linux操作系统&#…...

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…...

网安知识点

1.SQL注入漏洞产生的原因是&#xff1f; 前端传到后端的数据&#xff0c;没有经过任何处理&#xff0c;直接当作sql语句的一部分来执行 2.讲一下sql注入&#xff0c;写入webshell需要哪些前提条件 开启导入导出权限secure-file-priv 站点根目录位置/路径 mysql用户对站点根目…...

UniApp 运行的微信小程序如何进行深度优化

UniApp 运行的微信小程序如何进行深度优化 目录 引言性能优化 1. 减少包体积2. 优化页面加载速度3. 减少 setData 调用4. 使用分包加载 代码优化 1. 减少不必要的代码2. 使用条件编译3. 优化图片资源 用户体验优化 1. 优化交互体验2. 预加载数据3. 使用骨架屏 调试与监控 1. …...

leetcode-sql数据库面试题冲刺(高频SQL五十题)

题目&#xff1a; 577.员工奖金 表&#xff1a;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.…...

每日一练之移除链表元素

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

BM25原理概述

1️⃣设定&#xff1a;对于查询 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、查验身份证-&#xff08;解析&#xff09;-简单题 1032、挖掘机技术哪家强-&#xff08;解析&#xff09;-细节题(┬┬﹏┬┬)&#xff0c;太抠细节了 1033、旧键盘打字-&#xff08;解析&#xff09;-输入格式&#xff01;这才是重点(┬┬﹏┬┬)&#xff0c;让…...

力大砖飞,纯暴力搜索——蓝桥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;自定义注解…...

ES Filter Query 区别

在 Elasticsearch&#xff08;ES&#xff09; 中&#xff0c;Filter 和 Query 是两种常用的数据检索方式&#xff0c;它们的主要区别在于 是否计算相关性分数&#xff08;Score&#xff09; 以及 是否使用缓存。以下是它们的详细区别和应用场景&#xff1a; 1. 核心区别 特性F…...

Java多线程与高并发专题——关于CopyOnWrite 容器特点

引入 在 CopyOnWriteArrayList 出现之前&#xff0c;我们已经有了 ArrayList 和 LinkedList 作为 List 的数组和链表的实现&#xff0c;而且也有了线程安全的 Vector 和Collections.synchronizedList() 可以使用。 首先我们来看看Vector是如何实现线程安全的 &#xff0c;还是…...

春节面对大流量并发,系统该如何设计

基于6个层次进行系统设计以解决大流量瞬时并发问题&#xff1a;CDN层&#xff0c;Nginx层&#xff0c;服务层&#xff0c;缓存层&#xff0c;数据库层&#xff0c;全链路压测监控。以下为具体设计参考 1. CDN&#xff08;内容分发网络&#xff09; 作用&#xff1a;静态资源&…...

mac本地安装运行Redis-单机

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