欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringCloud搭建微服务框架(四)- 集群环境搭建

程序员文章站 2022-06-14 14:31:28
...

前面的内容中,搭建的组件无论是eureka server、eureka client(服务提供方和服务消费方)还是zuul网关,都是单个应用,并没有集群环境,这篇文章会显示集群环境的搭建,并且填上一些之前没有提到的坑。

1.Eureka server集群环境搭建

主要是修改配置文件,原eureka server的配置文件:

spring:
  application:
    name: spring-cloud-eureka
server:
  port: 8761
eureka:
  instance:
    hostname: peer1
  client:
    registerWithEureka: false #是否将自己注册到eureka server,构建集群环境时,需将自己注册到集群中,默认为true
    fetchRegistry: false #是否从eureka server获取注册信息,构建集群环境时,需同步其他eureka server节点,默认为true
    serviceUrl:
      defaultZone: http://127.0.0.1:8761/eureka/

集群配置主要修改以下几点

  • registerWithEureka: true,将自身注册到集群中,该配置属性默认为true
  • fetchRegistry: true,用于集群环境中,与其他eureka server节点同步注册信息,默认为true
  • defaultZone: 除自身外的其他eureka server节点url
  • 添加spring.profiles=peer1配置,用于同一个jar包在不同机器或者同一台机器上运行加载不同配置,运行jar包:java -jar xxx.jar --spring.profiles.active=peer1,(注:这里的peer1跟hostname的peer1没有关系)。也可不使用spring.profiles,运行jar包时用:java -jar xxx.jar --server.port=8761,加载对应配置
  • 多份配置之间用"---"分隔

