SpringCloud学习笔记-Eureka

2023-05-16

文章目录

  • 服务发现
  • eureka
    • 简介
    • 架构图
    • 使用方法
      • 创建Eureka Server
        • 引入依赖
        • 增加注解
        • 修改配置文件
      • 创建Eureka Client
        • 引入依赖
        • 修改配置文件
      • Eureka Server高可用
        • 编写高可用Eureka Server
      • 用户认证
        • 新增依赖
        • 修改配置文件
        • 增加配置类
      • Eureka元数据
      • Eureka的自我保护模式
      • 多网卡环境下的IP选择
        • 忽略指定名称的网卡
        • 指定使用网络地址
        • 只使用站点本地地址
        • 手动指定IP地址
      • Eureka的健康检查

服务发现

服务发现组件基本模式图
1.各个微服务启动时,将自己的网络地址等信息注册到服务发现组件中,各个微服务与会使用一定机制通信,若服务发现组件长时间无法与某微服务实例通信,就会注销该实例。
2.服务消费者首先从服务发现组件获取服务提供者的网络地址,然后通过该地址调用服务提供者的接口。

eureka

简介

Eureka是Netflix开源的服务发现组件,本身是一个基于REST的服务,包含Server和Client两部分。
Eureka的GitHub
Eureka的典故:阿基米德发现浮力时,非常开心,于是说:“Eureka!”意思是“我找到了!”。Netflix将它们的服务发现组件命名为Eureka实在是非常形象。

架构图

Eureka架构图

  • Application Service:服务提供者
  • Application Client:服务消费者
  • Make Remote Call:调用RESTful API的行为

包含两个组件:

  • Eureka Server:提供服务发现的能力,各个微服务启动时,会向Eureka Server注册自己的信息(例如IP、端口、微服务名称等),Eureka Server会存储这些信息。
  • Eureka Client:是一个Java客户端,用于简化与Eureka Server的交互。
  • 微服务启动后,会周期性地向Eureka Server发送心跳(默认周期为30秒)以续约自己的信息。如果Eureka Server在一定时间内没有接收到某个微服务节点的心跳,Eureka Server将会注销该微服务节点(默认90秒)。
  • 默认情况下,Eureka Server同时也是Eureka Client,多个Eureka Server实例互相之间通过复制的方式来实现服务注册表中数据的同步。
  • Eureka Client会缓存服务注册表中的信息。因此,微服务无需每次请求都查询Eureka Server,从而降低了Eureka Server的压力;其次,即使所有的Eureka Server节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者并完成调用。

使用方法

创建Eureka Server

引入依赖

在pom文件中增加Eureka Server的starter:

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

增加注解

在启动类上增加注解@EnableEurekaServer,申明这是一个Eureka Server:

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

修改配置文件

打开配置文件application.yml,进行修改:

server:
  port: 8761
eureka:
  instance:
    hostname: localhsot
  client:
    #是否将自己注册到Eureka Server,默认为true。由于当前应用就是Eureka Server,故而设为false。
    register-with-eureka: false
    #是否从Eureka Server获取注册信息,默认为true。
    #因为这是一个单节点的Eureka Server,不需要同步其他的Eureka Server节点的数据,故而设为false。
    fetch-registry: false
    service-url:
      #设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。此次端口需要与server.port一致
      #默认是http://localhost:8761/eureka/;多个地址间可用,分隔
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

创建Eureka Client

接下来实现将微服务注册到Eureka Server上,在启动类上不增加 @EnableDiscoveryClient 注解也能注册到微服务上。

引入依赖

新建项目,并且在pom中引入Eureka Client依赖:

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

修改配置文件

打开配置文件application.yml,进行修改:

spring:
  application:
    #用于指定注册到Eureka Server上的应用名称
    name: eureka-client1
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
  instance:
    #表示将自己的IP注册到Eureka Server。默认false,表示注册微服务所在操作系统hostname到Eureka Server。
    prefer-ip-address: true
  • 若不想微服务注册到Eureka Server,只需设置:spring.cloud.service-registry.auto-registration.enabled=false,或@EnableDiscoveryClient(autoRegister = false) 即可。

  • 设置向服务中心发送一条续约指令间隔时间(秒):eureka.instance.lease-renewal-interval-in-seconds=10

  • 设置判定服务过期时间(秒):eureka.instance.lease-expiration-duration-in-seconds=60

