在远程调用的时候,我们写的url是写死的。

String url = "<http://127.0.0.1:9090/product/>"+ orderInfo.getProductId();

当换个机器,或者新增个机器,导致ip变换,从而使得 url 发生了变化,接着就需要去通知所有的相关业务也跟着去改变,这就导致后期非常麻烦。

解决思路:

使用注册中心

什么是注册中心

注册中心是分布式系统/微服务架构中的核心基础设施,它扮演着服务治理的"电话簿"角色,他能维护一个服务列表,哪个机器上线了,哪个机器宕机了,这些信息都会自动更新到服务列表上,客户端拿到这个列表,直接进行服务调用即可。这个就是注册中心。 注册中心主要有三个角色:

  • **服务提供者(Server):**一次业务中,被其他微服务调用的服务,也就是提供接口给其他微服务。
  • **服务消费者(Client):**一次业务中,调用其他微服务的服务,也就是调用其他微服务提供的接口。
  • **服务注册中心(Register):**用于保存Server的注册信息,当Server节点发生变更时,Register会同步变更。服务和注册中心使用一定的通信机制,如果注册中心与某服务长时间无法通信,就会注销该实例。

注:服务提供者和服务消费者是相对的。

他们之间的关系及工作内容,可以通过两个概念来描述:

  • **服务注册:**服务提供者在启动时,向Register注册自身服务,并向Register定期发送心跳汇报存活状态。
  • **服务发现:**服务消费者从注册中心查询服务提供者的地址,并通过该地址调用服务提供者的接口,服务发现的一个重要作用就是提供给消费者一个可用的服务列表。

CAP理论:分布式系统的基石

CAP 理论是分布式系统设计的核心定理,由计算机科学家 Eric Brewer 于 2000 年提出,揭示了分布式系统必然面临的三元悖论。其核心内容可概括为:

任何分布式系统最多只能同时满足以下三项中的两项:

Consistency(一致性)

Availability(可用性)

Partition tolerance(分区容错性)

注:一致性分为强一致性(主库和从库,不论何时,对外提供的服务都是一致的)和弱一致性(随着时间的推移,最终达到了一致性),这里指的是强一致性。

比如说我有一个数据库集群,客户端向数据库集群发送了一个数据修改的请求,数据库集群需要向客户端进行响应,响应的时机分为以下两种:

  1. 主库接收到请求,并处理成功,此时数据库还未完全同步到从库,随着时间的推移,主库和从库的数据,最终会达到一个一致性。
  2. 主库接收到请求,并且所有数据库同步成功时,才返回响应。

CAP三要素:

要素含义典型场景
C:一致性(Consistency)所有节点在同一时刻看到的数据完全相同(强一致性)银行转账系统:A 转 B 100元后,所有节点必须立即看到更新
A:可用性(Availability)每个请求都能获得非错误响应(系统始终可操作)电商网站:双十一高峰期间必须保证用户能正常下单
P:分区容错性(Partition Tolerance)网络分区发生时系统仍能继续运行(容忍网络故障)跨数据中心部署:当机房之间网络中断时,系统仍能提供服务

CAP理论告诉我们:一个分布式系统不可能同时满足数据一致性,服务可用性和分区容错性这是三个基本需求,最多只能同时满足其中的两个。

在分布式系统中,系统间的网络不能100%保证健康,服务又必须对外保证服务,因此PartitionTolerance不可避免,那就只能在C和A中选择一个,也就是CP或者AP架构。

正常情况:

异常情况:

CP架构:为了保证分布式系统对外的数据一致性,于是选择不返回任何数据。

AP架构:为了保证分布式系统的可用性,节点2返回V0版本的数据(即使这个数据不正确)

更多参考:一文看懂|分布式系统之CAP理论-腾讯云开发者社区-腾讯云

常见的注册中心有:

  • Zookeeper(CP)
  • nacos(CP或AP,默认是AP)
  • eureka(AP)

Eureka介绍

Eureka是Netflix OSS套件中关于服务注册和发现的解决⽅案. Spring Cloud对Eureka进⾏了集成, 并

