【微服务】服务注册与发现 - Eureka(day3)

CAP理论

P是分区容错性。简单来说,分区容错性表示分布式服务中一个节点挂掉了,并不影响其他节点对外提供服务。也就是一台服务器出错了,仍然可以对外进行响应,不会因为某一台服务器出错而导致所有的请求都无法响应。综上所述,在分布式系统中,分区容错性是必须要保证的一个特性。

C表示一致性。通俗的讲,一致性就是所有节点在某个响应时的数据都是相同的。

A表示可用性。可用性指代对所有的请求都有相应结果。

在分布式系统中,P是必须要保证的一个特性,因此可用性和一致性就不能同时保证。原因就是当一个节点收到数据之后,要传给别的节点进行复制,在这个过程中,如果有请求的话,那么就可能导致一致性出现问题。假设要保证一致性,那就得上锁,不对外响应,那么此时可用性就出现了问题。因此,分布式系统中,只存在AP理论和CP理论。

举个例子来说明一下CAP的概念。在一家生意火爆的饭店中,一道菜的原料没有了,就要告诉所有的服务员不能再下单该菜了,但是通知的过程是要浪费时间的。

一致性表示所有的服务都接到通知了,因此对客户的响应都是相同的。可用性就是不管有没有接收到通知,服务员都会给出一个响应。分区容错性是指一个服务员请假了,那也不会影响今天的饭店开门。分区容错性饭店肯定是能保证的。但是如果要保证一致性,那么在所有服务员接收到通知之前,都是不能讲话的,这就影响到了可用性。如果要保证可用性,那么所有的服务员都能讲话,但是不确定谁没有接收到信息。如果想要同时保证可用性和一致性,只有一种可能,就是饭店只有一个人,但是这种情况下,他请假,饭店就关门了,分区容错性就没有了。

服务注册和发现引入

概述

在基础工程搭建中,我们发现调用服务时是以硬编码的方式来创建URL的,但是对于微服务来说,一个服务可能有成百上千个实例,并且还会随时扩缩容。因此,我们采用这种方式是不合理的。并且,在日常管理中,对这么多的实例,我们并不能立马确定哪个实例出现了宕机等问题。因此就出现了微服务家族的第一套组件——服务注册和发现。

服务注册和发现,最重要干的事就是把所有注册到注册中心的实例给展示出来。这样,我们可以轻松的看到所有的实例运行情况。如果此时某台实例出错下线了,注册中心也能监控到,并将该实例进行剔除,不再对外进行服务。而且,有的注册中心也能支持实例的动态上下线,这样能很快的实现扩缩容,大大减少了运维开发的工作。

综上所述,服务注册和发现组件的功能大概有:服务管理、容错处理、动态扩展等。当然,不同产品也会存在一定的差异化,例如咋们中国阿里巴巴的Nacos就不止实现了服务注册和发现这个功能,还有分布式配置管理等,当然,这都是下文了。

功能图

 角色

Server,服务提供者:一次业务中,被其他服务调用的服务,也就是提供接口给其他服务。

Client,服务消费者:一次业务中,调用其他服务的服务,也就是使用接口的服务。

Registry,服务注册中心:用来保存Server的注册信息,当Server节点发生变更时,注册中心就会感知到并进行同步更新。注册中心和注册的服务存在一定机制进行通信,如果注册中心与某服务长期没有通信,也就是超过限定的阈值,那么注册中心就会下线该实例。

服务注册和服务发现

服务注册:服务提供者在启动服务时,将自身注册到注册中心中,并定期向注册中心发送心跳包表示自己还存活。

服务发现:服务消费者需要调用某服务时,就先去注册中心找到服务提供者的地址,通过该地址对服务提供者进行调用。服务发现的重要作用就是提供一个可用的服务列表给消费者。

搭建注册中心

内容

1. Eureka Server:作为注册中心,向服务提供服务注册、服务发现、健康检查等功能。

