SpringCloud-微服务Eureka服务注册中心

news2024/12/25 9:23:33

微服务&服务注册中心

  • 前言
  • 一、微服务
    • 1.什么是微服务
    • 2.单体架构和微服务架构
      • 2.1.单体架构
      • 2.2.微服务架构
  • 二、服务注册中心
    • 1.服务注册中心简介
    • 2.Eureka服务注册中心
      • 2.1.Eureka Server开发
      • 2.2 Eureka Client开发
    • 3.Eureka的自我保护机制
      • 3.1.Eureka自我保护机制简介
      • 3.2.Eureka自我保护机制的停止
        • 3.2.1.客户端心跳高于预期阈值的实现
        • 3.2.2.服务端自我保护机制禁用的实现


前言

  最近学习SpringCloud,对其中的知识点进行梳理,故写下博客记录自己的学习笔记,方便日后回顾。


一、微服务

1.什么是微服务

  官方定义:微服务就是由一系列围绕自己业务开发的微小服务构成,它们独立部署运行在自己的进程里,基于分布式的管理

  通俗定义:微服务是一种架构,这种架构是将单个的整体应用程序分割成更小的项目关联的独立的服务。一个服务通常实现一组独立的特性或功能,包含自己的业务逻辑和适配器。各个微服务之间的关联通过暴露的API来实现。这些独立的微服务不需要部署在同一个虚拟机,同一个系统和同一个应用服务器中。

2.单体架构和微服务架构

2.1.单体架构

在这里插入图片描述

1.优点:
  单一架构模式在项目初期很小的时候开发方便,测试方便,部署方便,运行良好。

2.缺点:
  应用随着时间的推进,加入的功能越来越多,最终会变得巨大,一个项目中很有可能数百万行的代码,互相之间繁琐的jar包。 久而久之,开发效率低,代码维护困难,还有一个如果想整体应用采用新的技术,新的框架或者语言,那也是极其困难的。同时任意模块的漏洞或者错误都会影响这个应用,降低系统的可靠性。


2.2.微服务架构

在这里插入图片描述

1.优点:

  • 将服务拆分成多个单一职责的小的服务,进行单独部署,服务之间通过网络进行通信。
  • 每个服务应该有自己单独的管理团队,高度自治。
  • 服务各自有自己单独的职责,服务之间松耦合,避免因一个模块的问题导致服务崩溃。

2.缺点:

  • 开发人员要处理分布式系统的复杂性。
  • 多服务运维难度,随着服务的增加,运维的压力也在增大。
  • 服务治理和服务监控同样是关键。


二、服务注册中心

1.服务注册中心简介

  服务注册中心:服务注册中心就是在整个的微服务架构中单独提出一个服务,这个服务不完成系统的任何的业务功能,仅仅用来完成对整个微服务系统的服务注册服务发现,以及对服务健康状态的监控和管理功能。

在这里插入图片描述

服务注册中心

  • 可以对所有的微服务的信息进行存储,如微服务的名称、IP、端口等
  • 可以在进行服务调用时通过服务发现查询可用的微服务列表及网络地址进行服务调用
  • 可以对所有的微服务进行心跳检测,如发现某实例长时间无法访问,就会从服务注册表移除该实例

  目前常用的服务注册中心有Eureka,Consul、Zookeeper、以及阿里巴巴推出Nacos,这些注册中心SpringCloud都支持,并且在本质上都是用来管理服务的注册和发现以及服务状态的检查的。而我们这里只对Eureka和Nacos两种服务注册中心进行介绍。

2.Eureka服务注册中心

  Eureka官网地址:https://github.com/Netflix/eureka/wiki
  Eureka是Netflix开发的服务发现框架,本身也是一个基于Rest的服务,SpringCloud将它集成在其子项目springcloud-cloud-netflix中,实现SpringCloud的服务注册和发现功能。其包含两个组件:Eureka Server 和 Eureka Client。更加通俗理解,Eureka Server可以理为Eureka服务注册中心,而Eureka Client则是指各个微服务。

2.1.Eureka Server开发

  1.创建项目并引入依赖

        <!--springboot web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

  2.编写配置文件application.yml

