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

前面的内容中,搭建的组件无论是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,如下图所示:

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

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

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

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

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

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

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

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

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

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

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

4.网关集群环境搭建

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

你可能感兴趣的:(spring,cloud微服务,Java)