SpringCloud Eureka应用全面介绍
作者:扎哇太枣糕 发布时间:2022-08-23 17:43:26
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 #是否从注册中心抓取已有的注册信息 默认true
service-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 #是否从注册中心抓取已有的注册信息 默认true
service-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
来源:https://blog.csdn.net/qq_59138417/article/details/125834381


猜你喜欢
- Bottom SheetBottom Sheet 是 Design Support Library 23.2 版本引入的一个类似于对话框的控
- kafka-console-consumer.sh解读kafka-console-consumer.sh 脚本是一个简易的消费者控制台。该
- 会话技术会话:一次会话中包含多次请求和响应。一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止功能:在一次会话的范围内
- 使用到的类:net.sf.json.JSONObject 使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2
- 一、系统介绍本系统实现扑克的分发,抢地主,电脑自动出牌等功能。二、系统展示1.扑克分发2.抢地主3.出牌4.游戏胜利三、系统实现Card.j
- MapReduce的原理MapReduce由两个主要阶段组成:Map和Reduce。在Map阶段中,数据集被分成若干个小块,每个小块由Map
- 有三种方法如下:三个方法都需要动态申请读写权限否则保存图片到相册也会失败方法一/** * 保存bitmap到本地
- 为什么要学习Android与H5互调?微信,QQ空间等大量软件都内嵌了H5,不得不说是一种趋势。Android与H5互调可以让我们的实现混合
- public class Count { public static void main(String[] args) { int i =
- 概述在使用Spring Boot的时候我们经常使用actuator,健康检查,bus中使用/refresh等。这里记录如何使用注解的方式自定
- 一、利用距离感应器监听听筒靠近耳朵事件准确的说距离感应器并不能监听到你是否把手机靠近耳朵,也许是你用手挡在了距离感应器前面,但这不是我们关心
- java 图片转base64字符串、base64字符串转图片,具体内容如下1. 图片转base64字符串: /** * base
- 前言新进阶的程序员可能对async、await用得比较多,却对之前的异步了解甚少。本人就是此类,因此打算回顾学习下异步的进化史。本文主要是回
- 这篇文章主要介绍了Java中遍历ConcurrentHashMap的四种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一
- 废话不多说了,直接给大家贴代码了。package com.only.android.app;import java.io.File;impo
- 验证码的实现原理: 在一个Servlet中生成验证,并把验证码上的数据保存在Session,用户提交验证码之后,会提交给另外一个
- 本文实例讲述了Android持久化技术之SharedPreferences存储。分享给大家供大家参考,具体如下:1、SharedPrefer
- 序列化与反序列化序列化:把对象转换成字节的过程,称为对象序列化反序列化:把字节恢复成对象的过程,称为反序列化对象的持久化概念:把字节保存的硬
- 最近项目里涉及到自定义View的东西还是挺多的,所以打算在自定义View上多花点时间,也顺便分享给大家。先总结下自定义View的步骤:1、自
- 发布:一个对象是使它能够被当前范围之外的代码所引用:常见形式:将对象的的引用存储到公共静态域;非私有方法中返回引用;发布内部类实例,包含引用