server:
  port: 8080 #服务端口

spring:
  application:
    name: EUREKASERVER  #服务名称 唯一标识

eureka:
  client:
    service-url:
      defaultZone: http://loalhost:8761/eureka #指定服务注册中心的地址
    fetch-registry: false #关闭eureka client的立即注册
    register-with-eureka: false #当前应用仅作为服务端,不再作为客户端进行注册

  3.入口类加入注解开启Eureka Server

@SpringBootApplication
@EnableEurekaServer //开启当前应用为服务注册中心
public class EurekaServerApplication {
    public static void main(String[] args){
        SpringApplication.run(EurekaServerApplication.class, args);
    }
}

  完成以上操作后启动该服务,进入浏览器访问Eureka的服务注册页面http://localhost:8761,即可看到如下图界面,我们也可以观察到,此时服务注册中心中是没有服务注册上去的,显示的是
No instances available在这里插入图片描述

2.2 Eureka Client开发

  1.创建项目并引入依赖

        <!--springboot web依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

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

  2.编写配置文件application.yml

server:
  port: 8888

spring:
  application:
    name: EUREKACLIENT

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka #指定服务注册中心的地址

  3.入口类加入注解开启Eureka Client

@SpringBootApplication
@EnableEurekaClient //开启eureka客户端
public class EurekaClientApplication {
    public static void main(String[] args){
        SpringApplication.run(EurekaClientApplication.class, args);
    }
}

  同理,在完成上述操作后启动该服务,但是值得注意的是,我们需要先启动之前的Eureka服务注册中心,再启动本服务,即可服务注册中心的注册情况,如下图所示,EUREKACLIENT服务已经注册到服务中心当中。

在这里插入图片描述

3.Eureka的自我保护机制

  官方文档地址:https://github.com/Netflix/eureka/wiki/Server-Self-Preservation-Mode

3.1.Eureka自我保护机制简介

  当我们启动服务注册中心,同时对应客户端服务也已经注册到服务注册中心,但是某个时间点该客户端服务突然宕机,对服务注册中心进行多次刷新该服务依然存在于注册中心,同时Eureka服务注册中心出现如下界面:
在这里插入图片描述

  • EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
    紧急!EUREKA 可能错误地声称实例已启动,而实际上它们没有启动。 续订小于阈值,因此实例不会过期只是为了安全起见

而这也是Eureka触发了自我保护机制的现象。
  在官方文档中对Eureka的自我保护有这样的定义:

默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时(比如网络延迟),微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。Eureka Server在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期。这种设计的哲学原理就是"宁可信其有不可信其无!"。自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。

所以我们也可以知道,引入自我保护机制,其实也是为了确保这种灾难性的网络事件不会清除掉Eureka中的注册数据,并将其传播到其他的客户端。

3.2.Eureka自我保护机制的停止

  自我保护机制的开启时间并不是没有限制的,在官方文档中也提到,当该服务的心跳次数高于预期阈值,或者自我保护机制被禁用,那么该服务则会从服务注册中心中移除。虽然这两个条件是或者关系,但是实现起来需要两者的配合使用。

3.2.1.客户端心跳高于预期阈值的实现

  在客户端配置文件application.yml中加入如下配置:

eureka:
  instance:
    lease-expiration-duration-in-seconds: 10 #修改eureka server默认接受心跳的最大时间 默认是90s
    lease-renewal-interval-in-seconds: 5 #指定客户端多久向eureka server发送一次心跳 默认是30s

在默认的配置当中,90s的时间内,每隔30s向服务端发送一次心跳,则每个单元就发送了3次心跳;而在15分钟这个总的周期当中,总共会发送30次心跳,在这30次心跳中要有超过85%的失败心跳,则不会启动自我保护机制,等待超时时间之后将清除该服务。我们在配置中更改了默认数据,则每个单元内发送2个心跳,倘若两个心跳都失败,则会加快清除的速度。

3.2.2.服务端自我保护机制禁用的实现

  在服务端配置文件application.yml中加入如下配置:

eureka:
  server:
    enable-self-preservation: false #关闭自我保护
    eviction-interval-timer-in-ms: 3000 #超时3s自动清除 默认一分钟

这里需要注意,即使关闭了自我保护机制,当注册中心检测到两者之间的失败心跳频率低于预定频率,也不会立刻清除该服务,而是等待超时时间过后再清除。当然官方并不推荐关闭自我保护机制这种方式。

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

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

相关文章

MySQL数据库连接超时自动断开的解决方案

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

windows下msys2编译64位的ffmpeg源码

目前遇到过两次需求&#xff0c;需要编译ffmpeg源码。网上下载的编译好的源码里面可能不全&#xff0c;很多时候需要自行编译源码。本文介绍自行编译ffmpeg64位源码&#xff08;32位通过相似的方式为编译成功&#xff0c;不知道原因&#xff09; 环境&#xff1a; 2023.5.4下载…

团队密码管理器Passbolt的安装

老苏下载了吴恩达联手 OpenAI 推出的 Prompt for developer 课程&#xff0c;总长度大概在一个半小时左右&#xff0c;可以让我们学习正确的 ChatGPT Prompt 工程 虽然课程对话是英文&#xff0c;但有中文字幕&#xff0c;课程地址&#xff1a;https://www.aliyundrive.com/s/…

[Gitops--9]微服务项目sangomall代码配置修改及资源清单文件

微服务项目sangomall代码配置修改及资源清单文件 1. 中间件的地址 1.1 Nacos 集群外 nacos-server.intra.com 192.168.31.211集群内 nacos-server.sangomall.svc.cluster.local. nacos-server.sangomall.svc.cluster.local.:88481.2 Redis 集群内 redis.sangomall.svc.c…

ipad有必要用手写笔吗?电容笔和Apple pencil区别

与Apple Pencil最大的不同之处&#xff0c;在于普通的电容笔并不具备着重力压感&#xff0c;而是会给人一种倾斜的压感。如果不是频繁作画&#xff0c;那就用一支普通的电容笔。这种电容笔不但可以用于办公室&#xff0c;也可以用于记笔记、做练习。再说了&#xff0c;一支苹果…

深入理解 Linux 内核(二)

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 深入理解 Linux 内核&#xff08;二&#xff09; Linux 设备驱动程序 Linux设备驱动开发详解 文章目录 系列文章目录五、定时测量1、时钟和定时器电路2、Linux 计时体系结构&#xff08;1&#xff09;计时体系机构的数据…

200G 400G光模块介绍

200G 光模块封装有2种&#xff0c;分别是QSFP56和QSFP-DD。 200G QSFP56有2种光模块&#xff0c;第一种是200G QSFP56 SR4&#xff0c;第二种是200G QSFP56 FR。 200G QSFP56 SR4的封装形式是QSFP56&#xff0c;速率是200G&#xff0c;波长是850nm&#xff0c;最远传输距离是10…

儿童书写台灯哪个牌子比较好?盘点护眼学生用台灯品牌排行

想要拥有一个健康的视力对于我们多么重要&#xff0c;日常生活多么不便利&#xff0c;就是像家里孩子考学时视力也是对于未来专业选择的一个阻碍。 想要孩子不吃近视的苦&#xff0c;从小就要开始抓孩子对于视力和眼睛的呵护。 养成好习惯必须保持一个正确的学习姿势&#xff…

redis 持久化 RDB + AOF

redis 持久化 RDB AOF 1.redis持久化----两种方式 RDB&#xff08;Redis DataBase&#xff09;和AOF&#xff08;Append Only File&#xff09; RDB&#xff0c;简而言之&#xff0c;就是在不同的时间点&#xff0c;将redis存储的数据生成快照并存储到磁盘等介质上 AOF&am…

视频剪辑学习 pr 中视频

2023年中视频学习计划&#xff0c;学习资料全套视频。全网一手资料&#xff0c;有意者V&#xff1a; 第一章- 基础知识 第二章- 素材获取 第三章- 文案创作及搬运改写 第四章- 智能配音与自己配音修音 第五章- 剪辑基础快速入门 手机剪映零基础快速入门 电脑剪映零基础快速入门…

