0


03. 微服务 - 集群搭建 - Eureka(二)

前言

基于上一篇文章搭建Eureka集群服务
实现3个eureka server节点数据同步
记录搭建过程中的的问题及疑问

Spring Cloud Eureka使用手册
Eureka Wiki

Eureka集群架构

Eureka高级架构图

  • 紧接上篇的demo项目,在其中新建dingsu-eureka-cluster模块
  • 目标是上图中,3个eureka Server之间的数据同步
  • 项目结构如下图项目结构

准备工作

  • 因为是在本机模拟三个eureka Server,修改C:\Windows\System32\drivers\etc\hosts,增加3个域名对应到本地IP(复制到其他路径,右键属性取消只读,修改后复制回去覆盖)
# Copyright(c)1993-2009MicrosoftCorp.
#
# This is a sample HOSTS file used by Microsoft TCP/IP forWindows.
#
# This file contains the mappings of IP addresses tohostnames. Each
# entry should be kept on an individual line. The IP address should
# be placed in the first column followed by the corresponding host name.
# The IP address and the host name should be separated by at least one
# space.
#
# Additionally, comments (such as these) may be inserted on individual
# lines or following the machine name denoted by a '#' symbol.
#
# For example:
#
#      102.54.94.97     rhino.acme.com          # source server
#       38.25.63.10     x.acme.com              # x client host

# localhost name resolution is handled within DNS itself.
#    127.0.0.1       localhost
#    ::1             localhost
127.0.0.1       activate.navicat.com
127.0.0.1        eureka-server-1127.0.0.1        eureka-server-2127.0.0.1        eureka-server-3

父级模块dingsu-eureka-cluster

  • pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.hd</groupId><artifactId>confucius</artifactId><version>0.0.1</version></parent><artifactId>dingsu-eureka-cluster</artifactId><packaging>pom</packaging><modules><module>eureka-server-1</module><module>eureka-server-2</module><module>eureka-server-3</module></modules><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency></dependencies></project>

eureka Server 1配置

  • 设置eureka.client.service-url.defaultZone 注册到2和3
  • application.yml
spring:
  application:
    name: confucius-eureka-server # 注册到Eureka的实例名称,Application列
server:
  port:4311
eureka:
  server:
    #关闭自我保护,默认为true
    enable-self-preservation:false
    # 清理间隔 ms,默认60*1000
    eviction-interval-timer-in-ms:30000
  instance:
    #注册实例名称,非ip注册时的副本名称
    hostname: eureka-server-1 
    #是否将自己的ip注册到eureka中,默认false
    prefer-ip-address:false
  client:
    #是否作为客户端,注册自己到eureka server中
    register-with-eureka:true
    # 是否作为客户端,拉取其他服务
    fetch-registry:true
    service-url:
      defaultZone: http://eureka-server-2:4322/eureka,http://eureka-server-3:4333/eureka

logging:
  config: classpath:logback.xml

eureka Server 2配置

  • 设置eureka.client.service-url.defaultZone 注册到1和3
  • application.yml
spring:
  application:
    name: confucius-eureka-server # 注册到Eureka的实例名称,Application列
server:
  port:4322
eureka:
  server:
    #关闭自我保护,默认为true
    enable-self-preservation:false
    # 清理间隔 ms,默认60*1000
    eviction-interval-timer-in-ms:30000
  instance:
    #注册实例名称,非ip注册时的副本名称
    hostname: eureka-server-2
    #是否将自己的ip注册到eureka中,默认false
    prefer-ip-address:false
  client:
    #是否作为客户端,注册自己到eureka server中
    register-with-eureka:true
    # 是否作为客户端,拉取其他服务
    fetch-registry:true
    service-url:
      defaultZone: http://eureka-server-1:4311/eureka,http://eureka-server-3:4333/eureka

logging:
  config: classpath:logback.xml

eureka Server 3配置

  • 设置eureka.client.service-url.defaultZone 注册到1和2
  • application.yml
