微服务篇之Eureka注册中心

news2024/10/10 0:24:09

     

目录

1. 初识Eureka

  1.1 Eureka是什么

  1.2 什么是注册中心

  1.3 Eureka的原理

2. Eureka的快速入门

  2.1 搭建eureka的单机服务

  2.2 注册服务的消费者

  2.3 注册服务的提供者

3. Eureka的特性

  3.1 自我保护机制

  3.2 集群支持AP特性

4. Eureka的集群

 4.1 不分区集群模式

 4.2 分区集群模式


     学习是一件需要实践和思考的事情,很多东西学过一遍没有动手操作很容易就忘记,而且你以为你理解和掌握了,一到面试和工作中用到就会懵。最近才发现要改变自己的学习习惯了,学习就是理论为辅实践为主。我工作中第一次接触的就是Eureka,确实在企业中搭建好了也没多去了解一些细节的东西,现在是时候了解一下里面的细节和用法了。

1. 初识Eureka

  1.1 Eureka是什么

        Eureka最早是由Netflix公司开发的一款提供服务注册和发现的开源产品,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud项目组对Eureka进行二次封装,将它集成在自己的子项目spring-cloud-netflix中,用于实现微服务架构下的注册中心的功能。

  1.2 什么是注册中心

       注册中心是指实现了服务的注册和发现以及服务的续约、剔除、下线等功能的服务端应用。注册中心是微服务架构下实现服务治理的最核心模块。注册中心保存了注册服务的IP和端口号等注册信息,使服务与服务之间进行RPC远程调用和实现负载均衡变得简单,同时注册中心还会采取心跳检测机制对服务实例进行续约、剔除,下线等维护。目前主流的注册中心产品有eureka、nacos、zookeeper等。

  1.3 Eureka的原理

 

   基本的概念:

        Eureka实现注册中心采用C-S架构,分为Eureka的服务端(server)和客户端(client ),并且客户端包含了服务提供者和服务消费者两种角色。

  • 服务注册中心:Eureka的服务端,提供服务的注册与发现功能,接收客户端的register、renew、cancel 请求对服务进行处理,采取客户端定时发送心跳到服务端的方式剔除没有按时续约(renew)的服务。在集群集群模式下Eureka Server之间需要互相注册,在集群中随意选择一个节点注册,并通过对等复制的机制完成数据的同步。
  • 服务提供者:Eureka的客户端,运行后作为客户端向注册中心发起注册(register)的请求,注册成功后会将自己的IP地址、端口号、service ID等信息注册到注册表中。Eureka Client默认以30秒为周期向Eureka Server发送心跳以完成续约。
  • 服务消费者:Eureka的客户端,运行后将自身注册到注册中心,同时默认以30秒为周期从注册中心获取(fetch)服务的注册表信息缓存到客户端,方便后续服务消费者对服务提供者进行服务选择和远程调用。

2. Eureka的快速入门

  2.1 搭建eureka的单机服务

  •  创建springboot项目eureka-server01,添加eureka作为服务端的依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    <version>2.0.3.RELEASE</version>
</dependency>
  •  在application.yml配置文件配置eureka服务
server:
  port: 7001

spring:
  application:
    name: eureka-server       # 服务的应用名称,部署集群需保证应用名称一样
eureka:
  instance:
    hostname: localhost           # euraka服务实例的主机名或域名
    instance-id: eureka-server01  # euraka服务实例在注册中心的唯一实例ID
  client:
    # 当前服务作为服务端不注册到eureka, 默认为true,单机可为false,集群必须设为true
    register-with-eureka: false
    # 是否获取eureka服务器注册表上的注册信息,默认为true ,单机版可设为false
    fetch-registry: false
    service-url:
      defaultZone: http://localhost:7001/eureka/  #客户端可注册的eureka服务地址
  • 应用主启动类中添加@EnableEurekaServer注解,表示作为eureka服务端
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerMainApp {
    public static void main(String[] args) {
        SpringApplication.run(EurekaServerMainApp.class,args);
    }
}
  •  在浏览器中输入localhost:7001即可访问到Eureka的注册中心页面,我们发现Renews threshold的值为1,后面会介绍怎么计算出来的。

  2.2 注册服务的消费者

  • 创建springboot项目order-service,添加eureka作为客户端的依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  • 在application.yml文件中配置服务信息
