Spring Cloud之服务注册与发现(Eureka)

news2025/1/13 9:33:00

目录

Eureka

介绍

角色

实现流程

单机构建

注册中心

服务提供者

服务消费者

集群搭建

注册中心

服务提供者

自我保护机制

原理分析


Eureka

介绍

Eureka是spring cloud中的一个负责服务注册与发现的组件,本身是基于REST的服务,同时还提供了负载均衡、故障转移等能力。

角色

分为3个角色:服务中心、服务提供者、服务消费者

Eureka Server:服务器端,它提供了服务的注册和发现功能,即实现服务的治理。

Eureka Provider:服务提供者,它将自身服务注册到服务中心,以便“服务消费者”能通过服务器端提供的服务清单来调用它。

Eureka Consumer:服务消费者,它从Eureka获取“已注册的服务列表”,消费服务

实现流程

1.搭建一个Eureka Server作为服务注册中心

2.服务提供者启动时,把当前服务器的信息以服务名的方式注册到服务注册中心

3.服务消费者启动时,把当前服务注册到服务注册中心

4.服务消费者会获取一份可用服务列表,该列表包含了所有注册到服务注册中心的服务信息(包含服务提供者和自身的消息)

5.在获得了可用服务列表后,服务消费者通过 HTTP 或消息中间件远程调用服务提供者提供的服务

        服务注册中心(Eureka Server)所扮演的角色十分重要,它是服务提供者和服务消费者之间的桥梁。服务提供者只有将自己的服务注册到服务注册中心才可能被服务消费者调用,而服务消费者也只有通过服务注册中心获取可用服务列表后,才能调用所需的服务

单机构建

注册中心

搭建一个Eureka Server作为服务注册中心

1.在pom文件中添加Eureka Server依赖

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

2.在application.yml中添加配置

server:
  port: 7001 #端口
# 单机版
eureka:
  instance:
    hostname: localhost  #eureka服务端的实例名字   单机服务名称
  client:
    register-with-eureka: false    #表示不向注册中心注册自己
    fetch-registry: false   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
    service-url:
      #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/  #单机服务地址

3.启动类上添加注释

在启动类上添加 @EnableEurekaServer 注解

4.启动

访问 http://localhost:7001

服务提供者

1.在pom文件中添加Eureka client依赖

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

2.在application.yml中添加配置

server:
  port: 8001 #端口
eureka:
  client:
    register-with-eureka: true #是否向注册中心注册自己
    fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
    service-url:
      #      设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://localhost:7001/eureka #单机版
  instance:
    instance-id: cloud-provider-payment8001
    prefer-ip-address: true  #访问路径可以显示IP地址 鼠标悬停服务,右下角可以看到ip

3.启动类上添加注释

启动类上添加@EnableEurekaClient**注解

服务消费者

1.在pom文件中添加Eureka client依赖

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

2.在application.yml中添加配置

server:
  port: 80
spring:
  application:
    name: cloud-order- service
eureka:
  client:
    register-with-eureka: true #是否向注册中心注册自己
    fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
    instance:
      instance-id: cloud-consumer-order80
      prefer-ip-address: true  #访问路径可以显示IP地址
    service-url:
      #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://localhost:7001/eureka #单机版

3.创建RestTemplate

@Configuration
public class ApplicationContextConfig {
    @Bean
    @LoadBalanced //让这个RestTemplate在请求时拥有客户端负载均衡的能力
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

4.先将注册中心启动,再启动服务提供者

5.创建测试类,使用RestTemplate进行测试

public class OrderController {
	//单机情况下,直接ip加地址
    public static final String PAYMENT_URL = "http://localhost:8001";
    @Resource
    private RestTemplate restTemplate;

    @GetMapping("/payment/get/{id}")
    public CommonResult<Payment> getPayment(@PathVariable("id") Long id) {
        return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
    }
}

6.浏览器访问

集群搭建

注册中心

两个注册中心的配置都差不多,区别就是端口、hostname、defaultZone属性值不一样。
现在是模拟的是2台机器做在集群,需要在defaultZone修改,让两台机器相互注册。
7001的defaultZone就应该是:defaultZone: http://eureka7002.com:7002/eureka/

7002的defaultZone就应该是:defaultZone: http://eureka7001.com:7001/eureka/

server:
  port: 7001
#集群版
eureka:
  instance:
    hostname: eureka7001.com    #eureka服务端的实例名字
  client:
    register-with-eureka: false    #表示不向注册中心注册自己
    fetch-registry: false   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务
    service-url:
      #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7002.com:7002/eureka/  #这个是集群版开启 互相注册

服务提供者

修改配置文件,同时注册进两个注册中心:

server:
  port: 8001
eureka:
  client:
    register-with-eureka: true #是否向注册中心注册自己
    fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true
    service-url:
      #      设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka  #集群版
  instance:
    instance-id: cloud-provider-payment8001
    prefer-ip-address: true  #访问路径可以显示IP地址 鼠标悬停服务,右下角可以看到ip

自我保护机制