2. Eureka Client:服务提供者,服务启动时,会向注册中心提供自己的信息,例如端口号,IP地址等内容,而注册中心会保存这些信息。

步骤

1. 搭建Eureka Server。

2. 将服务都注册到注册中心中。

3. 服务与服务之间进行调用时,先去注册中心查找被调用服务的服务列表,然后进行调用。

搭建案例

搭建注册中心

建模块

写pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.wbz</groupId><artifactId>spring-cloud-test</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>cloud-server-eureka10010</artifactId><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><!--web通用模块--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--注册中心--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies></project>

写yml文件

server:port: 10010spring:application:name: cloud-server-eureka10010eureka:instance:hostname: localhostclient:# 表示是否从注册中心中获取注册的服务信息,默认是true# 咋们搭建的只是一个单体的,没有其他注册中心,因此不需要同步fetch-registry: false# 表示是否将自己注册到注册中心register-with-eureka: falseservice-url:# 设置注册中心的地址,查询服务和注册服务都需要依赖这个地址defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

改启动类

/*** Eureka服务注册中心*/@EnableEurekaServer // 开启注册中心服务
@SpringBootApplication
public class EurekaServerApplication10010 {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication10010.class, args);}}

启动该服务,访问URL:127.0.0.1:10010,出现如下界面就算搭建成功:

注册商品服务到注册中心

修改pom文件

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

修改yml文件

eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka/

注册订单服务到注册中心

 修改pom文件

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

修改yml文件

eureka:client:service-url:defaultZone: http://127.0.0.1:10010/eureka/

把两个项目进行重新启动,再次观察Eureka的页面,发现:

硬编码解耦

订单服务中进行修改