作为优先推荐⽅案进⾏宣传, 虽然⽬前Eureka 2.0已经停⽌维护, 新的微服务架构设计中, 也不再建议使

⽤, 但是⽬前依然有⼤量公司的微服务系统使⽤Eureka作为注册中⼼。

官方文档:https://github.com/Netflix/eureka/wiki

Eureka主要分为两个部分:

  • Eureka Server:作为注册中心Server端,向微服务应用程序提供服务注册,发现健康检查等能力。
  • Eureka Client:服务提供者,服务启动时,会向Eureka Server 注册自己的信息(IP,端口,服务信息等),Eureka Server会存储这些信息。

搭建注册中心

1.创建项目

2.pom加入Eureka的环境

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

项目构建插件

		<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>

3.配置文件,增加Eureka相关的配置

server:port: 10010
spring:application:name: eureka-server
eureka:instance:hostname: localhostclient:fetch-registry: false # 表示是否从Eureka Server获取注册信息,默认为true.因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,这里设置为falseregister-with-eureka: false # 表示是否将自己注册到Eureka Server,默认为true.由于当前应用就是Eureka Server,故而设置为false.service-url:# 设置Eureka Server的地址,查询服务和注册服务都需要依赖这个地址defaultZone: <http://$>{eureka.instance.hostname}:${server.port}/eureka/
logging:pattern:console: '%d{MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'

4.启动类,开启Eureka的功能

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class,args);}
}

5.启动测试

启动服务,访问注册中心:http://127.0.0.1:10010/

可以看到能正常访问注册中心了。

服务注册

我们的需求是订单查询订单信息的时候,根据订单里的产品ID,获取产品的详细信息,也就是需要order-service远程调用product-service,也就是说product-service是服务提供者,就需要把product-sevrice服务注册到注册中心里去。

1.加入Eureka的依赖

				<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

2.完善配置信息

#服务名称
spring:application:name: product-service#eureka地址
eureka:client:service-url:defaultZone: <http://127.0.0.1:10010/eureka/>
#日志
logging:pattern:console: '%d{MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'

3.启动测试

可以看到product-service已经成功注册到eureka-service上了。

服务发现

order-service是服务消费者,在远程调用时候,会从eureka-server拉取product-service的服务信息,实现服务发现。

1.加入Eureka依赖

        <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>

2.完善配置信息


spring:application:name: order-serviceeureka:client:service-url:defaultZone: <http://127.0.0.1:10010/eureka/>
logging:pattern:console: '%d{MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'

3.修改远程调用的代码

		public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);//String url = "<http://127.0.0.1:9090/product/>" + orderInfo.getProductId();//从Eureka中获取服务列表List<ServiceInstance> instances = discoveryClient.getInstances("product-service");//http://127.0.0.1:9090//instances.get(0):服务可能有多个,这里只获取第一个String uri = instances.get(0).getUri().toString();String url = uri + "/product/" + orderInfo.getProductId();log.info("远程调用url:{}",url);ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}

4.启动测试

可以看到order-service已经注册到eureka上了。

访问接口:http://127.0.0.1:8080/order/1

也可以看到,远程调用成功了。

Eureka 和Zookeeper区别(不发)

Eureka和Zookeeper都是⽤于服务注册和发现的⼯具,区别如下:

  1. Eureka是Netflix开源的项⽬, ⽽Zookeeper是Apache开源的项⽬.
  2. Eureka 基于AP原则, 保证⾼可⽤, Zookeeper基于CP原则, 保证数据⼀致性.
  3. Eureka 每个节点 都是均等的, Zookeeper的节点区分Leader 和Follower 或 Observer, 也正因为这 个原因, 如果Zookeeper的Leader发⽣故障时, 需要重新选举, 选举过程集群会有短暂时间的不可⽤.

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ubuntu24的一些小问题

截图Keyboard -> Keyboard Shortcus -> View and customize Shortcus如上&#xff0c;可以修改默认的快捷按键。比如截图按键可以修改。 ibus输入法无法&#xff0c;输入V异常问题 也是困扰了很久&#xff0c;发现是这样的&#xff1a;https://github.com/libpinyin/ibus…

