zl程序教程

您现在的位置是:首页 >  其他

当前栏目

【微服务笔记02】微服务组件之Eureka常见的几个配置属性及其常见的几个概念

2023-09-14 09:13:55 时间

这篇文章,主要介绍微服务组件中Eureka常见的几个配置属性及其常见的几个概念。

目录

一、Eureka常见配置属性

1.1、instance配置项

1.2、client配置项

1.3、server配置项

1.4、使用IP+端口注册服务

二、eureka常见概念

2.1、服务注册

2.2、服务发现

2.3、服务续约

2.4、服务剔除

2.5、自我保护机制

2.6、Eureka优雅停服

(1)引入actuator依赖

(2)暴露端点

2.7、Eureka安全认证

(1)引入Security依赖

(2)设置访问用户和密码

(3)修改eureka配置

(4)解决CSRF问题


一、Eureka常见配置属性

这篇文章,主要介绍以下Eureka注册中心中常见的一些配置属性及其含义,Eureka注册中心大致可以分为三部分的配置属性,分别是:instance、client、server三部分,下面分别介绍三部分的配置属性。

1.1、instance配置项

instance中文意思是:实例,也就是说instance是对当前eureka实例的相关信息进行配置的,在eureka中会有一个【EurekaInstanceConfigBean】类专门用于记录instance相关的配置项信息,如下所示:

介绍其中几个常见的配置项:

# eureka配置
eureka:
  instance:
    # 当前实例的主机名称
    hostname: localhost
    # 实例的唯一ID
    instance-id: id-20221331
    # 注册到注册中心服务器上的应用名称
    appname: demo-client-name
    # 初始状态下,注册到eureka服务器上的状态,默认就是UP
    initial-status: up
    # 设置实例的IP地址
    ip-address: 127.0.0.1
    # 是否采用IP地址的格式显示在eureka服务器上
    prefer-ip-address: true
    # eureka客户端和eureka服务端进行服务续约的时间间隔,默认是30s
    lease-renewal-interval-in-seconds: 30
    # eureka服务端从可用服务列表剔除不可用服务的时间间隔,默认是90s,即:3个心跳检测间隔
    lease-expiration-duration-in-seconds: 90

1.2、client配置项

client配置项是针对eureka客户端的,在eureka源代码中会有一个【EurekaClientConfigBean】类,这个类包含了所有client客户端相关的配置项信息,如下所示。

 client客户端配置项常见的几个属性如下:

# eureka配置
eureka:
  client:
    # 是否将自己注册到eureka注册中心
    register-with-eureka: true
    # 是否从eureka注册中心获取注册信息
    fetch-registry: true
    # eureka服务端对外提供的服务地址
    service-url:
      defaultZone: http://localhost:8761/eureka/ # eureka服务端的地址
    # 是否启用eureka客户端
    enabled: true
    # 是否开启eureka客户端的健康检查机制
    healthcheck:
      enabled: true

1.3、server配置项

server配置项只在eureka服务端才进行配置,并且这些配置项是依赖与【eureka-server】依赖,eureka中会有一个【EurekaServerConfigBean】类,专门用于保存server配置项,如下所示。

server配置项常见的几个属性如下所示:

# eureka配置
eureka:
  server:
    # 是否开启自我保护机制
    enable-self-preservation: true
    # 续约成功的阈值,当续约成功百分比低于85%,此时会自动开启自我保护机制
    renewal-percent-threshold: 0.85
    # 期望eureka客户端续约的时间间隔
    expected-client-renewal-interval-seconds: 30
    # 对于不可用服务间隔多久将其剔除,默认是0s,即:立即剔除
    eviction-interval-timer-in-ms: 2000

1.4、使用IP+端口注册服务

通过前面几个配置的介绍,我们在注册服务的时候,就可以采用【IP+端口】的形式将当前服务注册到Eureka注册中心里面,这种注册形式在实际开发中是最常见的,看着比较直观明了,如下所示:

  • 在每一个微服务客户端的配置文件【application.yml】里面,添加如下eureka配置,即可实现IP+端口的形式注册服务。
  • 注意:${spring.cloud.client.ip-address} 这个属性可以获取到当前机器的 IP 地址。
# eureka配置
eureka:
  instance:
    prefer-ip-address: true # 开启采用 IP 注册形式
    # ${spring.cloud.client.ip-address} 这个属性可以获取到当前机器的 IP 地址
    instance-id: ${spring.cloud.client.ip-address}:${server.port} # 设置当前服务的实例ID,采用:IP+端口形式

启动服务,查看注册中心,如下图所示:

二、eureka常见概念

2.1、服务注册

服务注册,是指:当一个微服务应用在启动的时候,会将自身的机器信息发送给eureka服务端,eureka服务端接收到信息之后会将其保存,这个过程叫做:服务注册。

简单来说,就是客户端发送一个请求给eureka服务端,让服务端将客户端的信息给保存起来。

2.2、服务发现

服务发现,是指:在所有微服务都启动之后,此时eureka服务端就已经保存了所有可用微服务的服务列表,当某个微服务需要调用其他微服务的时候,这个微服务只需要从eureka服务端的可用服务列表里面查找对应的微服务即可,这个过程叫做:服务发现。

简单理解,服务发现就是通过eureka服务端找到当前微服务需要调用的另一个微服务的可用服务地址。

2.3、服务续约

