服务注册中心 Eureka
服务注册中心 Eureka
Spring Cloud Eureka 是 Netflix 公司开发的注册发现组件,本身是一个基于 REST 的服务。提供注册与发现,同时还提供了负载均衡、故障转移等能力。
Eureka 有 3 个角色
- 服务中心(Eureka Server):服务器端。它提供服务的注册和发现功能,即实现服务的治理。
- 服务提供者(Service Provider):服务提供者。它将自身服务注册到 服务中心,以便 服务消费者 能够通过服务器提供的服务清单(服务注册列表)来调用它。
- 服务消费者(Service Consumer):服务消费者。它从 服务中心 获取已注册的服务列表,从而消费服务。
Eureka 是 AP 架构(可用性和分区容错性),Zookeeper 是 CP 架构(一致性和分区容错性)。Eueka 优先保证服务的可用性,Zookeeper 在 Master 节点因为网络故障与其他节点失去联系时,剩余节点选取 leader 的时间太长,这就导致在选举期间注册服务瘫痪。
1. 搭建单机Eureka注册中心
首先需要创建一个 spring-cloud 工程,删除 src 目录,然后在 pom.xml 文件中加入以下依赖:
<!-- 统一管理jar包版本 -->
<properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><spring-cloud.version>2021.0.0</spring-cloud.version><spring-boot.version>2.6.3</spring-boot.version>
</properties>
<!-- 子模块继承之后,提供作用:锁定版本,子modlue不用写groupId和version -->
<dependencyManagement><dependencies><!--spring boot 2.6.3--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!--spring cloud 2021.0.0--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement>
创建 eureka-server-7001 模块,然后在 pom.xml 文件中加入以下依赖:
<!-- 服务注册发现Eureka-->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
写 application.yaml 配置文件,具体如下:
server:port: 7001
eureka:instance:# eureka服务端的实例名字hostname: localhostclient:# 是否将自己注册到eureka serverregister-with-eureka: false# 是否从eureka server获取注册的服务信息fetch-registry: false# 设置与eureka server交互的地址service-url:defalutZone: http://${eureka.instance.hostname}:${server.port}/eureka/
最后在启动类上加上 @EnableEurekaServer 注解即可
@EnableEurekaServer
启动访问 localhost:7001 即可访问到 Eureka 注册中心的界面。
2. 创建服务提供者与服务消费者
创建服务提供者 provider-8001 和服务消费者 consumer-80 模块,然后在 pom.xml 文件中加入以下依赖:
<!-- 引入Eureka 客户端依赖 -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
服务提供者和消费者的依赖是一样的,都是 eureka-client。
写 application.yaml 配置文件,具体如下:
server:port: 8001
spring:application:name: cloud-provider-8001
eureka:client:# eureka服务地址service-url:defaultZone: http://localhost:7001/eureka/
server:port: 80
spring:application:name: cloud-consumer-80
eureka:client:service-url:defaultZone: http://localhost:7001/eureka/
最后在启动类上面加 @EnableEurekaClient 注解即可。
@EnableEurekaClient
先启动 Eureka 注册中心,然后在分别启动服务提供者和服务消费者,即可在 Eureka 服务注册中心看到相关信息。
3. Eureka 注册中心界面说明
访问上面我们搭建的注册中心(localhost:7001),界面如下:
其中最重要的是中间服务信息的那一栏,实例的状态有以下几种:
- UP:服务正常运行,特殊情况当进入自我保护模式,所有的服务依然是 UP 状态,所以需要做好熔断重试等容错机制应对灾难性网络出错情况
- OUT_OF_SERVICE:不再提供服务,其他的 Eureka Client 将调用不到该服务,一般有人为的调用接口设置的,如:强制下线。
- UNKNOWN:未知状态
- STARTING:表示服务正在启动中
- DOWN:表示服务已经宕机,无法继续提供服务
4. 服务自保和服务剔除机制
服务自保机制(Service Self-Preservation Mechanism):是指 Eureka Server 中的一种机制,用于保护在 Eureka 注册中心上注册的微服务实例免受意外删除的影响。当微服务实例在心跳超时时间内没有发送心跳信号给 Eureka Server 时,Eureka Server 不会立即将其从服务注册表中删除,而是认为该实例可能处于网络故障等临时异常情况,会将其保留在注册表中,提供一定的自我保护,防止误删健康的实例。这样可以避免因网络抖动、服务器负载或其他临时问题导致服务实例被误删,从而提高服务的稳定性和可用性。
服务剔除机制(Service Eviction Mechanism):与服务自保相对应,是指当服务实例连续长时间未发送心跳信号、或注册中心发现某个服务实例心跳连续失败的次数超过一定阈值时,Eureka Server 会将该服务实例从服务注册表中剔除。通过服务剔除机制,可以排除不健康、异常或故障状态的服务实例,防止其他服务继续调用故障的实例,减少错误的传播范围,提高系统的稳定性。
Eureka 中的服务自保机制是为了保护健康、可能出现临时异常的服务实例免受误删的影响,而服务剔除机制则是为了及时剔除不健康、长时间未发送心跳或心跳连续失败的服务实例,保障整个服务治理系统的正常运行。这两个机制的存在都是为了提高服务的可靠性和稳定性。
服务自保是默认开启的,可以使用以下配置来关闭,在 Eureka Server 的 application.yaml 配置文件中加入以下配置:
eureka: server:# 参数来关闭保护机制,已确保注册中心可以将不可用的实例正确剔除,默认为trueenable-self-preservation: false
5. Actuator 微服务信息完善
SpringCloud 体系里的服务实体向 Eureka 注册时,注册名默认是 IP名:应用名:应用端口名。
我们可以通过 actuator 来修改完善注册名,在服务提供者或消费者的 pom.xml 文件中加入以下配置:
<!-- actuator监控信息完善 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
然后在 application.yaml 配置文件中加入以下配置:
eureka:instance:# 实例名称instance-id: cloud-consumer01-80
6. 服务注册发现 Discovery
注册进入 Eureka 里面的微服务,可以通过服务发现来获取该服务的信息。
在服务提供者模块controller类,具体如下:
@Slf4j
@RestController
@RequestMapping("/provider")
public class ProviderController {@Autowiredprivate DiscoveryClient discoveryClient;@GetMapping("/discovery")public Object discovery() {// 获取所有微服务信息List<String> services = discoveryClient.getServices();for (String service : services) {log.info("service:={}", service);}return this.discoveryClient;}/*** 供消费者调用*/@GetMapping("/index")public String getMsg() {return "success";}
}
RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange() 以及 execute()。
在服务消费者模块中添加配置类,具体如下:
@Configuration
public class CloudConfig {@LoadBalanced@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
最后在服务消费者模块添加对应调用方法,具体如下:
@RestController
@RequestMapping("/consumer")
public class ConsumerController {@Autowiredprivate RestTemplate restTemplate;@GetMapping("/index")public String index() {// 远程微服务调用地址: 微服务名称String host = "http://cloud-provider-8001";// 具体URLString url = "/provider/index";// 发起远程调用// getForObject: 返回响应体中数据转化成的对象, 可以理解为json// getForEntity: 返回的是ResponseEntity的对象包含了一些重要的信息return restTemplate.getForObject(host + url, String.class);}
}
浏览器访问:http://localhost:80/consumer/index 地址,即出现在服务提供者模块中返回的 “success” 字符串。
相关文章:
服务注册中心 Eureka
服务注册中心 Eureka Spring Cloud Eureka 是 Netflix 公司开发的注册发现组件,本身是一个基于 REST 的服务。提供注册与发现,同时还提供了负载均衡、故障转移等能力。 Eureka 有 3 个角色 服务中心(Eureka Server):…...
SpringIoC组件的高级特性
目录 一、Bean组件的周期与作用域 二、FactoryBean接口 一、Bean组件的周期与作用域 1.1 Bean组件的生命周期 什么是Bean的周期方法 我们可以在组件类中定义方法,然后当IoC容器实例化和销毁组件对象的时候进行调用!这两个方法我们成为生命周期方法&a…...
Linux--进程地址空间
1.线程地址空间 所谓进程地址空间(process address space),就是从进程的视角看到的地址空间,是进程运行时所用到的虚拟地址的集合。 简单地说,进程就是内核数据结构和代码和本身的代码和数据,进程本身不能…...
ISIS路由协议
骨干区域与非骨干区域 凡是由级别2组建起来的邻居形成骨干区域;级别1就在非骨干区域,骨干区域有且只有一个,并且需要连续,ISIS在IP环境下目前不支持虚链路。 路由器级别 L1路由器只能建立L1的邻居;L2路由器只能建立L…...
论文解读:Bert原理深入浅出
摘取于https://www.jianshu.com/p/810ca25c4502 任务1:Masked Language Model Maked LM 是为了解决单向信息问题,现有的语言模型的问题在于,没有同时利用双向信息,如 ELMO 号称是双向LM,但实际上是两个单向 RNN 构成的…...
共享内存 windows和linux
服务端,即写入端 #include <iostream> #include <string.h> #define BUF_SIZE 1024 #ifdef _WIN32 #include <windows.h> #define SHARENAME L"shareMemory" HANDLE g_MapFIle; LPVOID g_baseBuffer; #else #define SHARENAME "sh…...
一个mongodb问题分析
mongodb问题分析 现状 表的个数: 生产上常用的表就10来个。 sharding cluster replica set方式部署: 9个shard server, 每个shard server 1主2从, 大量数据写入时或对大表创建索引时,可能有主从复制延迟问题。实…...
Vue3.0极速入门- 目录和文件说明
目录结构 以下文件均为npm create helloworld自动生成的文件目录结构 目录截图 目录说明 目录/文件说明node_modulesnpm 加载的项目依赖模块src这里是我们要开发的目录,基本上要做的事情都在这个目录里assets放置一些图片,如logo等。componentsvue组件…...
RabbitMQ---订阅模型-Direct
1、 订阅模型-Direct • 有选择性的接收消息 • 在订阅模式中,生产者发布消息,所有消费者都可以获取所有消息。 • 在路由模式中,我们将添加一个功能 - 我们将只能订阅一部分消息。 例如,我们只能将重要的错误消息引导到日志文件…...
Django REST framework实现api接口
drf 是Django REST framework的简称,drf 是基于django的一个api 接口实现框架,REST是接口设计的一种风格。 一、 安装drf pip install djangorestframework pip install markdown # Markdown support for the browsable API. pip install …...
4.19 20
服务端没有 listen,客户端发起连接建立,会发生什么? 服务端如果只 bind 了 IP 地址和端口,而没有调用 listen 的话,然后客户端对服务端发起了连接建立,服务端会回 RST 报文。 没有 listen&#x…...
(动态规划) 剑指 Offer 10- II. 青蛙跳台阶问题 ——【Leetcode每日一题】
❓剑指 Offer 10- II. 青蛙跳台阶问题 难度:简单 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e97(1000000007),如计算初始结果为:1…...
物联网WIFI 模块AT指令版本七大元凶
前言 目前我们讨论的这个问题,并不是说WIFI方案不具备以应的功能。而是指在同一个AT固件下可能存在的问题。由于各厂商AT指令的开发深度不同,导致各厂商之间的AT指令差异很大。我总结了一些问题,可能是导致目前AT指令不好用元凶。 底层库问题…...
Qt 正则(数据格式校验、替换指定格式数据、获取匹配数据)
头文件引用 #include <QRegExp>初始化QRegExp实列 QRegExp re("^\\d{1,3},\\d{1,3}$");数据格式验证 QRegExp re("^\\d{1,3},\\d{1,3}$"); QString msg "12,33"; if(re.exactMatch()){// 验证通过 }else{//验证不通过 }替换数…...
网络层协议——ip
文章目录 1. 网络层2. IP协议2.1 协议头格式 3. 网段划分3.1 特殊的IP地址3.2 IP地址的数量限制 4. 私有IP地址和公网IP地址 1. 网络层 在应用层解决了如何读取完整报文、序列化反序列化、协议处理问题。在传输层解决了可靠性问题。那么网络层IP的作用是在复杂的网络环境中确定…...
Qt6和Rust结合构建桌面应用
桌面应用程序是原生的、快速的、安全的,并提供Web应用程序无法比拟的体验。 Rust 是一种低级静态类型多范式编程语言,专注于安全性和性能,解决了 C/C 长期以来一直在努力解决的问题,例如内存错误和构建并发程序。 在桌面应用程序开…...
Kubernetes(K8S)简介
Kubernetes (K8S) 是什么 它是一个为 容器化 应用提供集群部署和管理的开源工具,由 Google 开发。Kubernetes 这个名字源于希腊语,意为“舵手”或“飞行员”。k8s 这个缩写是因为 k 和 s 之间有八个字符的关系。 Google 在 2014 年开源了 Kubernetes 项…...
面试中问:React中函数组件和class组件的区别,hooks模拟生命周期
React中函数组件和class组件的区别,hooks模拟生命周期 React中函数组件和class组件的区别hooks模拟生命周期 React中函数组件和class组件的区别 函数组件: 定义:函数组件是使用纯函数定义的组件,它接受 props 作为参数并返回 JSX。简洁性&am…...
Python高光谱遥感数据处理与高光谱遥感机器学习方法应用
本文提供一套基于Python编程工具的高光谱数据处理方法和应用案例。 本文涵盖高光谱遥感的基础、方法和实践。基础篇以学员为中心,用通俗易懂的语言解释高光谱的基本概念和理论,旨在帮助学员深入理解科学原理。方法篇结合Python编程工具,专注…...
Java实现接收xml格式数据并解析,返回xml格式数据
需求描述:后端接受xml格式数据,解析出相应数据,并返回xml格式数据。 <!--XML解析--><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId>…...
【C++】初步认识模板
🏖️作者:malloc不出对象 ⛺专栏:C的学习之路 👦个人简介:一名双非本科院校大二在读的科班编程菜鸟,努力编程只为赶上各位大佬的步伐🙈🙈 目录 前言一、泛型编程二、函数模板2.1 函…...
Ansible 临时命令搭建安装仓库
创建一个名为/ansible/yum.sh 的 shell 脚本,该脚本将使用 Ansible 临时命令在各个受管节点上安装 yum 存储库. 存储库1: 存储库的名称为 EX294_BASE 描述为 EX294 base software 基础 URL 为 http://content/rhel8.0/x86_64/dvd/BaseOS GPG 签名检查为…...
phpstorm动态调试
首先在phpstudy搭建好网站,在管理拓展开启xdebug拓展 查看php.ini配置已经更改 需要增添修改一下设置 [Xdebug] zend_extensionD:/phpstudy_pro/Extensions/php/php5.6.9nts/ext/php_xdebug.dll xdebug.collect_params1 xdebug.collect_return1 xdebug.auto_trace…...
二叉树的层序遍历及完全二叉树的判断
文章目录 1.二叉树层序遍历 2.完全二叉树的判断 文章内容 1.二叉树层序遍历 二叉树的层序遍历需要一个队列来帮助实现。 我们在队列中存储的是节点的地址,所以我们要对队列结构体的数据域重定义, 以上代码 从逻辑上来讲就是1入队,1出队&am…...
java八股文面试[JVM]——JVM内存结构
参考: JVM学习笔记(一)_卷心菜不卷Iris的博客-CSDN博客 JVM是运行在操作系统之上的,它与硬件没有直接的交互 JVM内存结构: 方法区:存储已被虚拟机加载的类元数据信息(元空间) 堆:存放对象实…...
Kafka基本使用
查看Kafka的进程是否在运行 #命令行终端中运行如下命令 ps -ef | grep kafkafind / -iname kafka-server-start.shcd /usr/local/kafka/bin/#启动kafka ./kafka-server-start.sh -daemon /usr/local/kafka/config/server.propertiesKafka默认使用9092端口提供服务…...
【目标检测】理论篇(2)YOLOv3网络构架及其代码实现
网络构架图: 代码实现: import math from collections import OrderedDictimport torch.nn as nn#---------------------------------------------------------------------# # 残差结构 # 利用一个1x1卷积下降通道数,然后利用一个3x3卷…...
k8s之工作负载、Deployment、DaemonSet、StatefulSet、Job、CronJob及GC
文章目录 1、工作负载1.1、定义1.2、分类 2、Deployment2.1、定义2.2、Deployment创建2.3、Deployment 更新机制2.3.1、比例缩放(Proportional Scaling)2.3.2、HPA(动态扩缩容)2.3.2.1、需要先安装metrics-server2.3.2.2、配置hpa…...
IDEA项目实践——Element UI概述
系列文章目录 IDEA项目实践——JavaWeb简介以及Servlet编程实战 IDEA项目实践——Spring当中的切面AOP IDEA项目实践——Spring框架简介,以及IOC注解 IDEA项目实践——动态SQL、关系映射、注解开发 IDEWA项目实践——mybatis的一些基本原理以及案例 文章目录 …...
Docker 容器学习笔记
Docker 容器学习笔记 容器的由来 早先,虚拟机通过操作系统实现相互隔离,保证应用程序在运行时相互独立,避免相互干扰。但是操作系统又笨又重,耗费资源严重: 容器技术只隔离应用程序的运行时环境但容器之间共享同一个…...
七牛云加速WordPress/济南seo网站优化
前段时间遇到了这个问题 也百度了很多 不过还是用自己的方法解决了 一个超级简单的方法 简单到令人发指 由于直接写文本太丑了 所以还是截图吧 嘻嘻嘻 假如有一个这样的数组 (这是假如 可能每个人的数据都不一样哦 但是方法都是可用的) 因为我这个项目功…...
wordpress 无法进入后台/网站排名优化快速
在 Linux 和 Windows 下给 Tomcat 分配大内存设置方法 - 偷得浮生半日闲 - 博客频道 - CSDN.NET在 Linux 和 Windows 下给 Tomcat 分配大内存设置方法2008-02-28 13:2712507人阅读评论(0)收藏举报其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4…...
做网站播放未上映的电影是侵权吗/贵阳百度快照优化排名
电信域名系统列表 (按拼音排序, 共32条)电信A安徽202.102.192.68202.102.199.6861.132.163.68202.102.213.68电信A澳门202.175.3.8202.175.3.3电信B北京202.96.199.133202.96.0.133电信C重庆61.128.128.6861.128.192.68电信F福建218.85.157.99218.85.152.99电信G甘肃…...
wordpress3.3/网络营销与传统营销的区别
1)API申请2)API调用3)[b]效果展示[/b]4)精准查询--------------------------------------------------------------------------1)API申请爱帮提供查询接口API,需要申请Key http://www.aibang.com查询数量有限制,2013-12-4 最多 1000次/每天 10次/分钟返…...
温州网站建设温州网站制作/百度网站域名
本节继续演示线条在排版中的作用,您将在本节使用线条描述内容的层级关系,同时也能起到引导观众视线的作用。 首先打开形状面板,并选择肘形箭头连接符工具。 在此处按下并向右上方拖动,以绘制一个肘形连接符。 然后将肘形连接符修改为虚线样式。...
网站管理助手ftp/电商怎么做推广
最近在使用selenium做一个数字货币的自动化脚本时,遇到一个问题就是okex网站的input使用clear()方法居然无法清空,但是后来试了好多次发现方法是可以使用的,而且这个网站修改input的value也没用,必须在文本框里修改才行࿰…...