SpringCloud两种注册中心
SpringCloud
基本概念
系统架构
我们之前做的所有的项目都属于单体架构
,下面我们将要学习更适合大型项目的分布式架构
单体架构: 将业务的所有功能几种在一个项目中开发,打成一个包部署。
优点:架构简单、部署成本低
缺点:耦合度高
分布式架构: 根据业务功能对系统进行拆分、每个业务模块作为独立项目开发,称为一个服务。
优点:降低服务耦合、有利于服务升级拓展。
缺点:架构复杂、运维、监控、部署难度高。
微服务
微服务是一种经过良好的架构设计的分布式架构方案。
微服务架构特征:
- 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责。
- 面向服务:微服务对外暴露业务接口
- 自治:团队独立,技术独立,数据独立,部署独立。
- 隔离性强:服务调用做好隔离、容错、降级,避免出现
级联问题
。
级联问题常涉及数据的关联性操作引发的一系列连锁变化。
微服务结构:
最知名的两种技术架构:SpringCloud、阿里巴巴Dubbo
SpringCloud集成了各种微服务功能组件。
并基于SpringBoot实现了这些组件的自动装配,从而提供了良好的体验。
服务的拆分总结:
- 不同微服务,不能重复开发相同业务。
- 微服务数据独立,不能访问其他微服务的数据库。
- 微服务将自己的业务暴露为接口,供其他微服务使用。
远程调用
案例:有两个服务分别是用户服务和订单服务,要求根据订单ID查询订单的同时,把订单所属的用户信息一起返回。
前面知道不同服务之间数据库互相独立,所以我们就只能在后端再发一次http请求,去调用其他服务的接口。
这就需要在Java代码中,发起HTTP请求,此处使用 RestTemplate
RestTemplate
是 Spring 框架提供的一个同步的 HTTP 客户端工具,用于在 Java 应用程序中发送 HTTP 请求并处理响应。
// 我们需要在配置类中声明一个Bean,启动类也属于配置类,所以此方法也可写入启动类中。/*** 创建RestTemplate并注入Spring容器* @return*/
@Bean
public RestTemplate restTemplate(){return new RestTemplate();
}
然后就可以在Java代码中发送请求了
@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 1.查询订单Order order = orderMapper.findById(orderId);String url = "http://localhost:8081/user/" + order.getUserId();//使用RestTemplate发送请求,第一个参数为请求地址,第二个参数为序列化返回对象User user = restTemplate.getForObject(url, User.class);order.setUser(user);// 4.返回return order;}
}
提供者与消费者
- 服务提供者:一次业务中,被其它微服务调用的服务。(提供接口给其它微服务)
- 服务消费者:一次业务中,调用其它微服务的服务。(调用其它微服务提供的接口)
服务调用关系:
- 服务提供者:暴露接口给其他微服务调用
- 服务消费者:调用其他微服务提供的接口
- 提供者与消费者角色是相对的
- 一个服务可以同时是服务提供者和服务消费者
Eureka注册中心
前面书写存在一些问题,有硬编码的部分,请求地址是写死了。
Eureka作用
消费者该如何获取服务提供者具体信息?
- 服务提供者启动时向eureka注册自己的信息
- eureka保存这些信息
- 消费者根据服务名称向eureka拉取提供者信息
如果有多个服务提供者,消费者该如何选择?
- 服务消费者利用负载均衡算法,从服务列表中挑选一个
消费者如何感知服务提供者健康状态?
- 服务提供者会每隔30秒向
EurekaServer
发送心跳请求,报告健康状态eureka会 - 更新记录服务列表信息,心跳不正常会被剔除
- 消费者就可以拉取到最新的信息
在Eureka架构中,微服务角色有两类:
EurekaServer
: 服务端,注册中心
- 记录服务信息
- 心跳监控
EurekaClient
: 客户端
- Provider:服务提供者,例如案例中的user-service
- 注册自己的信息到 Eureka Server
- 每隔30秒向Eureka Server发送心跳
- consumer:服务消费者,例如案例中的order-service
- 根据服务名称从Eureka Server拉取服务列表
- 基于服务列表做负载均衡,选中一个微服务后发起远程调用
搭建Eureka Server服务端
第一步:创建新的Maven模块,引入eureka-server依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
第二步:为启动类添加启动注解
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {public static void main(String[] args) {SpringApplication.run(EurekaApplication.class,args);}
}
第三步:添加配置信息
server:port: 10086
spring:application:name: eurekaservereureka:client:service-url: #eureka地址信息defaultZone: http://127.0.0.1:10086/eureka
注册user-service
第一步:在需要注册的服务中引入eureka-client依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
第二步:在配置文件中,添加配置
spring:application:name: userservereureka:client:service-url: #eureka地址信息defaultZone: http://127.0.0.1:10086/eureka
同理也可以注册order-service
复制服务,右键要copy的服务,点击Copy Configuration
起一个名称,然后在VM options中配置一个新的端口
-Dserver.port=8082
服务拉取
服务拉取是基于服务器名称获取服务列表,然后在对服务列表做负载均衡
- 修改
OrderService
的代码,修改访问的url
路径,用服务器名
代替ip
、端口
String url = "http://userservice/user/" + order.getUserId();
- 在RestTemplate的Bean中,添加
负载均衡
注解
@Bean
@LoadBalanced
public RestTemplate restTemplate(){return new RestTemplate();
}
Ribbon负载均衡
Nacos注册中心
启动方式:
startup.cmd -m standalone
服务注册
在父工程中添加spring-cloud-alibaba的管理依赖
<!-- Nacos 管理依赖-->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.2.5.RELEASE</version><type>pom</type><scope>import</scope>
</dependency>
注释原有的eureka依赖,添加nacos的客户端依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
修改配置文件
spring:application:name: orderservicecloud:nacos:server-addr: localhost:8848 #nacos服务地址
Nacos服务分级存储模型
一个服务可以有多个实例,大型公司会将实例部署在不同的服务器内。一个服务器机房就称为一个集群。
服务调用尽可能调用本地集群的服务,跨集群调用延迟较高,只有当本地集群不可访问时,再去访问其他的集群。
配置服务集群属性,修改yml
spring:cloud:nacos:server-addr: localhost:8848 # Nacos 服务端地址discovery:cluster-name: HB # 配置集群名称,机房位置
如果想要设置优先访问同集群服务,则需要修改负载均衡的IRule
userservice: # 要做配置的微服务名称ribbon:NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule # 负载均衡规则
注意将user-service的权重都设置为1
小结NacosRule负载均衡策略:
- 优先选择同集群服务实例列表
- 本地集群找不到提供者,才会到其他集群找,并且会报警告
- 确定了可用实例列表后,再采用随机负载均衡挑选实例
根据权重负载均衡
实际部署中会出现这样的场景:
服务器设备性能有差异,部分实例所在机器性能较好,另一些较差,我们希望性能好的机器承担更多的用户请求
Nacos提供了权重配置来控制访问频率,权重越大访问频率越高。
在Nacos控制台可以设置实例的权重值,点击编辑
按钮
小结:实例的权重控制
- Nacos控制台可以设置实例的权重值,0~1之间
- 同集群内的多个实例,权重越高被访问的频率越高
- 权重设置为0则完全不会被访问
环境隔离 - namespace
Nacos 中服务存储和数据存储的最外层都是一个名为namespace的东西,用来做最外层隔离
注意:服务只能访问当前命名空间,无法访问其他命名空间的服务
Namespace 下有 Group 下有 Service / Data
新建命名空间:在Nacos控制台中 - > 命名空间 -> 新建命名空间
在代码中修改服务到新的命名空间:
spring:cloud:nacos:server-addr: localhost:8848 #nacos服务地址discovery:cluster-name: HB # 集群名称namespace: xxxx # 命名空间id
Nacos环境隔离
- namespace用来做环境隔离
- 每个namespace都有唯一id
- 不同namespace下的服务不可见
临时实例与非临时实例
服务注册到Nacos时,可以选择注册为临时或非临时实例,通过下面的配置来设置
spring:cloud:nacos:server-addr:discovery:namespace:ephemeral: false #是否为临时实例
临时实例宕机时,会从nacos的服务列表中剔除,而非临时实例则不会
与Eureka的对比
Nacos与eureka的共同点
- 都支持服务注册和服务拉取
- 都支持服务提供者心跳方式做健康检测
Nacos与Eureka的区别
- Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式
- 临时实例心跳不正常会被剔除,非临时实例则不会被剔除
- Nacos支持服务列表变更的消息推送模式,服务列表更新更及时
- Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式
AP 可用性保证
CP 一致性保证
相关文章:

