SpringCloud学习笔记-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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值