【spring cloud】(二)服务的注册发现——Eureka

在这里插入图片描述

  各位小伙伴们大家好,欢迎来到这个小扎扎的spring cloud专栏,在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结,鉴于 看到就是学到、学到就是赚到 精神,这波依然是血赚 ┗|`O′|┛

💡spring cloud知识点速览

  • 🌕 Eureka
    • 🌓 什么是服务治理?为什么需要服务治理?
    • 🌓 什么是服务注册与发现?
    • 🌓 Eureka的两大组件
  • 🌕 Eureka的使用
    • 🌓 Eureka服务端server的创建
    • 🌓 Eureka客户端client的创建
  • 🌕 集群搭建
    • 🌓 Eureka服务端的集群搭建
    • 🌓 Eureka客户端的集群搭建
    • 🌓 微服务模块的相关配置
  • 🌕 服务发现
  • 🌕 自我保护机制
    • 🌓 什么是自我保护机制
    • 🌓 如何禁用自我保护机制

🌕 Eureka

🌓 什么是服务治理?为什么需要服务治理?

  服务治理是主要针对分布式服务框架的微服务,处理服务调用之间的关系、服务发布和发现、故障监控与处理,服务的参数配置、服务降级和熔断、服务使用率监控等。

需要服务治理的原因:

  • 过多的服务 URL 配置困难
  • 负载均衡分配节点压力过大的情况下,需要部署集群
  • 服务依赖混乱,启动顺序不清晰
  • 过多服务,导致性能指标分析难度较大,需要监控
  • 故障定位与排查难度较大

🌓 什么是服务注册与发现?

  服务注册主要针对服务提供者,服务启动后需要将本身以别名的方式注册到注册中心上;而服务发现主要是针对消费者(服务使用者),它在调用服务的时候需要通过别名去注册中心获取到相应的服务,然后再实现本地RPC调用远程RPC的功能。在这里插入图片描述

🌓 Eureka的两大组件

  Eureka Server: 提供注册服务,各节点启动时,会在EurekaServer中进行注册,各服务的节点信息会储存在EurekaServer中的服务注册表中。
  Eureka Client: 其本质是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的使用负载算法的负载均衡器在启动应用后将会向Eureka Server发送心跳(默认周期30s),如果EurekaServer在多个心跳周期内没有接收到某节点的心跳,将会把该节点从服务注册表上移除(默认周期90s)

🌕 Eureka的使用

🌓 Eureka服务端server的创建

  首先是创建一个子模块作为eureka的服务器模块,主要与其他的子模块有以下三处不同:

一、导入eureka服务端的依赖

<!-- 服务注册中心的服务端 eureka-server -->
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

二、配置文件配置eureka相关

# eureka的单机版配置
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/

三、主程序类上使用注解开启服务器

@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {public static void main(String[] args) {SpringApplication.run(EurekaMain7001.class, args);}
}

🌓 Eureka客户端client的创建

  之前创建的支付子模块8001就可以标记为Eureka的客户端,我们需要做的和Eureka服务端的三步一样:

一、导入eureka客户端的依赖

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

二、配置文件配置eureka相关

eureka:client:register-with-eureka: true #是否向注册中心注册自己fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认trueservice-url:defaultZone: http://localhost:7001/eureka #服务端的地址

三、主程序类使用注解开启客户端

@SpringBootApplication
@EnableEurekaClient
public class Payment8001Application {public static void main(String[] args) {SpringApplication.run(Payment8001Application.class, args);}
}

  红框显示当前名称为CLOUD-PAYMENT-SERVICE的服务状态为UP,也就是说这个模块已经被注册进了eureka服务
在这里插入图片描述
  目前为止,我们的eureka服务端上就只有一个支付模块作为服务的提供者注册进eureka服务器,并没有服务的调用者,于是乎我们可以将80端口的消费者模块通过以上三步,将其作为eureka客户端注册进eureka服务器,让其实现服务的调用

🌕 集群搭建

🌓 Eureka服务端的集群搭建

  想必集群的好处这里就不需要再进行赘述了,单体的服务器一旦出现故障整个项目就搞崩了,如果是集群就不一样了,一个故障其他顶上,服务之间可以实现互相注册相互守望

  现在我们就创建一个新的服务端子模块命名7002,作为集群中的另一个模块使用。那么,如何实现互相注册相互守望呢?答案就是:分别在配置文件中配置,使集群中的服务都能互相发现,其中最重要的就是defaultZone字段的对应值

server:port: 7001# eureka的单机版配置
eureka:instance:hostname: eureka7001.com  #eureka服务端的实例名字,这里以localhost代替client:register-with-eureka: false    #表示不向注册中心注册自己fetch-registry: false   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务service-url:# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/  # 单机版,指向的是自己# 集群版,指向集群中的其他服务defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
server:port: 7002# eureka的单机版配置
eureka:instance:hostname: eureka7002.com   #eureka服务端的实例名字,这里以localhost代替client:register-with-eureka: false    #表示不向注册中心注册自己fetch-registry: false   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务service-url:# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/  # 单机版,指向的是自己# 集群版,指向集群中的其他服务defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/
server:port: 7003# eureka的单机版配置
eureka:instance:hostname: localhost  # eureka服务端的实例名字,这里以localhost代替client:register-with-eureka: false    #表示不向注册中心注册自己fetch-registry: false   #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务service-url:# defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/  # 单机版,指向的是自己# 集群版,指向集群中的其他服务defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/

  集群搭建完毕之后,服务也要向集群中的所有模块进行注册,那么就需要使用配置文件了,这里以服务调用者80端口为例

server:port: 80spring:application:name: cloud-order-serviceeureka:client:register-with-eureka: true #是否向注册中心注册自己fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认trueservice-url:
#      defaultZone: http://localhost:7001/eureka #服务端的地址#服务端的地址,服务端为集群版,向所有的模块都注册defaultZone: http://localhost:7001/eureka,http://localhost:7002/eureka,http://localhost:7003/eureka

🌓 Eureka客户端的集群搭建

  从8001模块copy一个为8002,作为客户端集群的另一个模块,同样使用配置文件,将其也注册进服务端集群。此时就可以使用服务调用者80进行调用了,但是80的controller是直接写死的域名和端口,于是需要将域名端口改为微服务的名称,然后在服务调用者80模块开启负载均衡让请求合理的分配到服务集群的每一个模块
将原先的指定域名+端口改为指定服务
在这里插入图片描述
配置中开启负载均衡
在这里插入图片描述
这样集群就部署好了,可以实现服务调用对8001和8002的轮询

🌓 微服务模块的相关配置

配置服务的名称

eureka:instance:instance-id: payment8001

在这里插入图片描述
访问路径显示IP地址

eureka:instance:prefer-ip-address: true

🌕 服务发现

  所谓的服务发现就是对于已经注册进eureka里的微服务,可以通过这个方式来获得该服务的相关信息,实现服务发现功能分三步走:
一、对象注入

@Resource
private DiscoveryClient discoveryClient;

二、调用api获取服务信息

@GetMapping(value = "/discovery")
public Object discovery() {List<String> services = discoveryClient.getServices();for (String service : services) {log.info("***********service: " + service);}List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");for (ServiceInstance instance : instances) {log.info(instance.getServiceId() + "\t"+ instance.getHost() + "\t"+ instance.getPort() + "\t"+ instance.getUri());}return this.discoveryClient;
}

三、主程序入口注解开启发现功能

@EnableDiscoveryClient

这样即可打印服务的相关信息
在这里插入图片描述

🌕 自我保护机制

🌓 什么是自我保护机制

  EurekaServer会检查最近15分钟内所有EurekaClient正常心跳占比,如果低于85%就会触发自我保护机制,此时Eureka暂时把这些失效的服务保护起来,不会立即将其剔除。Eureka在启动完成后,每隔60秒会检查一次服务健康状态,如果这些暂时失效的服务过一段时间后(默认90秒)还是没有恢复,就会把这些服务剔除。反之这个服务就不会因为网络的延时、卡顿、拥挤等问题而被错误删除。

  总而言之,自我保护机制就是说某一时刻微服务不可用时,Eureka不会立即将其剔除,而是在一段时间内等待其正常发送心跳。这属于CAP原则的AP分支,主要保证了可用性和分区容错性

🌓 如何禁用自我保护机制

  服务端使用配置文件关闭eureka的自我保护机制

eureka:server:# 关闭自我保护机制,保证不可用服务被及时踢除enable-self-preservation: false# eviction-interval-timer-in-ms: 2000

  客户端使用配置文件设置心跳相关配置

eureka:instance:# Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)lease-renewal-interval-in-seconds: 1# Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务lease-expiration-duration-in-seconds: 2

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

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

相关文章

新手攻略熔炉_我的世界攻略:生存模式新手攻略

《我的世界》(英文:《minecraft》)是一款风靡全球的高自由度沙盒游戏&#xff0c;由瑞典MojangAB和4J Studios开发。国际版由微软Mojang工作室开发&#xff0c;中国版由网易代理。Minecraft着重于让玩家去探索、交互&#xff0c;并且改变一个由一立方米大小的方块动态生成的地图…

【spring cloud】(三)服务调用——Ribbon、OpenFeign

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的spring cloud专栏&#xff0c;在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;服务…

c语言斐波那契数列_剑指Offer-10-I.斐波那契数列

题目题目描述写一个函数&#xff0c;输入 n &#xff0c;求斐波那契&#xff08;Fibonacci&#xff09;数列的第 n 项。斐波那契数列的定义如下&#xff1a; F(0) 0, F(1) 1F(N) F(N - 1) F(N - 2), 其中 N > 1. 斐波那契数列由 0 和 1 开始&#xff0c;之后的斐波那契数…

mysql 导入 mssql_MySQL(csv,text)导入mssql使用方法

MySQL(csv,text)导入mssql是非常的简单了但是在导入过程中会碰到text字段问题了&#xff0c;下面我们就来看一篇关于MySQL(csv,text)导入mssql使用方法吧&#xff0c;具体的操作细节如下所示。分两步处理&#xff0c;第一步是将csv导入到mysql。没有使用mssql自带客户端的导入功…

c# mvvm模式获取当前窗口_AWTK-MVVM 介绍

MVVM(Model-View-ViewModel)介绍8.1 分离用户界面和业务逻辑在开发应用程序时&#xff0c;要把用户界面和业务逻辑分离开来&#xff0c;这是每个程序员都知道的常识。分离用户界面和业务逻辑有几个重要的好处&#xff1a;有利于隔离变化。用户界面是最容易变化的&#xff0c;易…

【spring cloud】(三)服务降级——Hystrix

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的spring cloud专栏&#xff0c;在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;服务…

mysql高级查询教程_MYSQL高级查询

实际开发中&#xff0c;经常需要对某些数据进行统计&#xff0c;比如&#xff0c;统计某个字段的最大值、最小值、平均值等。MySQL中&#xff0c;提供了一些函数来实现这些功能聚合函数COUNT()——返回某列的行数SUM()——返回某列值的和AVG()——返回某列的平均值MAX()——返回…

【dubbo】(一) dubbo是什么?

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的dubbo专栏&#xff0c;在这个系列专栏中我对B站尚硅谷雷神的dubbo教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;dubbo知识点速览&a…

axios安装_Vue脚手架安装,与基本语法(干货)

首先&#xff0c;这篇Vue文章是为了下一篇我整合springbootvue前后分离的小demo&#xff0c;这两天整理好会上传哈哈1. Node.js安装1.1 下载安装在node.js 官网下载&#xff0c; 根据自己电脑系统安装&#xff0c;一直点下一步即可1.2 测试安装是否成功WindowsR打开cmd窗口&…

base64 能放数组里面么_数组:总结篇

我们做个总结吧数组理论基础数组是非常基础的数据结构&#xff0c;在面试中&#xff0c;考察数组的题目一般在思维上都不难&#xff0c;主要是考察对代码的掌控能力也就是说&#xff0c;想法很简单&#xff0c;但实现起来 可能就不是那么回事了。首先要知道数组在内存中的存储方…

xampp mysql 卸载_卸载Xampp并安装apache + mysql + php 过程

首先是卸载xampp&#xff0c;打开xampp-control.exe 控制面板&#xff0c;停止apache和mysql服务。如果你是安装版xampp&#xff0c;可以到如果不是则安装如下方法。停止服务之后。就需要卸载服务。打开cmd&#xff0c;用sc.exe这个Windows命令开始——运行——cmd.exe&#xf…

nodejs mysql 返回json_python向mysql中存储JSON及Nodejs取出

虽然把JSON数据存入mysql也是比较蛋疼&#xff0c;但是相比使用Nodejs嵌套处理多个mysql查询并拼接返回数据也算是没mongo时的一个折中方案了。我使用python拼接了一个json格式的字符串&#xff0c;却遇到了一些问题1&#xff0c;如果把json数据转成str存入&#xff0c;那么nod…

17个常用经典数据可视化图表与冷门图表

数据可视化是创建信息图形表示的过程。随着可视化技术的飞速发展&#xff0c;可以利用强大的可视化工具选择合适的数据可视化图表来展示数据。以下专业人士都应该知道的一些最重要的数据可视化图表。 常见数据可视化图表 饼图 饼图是最常见和最基本的数据可视化图表之一。饼图…

python keyerror_盘点Python 初学者最容易犯的10大错误!你中招了吗?

对于新手&#xff0c;初学Python时&#xff0c;总会遇到这样那样的报错&#xff0c;想要弄懂Python错误信息的含义可能还不知道怎么做&#xff0c;这里列出了一些比较常见的Python报错问题&#xff0c;希望对于学习Python的人能够有些帮助。发现有很多想要学习Python却不知道如…

【spring cloud】(六)消息总线——springcloud Bus

各位小伙伴们大家好&#xff0c;欢迎来到这个小扎扎的spring cloud专栏&#xff0c;在这个系列专栏中我对B站尚硅谷阳哥的spring cloud教程进行一个总结&#xff0c;鉴于 看到就是学到、学到就是赚到 精神&#xff0c;这波依然是血赚 ┗|&#xff40;O′|┛ &#x1f4a1;Bus…

kali 切换root权限_Ubuntu 被曝严重漏洞:切换系统语言 + 输入几行命令,就能获取 root 权限...

公众号关注 “GitHubDaily”设为 “星标”&#xff0c;带你了解技术圈内新鲜事&#xff01;来自量子位无需系统密码&#xff0c;就能添加新的 sudo 用户、获取 root 权限&#xff0c;事后还能删除不留痕迹。这是 GitHub 安全研究员 Kevin Backhouse 发现的一个 Ubuntu 系统大漏…

oracle定义变量sql赋值_ORACLE获取SQL绑定变量值的方法总结

本文总结一下ORACLE数据库中如何获取SQL绑定变量值的方法&#xff0c;在SQL优化调优过程中&#xff0c;经常会用到这方面的知识点。在此梳理、总结一下这方面的知识点&#xff0c;方面日后查找、翻阅。方法1&#xff1a;查询V$SQLV$SQL视图中的BIND_DATA字段用来存储绑定变量的…

transition css_Transition 过渡

1&#xff1a;基本概念在一定时间内平滑的过渡&#xff0c;也就是圆滑的以动画效果改变css的属性值。它的过渡可以由鼠标点击、焦点获取或者失去、被点击事件或对元素的改变中触发&#xff1b;不能主动触发&#xff0c;只能被动触发。常用的基本属性有&#xff1a;Transition-d…

jdbc mysql分页_JDBC【数据库连接池、DbUtils框架、分页】

1.数据库连接池什么是数据库连接池简单来说&#xff1a;数据库连接池就是提供连接的。。。为什么我们要使用数据库连接池数据库的连接的建立和关闭是非常消耗资源的频繁地打开、关闭连接造成系统性能低下编写连接池编写连接池需实现java.sql.DataSource接口创建批量的Connectio…

python读写文件操作_详解Python文件读写操作

读文件 打开文件&#xff08;文件需要存在&#xff09;#打开文件 f open("data.txt","r") #设置文件对象 print(f)#文件句柄 f.close() #关闭文件 #为了方便&#xff0c;避免忘记close掉这个文件对象&#xff0c;可以用下面这种方式替代 with open(data.t…