@Slf4j
@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements OrderService {/*@Resourceprivate RestTemplate restTemplate;@Overridepublic Order getOrderById(Integer id) {Order order = this.getById(id);String url = "http://127.0.0.1:8001/product/query/" + order.getProductId();Product product = this.restTemplate.getForObject(url, Product.class);order.setProduct(product);return order;}*/private final String PRODUCT_SERVICE_NAME = "cloud-provider-payment8001";@Resourceprivate RestTemplate restTemplate;@Resourceprivate DiscoveryClient discoveryClient;@Overridepublic Order getOrderById(Integer id) {// 获取订单Order order = this.getById(id);// 获取商品服务的实例List<ServiceInstance> instances = discoveryClient.getInstances(this.PRODUCT_SERVICE_NAME);// 输出日志查看获取到的实例有哪些内容log.info(instances.toString());// 获取第一个商品实例的uriString uri = instances.get(0).getUri().toString();log.info(uri);// 拼接urlString url = uri + "/product/query/" + order.getProductId();// 远程调用Product product = this.restTemplate.getForObject(url, Product.class);order.setProduct(product);// 返回结果return order;}}

在硬编码解耦中,其实就是将原来的IP和PORT进行改换。通过服务名字去注册中心查找实例然后进行调用,这样无论启动多少个实例,也不用对代码进行变动。

Eureka对于CAP理论来说,其实现的是AP理论,保证高可用。

总结与疑惑 

在我第一次学习了Eureka之后,感觉这个组件好好用,能减少代码的耦合,不过,随之而来又出现了一个问题就是当我启动多个实例之后,发现我依旧只能调用第一个服务,那原因是出在哪里呢。经过查看我的代码如下图发现,是在服务调用的时候写了只调用第一个。问题找打了,但是如何解决呢?写一个取余来判断?但是我又不确定又几个实例。在这里就不多说了,好奇的同学就赶快去看第二个组件负载均衡吧,他完美解决了这个问题。

再提一句,学习了Nacos和Consul之后,发现Eureka不香了,看到这里的同学是不是得来一句——经典白雪,赶快打在评论区吧。

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

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

相关文章

【MySQL 06】表的增删查改

目录 1.insert 增添数据 1.1单行数据 全列插入 1.2多行数据 指定列插入 1.3插入否则更新 1.4.插入否则替换 2.select查找 2.1 全列查找 2.2指定列查找 2.3查询字段为表达式 2.4为查询结果指定别名 2.5 结果去重 2.6 where条件查询 2.7结果排序 2.8.筛选分页结果…

指针(7)

目录 1. sizeof和strlen的对⽐ 1.1 sizeof 1.2 strlen sizeof 和 strlen 总结&#xff1a; 2. 数组和指针 2.1 ⼀维数组 2.2 字符数组 1. sizeof和strlen的对⽐ 1.1 sizeof 计算的是使⽤类型创建的变量所占内存空间的⼤⼩。sizeof不在乎你里面放的什么。sizieof是操作符…

指 针

回顾一下&#xff1a; 1. 指针 1.1 基本知识 指针变量——指针&#xff08;存放地址的变量&#xff09; 指针变量所占用的大小&#xff0c;与数据类型无关&#xff0c;跟编译器有关。&#xff08;32位&#xff1a;4字节&#xff0c;64位&#xff1a;8字节&#xff09; 1.2 …

使用阿里云试用资源快速部署web应用-dofaker为例

本文介绍使用阿里云的试用资源部署dofaker的方法&#xff0c;本教程主要作学习在阿里云部署web应用之用&#xff0c;部署好应用之后&#xff0c;可以在任何地点通过公网ip访问web应用。 一、创建云主机 登录阿里云账户之后&#xff0c;点击控制台&#xff1a; 点击云服务器EC…

JavaWeb程序设计(第四版)习题参考答案

JavaWeb程序设计&#xff08;第四版&#xff09;习题参考答案 目录 模块1 习题参考答案 模块2 习题参考答案 模块3 习题参考答案 模块4 习题参考答案 模块5 习题参考答案 模块6 习题参考答案 模块7 习题参考答案 模块8 习题参考答案 模块1 习题参考答案 选择题 1 .A …

模拟退火算法简介

什么是模拟退火算法&#xff1f; 模拟退火算法&#xff08;Simulated Annealing&#xff0c;SA&#xff09;是一种基于随机化搜索的优化算法&#xff0c;灵感来源于金属退火过程。在金属制造中&#xff0c;金属被加热到高温并缓慢冷却&#xff0c;这一过程可以减少内部缺陷&am…

L111213 【哈工大_操作系统】内核级线程内核级线程实现操作系统之“树”

L2.4 内核级线程 切换进程&#xff0c;实际上是切换内核级线程&#xff0c;没有用户级进程说法&#xff0c;进程只能在内核中。 多核与多处理器的区别在于是否共用资源。多核多线程 并发&#xff1a;同时触发&#xff0c;交替执行&#xff0c;在一个核上 并行&#xff1a;同…

三菱FX3U定位控制接线示例(脉冲控制伺服)

一、FX3u系列基本单元(DC24V输入) 二、FX3u系列基本单元(晶体管输出) 脉冲输出用端子Y000、 Y001、 Y002为高速响应输出。 三、FX3UPLC链接MR-J4-A伺服连接实例 1、为了安全起见&#xff0c;不仅仅在可编程控制器侧&#xff0c;在伺服放大器侧也请设计正转限位和反转限位的限位…

数字安全新时代:聚焦关键信息基础设施安全保障——The Open Group 2024生态系统架构·可持续发展年度大会盛大来袭

在全球数字化转型的浪潮中&#xff0c;关键信息基础设施&#xff08;Critical Information Infrastructure&#xff0c;简称CII&#xff09;的安全保障已成为各国政府和企业共同关注的焦点。随着技术的飞速发展和网络威胁的日益复杂&#xff0c;如何构建高效、灵活且安全的数字…

vue2接入高德地图实现折线绘制、起始点标记和轨迹打点的完整功能(提供Gitee源码)

目录 一、申请密钥 二、安装element-ui 三、安装高德地图依赖 四、完整代码 五、运行截图 六、官方文档 七、Gitee源码 一、申请密钥 登录高德开放平台&#xff0c;点击我的应用&#xff0c;先添加新应用&#xff0c;然后再添加Key。 ​ 如图所示填写对应的信息&…

【最新华为OD机试E卷-支持在线评测】简单的自动曝光(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

[Linux]开发环境搭建

RPM和YUM 安装JDK 安装Tomcat 安装IDEA 安装MySql

Kotlin真·全平台——Kotlin Compose Multiplatform Mobile(kotlin跨平台方案、KMP、KMM)

前言 随着kotlin代码跨平台方案的推出&#xff0c;kotlin跨平台一度引起不少波澜。但波澜终归没有掀起太大的风浪&#xff0c;作为一个敏捷型开发的公司&#xff0c;依然少不了Android和iOS的同步开发&#xff0c;实际成本和效益并没有太多变化。所以对于大多数公司来说依然风平…

精选算法入门——day2

精选算法入门——day2 题目一题干解题思路一解题思路二解题思路三思路三代码 题目二题干解题思路代码 题目三题干解题思路一代码解题思路二代码解题思路三代码 题目四题干解题思路代码 题目一 题干 数组中有一个数字出现的次数超过数组长度的一半&#xff0c;请找出这个数字。…

PDF转换为TIF,JPG的一个简易工具(含下载链接)

目录 0.前言&#xff1a; 1.工具目录 2.工具功能&#xff08;效果&#xff09;&#xff0c;如何运行 效果 PDF转换为JPG&#xff08;带颜色&#xff09; PDF转换为TIF&#xff08;LZW形式压缩&#xff0c;可以显示子的深浅&#xff09; PDF转换为TIF&#xff08;CCITT形…

uniapp+Android智慧居家养老服务平台 0fjae微信小程序

目录 项目介绍支持以下技术栈&#xff1a;具体实现截图HBuilderXuniappmysql数据库与主流编程语言java类核心代码部分展示登录的业务流程的顺序是&#xff1a;数据库设计性能分析操作可行性技术可行性系统安全性数据完整性软件测试详细视频演示源码获取方式 项目介绍 老年人 登…

IDEA:Properties in parent definition are prohibited

问题背景 如果你在POM.xml中使用了自定义版本&#xff0c;那么IDEA就没办法很动态检测&#xff08;其实可以做到的&#xff0c;不是吗&#xff09;&#xff0c;就会有一个Properties in parent definition are prohibited 的错误信息&#xff08;禁止使用父级定义中的属性&…

吊打ChatGPT4o!大学生如何用上原版O1辅助论文写作(附论文教程)

目录 1、用ChatGPT生成论文选题2、用ChatGPT生成论文框架3、用ChatGPT进行文献整理4、用ChatGPT进行论文润色5、用ChatGPT进行问题求解6、用ChatGPT进行思路创新7、用ChatGPT进行论文翻译8、如何直接使用ChatGPT4o、o1、OpenAI Canvas 9、OpenAI Canvas增强了啥&#xff1f;10、…

打造自己的RAG解析大模型:Windows部署OCR服务(可商业应用)

在上一篇文章中&#xff0c;我们介绍了如何在 Windows 环境中配置 OCR 相关模型&#xff0c;并完成了模型验证。本篇文章将基于之前的内容&#xff0c;进一步讲解如何将文本检测、方向分类和文本识别模型进行串联&#xff0c;最终搭建一个基础的 OCR 应用服务。通过这些模型的串…

降重秘籍:如何利用ChatGPT将重复率从45%降至10%以下?

AIPaperGPT&#xff0c;论文写作神器~ https://www.aipapergpt.com/ 重复率高达45%&#xff1f;很多人一查论文的重复率&#xff0c;瞬间想“完了&#xff0c;这次真的要重写了”。但其实不用这么绝望&#xff01;有了ChatGPT&#xff0c;降重真的没那么难。今天就教你几招&a…