Eureka Server高可用

Eureka Client会定时连接Eureka Server,获取服务注册表中的信息缓存在本地。微服务在远程消费API时总是使用本地缓存中的数据。因此一般来说,即使Eureka Server发生宕机,也不会影响服务之间的调用。但如果Eureka Server宕机时,某些微服务也出现了不可用的情况,Eureka Client中的缓存若不被更新,就可能会影响微服务的调用,甚至影响整个应用系统的高可用性。因此,在生产环境中,通常会部署一个高可用的Eureka Server集群。

编写高可用Eureka Server

与创建单体Eureka Server的区别在于配置文件不同,依照上文创建Eureka Server后修改配置文件,修改配置文件:

spring:
  application:
    name: eureka-server-ha
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8762/eureka,http://localhost:8763/eureka/

# 连字符(---)将application.yml文件分成三段。第二段和第三段分别为spring.properties指定了一个值,该值对应所在的Profile。
# 第一段未指定spring.properties,因此这段内容会对所有Profile生效。
---
spring:
  #指定此段配置文件名称,通过spring.profiles.active指定profile
  profiles: ha1
server:
  port: 8762
eureka:
  instance:
    #指定主机名,表示注册hostname到Eureka Server
    hostname: ha1
---
spring:
  profiles: ha2
server:
  port: 8763
eureka:
  instance:
    hostname: ha2
  • 打包项目后启动时通过 java -jar 项目.jar--spring.profiles.active=profiles名称指定profile。
  • 微服务注册到Eureka Server集群时最好是以逗号(,)分割配置多个defaultzone,虽然配置一个defaultZone后,多个Eureka Server之间的数据会同步,但是为适应某些极端场景,建议配置多个。

用户认证

在实际项目中可能需要用户认证才允许访问Eureka Server,而不是匿名访问。

新增依赖

在原有依赖上新增security的starter依赖:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-security</artifactId>
</dependency>

修改配置文件

server:
  port: 8761
spring:
  security:
    user:
      #配置登录账号
      name: admin
      #配置登录密码
      password: 123456
eureka:
  client:
    fetch-registry: false
    register-with-eureka: false
    service-url:
      #需要修改为http://user:password@EUREKA_HOST:EUREKA_PORT/eureka/的形式
      defaultZone: http://admin:123456@localhost:8761/eureka/

增加配置类

如果不增加如下配置文件,使用微服务连接时,会报错:

com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server

这种客户端链接的方式是:HttpBasic,
所以security需要改成这种链接方式验证。

package com.clouddemo.eureka_server_auth.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.http.SessionCreationPolicy;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER);
        http.csrf().disable();
        //注意:为了可以使用 http://${user}:${password}@${host}:${port}/eureka/ 这种方式登录,所以必须是httpBasic,如果是form方式,不能使用url格式登录
        http.authorizeRequests().anyRequest().authenticated().and().httpBasic();
    }
}
  • 微服务注册到需要认证的Eureka Server上时,只需要将defaultZone设置为:http://user:password@EUREKA_HOST:EUREKA_PORT/eureka/的形式。

Eureka元数据

Eureka的元数据分为两种,分别是标准元数据和自定义元数据。

  • 标准元数据:主机名、IP地址、端口号、状态页和健康检查等信息,这些信息都会被发布在服务注册表中,用于服务之间的调用。
  • 自定义元素据:使用eureka.instance.metadata-map配置,这些元数据可以在远程客户端中访问,但一般不会改变客户端的行为,除非客户端知道该元数据的含义。

访问 http://localhost:8761/eureka/apps 可以查看Eureka的metadata

Eureka的自我保护模式