spring:
  application:
    name: confucius-eureka-server # 注册到Eureka的实例名称,Application列
server:
  port:4333
eureka:
  server:
    #关闭自我保护,默认为true
    enable-self-preservation:true
    # 清理间隔 ms,默认60*1000
    eviction-interval-timer-in-ms:30000
  instance:
    #注册实例名称,非ip注册时的副本名称
    hostname: eureka-server-3
    #是否将自己的ip注册到eureka中,默认false
    prefer-ip-address:false
  client:
    #是否作为客户端,注册自己到eureka server中
    register-with-eureka:true
    # 是否作为客户端,拉取其他服务
    fetch-registry:true
    service-url:
      defaultZone: http://eureka-server-1:4311/eureka,http://eureka-server-2:4322/eureka

logging:
  config: classpath:logback.xml

运行状态

Eureka运行状态

无效副本(unavailable-replicas)问题

  • 自己搭建时,基本都会自定义应用名称、域名、实例名称等,大概率会出现无效副本(unavailable replicas)
  • 如果出现该问题,排查以下几个方面: 1. defaultZone 值中的域名是否一致,因为单机演示时只有一个IP,所以我们注册服务时,instance.prefer-ip-address设置为了false,如果我们全都使用localhost去向其他服务注册,则会出现DS replicas副本同名问题。2. client.register-with-eureka、fetch-registry 都为 true3. 三个服务的spring.application.name需要一致,否则被认为是三个独立的服务,无法通过同一个服务名,压根实现不了负载均衡😂4. instance.hostname需要与其他Server配置defaultZone时,所使用的域名一致

nginx服务代理

  • 其他服务向该Eureka集群注册时,总不可能Client每次都配置全部的节点到defaultZone吧(新增Server得修改所有的Client配置),也不能注册到某一节点(Server宕机之后,Client也就丢了),等着同步吧,所以我们使用nginx进行统一代理,由nginx自动选择某一Server,即使因为某一Server宕机,引起节点重新注册,nginx也能提供别的Server节点给Client
  • nginx.conf
stream {
    upstream eureka_stream {
        server eureka-server-1:4311;
        server eureka-server-2:4322;
        server eureka-server-2:4333;}
 
    server {
        listen 4499; # Nginx监听的端口
        proxy_pass eureka_stream; # 代理到Eureka服务器集群
        proxy_connect_timeout 1s; # 连接超时设置
    }}
  • 其他模块defaultZone设置
eureka:
  client:
    service-url:
      defaultZone: http://localhost:4499/eureka
  • 启动之后状态在这里插入图片描述

自我保护模式阈值计算

  • 网页右上角最后两个属性,Renews threshold及Renews (last min)
  • 因为搭建过程中只是示例,所以只使用了3个eureka Server节点,如果我们开启自我保护模式的话,会直接触发阈值,如果自己想要测试,需要至少6个以上
  • 默认阈值为0.85(之后源码中会写)
  • 3个节点时,Renews (last min)即上一分钟收到的服务续约(心跳)次数 = 1分钟/30ms(yml配置)* 节点数量 = 6;验证的话,等服务启动后过1分钟刷新再看
  • Renews threshold即最低期望续约数,即 6 * 0.85之后向下取整
  • 通过修改server.renewal-percent-threshold = 0.85,可以自定义阈值

强制IP

  • 以上截图中,页面最后一部分为服务自身的实例信息,ipAddr = 192.168.119.1,但其实我想使用的192.168.0.5这个IP
  • 因为我电脑设置了多个IP,同时还有虚拟网卡等,这在内外网通信时是很普遍的现象(内网负责与内部板卡通信,外网负责设备、服务之间通信),所以在我们看来,这个ip获取是错误的
  • 强制IP设置,修改eureka.server.ip-address = 192.168.0.5

本文转载自: https://blog.csdn.net/qq_36075491/article/details/143184197
版权归原作者 丁宿 所有, 如有侵权,请联系我们删除。

“03. 微服务 - 集群搭建 - Eureka(二)”的评论:

还没有评论