SpringCloud两种注册中心
SpringCloud 基本概念 系统架构 我们之前做的所有的项目都属于单体架构,下面我们将要学习更适合大型项目的分布式架构 单体架构: 将业务的所有功能几种在一个项目中开发,打成一个包部署。 优点:架构简单、部署成本低 缺点&am…...

陕西羊肉泡馍:味蕾上的西北风情
陕西羊肉泡馍:味蕾上的西北风情 在广袤的西北地区,有一道美食以其独特的口感、丰富的营养价值和深厚的文化底蕴,成为了无数食客心中的佳肴——陕西羊肉泡馍。这道传统美食,不仅承载着陕西人民的饮食智慧,更以其醇厚的味道和暖胃耐饥的特性,赢得了国内外食客的一致赞誉。 历史渊…...

蓝桥杯试题:整数反转
一、题目要求: 给定一个整数,请将该数各个位上数字反转得到一个新数。新数也应满足整数的常见形式,即除非给定的原数为零,否则反转后得到的新数的最高位数字不应为零 二、题目分析代码演示: 该程序的主要功能是接收一个整数输入&…...

Moretl FileSync增量文件采集工具
永久免费: <下载> <使用说明> 我们希望Moretl FileSync是一款通用性很好的文件日志采集工具,解决工厂环境下,通过共享目录采集文件,SMB协议存在的安全性,兼容性的问题. 同时,我们发现工厂设备日志一般为增量,为方便MES,QMS等后端系统直接使用数据,我们推出了增量采…...

