SpringCloud Eureka服务治理之服务注册服务发现
作者:共饮一杯无 发布时间:2021-12-27 15:07:16
什么是Eureka
Netflix Eureka 是一款由 Netflix 开源的基于 REST 服务的注册中心,用于提供服务发现功能。Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 进行了二次封装,主要负责完成微服务架构中的服务治理功能。
Spring Cloud Eureka 是一个基于 REST 的服务,并提供了基于 Java 的客户端组件,能够非常方便的将服务注册到 Spring Cloud Eureka 中进行统一管理。
Eureka核心概念服务注册和服务发现
服务注册
注册中心
拆开来看注册和中心。注册比如用户注册,就是将自己的信息注册在某个平台上。中心可以理解成一个统一管理信息的平台。所以注册中心顾名思义是统一管理所有注册信息的平台。
服务注册
指的是服务在启动时将自身的信息注册到注册中心中,方便信息进行统一管理。服务注册是客户端向注册中心提交信息的动作。
服务发现
服务发现
指的是从注册中心获取对应服务的信息,是客户端向注册中心拉取pull信息的动作。
Eureka实战
Eureka 的架构主要分为 Eureka Server 和 Eureka Client 两部分,Eureka Client 又分为 Applicaton Service 和 Application Client,Applicaton Service 就是服务提供者,Application Client 就是服务消费者。
Eureka Client 会向 Eureka Server 发送请求,进行注册,并将自己的一些信息发送给 Eureka Server。
注册成功后,每隔一定的时间,Eureka Client 会向 Eureka Server 发送心跳来续约服务,也就是汇报健康状态。 如果客户端长时间没有续约,那么 Eureka Server 将在 90 秒(默认)内从服务器注册表中删除客户端的信息。
Eureka Client 还会定期从 Eureka Server 拉取注册表信息,然后通过Ribbon 组件根据负载均衡算法得到一个目标,并发起远程调用。
应用正常停止时也会通知 Eureka Server 移除相关信息,信息成功移除后,其他客户端会更新服务的信息,这样就不会调用已经下线的服务了,当然这个会有延迟,有可能会调用到已经失效的服务,所以在客户端会开启失败重试功能来避免这个问题。
Eureka Server 会有多个节点组成一个集群,保证高可用。Eureka Server 没有集成其他第三方存储,而是存储在内存中,内部维护一个注册表的概念。
所以 Eureka Server 之间会将注册信息复制到集群中的 Eureka Server 的所有节点。 这样数据才是共享状态,任何的 Eureka Client 都可以在任何一个 Eureka Server 节点查找注册表信息。
Eureka服务端单节点构建
打开start.spring.io/ 或者阿里云的快速start start.aliyun.com/bootstrap.h… ,开始构建对应的服务端项目。推荐使用阿里云的快速start,因为访问速度更快些。
自动生成完成后,在resource目录下,新建application.yml
文件替换原来的application.properties
。内容如下:
#应用名称
spring:
application:
name: eureka-server
server:
port: 8001
eureka:
client:
# 是否将自己实例注册到Eureka Server中
register-with-eureka: false
# 是否应从Eureka Server获取Eureka注册表信息
fetch-registry: false
在SpringBoot的启动类上添加@EnableEurekaServer 注解,表示是Eureka 服务端。 上述配置完成后,一个单节点的Eureka服务端就配置完成了,启动效果如下:
访问http://localhost:8761/ 可以进入eureka控制台。
目前还没有任何一个服务注册到 Eureka 中,不过从上图中,我们还是可以看到关于 Eureka 服务器内存、CPU 、IP等的相关信息。
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进入自我保护模式(SELF PRESERVATION MODE)。
Eureka服务端集群构建
单个 Eureka 服务可能存在的单点失效问题,我们通常都需要构建一个 Eureka 服务器集群来确保注册中心本身的可用性。与传统的集群构建方式不同,如果我们把 Eureka 也视为一个服务,也就是说 Eureka服务自身也能注册到其他 Eureka 服务上,从而实现相互注册,并构成一个集群。 同样可以通过单节点构建步骤构建两个Eureka Server服务A和B。对应的yml配置如下:
server:
port: 8761
eureka:
instance:
hostname: eurekaA
client:
serviceUrl:
defaultZone: http:// eurekaB:8762/eureka/
server:
port: 8762
eureka:
instance:
hostname: eurekaB
client:
serviceUrl:
defaultZone: http://eurekaA:8761/eureka/
**eureka.instance.hostname **是Eureka 实例管理类配置项 ,用于指定当前 Eureka 服务的主机名称。 需要在本机的hosts文件中添加以下信息:
127.0.0.1 eurekaA
127.0.0.1 eurekaB
我们可以看到服务端A和B只调整了端口和地址的引用。构建 Eureka 集群模式的关键点在于使用客户端配置项
eureka.client.serviceUrl.defaultZone
用于指向集群中的其他 Eureka 服务器。所以 Eureka 集群的构建方式实际上就是将自己作为服务并向其他注册中心注册自己,这样就形成了一组互相注册的服务注册中心以实现服务列表的同步。
这个场景下
register-with-eureka
(是否将自己实例注册到Eureka Server中) 和fetch-registry
(是否应从Eureka Server获取Eureka注册表信息)配置项应该都使用其默认的 true 值,我们不需要对其进行显式的设置。如果你尝试使用本机搭建集群环境,显然 eureka.instance.hostname 配置项中的 eureka1 和 eureka2 是无法访问的,所以需要在本机hosts 文件中添加以下信息。
现在启动这两个 Eureka 服务,然后分别打开 http://127.0.0.1:8761/ 和 http://127.0.0.1:8762/ 端点可以看到各自的服务注册效果。
Eureka客户端构建
客户端引入的pom坐标有差异,需要引入客户端坐标:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
在启动类上需要加@EnableDiscoveryClient
注解表示是Eureka客户端。
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientProviderApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientProviderApplication.class, args);
}
}
yml配置如下:
spring:
application:
name: eureka-client
server:
port: 8081
eureka:
client:
serviceUrl:
#指定eureka服务端地址,如果是集群则通过逗号分隔
defaultZone: http://localhost:8761/eureka/
配置完成后可以在eureka控制台查看到相关注册信息。
来源:https://juejin.cn/post/7126388254941085733