Python Locust库详解:从入门到分布式压力测试实战

一、Locust核心优势 作为一款基于Python的开源负载测试工具&#xff0c;Locust通过协程架构实现了高效资源利用。其独特优势体现在&#xff1a; 纯Python脚本&#xff1a;用熟悉的语言定义用户行为&#xff0c;支持条件判断和复杂逻辑分布式扩展&#xff1a;单节点支持数千并发…

Redis数据类型与内部编码

在Redis中通常普遍认为&#xff0c;使用redis的能进行查询&#xff0c;插入&#xff0c;删除&#xff0c;修改操作都是O(1)是因为他是利用hash表实现的&#xff0c;但是&#xff0c;背后的实现不一定是一个标准的hash表&#xff0c;它内部的数据类型还会有变数&#xff0c;不过…

03-netty基础-多路复用select、poll、epoll

1 什么是多路复用多路复用&#xff08;Multiplexing&#xff09; 是一种让单个线程同时处理多个 I/O 通道的技术&#xff0c;核心是通过系统调用将 I/O 状态查询的工作交给操作系统内核&#xff0c;应用程序只需等待内核通知哪些通道就绪。多路&#xff1a;指的是多个socket网络…

网易大模型算法面经总结第一篇

网友一 MHA的原理&#xff0c;是如何进行加速的&#xff0c;用的什么框架推理。 回答&#xff1a; ①先答一下什么是MHA&#xff1a;Multi-Head Attention&#xff08;MHA&#xff09;是 Transformer 的核心机制&#xff0c;并行地关注输入序列中不同位置的多种信息 ②回答MHA的…

Vue3 面试题及详细答案120道(91-105 )

《前后端面试题》专栏集合了前后端各个知识模块的面试题&#xff0c;包括html&#xff0c;javascript&#xff0c;css&#xff0c;vue&#xff0c;react&#xff0c;java&#xff0c;Openlayers&#xff0c;leaflet&#xff0c;cesium&#xff0c;mapboxGL&#xff0c;threejs&…

SAP-MM-物料进销存表

ABAP库存进销存报表程序摘要 该ABAP程序是一个完整的库存进销存报表系统,主要功能包括: 报表类型选择: 物料库存进销存 批次库存进销存 寄售库存进销存 供应商库存进销存 原料库存进销存 主要功能: 从历史数据表(MARDH, MSKAH, MSLBH, MCHBH等)获取期初库存 处理物料移动数…

这几天都是发癫写的

#include <iostream> #include <vector> #include <unordered_map> #include <algorithm> #include <cmath> // for sqrt// Gen-Sort 实现&#xff08;保持不变&#xff09; void genSort(std::vector<int>& arr) {if (arr.empty()) r…

QT6 源,七章对话框与多窗体(11) 进度对话框 QProgressDialog:属性,公共成员函数,槽函数,信号函数,与源代码带注释

&#xff08;1&#xff09; 本类的继承关系 &#xff1a;可见&#xff0c;进度对话框&#xff0c;也是 QDialog 的子类&#xff0c;在其上面又摆放了一些控件&#xff0c;构成了不同用途的对话框。咱们也可以自定义对话框。只是没有 QT 官方大师们做的好。 人家在定义这 6 个子…

学习游戏制作记录(技能系统)7.24

1.技能系统概念首先让我们了解一下游戏的技能本质是什么&#xff0c;以投掷剑为例子&#xff0c;当玩家使用这个技能时&#xff0c;首先会播放玩家的动画&#xff0c;随后通过技能脚本创建一个剑的对象&#xff0c;当剑回收时会再次调用脚本&#xff0c;让它朝向玩家飞来并销毁…

外部存档(External Archive)机制

前言 提醒&#xff1a; 文章内容为方便作者自己后日复习与查阅而进行的书写与发布&#xff0c;其中引用内容都会使用链接表明出处&#xff08;如有侵权问题&#xff0c;请及时联系&#xff09;。 其中内容多为一次书写&#xff0c;缺少检查与订正&#xff0c;如有问题或其他拓展…