        当我们在本地调试基于 Eureka 的程序时,Eureka 服务注册中心很有可能会出现如下图所示的红色警告,这个警告是触发了 Eureka 的自我保护机制而出现的

        默认情况下,如果注册中心在90秒内没有接收到某个服务提供者的心跳,就会将这个服务提供者提供的服务从服务注册表中移除,这样消费者就无法获取到该服务,更无法调用该服务。

        实际情况中,服务提供者可能会出于网络故障而无法与注册中心正常通信。若此时注册中心因为没有接收心跳而误将健康的服务从服务列表中移除,这显然是不合理的。而 Eureka 的自我保护机制就是来解决此问题的。

        Eureka 的自我保护机制:其中心思想就是,如果注册中心在一段时间内没有接收到服务提供者的心跳,那么注册中心就会开启自我保护模式,将所有的服务提供者的注册信息保护起来,而不是直接从服务注册表中移除。一旦网络恢复,这些服务提供者提供的服务还可以继续被服务消费者消费。

默认情况下,Eureka 的自我保护机制是开启的,如果想要关闭,则需要在配置文件中添加以下配置:

eureka:
  server:
    enable-self-preservation: false # false 关闭 Eureka 的自我保护机制,默认是开启,一般不建议大家修改

原理分析

1.当启动eurake客户端应用,比如上面说到的会员服务member,会把当前服务比如服务地址和端口以别名的注册到注册中心

2.当服务消费者比如上面说到的order订单服务,在接口调用的时候,使用服务别名也就是service id去注册中心获取实际的rpc远程调用地址

3. 服务消费者在获取到实际的rpc远程调用地址后,在本地使用HttpClient技术调用远程接口

流程图如下:

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

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

相关文章

虚拟化 vs. 裸金属:K8s 部署环境架构与特性对比

伴随着 IT 云化转型的逐步推进&#xff0c;越来越多的用户加入应用容器化改造的行列&#xff0c;并使用 Kubernetes&#xff08;K8s&#xff09;进行容器部署管理。然而&#xff0c;令不少用户感到困惑的是&#xff0c;由于大部分应用此前都部署在虚拟化或超融合环境&#xff0…

批量处理图片,轻松转换JPG到TIFF,让你的图片管理更优化!

作为图片处理的专业人士&#xff0c;您可能经常需要处理大量的图片文件&#xff0c;其中包括各种不同的格式&#xff0c;如JPG、PNG、GIF等。然而&#xff0c;不同的格式有着不同的优缺点&#xff0c;有时候为了更好地保存和传输图片&#xff0c;您可能需要将其转换为其他格式。…

NEFU系统分析与设计

系统分析与设计概述 用户故事 用来描述用户希望得到的功能 三要素&#xff1a;角色、活动、商业价值 举例&#xff1a;作为一个“网站管理员”&#xff0c;我想要“统计每天有多少人访问了我的网站”&#xff0c;以便于“我的赞助商了解我的网站会给他们带来什么收益。 系统…

Jmeter(十二):线程组元件第三方插件的线程组压力和负载线程详解

线程组(thread group) 线程组元件是任何一个测试计划的开始点。在一个测试计划中的所有元件 都必须在某个线程下。所有的任务都是基于线程组。 一个线程组可以看做一个虚拟用户组&#xff0c;线程组中的每个线程都可以理解为一 个虚拟用户。多个用户同时去执行相同的一批次任…

升讯威在线客服系统的并发高性能数据处理技术:为多线程处理同步数据

我在业余时间开发维护了一款免费开源的升讯威在线客服系统&#xff0c;也收获了许多用户。对我来说&#xff0c;只要能获得用户的认可&#xff0c;就是我最大的动力。 最近客服系统成功经受住了客户现场组织的压力测试&#xff0c;获得了客户的认可。 客户组织多名客服上线后&a…

uniapp跨域

配置 /manifest.json "devServer" : { "https" : false, "port" : 7101, "proxy": { "/api": { "target": "https://域名", "changeOrigin": t…

3D模型如何添加表面贴图?

1、模型表面贴图介绍 模型表面贴图&#xff08;Texture Mapping&#xff09;是一种将纹理映射到三维模型表面的技术&#xff0c;用于增加模型的细节和真实感。它通过在模型的每个表面点上应用纹理坐标&#xff0c;并将纹理像素与模型的对应点进行匹配&#xff0c;使得模型表面…

elasticSearch put全局更新和单个字段更新语法

1、如下&#xff1a;更新改类型未doc(文档)的全局字段数据 注意&#xff1a;如果你使用的是上面的语句&#xff0c;但是只写了id和title并赋值&#xff0c;图片上其他字段没有填写&#xff0c;执行命令后&#xff0c;则会把原文档中的其他字段都给删除了&#xff0c;你会发现查…

prosemirror 学习记录(二)创建 apple 节点

apple type 向 schema 中添加 apple type const nodes {apple: {inline: true,attrs: {name: { default: "unknown" },},group: "inline",draggable: true,parseDOM: [{tag: "span[custom-node-typeapple]",getAttrs(dom) {return {name: dom…

【高效开发工具系列】Apifox

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

Vue单页面应用(SPA)怎么做SEO

在Vue单页面应用(SPA)中,由于内容的动态加载和路由切换,搜索引擎可能无法直接获取和索引页面的内容。不过,你可以采取一些策略来优化SEO,使你的Vue单页面应用在搜索引擎中更好地被索引和展示: 1:使用预渲染(Prerendering)或服务器端渲染(Server-Side Rendering,SS…

爬虫采集如何解决ip被限制的问题呢?

在进行爬虫采集的过程中&#xff0c;很多开发者会遇到IP被限制的问题&#xff0c;这给采集工作带来了很大的不便。那么&#xff0c;如何解决这个问题呢&#xff1f;下面我们将从以下几个方面进行探讨。 一、了解网站的反爬机制 首先&#xff0c;我们需要了解目标网站的反爬机制…

设计模式(13)适配器模式

一、介绍&#xff1a; 1、定义&#xff1a;是一种结构型设计模式&#xff0c;它可以将一个类的接口转换成客户端所期望的另一种接口。适配器模式常用于系统的不兼容性问题。 2、组成&#xff1a; &#xff08;1&#xff09;目标接口&#xff08;Target&#xff09;&#xff…

商品价格区间筛选

列表应用&#xff0c;商品价格区间筛选。 (本笔记适合熟悉python列表及列表的条件筛选的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那么…

允许mysql远程访问

一、修改表 进入mysql&#xff0c;mysql -u root &#xff0c;如果没有root用户&#xff0c;那么是可以直接进入的 使用 mysql数据库 use mysql 执行 update user set host% where userroot; 查询 用户表 select User,Host from user 把root用户的host改为 % 允许任何主…

elment-ui 日期选择器 月份区间选择的问题解决(含代码、截图)

elment-ui 日期选择器 月份区间选择的问题解决&#xff08;含代码、截图&#xff09; 参考文章&#xff1a; elment-ui 日期选择器 月份区间选择的问题解决官方文档参考&#xff1a;https://element.eleme.cn/#/zh-CN/component/date-picker 效果图&#xff1a; 代码案例&…

赢球票(蓝桥杯)

赢球票 题目描述 某机构举办球票大奖赛。获奖选手有机会赢得若干张球票。 主持人拿出 N 张卡片&#xff08;上面写着 1⋯N 的数字&#xff09;&#xff0c;打乱顺序&#xff0c;排成一个圆圈。 你可以从任意一张卡片开始顺时针数数: 1,2,3 ⋯ 如果数到的数字刚好和卡片上的…

东莞理工网安学院举办第三届“火焰杯”软件测试高校就业选拔赛颁奖典礼

3月7日下午&#xff0c;由软件测试就业联盟主办的第三届“火焰杯”软件测试高校就业选拔赛颁奖典礼在9A206报告厅举行。本届比赛我院有25位同学报名参加&#xff0c;预选赛阶段&#xff0c;有5位同学获奖。其中&#xff0c;一等奖1项&#xff0c;奖金价值10000元&#xff1b;二…

element-plus 自动按需引入icon unplugin-icons相关配置(有效)

1.安装的组件有这四个2.vite.config.js配置文件修改页面使用附完整vite.config.js配置 相关配置&#xff08;自行根据配置文件中的安装哈&#xff0c;我就不一 一列举了&#xff09; 1.安装的组件有这四个 2.vite.config.js配置文件修改 页面使用 <i-ep-edit />效果 附…