服务续约,是指:当某个微服务A在启动之后,它会将自身的信息注册到eureka服务端,那么在之后的运行过程中,eureka服务端需要知道微服务A是否还是可用的。一次服务续约,也可以叫做是一次心跳检测。

如何知道某个微服务是否可用???

  • 要得知某个微服务是否可用,我们可以让客户端和eureka服务端进行一个续约操作,也就是说,eureka服务端需要让eureka客户端每间隔一定的时间就向Eureka服务端发起一个请求,这个请求是告诉eureka服务端,当前这个eureka客户端还活者。
  • 这个【续约的时间间隔】默认是【30】秒,可以通过【lease-renewal-interval-in-seconds】属性自定义设置。

2.4、服务剔除

服务剔除,是指:当某个微服务不可用的时候,Eureka服务端会将那个不可用的微服务从所有的可用服务列表里面给删除掉,删除之后其他的微服务就不能够在进行服务的消费。

Eureka服务端剔除服务的机制:默认情况下,如果Eureka客户端和Eureka服务端超过3次没有进行服务续约,那么此时Eureka服务端就会认为客户端不可用,这个时候就会从可用服务列表剔除这个客户端服务。

  • eureka默认情况下,是指定【90】秒内没有服务续约,就会剔除这个微服务。
  • 也可以通过属性【lease-expiration-duration-in-seconds】自定义设置时间。

2.5、自我保护机制

前面说了,当Eureka服务端超过3个心跳没有进行服务续约,此时Eureka服务端就会将其剔除,但是不可能让你一直剔除,一直剔除那岂不是到最后都灭有可用服务了,所以Eureka设置了一个自我保护机制,这个自我保护机制是为了避免将所有的可用服务剔除。

什么时候会触发自我保护机制???

  • 默认情况下,15分钟内,如果所有客户端的服务续约成功的次数占比低于85%,那么此时eureka服务端会进入自我保护模式。
  • 处于自我保护模式下的eureka,不会再剔除可用服务,但是可以接收其他eureka客户端的服务注册信息。

2.6、Eureka优雅停服

(1)引入actuator依赖

Eureka如果要实现优雅停服的功能,需要引入【actuator】依赖,如下所示:

<!-- 引入 actuator 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

(2)暴露端点

引入上面的依赖之后,我们还需要告诉SpringBoot将哪些url路径暴露出去,实现优雅停服需要暴露【/shutdown】请求地址,在application.yml配置文件里面添加如下内容:

# actuator 配置,实现eureka优雅停服
management:
  endpoints:
    web:
      exposure:
        include: shutdown # 暴露停止服务的接口地址
  endpoint:
    shutdown:
      enabled: true # 确认要开启 shutdown 停止服务的接口服务

到此,启动服务,然后通过Postman访问【http://localhost:9527/actuator/shutdown】地址,就可以实现停止服务的功能啦。

2.7、Eureka安全认证

我们使用Eureka时候,不需要登录就可以访问,这显然安全性就降低了,有没有办法提高eureka的访问安全性呢???这里就需要借助于SpringSecurity实现Eureka的安全认证功能啦。

(1)引入Security依赖

安全认证需要Spring Security依赖,在eureka服务端和客户端都需要引入Security依赖:

<!-- 引入 Spring Security 依赖 -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

(2)设置访问用户和密码

在eureka注册中心的服务端配置文件里面,添加security的用户名和密码配置:

spring:
  application:
    name: eureka-server # 微服务工程应用名称
  security: # 安全认证
    user:
      name: root # 设置 security 登录的用户名称
      password: root # 设置登录密码

(3)修改eureka配置

添加了security的安全认证之后,那么客户端在访问eureka注册中心的时候,就需要携带用户名和密码,用户名和密码正确才能够访问成功,修改客户端中eureka的配置如下:

# eureka配置
eureka:
  client:
    service-url:
		# 在访问eureka注册中心地址的时候,添加【用户名:密码】
		# 格式:http://用户名:密码@IP地址:端口/eureka
      defaultZone: http://root:root@localhost:8761/eureka/ # eureka服务端的地址

启动工程,此时访问eureka注册中心,可以发现就会进入登录页面,如下所示:

输入设置的用户名和密码,登录之后,此时你会发现我们的其他微服务无法注册到eureka注册中心里面,这是由于CSRF的过滤机制所导致的问题,如何解决这个问题???

(4)解决CSRF问题

有两种方式解决CSRF问题,下面两种配置只需要在eureka服务端配置即可:

  • 第一种方式:通过放行【/eureka/**】开头的所有请求(局部设置)。
package com.gitcode.eureka.config;

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;

/**
 * @version 1.0.0
 * @Date: 2023/2/5 15:37
 * @Copyright (C) ZhuYouBin
 * @Description: Security 的配置类
 */
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        // 忽略 【/eureka/**】 请求
        http.csrf().ignoringAntMatchers("/eureka/**");
    }
}
  • 第二种方式:关闭所有的CSRF过滤机制(全局设置)。
package com.gitcode.eureka.config;

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;

/**
 * @version 1.0.0
 * @Date: 2023/2/5 15:37
 * @Copyright (C) ZhuYouBin
 * @Description: Security 的配置类
 */
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 关闭 csrf 机制
        http.csrf().disable()
                .authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .httpBasic();
    }
    
}

到此,Eureka相关配置属性及其几个常见的概念术语介绍完啦。

综上,这篇文章结束了,主要介绍微服务组件中Eureka常见的几个配置属性及其常见的几个概念 【源代码地址】。