Spring cloud微服务实战——高可用注册中心(二)

来源:互联网 发布:视频云平台 阿里云 编辑:程序博客网 时间:2024/06/06 00:18

上一篇我们介绍服务注册中心、服务提供者、服务消费者的创建以及调用。本次课程介绍的是服务中心高可用设置,以及Eureka的自我保护模式。

高可用的服务注册中心

在服务注册中心其实也就是一个服务,它同样可以向其他服务中心注册,Eureka Servere的高可用实际上就是将自己作为服务向其他服务中心进行注册,这样就形成了相互注册的服务注册中心。下面我们就来配置一下。我们还是使用上一节的ack-center工程为示例,创建两个节点,如下:

  • application-node1.properties
spring.application.name=ack-centerserver.port=9101eureka.instance.hostname=ack-center-node1eureka.client.register-with-eureka=trueeureka.client.fetch-registry=trueeureka.client.service-url.defaultZone=http://ack-center-node2:9102/eureka/
  • application-node1.properties
spring.application.name=ack-centerserver.port=9102eureka.instance.hostname=ack-center-node2eureka.client.register-with-eureka=trueeureka.client.fetch-registry=trueeureka.client.service-url.defaultZone=http://ack-center-node1:9101/eureka/

端口分别设置为9101,9102,node1和node2互相注册,注意:eureka.client.register-with-eureka=true eureka.client.fetch-registry=true 设置为true,还记得之前我们设置为false,是不向自己进行注册。这里要设置为true。

记得修改hosts:
127.0.0.1 ack-center-node1
127.0.0.1 ack-center-node2

然后到ack-center目录下用maven命令打包 mvn package。
这里写图片描述

打包成功后到target 目录下通过spring.profiles.active属性分别启动node1,node2

java -jar ack-center-0.0.1-SNAPSHOT.jar --spring.profiles.active=node1java -jar ack-center-0.0.1-SNAPSHOT.jar --spring.profiles.active=node2

打开localhost:9101,看到node2已经注册,同理打开localhost:9102,看到node1已经注册,registered-replicas,available-replicas,分别已经有了不同节点的信息。

这里写图片描述

这样我们就实现了服务的高可用。

服务提供者&消费者修改

在配置了多节点的服务注册中心后,服务提供者和消费者需要相应的修改。同样,我们还是借助ack-provider和ack-consumer进行修改。

  • 提供者修改eureka.client.service-url.defaultZone如下
spring.application.name=ack-providerserver.port=9001eureka.instance.hostname=ack-providereureka.client.register-with-eureka=trueeureka.client.fetch-registry=trueeureka.client.service-url.defaultZone=http://ack-center-node1:9101/eureka/,http://ack-center-node2:9102/eureka/
  • 消费者修改eureka.client.service-url.defaultZone如下
spring.application.name=ack-consumerserver.port=9002eureka.client.register-with-eureka=trueeureka.client.fetch-registry=true#eureka.client.service-url.defaultZone=http://ack-center:9000/eureka/eureka.client.service-url.defaultZone=http://ack-center-node1:9101/eureka/,http://ack-center-node2:9102/eureka/

然后分别启动提供者和消费者看到:
2017-09-26 11:25:41.380 INFO 7384 — [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_ACK-PROVIDER/localhost:ack-provider:9001: registering service…
2017-09-26 11:25:41.425 INFO 7384 — [nfoReplicator-0] com.netflix.discovery.DiscoveryClient : DiscoveryClient_ACK-PROVIDER/localhost:ack-provider:9001 - registration status: 204

刷新 http://localhost:9101/,和http://localhost:9102/ 看到了ack-provider

这里写图片描述

刷新 http://localhost:9102/

这里写图片描述

ack-consumer也是同样的道理。我们现在调用consumer的接口:http://localhost:9002/getHello
看到输出:hello,I am from provider。

我们既然用了高可用的注册中心,那么现在我们把node1给停掉。同样执行http://localhost:9002/getHello ,也会收到hello,I am from provider的输出,因为provider同时向node1和node2进行了注册,当断开node1的时候,node2上的其他服务依然可以访问,从而实现了服务注册中心的高可用。

EMERGENCY!

当我们停掉一个服务的时候,会看到如下警告。

这里写图片描述

这是Eureka进入了保护模式,不会马上把不可用的服务剔除掉,默认的心跳时间比较长,开发环境下,我们想快速踢出不可用服务时,如何做?很简单,把自我保护功能设置为false:
server 端设置

eureka.server.enable-self-preservation=false#Make sure eureka server can detect whether this app is up or downeureka.instance.lease-renewal-interval-in-seconds=5eureka.instance.lease-expiration-duration-in-seconds=5

client端设置

#Make sure eureka server can detect whether this app is up or downeureka.instance.lease-renewal-interval-in-seconds=5eureka.instance.lease-expiration-duration-in-seconds=5

这样会报:

THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.

提示你自我保护功能关闭会带来的问题。加入ack-provider已经注册了,这时候我们关闭ack-provider,过几秒,ack-center控制台会输出

2017-09-26 15:00:40.772  INFO 7656 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Running the evict task with compensationTime 0ms2017-09-26 15:00:40.772  INFO 7656 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Evicting 1 items (expired=1, evictionLimit=1)2017-09-26 15:00:40.772  WARN 7656 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : DS: Registry: expired lease for ACK-PROVIDER/localhost:ack-provider:90012017-09-26 15:00:40.773  INFO 7656 --- [a-EvictionTimer] c.n.e.registry.AbstractInstanceRegistry  : Cancelled instance ACK-PROVIDER/localhost:ack-provider:9001 (replication=false)

刷新页面,ack-provider已经被移除了。

不使用主机名来定义注册中心的地址

修改properties

#####使用IP地址################eureka.instance.prefer-ip-address=trueeureka.instance.instanceId=${spring.application.name}:${spring.cloud.client.ipAddress}:${server.port}###########IP END#################

重启刷新页面,则显示了IP:端口

这里写图片描述

到这里就结束了。

本文源码下载
https://github.com/babylikebird/ack-project

阅读全文
1 0