MybatisPlus操作方法详细总结

摘要&#xff1a;本文围绕 MyBatis-Plus 数据操作展开&#xff0c;涵盖标准数据层 CRUD 与分页查询&#xff1b;以及各种的复杂 SQL 查询&#xff1b;映射匹配&#xff08;TableField、TableName 注解&#xff09;与 ID 生成策略&#xff08;TableId 五种类型及全局配置&#x…

【C语言进阶】动态内存管理的面试题||练习

本节内容专门整理了一些动态内存管理的面试题&#xff0c;配有详细的解答。 目录 1. 看代码说结果 2. 看代码说结果 3. 看代码说结果 4.小乐乐与欧几里得 描述 分析1&#xff1a; 分析2&#xff1a; 代码&#xff1a; 5. 空心正方形 分析&#xff1a; 1. 看代码说结…

【图论】倍增与lca

void dfs(long u,long father){ dep[u]dep[father]1;//只在这里初始化depfor(long i1;(1<<i)<dep[u];i)fa[u][i]fa[fa[u][i-1]][i-1];//只这里用的倍增for(long ihead[u];~i;iedge[i].next){long vedge[i].to;if(vfather)continue;fa[v][0]u;dfs(v,u); }} long lca(lo…

VS Code 美化插件

目录1. Better Comments 更好的注释2. indent-rainbow 彩虹的缩进3. Trailing Spaces 尾随的空格4. Gruvbox Material 护眼的材质5. Md Editor 博客编辑器6. 待补充推荐笔记&#xff1a;VS Code写代码必备的五款代码美化插件 1. Better Comments 更好的注释 Better Comments Be…

火语言 RPA 在日常运维中的实践

在系统运维和技术支持工作中&#xff0c;总有一些操作像 “固定程序” 一样循环往复&#xff1a;定期检查服务器状态、批量处理用户权限申请、手动清理系统日志…… 这些工作步骤固定、逻辑简单&#xff0c;却占用了大量本可用于故障排查和系统优化的时间。近期在优化运维团队的…

FOUPK3system5XOS系统 NTX V2.0发布通知

FOUPK3system5XOS系统NTX V2.0发布通知更新1.系统安全&#xff1a;使用FOUPK3system5XOS NOS X9新内核与FOUPK3system5XOS系统19.63正式版一样提供更好的安全性2.原生应用&#xff1a;启用FOUPK3system5XOS ONS X9 API 72服务FOUPK3system5XOS系统 NTX V2.0用户支持使用FOUPK3…

爬虫算法原理解析

文章目录 核心算法原理 1. 图遍历算法 广度优先搜索(BFS) 深度优先搜索(DFS) 2. URL调度算法 优先级队列调度 3. 页面去重算法 基于哈希的去重 基于布隆过滤器的去重 4. 链接提取与规范化 5. 抓取频率控制算法 6. 增量爬取算法 高级算法策略 1. PageRank算法在爬虫中的应用 2. …

探索双链表:C语言中的链式结构魔法

目录 引言 一、双链表基础 1.1、什么是双链表&#xff1f; 1.2、双链表节点的结构定义 二、双链表的基本操作 2.1、双链表的初始化 2.2、尾插法 2.3、头插 2.4、判断双链表是否为空 2.5、尾删法 2.6、头删法 2.7、查找 2.8、双链表在指定位置之前插入 2.9、双链表…

HTML5 + CSS3模拟西门庆、武大郎和潘金莲的精彩520微信聊天,看完我又相信爱情了

今天520了&#xff0c;我用HTML5 CSS3模拟了西门庆、武大郎和潘金莲的精彩微信聊天&#xff0c;希望你看完以后可以在紧张的工作中&#xff0c;放松一下&#xff0c;开心一下&#xff0c;同时祝你在这个520可以过得开心快乐。 目录 1 实现思路 1.1 聊天实现素材 1.2 HTML布…