server:
  port: 8080

spring:
  application:
    name: order-service       # 服务的应用名称,部署集群需保证应用名称一样
eureka:
  instance:
    hostname: localhost                      # euraka服务实例的主机名或域名
    instance-id: order8080                   # euraka服务实例的id,需唯一
    lease-renewal-interval-in-seconds: 30    # 客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    lease-expiration-duration-in-seconds: 90 # 服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
  client:
    # 客户端服务需要将自己作为服务注册到eureka, 默认为true
    register-with-eureka: true
    # 客户端服务需要获取eureka服务器注册表上的注册信息,默认为true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka/  #客户端可注册的eureka服务地址
  • 应用主启动类中添加@EnableEurekaClient注解,表示作为eurek客户端
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

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

  2.3 注册服务的提供者

  • 创建springboot项目payment-service,添加eureka作为客户端的依赖
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
  •  在application.yml文件中配置服务信息
server:
  port: 8080

spring:
  application:
    name: payment-service        # 服务的应用名称,部署集群需保证应用名称一样
eureka:
  instance:
    hostname: localhost                      # euraka服务实例的主机名或域名
    instance-id: payment8001                 # euraka服务实例的id,需唯一
    lease-renewal-interval-in-seconds: 30    # 客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    lease-expiration-duration-in-seconds: 90 # 服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
  client:
    # 客户端服务需要将自己作为服务注册到eureka, 默认为true
    register-with-eureka: true
    # 客户端服务需要获取eureka服务器注册表上的注册信息,默认为true
    fetch-registry: true
    service-url:
      defaultZone: http://localhost:7001/eureka/  #客户端可注册的eureka服务地址
  • 应用主启动类中添加@EnableEurekaClient注解,表示作为eurek客户端
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaClient
public class ProviderPaymentMainApp {
    public static void main(String[] args) {
        SpringApplication.run(ProviderPaymentMainApp.class, args);
    }
}
  •  启动服务后在Eureka注册中心列表能看到注册成功的两个服务order-servicepayment-service,从页面中我们发现了Renews theshold值为5,Renews值为4,同时还有一行红色的提示说明(出现存在一分钟延迟),这文字表示触发了eureka的自我保护机制。两个服务明明都正常发送了心跳为什么还会触发eureka的自我保护机制呢?这是eureka服务端设置了eureka.client.register-with-eureka = false引发的问题。

3. Eureka的特性

  3.1 自我保护机制

   1. 什么是自我保护机制?

      自我保护机制指当eureka server节点在短时间内丢失过多客户端的心跳时,应该优先认定为是发生了网络分区故障(延时、卡顿、拥挤),而不是认为客户端服务真正不可用了,避免因eureka server节点无法正常通信而删除健康可用服务实例的一种保护策略。

   2. 为什么要有自我保护机制?

      我们前面了解到如果eureka server在一定时间(默认90s)内没有接收到某个微服务实例的心跳,eureka server将会注销该实例。这种方式存在缺点,如果eureka server节点在某一时刻与注册在该节点的所有客户端服务都无法进行正常的心跳通信了,在90s过后eureka server节点把这些客户端服务都注销了,而这些客户端服务又都是正常能提供服务的,不就发生了错误吗?eureka为了避免这种错误引入了自我保护机制,eureka server在触发自我保护机制后不再对未完成心跳续约的服务实例进行剔除,保证了服务的高可用。

  3. 自我保护机制的触发条件? 

      eureka的自我保护机制默认是开启的,而触发条件是: eureka server每分钟收到的总续约次数(Renews)低于或等于续约阈值(Renews threshold)就会触发。当它一分钟收到的续约总数重新恢复到阈值以上时,该eureka server结点才会自动退出自我保护模式。阈值计算有坑,不建议设置eureka-server的eureka.client.register-with-eureka = false,集群模式为true不会有影响。