360SEO 360搜索引擎算法的基础知识

360搜索引擎是中国的一家互联网搜索引擎公司&#xff0c;由奇虎360公司推出。作为中国互联网领域的知名品牌之一&#xff0c;它的搜索算法一直备受关注和研究。那360搜索引擎有哪些算法的基础知识呢&#xff1f; 一、概述 360搜索引擎算法是一个非常庞大、复杂的系统&#xff…

科研人的利器:利用New Bing五分钟读完一篇论文

大家好&#xff0c;我是可夫小子&#xff0c;关注AIGC、读书和自媒体。解锁更多ChatGPT、AI绘画玩法。加我&#xff0c;拉你进群。 New Bing『新必应』是微软一款集成了ChatGPT的搜索引擎&#xff0c;它以聊天的方式来进行信息搜索&#xff0c;这不同过去几十年通过对话框搜索信…

Linux之yum原(三)

最近学习Linux&#xff0c;利用 yum 下载软件的时候&#xff0c;总是报错&#xff1a; 错误&#xff1a;为仓库 appstream 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist因此小编决定更换一下 yum 源&#xff0c;小编用的是 CentOS8.5.2111&am…

Scala Option类型,异常处理,IO,高阶函数

Option类型 实际开发中, 在返回一些数据时, 难免会遇到空指针异常(NullPointerException), 遇到一次就处理一次相对来讲还是比较繁琐的. 在Scala中, 我们返回某些数据时&#xff0c;可以返回一个Option类型的对象来封装具体的数据&#xff0c;从而实现有效的避免空指针异常。S…

记录-对象有哪些继承方式

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 1. 原型链 温故而知新&#xff1a; 构造函数、原型和实例的关系&#xff1a;  每个构造函数都有一个原型对象&#xff0c;原型有一个属性指回构造函数&#xff0c;实例有一个内部指针指向原型。 思考…

【Java校招面试】基础知识(六)——计算机网络

目录 前言一、TCP协议 / UDP协议二、HTTP协议后记 前言 本篇主要介绍计算机网络的相关内容。 “基础知识”是本专栏的第一个部分&#xff0c;本篇博文是第六篇博文&#xff0c;如有需要&#xff0c;可&#xff1a; 点击这里&#xff0c;返回本专栏的索引文章点击这里&#xf…

Leetcode303. 区域和检索 - 数组不可变

Every day a leetcode 题目来源&#xff1a;303. 区域和检索 - 数组不可变 解法1&#xff1a;暴力 代码&#xff1a; class NumArray { public:vector<int> v;NumArray(vector<int> &nums){v nums;}int sumRange(int left, int right){int sum 0;for (in…

ChatGPT镜像网站【免费白嫖】

文章目录 前言说明网站 前言 ChatGPT是一种基于OpenAI GPT&#xff08;Generative Pretrained Transformer&#xff09;模型的聊天机器人&#xff0c;它可以对用户提出的问题做出回答&#xff0c;同时还能够进行精准的语言理解和回复&#xff0c;较好地满足了人们与机器人之间…

避免使用第三方工具完成电脑环境检测

0. 简介 在之前配置各种深度学习环境的时候经常需要先检测一下电脑的软硬件环境&#xff0c;其实整个过程比较重复和固定&#xff0c;所以我们是否有可能一键检测Python版本、PIP版本、Conda版本、CUDA版本、电脑系统、CPU核数、CPU频率、内存、硬盘等内容这是很多Deepper苦恼…

[架构之路-183]-《软考-系统分析师》-13-系统设计 - 高内聚低耦合详解、图解以及技术手段

目录 第1章 什么是高内聚低耦合 1.1 概念 1.2 目的 1.3 什么时候需要进行高内聚低耦合 1.4 什么系统需要关注高内聚、低耦合 第2章 分类 2.1 内聚的分类 2.2 耦合的分类 第3章 增加高内聚降低耦合度的方法 3.1 增加高内聚 3.2 降低耦合度 第1章 什么是高内聚低耦…