day1代码练习
输出3-100以内的完美数,(完美数:因子和(因子不包含自身)数本身) #include <stdio.h>// 判断一个数是否为完美数的函数 int panduan(int n) {if (n < 2) {return 0; // 小于2的数不可能是完美数}int sum 1; // 因子和初始化为1(因…...

【Pytest】结构介绍
1.目录结构介绍 project_root/ │ ├── tests/ # 测试用例存放目录 │ ├── __init__.py │ ├── test_module1.py │ ├── module1.py # 被测试的模块 ├── conftest.py # pytest配置文件,可定义fixture和钩子函数 ├── py…...

Django基础之ORM
一.前言 上一节简单的讲了一下orm,主要还是做个了解,这一节将和大家介绍更加细致的orm,以及他们的用法,到最后再和大家说一下cookie和session,就结束了全部的django基础部分 二.orm的基本操作 1.settings.py&#x…...

【以音频软件FFmpeg为例】通过Python脚本将软件路径添加到Windows系统环境变量中的实现与原理分析
在Windows系统中,你可以通过修改环境变量 PATH 来使得 ffmpeg.exe 可在任意路径下直接使用。要通过Python修改环境变量并立即生效,如图: 你可以使用以下代码: import os import winreg as reg# ffmpeg.exe的路径 ffmpeg_path …...

检测到联想鼠标自动调出运行窗口,鼠标自己作为键盘操作
联想鼠标会自动时不时的调用“运行”窗口 然后鼠标自己作为键盘输入 然后打开这个网页 (不是点击了什么鼠标外加按键,这个鼠标除了左右和中间滚轮,没有其他按键了)...

web UI自动化测试笔记
在当今数字化转型的浪潮中,Web 应用已经无处不在,而其质量保障的关键之一就是自动化测试。想象一下,如果每次都手动验证 UI 功能,不仅耗时耗力,还容易遗漏问题。Python 的强大生态为 Web UI 自动化测试提供了高效的解决…...

计算机网络 (60)蜂窝移动通信网
一、定义与原理 蜂窝移动通信网是指将一个服务区分为若干蜂窝状相邻小区并采用频率空间复用技术的移动通信网。其原理在于,将移动通信服务区划分成许多以正六边形为基本几何图形的覆盖区域,称为蜂窝小区。每个小区设置一个基站,负责本小区内移…...

计算机网络三张表(ARP表、MAC表、路由表)总结
参考: 网络三张表:ARP表, MAC表, 路由表,实现你的网络自由!!_mac表、arp表、路由表-CSDN博客 网络中的三张表:ARP表、MAC表、路由表 首先要明确一件事,如果一个主机要发送数据,那么必…...

DRF开发避坑指南01
在当今快速发展的Web开发领域,Django REST Framework(DRF)以其强大的功能和灵活性成为了众多开发者的首选。然而,错误的使用方法不仅会导致项目进度延误,还可能影响性能和安全性。本文将从我个人本身遇到的相关坑来给大…...

批量提取多个 Excel 文件内指定单元格的数据
这篇文章将介绍如何从多个相同格式的Excel文件中,批量提取指定单元格的数据,合并后保存到新的工作薄。 全程0代码,可视化操作。 提取前: 提取后: 准备数据 这里准备了3个测试数据 开始提取 打开的卢易表࿰…...