4. 续约阈值和续约次数如何计算?

默认需续约的阈值百分比:eureka.server.renewal-percent-threshold = 0.85

默认向服务端发送心跳的时间间隔:eureka.instance.lease-renewal-interval-in-seconds = 30

注意:阈值计算是取默认心跳时间间隔30s

阈值计算公式:Renews threshold = 服务实例总数(server+client)* 每分钟默认需要续约次数(60s/30s)* 0.85

上面案例:1台eureka server 时,Renews threshold = 1*(60/30)*0.85 = 1.7 取整为1

                    1台eureka server,2台eureka client 时,Renews threshold = (1+2)*(60/30)*0.85 = 5.1 取整为5

最后,我们要知道续约阈值什么时候更新,这个涉及源码级别的分析,我们只简单了解续约阈值更新可以通过 eureka.server.renewal-threshold-update-interval-ms = xxx 来配置,默认是15分钟更新一次。

注意:续约总次数计算是取每个服务实例各自的心跳时间间隔

一分钟续约总次数计算:Renews = 全部服务实例一分钟续约次数相加

上面案例:  2台eureka client  发送心跳间隔为30s,则一分钟续约总次数 = 2*(60/30)= 4次,比续约阈值5还少,所以触发了自我保护机制。

 思考:那么是什么原因导致的呢?

      我们试着设置eureka server的eureka.client.register-with-eureka = true重启服务试试,结果完美解决所有问题,Renews变成了6,大于续约阈值5了,不再错误触发自我保护机制了。默认eureka server是希望把自己也注册进去的,也会给自己发心跳续约,对于集群模式来说这样是合理的,一般eureka server也不会是单机部署的。

 5.  对自我保护机制的总结?

      触发自我保护机制条件(Renews<=Renews threshold)后Lease expiration enabled变为false,表示续约不会过期,所以不再对服务实例进行注销。阈值计算是取默认心跳时间间隔30s,配置服务实例心跳间隔不建议大于30s,否则容易触发自我保护机制。自我保护机制可以设置eureka.server.enable-self-preservation = false关闭。

3.2 集群支持AP特性

       

      CAP理论,就是指在一个分布式系统中,Consistency(一致性)、Availability(可用性)、Partition tolerance(分区容错性),三者不能同时满足,只能满足其中的任意两项。

     1. Consistency(一致性):指的是数据的一致性,即分布式系统中的任意结点服务被用户访问都能拿到相同的数据,即服务结点之间数据是没有差别的,这种一致性是严格要求的,指的是强一致性。

    2. Availability(可用性):指的是分布式系统在出现某一节点宕机或数据不一致时,也要保证系统的正常可用。可用性强调的是系统的高可用,可以接受一部分数据不是最新的要求。

    3. Partition tolerance(分区容错性): 只要是分布式系统就可能会发生网络分区,这里的分区是指某一个或多个结点因为网络问题暂时与集群结点无法通信,就形成了分区。分区容错性是指分布式系统要能够容忍网络分区带来的AC不能同时满足的问题,保证系统能正常运行,这通常是必须的。如果一个系统既要满足A(可用性)和P(一致性),那么这个系统一定是不会发生网络分区和存在分区容错性问题的。

     为什么Eureka的集群是支持AP特性的呢?这是因为eureka的集群结点设计是Peer to Peer对等的,没有主从之分。Eureka的客户端服务在向某个Eureka服务结点注册时如果发现注册失败,则会继续选择其它节点进行注册,只要有一台Eureka服务结点还在,就能保证集群服务的可用(保证了可用性)

4. Eureka的集群

4.1 不分区集群模式

  •  eureka的集群设计是Peer to Peer,即集群结点与结点之间是平等的没有主从之分,结点之间采用对等复制的方式同步数据,所以集群搭建就是eureka server结点能够互相注册,而不分区集群是让所有服务结点都在defaultZone默认分区中。