新加的与集群环境无关的配置

  • 当注册到注册中心的微服务实例不可用时,eureka server会在一定时间(默认90秒)后移除该实例,但这个时间间隔可能有些过长而导致不能及时剔除不可用的实例,这个时候需更改eureka server的清理时间间隔(需将eureka server的自我保护功能关闭
  • 由于eureka server服务注册中心会被部署到那台机器上是不确定(或者说可能变动)的,如果把注册中心url直接配置在配置文件中,当注册中心变动时,需修改代码后重新部署,因此一般采取的做法是,在/etc/hosts(Windows下为:C:\Windows\System32\drivers\etc)文件中添加:127.0.0.1 peer1,注册中心url用peer1表示:defaultZone: http://peer1:8761/eureka/
  • 微服务实例注册到注册中心时,默认将主机名注册到注册中心,此时微服务的各组件若部署在不同的机器上,可能会导致服务间调用或网关转发失效(因为从注册中心获取的服务实例的主机名,若未正确配置域名解析服务,主机名不能转换为对应的IP),所以需修改为以IP地址注册到服务中心

修改为集群环境的配置文件如下:

# 需配置host文件,
# windows下为:C:\Windows\System32\drivers\etc
# linux下为:/etc/hosts
# 127.0.0.1 peer1
# 127.0.0.1 peer2
# 127.0.0.1 peer3
# 若配置eureka多台服务器集群,则修改peer1、peer2、peer3为对应服务器的IP
spring:
  profiles: peer1
  application:
    name: spring-cloud-eureka
server:
  port: 8761
eureka:
  instance:
    hostname: peer1
    prefer-ip-address: true #以IP地址注册到服务中心,相互注册使用IP地址
  client:
    registerWithEureka: true #是否将自己注册到eureka server,构建集群环境时,需将自己注册到集群中,默认为true
    fetchRegistry: true #是否从eureka server获取注册信息,构建集群环境时,需同步其他eureka server节点,默认为true
    serviceUrl:
      defaultZone: http://peer2:8762/eureka/,http://peer3:8763/eureka/
  #解决eureka server不剔除已停掉的节点问题,更改Eureka更新频率将打破服务器的自我保护功能
  server:
    enableSelfPreservation: false #设为false,关闭自我保护功能
    evictionIntervalTimerInMs: 4000 #清理间隔(单位毫秒)

---
spring:
  profiles: peer2
  application:
    name: spring-cloud-eureka
server:
  port: 8762
eureka:
  instance:
    hostname: peer2
    prefer-ip-address: true #以IP地址注册到服务中心,相互注册使用IP地址
  client:
    registerWithEureka: true #是否将自己注册到eureka server,构建集群环境时,需将自己注册到集群中,默认为true
    fetchRegistry: true #是否从eureka server获取注册信息,构建集群环境时,需同步其他eureka server节点,默认为true
    serviceUrl:
      defaultZone: http://peer1:8761/eureka/,http://peer3:8763/eureka/
  #解决eureka server不剔除已停掉的节点问题,更改Eureka更新频率将打破服务器的自我保护功能
  server:
    enableSelfPreservation: false #设为false,关闭自我保护功能
    evictionIntervalTimerInMs: 4000 #清理间隔(单位毫秒)

---
spring:
  profiles: peer3
  application:
    name: spring-cloud-eureka
server:
  port: 8763
eureka:
  instance:
    hostname: peer3
    prefer-ip-address: true #以IP地址注册到服务中心,相互注册使用IP地址
  client:
    registerWithEureka: true #是否将自己注册到eureka server,构建集群环境时,需将自己注册到集群中,默认为true
    fetchRegistry: true #是否从eureka server获取注册信息,构建集群环境时,需同步其他eureka server节点,默认为true
    serviceUrl:
      defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
  #解决eureka server不剔除已停掉的节点问题,更改Eureka更新频率将打破服务器的自我保护功能
  server:
    enableSelfPreservation: false #设为false,关闭自我保护功能
    evictionIntervalTimerInMs: 4000 #清理间隔(单位毫秒)

注:如果想在idea中通过不同端口部署eureka server的集群环境,可通过如下步骤,在一个窗口中启动多个实例

1.点击右上角的Edit Configurations,如下图所示:

SpringCloud搭建微服务框架(四)- 集群环境搭建

2.将右上角的Single instance only取消勾选,在红色框的Active Profiles中填入配置文件中想加载的那套配置的spring.profiles,Name可任意填写,但是为了作区分,一般跟Active Profiles相同值

SpringCloud搭建微服务框架(四)- 集群环境搭建

3.点击Appay->OK,启动多个实例

注:这里配置了三个端口,会启动三个集群节点,当启动前两个的时候,自身需注册到集群eureka server中,但是由于另外两个(或一个)注册中心节点未启动,注册不进去会报错,但是这里并不影响,程序运行没有问题,启动最后一个eureka server节点不会报错。

注:启动时,application.yml文件一定要设置正确的编码(UTF-8),不然会报异常Caused by: java.nio.charset.MalformedInputException: Input length = 1

SpringCloud搭建微服务框架(四)- 集群环境搭建

依次启动三个eureka server节点后,访问注册中心http://localhost:8761/,可以看到确实启动了三个eureka server节点,并且注册到了注册中心

SpringCloud搭建微服务框架(四)- 集群环境搭建

2.服务提供方集群环境搭建

主要也是修改application.yml配置文件,修改以下几个部分:

  • 注册中心url
  • 解决eureka server不及时剔除不可用节点问题
  • 以IP地址注册到注册中心
  • 添加对应的spring.profiles

这里启动了两个实例,启动后访问注册中心http://localhost:8761/,可以看到确实启动了PARAMETER-MODULE服务节点

SpringCloud搭建微服务框架(四)- 集群环境搭建

3.服务消费方集群环境搭建

与服务提供方集群环境搭建类似,这里不作演示

4.网关集群环境搭建

关于网关是否需做集群环境,个人觉得没太大必要,因为网关是微服务的统一入口,若网关做了集群,那么统一入口就没有了,可以想到的是用nginx作负载均衡,但是当请求量非常大时,统一入口负载均衡器仍旧可以成为瓶颈。那么对应这种情况,其实真正需要做的是去中心化,一种解决方法是,利用域名解析服务器作为负载均衡器。有兴趣的可以详细了解一下。