自我保护模式是一种应对网络异常的安全保护措施,它宁可同时保留所有微服务(正常与异常的微服务),也不盲目注销任何正常的微服务。
在Eureka Server节点配置文件中,可以使用 eureka.server.enable-self-preservation= false 来禁用自我保护模式。
进入自我保护模式最直观的体现,是Eureka Server首页输出的警告:
在这里插入图片描述
默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务的心跳,Eureka Server将注销该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通讯,会导致的结果是微服务是正常的,却在Eureka Server中被注销了。
Eureka通过自我保护模式来解决这个问题——当Eureka Server节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。Eureka Server就会保护服务注册表中的信息,不再删除服务注册表中的数据(也就是不再注销任何微服务)。当网络故障恢复后,该Eureka Server节点会自动退出自我保护模式。

设置触发服务剔除的间隔时间(ms): eureka.server.eviction-interval-timer-in-ms: 10000

多网卡环境下的IP选择

对于多网卡的服务器,微服务可使用Spring Cloud提供的按需选择IP的能力:

忽略指定名称的网卡

spring:
  cloud:
    inetutils:
      #忽略docker0网卡和所有以veth开头的网卡
      ignored-interfaces:
        - docker0
        - veth.*
eureka:
  instance:
    prefer-ip-address: true

指定使用网络地址

spring:
  cloud:
    inetutils:
      #使用正则表达式,指定使用的网络地址
      preferred-networks:
        - 192.168
        - 10.0
eureka:
  instance:
    prefer-ip-address: true

只使用站点本地地址

spring:
  cloud:
    inetutils:
      #只使用站点本地地址
      use-only-site-local-interfaces: true
eureka:
  instance:
    prefer-ip-address: true

手动指定IP地址

在某些极端场景下,可以手动指定注册到Eureka Server的微服务IP:

eureka:
  instance:
    prefer-ip-address: true
    ip-address: 127.0.0.1

Eureka的健康检查

只需启用Eureka的健康检查,应用程序就会将自己的健康状态传播到Eureka Server。在微服务application.yml中配置以下内容,即可开启健康检查:

eureka:
  client:
    healthcheck:
      enabled: true
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringCloud学习笔记-Eureka 的相关文章

  • 北大中文核心期刊计算机类前30%名录

    1 计算机学报 2 软件学报 3 自动化学报 4 计算机研究与发展 5 控制与决策 6 中国图像图形学报 7 计算机辅助设计与图形学学报 8 计算机应用研究 9 计算机科学 属于其他类目但也可以发计算机的期刊名录 1 激光与光电子学进展
  • Xshell 无法连接虚拟机中的ubuntu的问题

    昨天在VMware Player中安装了ubuntu系统 xff0c 今天想通过xshell连接ubuntu xff0c 结果显示 Connecting to 10 7 100 182 22 Could not connect to 39
  • MATLAB无法直接打开M文件

    MATLAB无法直接打开M文件 啊这1 下载MATLAB文件关联 amp 快捷修复文件2 在MATLAB添加路径3 运行associateFiles m4 打开生成的注册表文件5 重启电脑 啊这 穷折腾装了个2020试试 xff0c 发现安
  • LWIP个人移植心得,平台STM32F4,HAL库,CMSIS_OS系统封装

    LWIP个人移植心得 xff0c 平台STM32F4 xff0c HAL库 xff0c CMSIS OS系统封装 1 先在官网下载LWIP源码及例程文件 xff0c 以1 4 1版本为例分别是lwip 1 4 1和contrib 1 4 1
  • Pyqt5 ——setStyleSheet用法

    版权声明 xff1a 本文为博主原创文章 xff0c 遵循 CC 4 0 BY SA 版权协议 xff0c 转载请附上原文出处链接和本声明 本文链接 xff1a https blog csdn net weixin 42066185 art
  • 递归互斥量解决死锁问题

    一 递归互斥量 一般情况下 xff0c 我们在同一个线程中对同一个互斥量加两次锁 xff0c 就会死锁 xff08 自我死锁 xff09 如果将互斥量类型属性设置为递归类型 PTHREAD MUTEX RECURSIVE 就不会出现此问题
  • 单相逆变器及基于STM32 SPWM生成代码

    2022 4 26更新 若需商业合作可私聊留VX号 xff0c 博主看到后会添加的 最近在做单相逆变器 xff0c 用篇文章来记录 主电路采用H桥 xff0c 使用IR2104半桥驱动内置630ns死区 xff0c 上管采用自举电容浮地驱动
  • 20200329 百度 测试开发实习 笔试题

    20200329 百度 测试开发实习 笔试题 第一题题目描述 xff1a 输入输出样例输入样例输出提示 第二题题目描述 xff1a 输入输出样例输入样例输出 第一题 题目描述 xff1a 桌子上放着N枚硬币 xff0c 将其从1到N编号 x
  • STM32 VBAT外围电路接法详解

    给大家看几块开发板的VBAT外围电路的设计图 xff1a xff08 1 xff09 xff08 2 xff09 xff08 3 xff09 xff08 4 xff09 xff08 5 xff09 stm32芯片手册要求 xff1a xff
  • PX4混控矩阵的移植

    首先感谢各位提供帮助的大神们 xff0c 我也只是把人的心得总结一下 xff0c 加上自己的一点感悟 xff1a 混控步骤 xff1a 一 忽略偏航进行融合处理 1根据混控矩阵计算得到out xff0c 这一步已经包含油门 xff0c 同时
  • 关于hal库使用笔记——串口接收中断部分

    在HAL库中 xff0c 进入接收中断的方法与标准库很不一样 xff0c 具体方法如下 u8 Res 1 声明一个U8数组 HAL UART Receive IT amp huart1 Res 1 初始化中打开串口1接收中断 重写函数HAL
  • TX2 备份与恢复系统(转)

    转载 xff1a https www ncnynl com archives 201706 1740 html TX2入门教程基础篇 备份和恢复 说明 xff1a 介绍如何为TX2进行备份和恢复 xff08 0 xff09 准备 xff1a
  • FTP-HTTP-HTTPS的学习总结

    FTP协议的学习 一 xff0c 学习的要点 ftp的掌握总体架构 了解状态机 请求响应的格式 常用操作码及响应的含义 PORT与PASV的区别 断点续传 上传 下载文件的基本流程 1 xff0c FTP的架构主要有两种形式 UserPI
  • Zookeeper启动失败

    zkServer sh status ZooKeeper JMX enabled by default Using config Users leewz app zookeeper 3 5 3 beta bin conf zoo cfg C
  • 【TX2刷机教程】Ubuntu18.04+jetpack4.5.1

    一 下载SDKManager 点此进入下载页面 PS 此处下载需要登录英伟达账号 二 安装SDKManager xff08 默认文件下载到Downloads文件夹下 xff09 span class token builtin class
  • 大疆测试面经(部分附答案)

    大疆测试岗知识点 软件测试 常用的测试方法和自动化测试工具的了解 常用的测试方法 xff1a 是否关心软件的内部结构 xff08 黑盒测试 xff0c 白盒测试 xff0c 灰盒测试 xff09 xff0c 是否执行代码 xff08 静态测
  • ESP32 优化笔记(一)内存优化

    内存优化 内存优化优化措施1 修改 SPI RAM config2 修改 BLE 的配置3 检查是否有较大的全局变量4 动态申请的空间调试5 任务的栈的大小 内存优化 ESP32 内部 SRAM 有 520KB xff0c 但是系统启动后可
  • ESP32 优化笔记(二)固件大小优化

    固件大小优化 固件大小优化查看固件大小固件大小优化方式 固件大小优化 查看固件大小 使用 idf py size components 命令查看所有组件大小 固件大小优化方式 在正常编译烧录示例的基础上可使用 idf py menuconf
  • ESP32 调试笔记(一)ESP32 调试方法

    ESP32 调试方法 ESP32 调试方法 ESP32 调试方法 待完善
  • ESP32 调试笔记(二)JTAG 调试

    JTAG 调试 JTAG 调试 JTAG 调试 待完善

随机推荐