猜你喜欢
- 形参和实参java在定义方法时可以设置参数,参数分为形参和实参,形参是指在定义函数时用于接收外部传入数据的参数,而实参是指在调用方法时主调函
- XmlTextReader 提供对 XML 数据流的只进只读访问。当前节点指读取器定位到的节点。使用任何读方法推进读取器并且属性反映当前节点
- 前言:最近涉及到和QQ打交道,定义所有的好友一共只能有300条消息,如果一次性从数据库读取300条或者更多,界面会有细微的卡顿.所以考虑了下
- 本文实例为大家分享了Android实现蓝牙原理代码,供大家参考,具体内容如下package com.example.se7en.testbl
- 在阿里开发手册的建表规约中有说明,数据库表中应该都要有create_time、update_time字段;那么在开发中,对于这些共有字段的处
- 首先,我们需要对.net提供的FileSystemWatcher类有所了解。我有些懒,找了MSDN对该类的描述。FileSystemWatc
- session简介做过Web开发的程序员应该对Session都比较熟悉,Session是一块保存在服务器端的内存空间,一般用于保存用户的会话
- 目录引言SqlSessionFactory不使用 XML 构建 SqlSessionFactorySqlSessionFactoryBuil
- 使用idea创建javaweb项目idea还是写框架项目比较爽,原生的javaweb项目不是特别方便,这篇文章就是记录一下创建的过程图较多注
- spring注入枚举类型作为参数//定义枚举类型public enum ReportType { MONTH,WE
- 本文介绍在Java编程时,如何快速的构造一个XML片段,然后再将这个XML输出出来。在日常使用Java开发时,经常会用到XML。XML用起来
- SSM@Controller,@Service本质都是@Component,作用是new对象放到Spring容器里。controller层@
- 本文实例讲述了C#自定义繁体和简体字库实现中文繁体和简体之间转换的方法。分享给大家供大家参考。具体分析如下:这里使用C#自定义繁体和简体字库
- 这篇文章主要介绍了spring boot2X Consul如何使用Feign实现服务调用,文中通过示例代码介绍的非常详细,对大家的学习或者工
- Java调用Oracle存储过程详解步骤:1、编写Oracle存储过程2、编写数据库获取连接工具类3、编写简单应用调用存储过程实现:1、Or
- 本文实例讲述了Java单例模式下的MongoDB数据库操作工具类。分享给大家供大家参考,具体如下:我经常对MongoDB进行一些基础操作,将
- 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限。 <uses-permission android:na
- 0.简介GridView 和 ListView 有共同的父类:AbsListView,因此 GridView 和 ListView 具有一定
- 由于工作和之前学习的原因,我需要同时使用Java和C#两门语言。这几年,我也一直在使用J2EE平台和.NET平台做开发。说起C#和Java这
- 一、Vitamio介绍 1.1 Vitamio是什么? Vit