#HarmonyOS篇:build-profile.json5里面配置productsoh-package.json5里面dependencies依赖引入
oh-package.json5 用于描述包名、版本、入口文件和依赖项等信息。 {"license": "","devDependencies": {},"author": "","name": "entry","description": "Please describe the basic…...

Spring集成Redis|通用Redis工具类
一、基础使用 概述 在SpringBoot中一般使用RedisTemplate提供的方法来操作Redis。那么使用SpringBoot整合Redis需要 那些步骤呢。 1、 JedisPoolConfig (这个是配置连接池) 2、 RedisConnectionFactory 这个是配置连接信息,这里的RedisConnectionFactory是一个接 …...

Vue中设置报错页面和“Uncaught runtime errors”弹窗关闭
文章目录 前言操作步骤大纲1.使用Vue自带的报错捕获机制添加报错信息2.在接口报错部分添加相同机制3.把报错信息添加到Vuex中方便全局使用4.添加报错页面备用5.app页面添加if判断替换报错界面 效果备注:vue项目中Uncaught runtime errors:怎样关闭 前言 在开发Vue项…...

【力扣】219. 存在重复元素 II
题目 给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] nums[j] 且 abs(i - j) < k 。如果存在,返回 true ;否则,返回 false 。 示例 1: 输入:…...

头歌实训作业 算法设计与分析-贪心算法(第5关:求解流水作业调度问题)
问题描述 有 n 个作业(编号为1~n)要在由两台机器 M 1和 M 2 组成的流水线上完成加工。每个作业加工的顺序都是先在 M 1上加工,然后在 M 2 上加工。 M 1 和 M 2 加工作业 i 所需的时间分别为 a i 和 b i(1≤i≤n&am…...

Hadoop•搭建完全分布式集群
听说这里是目录哦 一、安装Hadoop🥕二、配置Hadoop系统环境变量🥮三、验证Hadoop系统环境变量是否配置成功🧁四、修改Hadoop配置文件🍭五、分发Hadoop安装目录🧋六、分发系统环境变量文件🍨七、格式化HDFS文…...

SQL-leetcode—1141. 查询近30天活跃用户数
1141. 查询近30天活跃用户数 表:Activity ---------------------- | Column Name | Type | ---------------------- | user_id | int | | session_id | int | | activity_date | date | | activity_type | enum | ---------------------- 该表没有包含重复数据。 …...

总结与展望,龙蜥社区第 30 次运营委员会会议线上召开
2025 年 1 月 20 日,龙蜥社区召开了第 30 次运营委员会线上会议,来自 24 家理事单位的 22 位委员及委员代表出席,本次会议由运营委员凝思软件李晨斌主持。会上总结和回顾了龙蜥社区 1 月运营发展情况,同步了龙蜥社区 3 大运营目标…...

idea对jar包内容进行反编译
1.先安装一下这个插件java Bytecode Decompiler 2.找到这个插件的路径,在idea的plugins下面的lib文件夹内:java-decompiler.jar。下面是我自己本地的插件路径,以作参考: D:\dev\utils\idea\IntelliJ IDEA 2020.1.3\plugins\java-d…...

c++----------------------多态
1.多态 1.1多态的概念 多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运⾏时多 态(动态多态),这⾥我们重点讲运⾏时多态,编译时多态(静态多态)和运⾏时多态(动态多态)。编译时 多态(静态多态)…...

C语言 指针_野指针 指针运算
野指针: 概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的) 指针非法访问: int main() {int* p;//p没有初始化,就意味着没有明确的指向//一个局部变量不初始化,放…...

【JavaEE进阶】Spring留言板实现
目录 🎍预期结果 🍀前端代码 🎄约定前后端交互接口 🚩需求分析 🚩接口定义 🌳实现服务器端代码 🚩lombok介绍 🚩代码实现 🌴运行测试 🎄前端代码实…...

第25篇 基于ARM A9处理器用C语言实现中断<一>
Q:怎样理解基于ARM A9处理器用C语言实现中断的过程呢? A:同样以一段使用C语言实现中断的主程序为例介绍,和汇编语言实现中断一样这段代码也使用了定时器中断和按键中断。执行该主程序会在DE1-SoC的红色LED上显示流水灯…...

面向通感一体化的非均匀感知信号设计
文章目录 1 非均匀信号设计的背景分析1.1 基于OFDM波形的感知信号1.2 非均匀信号设计的必要性和可行性1.2 非均匀信号设计的必要性和可行性 3 通感一体化系统中的非均匀信号设计方法3.1 非均匀信号的设计流程(1)均匀感知信号设计(2࿰…...

修改docker共享内存shm-size
法1:在创建容器时增加共享内存大小 nvidia-docker run -it -p 10000:22 --name"zm" -v /home/zm:/data ufoym/deepo:all-cu101 /bin/bash --shm-size20G法2:修改正在运行的容器的共享内存设置 查看容器、共享内存 docker ps -a df -lh | gr…...

WIN11 UEFI漏洞被发现, 可以绕过安全启动机制
近日,一个新的UEFI漏洞被发现,可通过多个系统恢复工具传播,微软已经正式将该漏洞标记为追踪编号“CVE-2024-7344”。根据报告的说明,该漏洞能让攻击者绕过安全启动机制,并部署对操作系统隐形的引导工具包。 据TomsH…...