# 集群模式下eureka server也需要作为客户端注册到eureka中
eureka.client.register-with-eureka = true
  •  创建一个springboot项目eureka-server02与前面的eureka-server01共同搭建集群,修改本机路径下 C:\Windows\System32\drivers\etc 的hosts文件。
# 添加ip地址与主机名的映射
127.0.0.1  eureka7001.com  
127.0.0.1  eureka7002.com  
  •  eureka注册中心结合springsecurity实现密码安全验证,先在pom.xml文件中引入依赖。
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
  • 再创建springsecurity的配置类,对/eureka/** 下的所有请求过滤CSRF。
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;

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     *  使CSRF忽略 /eureka/**的所有请求
     * @param http
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        //忽略所有 /eureka/** 的请求
        http.csrf().ignoringAntMatchers("/eureka/**");
    }
}
  • 配置eureka-server01的application.yml
server:
  port: 7001

spring:
  application:
    name: eureka-server       # 服务的应用名称,部署集群需保证应用名称一样
  security:                   # security用户认证的账号密码
    user:
      name: admin
      password: admin12
eureka:
  instance:
    hostname: eureka7001.com           # euraka服务实例的主机名或域名
    instance-id: eureka-server01       # euraka服务实例在注册中心的唯一实例ID
  client:
    register-with-eureka: true     # 集群模式eureka需要相互注册发现彼此,必须设为true
    fetch-registry: true           # 是否获取eureka的注册表信息,默认为true
    service-url:
      # 客户端可注册的eureka服务地址,集群需要写多个,但最终只会选择一个可用的注册
      defaultZone: http://admin:admin12@eureka7002.com:7002/eureka/,http://admin:admin12@eureka7001.com:7001/eureka/  
  server:
    eviction-interval-timer-in-ms: 300000         # 剔除eureka上未正常心跳续约服务实例的时间间隔
    renewal-threshold-update-interval-ms: 900000  # 更新续约阈值的时间间隔(默认15分钟)
  •  配置eureka-server02的application.yml
server:
  port: 7002

spring:
  application:
    name: eureka-server       # 服务的应用名称,部署集群需保证应用名称一样
  security:                   # security用户认证的账号密码
    user:
      name: admin
      password: admin12
eureka:
  instance:
    hostname: eureka7002.com           # euraka服务实例的主机名或域名
    instance-id: eureka-server02       # euraka服务实例在注册中心的唯一实例ID
  client:
    register-with-eureka: true   # 集群模式erueaka需要相互注册发现彼此,必须设为true
    fetch-registry: true         # 是否获取eureka的注册表信息,默认为true
    service-url:
      # 客户端可注册的eureka服务地址,集群需要写多个,但最终只会选择一个可用的注册
      defaultZone: http://admin:admin12@eureka7001.com:7001/eureka/,http://admin:admin12@eureka7002.com:7002/eureka/ 
  server:
    eviction-interval-timer-in-ms: 300000         # 剔除eureka上未正常心跳续约服务实例的时间间隔
    renewal-threshold-update-interval-ms: 900000  # 更新续约阈值的时间间隔(默认15分钟)  
  •  order-service服务和payment-service注册到eureka集群中,要在注册地址上加上认证的用户和密码才能成功注册。
eureka:
  client:
    service-url:
      defaultZone: http://admin:admin12@eureka7002.com:7002/eureka/,http://admin:admin12@eureka7001.com:7001/eureka/
  • 访问 eureka7001.com:7001或 eureka7002.com:7002会进入springsecurity默认登录页面,输入自己配置的用户名和密码登录成功就表明eureka实现了安全认证功能,我们可以在注册中心页面查看集群信息和注册的服务实例。

  • 在注册中心页面我们看到了order-service服务和payment-service服务被成功注册到集群中,同时也包括eureka-server的所有服务实例,这便于让我们知道eureka-server有几个结点,以及结点的健康状态。

 

 4.2 分区集群模式

     eureka集群提供了分区的功能, 它的分区集群是通过配置region和zone(或者availability-zones)来实现的,这些均是来源于AWS的概念。region和zone的英文单词都可以翻译为地区,在eureka中一个region可以包含多个zone,所以我们可以把region认为是一个大的区域,zone是region下面的小的分区。上图中的us-east-1c、us-east-1d、us-east-1e就是三个不同的zone,都属于region为us-east的这个地区。

  • 配置eureka-server01的application.yml文件,让eureka-server01注册到广州(guangzhou)分区。
server:
  port: 7001

spring:
  application:
    name: eureka-server       # 服务的应用名称,部署集群需保证应用名称一样
  security:                   # security用户认证的账号密码
    user:
      name: admin
      password: admin12
eureka:
  instance:
    hostname: eureka7001.com           # euraka服务实例的主机名或域名
    instance-id: eureka-server01       # euraka服务实例在注册中心的唯一实例ID
  client:
    register-with-eureka: true     # 集群模式eureka需要相互注册发现彼此,必须设为true
    fetch-registry: true           # 是否获取eureka的注册表信息,默认为true
    prefer-same-zone-eureka: true  # 尽量向同一区域的eureka注册,默认为true
    # 集群所属的区域为华南地区
    region: huanan
     # 可用的分区,广州分区和深圳分区
    availability-zones:
      huanan: shenzhen,guangzhou   # 按照顺序从可用分区中选择一个可用地址注册
    service-url:
      guangzhou: http://admin:admin12@eureka7001.com:7001/eureka/
      shenzhen: http://admin:admin12@eureka7002.com:7002/eureka/
  server:
    enable-self-preservation: false                # 关闭自我保护机制,保证不可用服务被及时删除
    eviction-interval-timer-in-ms: 30000         # 剔除eureka上未正常心跳续约服务实例的时间间隔
    renewal-threshold-update-interval-ms: 900000  # 更新续约阈值的时间间隔(默认15分钟)
  • 配置eureka-server02的application.yml文件,让eureka-server02注册到深圳(shenzhen)分区。
server:
  port: 7002

spring:
  application:
    name: eureka-server       # 服务的应用名称,部署集群需保证应用名称一样
  security:                   # security用户认证的账号密码
    user:
      name: admin
      password: admin12
eureka:
  instance:
    hostname: eureka7002.com           # euraka服务实例的主机名或域名
    instance-id: eureka-server02       # euraka服务实例在注册中心的唯一实例ID
  client:
    register-with-eureka: true     # 集群模式eureka需要相互注册发现彼此,必须设为true
    fetch-registry: true           # 是否获取eureka的注册表信息,默认为true
    prefer-same-zone-eureka: true  # 尽量向同一区域的eureka注册,默认为true
    # 集群所属的区域为华南地区
    region: huanan
     # 可用的分区,广州分区和深圳分区
    availability-zones:
      huanan: guangzhou,shenzhen   # 按照顺序从可用分区中选择一个可用地址注册
    service-url:
      guangzhou: http://admin:admin12@eureka7001.com:7001/eureka/
      shenzhen: http://admin:admin12@eureka7002.com:7002/eureka/
  server:
    enable-self-preservation: false                # 关闭自我保护机制,保证不可用服务被及时删除
    eviction-interval-timer-in-ms: 30000         # 剔除eureka上未正常心跳续约服务实例的时间间隔
    renewal-threshold-update-interval-ms: 900000  # 更新续约阈值的时间间隔(默认15分钟)
  • 消费者order-service服务注册进集群中,order-service服务所属zone为guangzhou,并会优先调用同一zone下的服务提供者,降低服务延迟。当同一zone下的服务提供者不可用时,才会调用其它zone下的服务。
server:
  port: 8080

spring:
  application:
    name: order-service
eureka:
  instance:
    instance-id: order8080
    lease-renewal-interval-in-seconds: 30     # Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    lease-expiration-duration-in-seconds: 90  # Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
    metadata-map:
      zone: guangzhou                     # 当前服务所属的zone
  client:
    register-with-eureka: true            # 表示是否将自己注册进EurekaServer默认为true
    fetch-registry: true                  # 是否获取eureka服务器注册表上的注册信息,默认为true
    registry-fetch-interval-seconds: 30   # 指示从eureka服务器获取注册表信息的频率
    prefer-same-zone-eureka: true         # 尽量向同一区域的 eureka 注册,默认为true
    
    region: huanan                 # 集群所属的区域为华南地区
    availability-zones:            # 可用的分区
      huanan: guangzhou,shenzhen
    service-url:
      guangzhou: http://admin:admin12@eureka7001.com:7001/eureka/
      shenzhen: http://admin:admin12@eureka7002.com:7002/eureka/

  •  提供者payment-service服务注册进集群中,配置该payment-service服务端口号为8001,所属zone为guangzhou
server:
  port: 8001

spring:
  application:
    name: payment-service
eureka:
  instance:
    instance-id: payment8001
    lease-renewal-interval-in-seconds: 30     # Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    lease-expiration-duration-in-seconds: 90  # Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
    metadata-map:
      zone: guangzhou                     # 当前服务所属的zone为guangzhou
  client:
    register-with-eureka: true            # 表示是否将自己注册进EurekaServer默认为true
    fetch-registry: true                  # 是否获取eureka服务器注册表上的注册信息,默认为true
    registry-fetch-interval-seconds: 30   # 指示从eureka服务器获取注册表信息的频率
    prefer-same-zone-eureka: true         # 尽量向同一区域的 eureka 注册,默认为true
    
    region: huanan                 # 集群所属的区域为华南地区
    availability-zones:            # 可用的分区
      huanan: guangzhou,shenzhen
    service-url:
      guangzhou: http://admin:admin12@eureka7001.com:7001/eureka/
      shenzhen: http://admin:admin12@eureka7002.com:7002/eureka/

  • 提供者payment-service服务注册进集群中,配置该payment-service服务端口号为8002,所属zone为shenzhen
server:
  port: 8002

spring:
  application:
    name: payment-service
eureka:
  instance:
    instance-id: payment8002
    lease-renewal-interval-in-seconds: 30     # Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    lease-expiration-duration-in-seconds: 90  # Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
    metadata-map:
      zone: shenzhen                     # 当前服务所属的zone为shenzhen
  client:
    register-with-eureka: true            # 表示是否将自己注册进EurekaServer默认为true
    fetch-registry: true                  # 是否获取eureka服务器注册表上的注册信息,默认为true
    registry-fetch-interval-seconds: 30   # 指示从eureka服务器获取注册表信息的频率
    prefer-same-zone-eureka: true         # 尽量向同一区域的 eureka 注册,默认为true
    
    region: huanan                 # 集群所属的区域为华南地区
    availability-zones:            # 可用的分区
      huanan: shenzhen,guangzhou
    service-url:
      guangzhou: http://admin:admin12@eureka7001.com:7001/eureka/
      shenzhen: http://admin:admin12@eureka7002.com:7002/eureka/

  •  分区集群搭建后启动项目查看eureka管理界面查看服务结点列表,查看分区集群搭建成功,但同时也看到了关闭了自我保护机制的红色文字提醒,关闭自我保护机制能够保证服务结点不可用时能够被及时下线处理。

 

 

  •  测试服务消费者order-service调用服务提供者payment-service,我们发现order-service调用服务提供者接口时只调用端口为8001的payment-service服务实例,这是因为分区集群模式下服务消费者优先调用同一zone下的服务提供者,当同一zone下的服务提供者不可用时,才会去调用不同zone下的服务提供者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/190866.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Go语言测试(回归测试、集成测试、单元测试简述)与项目开发的流程简述

测试项目流程1. 测试的类别2. 单元测试的规则&#xff08;函数以Test开头&#xff09;2.1 示例12.2 示例23. Mock测试&#xff08;打桩&#xff09;4. 基准测试&#xff08;类似于单元测试&#xff0c;函数以Benchmark开头&#xff09;5. 项目开发的流程项目拆解代码设计测试运…

浪涌保护器(电涌保护器)连接线规格分析方案

低压配电设计中&#xff0c;现在对于浪涌保护器(SPD)及其专用保护装置的标注和画法&#xff0c;都比较规范统一了。那有没有遇到要求标注浪涌保护器连接线规格的情况&#xff1f;或者说&#xff0c;设计师有没有责任要标注清楚各类浪涌保护器连接线规格&#xff1f;地凯科技防雷…

屈光发育档案是什么?为什么专业医生建议从3岁开始就要建立?

当孩子出现近视问题时&#xff0c;家长们都会很焦虑。其实儿童视力发育是一个循序渐进&#xff0c;逐渐成长完善的过程。我们唯一能做的就是预防&#xff0c;在未近视时提前发现近视的趋势。来源&#xff1a;卫生健康委网站这其中最为关键的是建立屈光发育档案。国家青少年近视…

视频剪辑有这6个高清视频素材库就够了

视频剪辑必备的6个网站&#xff0c;免费、可商用&#xff0c;建议收藏&#xff01; 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYxMjky 菜鸟图库网素材类型非常多&#xff0c;平面设计、UI设计、电商类、图片、视频、音频等素材站内都能找到。视频素材全部高清、无…

C++——map和set封装实现

目录 mao和set模拟实现 模拟实现 取K的仿函数 Insert 迭代器 begin和end 和-- operator[] 完整代码 set.h map.h rbtree.h mao和set模拟实现 STL map和set只是包含了几个头文件 主要在选中的这个文件里&#xff0c;打开之后我们可以看到红黑树 用红黑树…

【操作系统】第二章 进程与线程

文章目录第二章 知识体系2.1 进程与线程2.1.1 进程的概念和特征2.1.2 进程的状态与转换2.1.3 进程的组成2.1.4 进程控制2.1.5 进程通信2.1.6 进程的上下文切换2.1.7 线程和多线程模型2.2 处理机调度2.2.1 调度的概念2.2.2 调度的层次分类2.2.3 调度的实现2.2.4 典型的调度算法2…

【八大数据排序法】选择排序法的图形理解和案例实现 | C++

第十五章 选择排序法 目录 第十五章 选择排序法 ●前言 ●认识排序 ●一、选择排序法是什么&#xff1f; 1.简要介绍 2.图形理解 3.算法分析 ●二、案例实现 1.案例一 ● 总结 前言 排序算法是我们在程序设计中经常见到和使用的一种算法&#xff0c;它主要是将一堆不规则…

活体识别3:论文笔记之《FACE ANTI-SPOOFING BASED ON COLOR TEXTURE ANALYSIS》

说明 本文是我对论文《FACE ANTI-SPOOFING BASED ON COLOR TEXTURE ANALYSIS》做的一个简单笔记。 这个论文是芬兰奥卢大学(Oulu)课题组的一篇很有代表性的论文&#xff0c;写于2015年&#xff0c;使用的是“LBP特征SVM分类器”这种比较传统的方案&#xff0c;方案不复杂&…

如何使用 JuiceFS 创建 WebDAV 共享

WebDAV 是一种基于 HTTP 的文件共享协议&#xff0c;最初被设计用于多用户文档协作编辑的场景&#xff0c;也被广泛应用在基于互联网的文件存储、数据同步等网盘类应用场景。 手机端和 PC 端有大量的应用内置了对 WebDAV 的支持&#xff0c;比如知名的文献管理工具 Zotero、iP…

微信小程序 java Springboot校园租房指南房屋租赁系统

东前端&#xff1b;首页、房源信息、租房指南、我的&#xff0c;用户前端&#xff1b;首页、房源信息、租房指南、我的等主要功能模块的操作和管理。 1.出租房源信息的上传、审核、发布&#xff1b; 2.租房信息的浏览、查找、查看&#xff1b; 3.用户与出租方通信&#xff1b; …

Docker-01基本命令

1、Docker安装 系统镜像为Centos7.x yum包更新到最新 sudo yum update安装需要的软件包&#xff0c;yum-util提供yum-config-manager功能。另外两个是devicemapper驱动依赖的 sudo yum install -y yum-utils device-mapper-persistent-data lvm2设置yum源为阿里云 sudo yu…

OpenText 企业内容管理平台客户案例——印度鲁宾(Lupin)制药公司

OpenText 企业内容管理平台客户案例——印度鲁宾&#xff08;Lupin&#xff09;制药公司 公司&#xff1a;Lupin 行业&#xff1a;制药 方案&#xff1a; OpenText™ Extended ECM Platform OpenText™ AppWorks™ OpenText™ Capture 合作伙伴&#xff1a;Muraai Informat…

uniapp数据缓存与apk打包

目录 一、uniapp数据缓存Storage 1.1、存值uni.setStorageSync(KEY,DATA) 1.2、取值uni.getStorageSync(KEY) 1.3、uni.removeStorageSync(KEY) 1.4、uni.clearStorageSync() 二、配置发行H5--打包 一、uniapp数据缓存Storage 1.1、存值uni.setStorageSync(KEY,DATA) 含…

APISIX介绍和安装使用

APISIX目录什么是APISIX&#xff1f;与 Kong的比较概述安装1. 安装依赖2 安装 Apache APISIX2.1 安装脚本2.2 启动 APISIXAPISIX 控制台动态负载均衡1. 启动2个微服务命令2.验证服务是否正常3. 重要概念4.创建 APISIX Upstream&#xff08;上游&#xff0c;后端 API 服务&#…

Python(12)--元组

一、元组的基本介绍 元组&#xff08;tuple&#xff09;&#xff1a;这种数据类型结构与列表相同&#xff0c;但它与列表也有很大的差异&#xff0c;它的元素值与元素个数不可更改。 列表的定义是将元素放入[ ]中&#xff0c;元组的定义是将元素放入&#xff08;&#xff09;中…

通过堆转储快照定位JVM堆内存OOM的问题

目录获取堆转储快照JVM启动时增加参数通过jmap指令生成分析堆转储快照Eclipse Memory Analyzer简介示例获取堆转储快照 如何获取堆转储快照&#xff1f;常用的有两种方式&#xff1a; JVM启动时增加参数 出现OOM时生成堆dump&#xff1a; -XX:HeapDumpOnOutOfMemoryError指…

【2325. 解密消息】

来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 描述&#xff1a; 给你字符串 key 和 message &#xff0c;分别表示一个加密密钥和一段加密消息。解密 message 的步骤如下&#xff1a; 使用 key 中 26 个英文小写字母第一次出现的顺序作为替换表中的字母 顺序 。将…

【数据结构初阶】第六篇——二叉树的重要性质

树的概念及结构 树的概念 树中专有名词 树的表示 二叉树的概念及其重要性质 二叉树的概念 数据结构中的二叉树 特殊的二叉树 二叉树的性质 二叉树的存储结构 顺序结构 链式结构 树的概念及结构 树的概念 树是一种非线性的数据结构&#xff0c;它是由n(n>0)个有…

【算法】Brute-Force 算法

目录1.概述2.代码实现本文参考&#xff1a; 《数据结构教程》第 5 版 李春葆 主编 1.概述 &#xff08;1&#xff09;设有两个串 s 和 t&#xff0c;串 t 的定位就是要在串 s 中找到一个与 t 相等的子串。通常把 s 称为目标串(target string)&#xff0c;把 t 称为模式串(patt…

flutter 之 ListView的使用与详解 map for listview.builder 的使用

1.ListView 配合ListTile 实现新闻列表样式 ListView(children: <Widget>[ListTile(title: const Text(我是 title),subtitle: const Text(我是 sub_title),leading: Image.asset(images/c.png,fit: BoxFit.cover,),trailing: const Icon(Icons.chevron_right,size: 22,…