1.前言
在浅出系列的第一节:SpringCloud进击 | 一浅出:服务注册与发现(Eureka)【Finchley版本】介绍了服务注册与发现,其中服务注册中心,是一个实例,所以,当成千上万个服务向它注册的时候,它的负载是非常高的,如果遇到故障就是毁灭性的,这在生产环境上是不理想的架构,所以,我们需要 Eureka Server 集群化。
在一个分布式系统中,服务注册中心是最重要的基础部分,理应随时处于可以提供服务的状态。Eureka 通过互相注册的方式来实现高可用的部署,所以我们只需要将 Eureke Server 配置其他可用的 service-url 就能实现高可用部署。
2.准备
先来回顾一下前面浅出部分我们都完成了什么:
- 构建 服务注册中心:wei-eureka-server,端口号:8090
- 创建 服务提供者:wei-service-provider,端口号:8010
- 创建 服务消费者:wei-consumer-ribbon,端口号:8020 和 wei-consumer-feign,端口号:8030
- 实现 Spring Cloud Netflix Hystrix 断路器 的融断机制
- 实现 服务网关的映射和过滤器:wei-gateway-zuul,端口号:8040
- 实现 服务配置中心:wei-config-server,端口号:8050 和 wei-config-client,端口号:8060
嗯。这么看,似乎一个微服务框架已经完成了。
嗯,接下来,我们将对这些之前写的模块进行功能改造和升级,所以接下来的深入系列将继续延用之前写好的代码。
3.进击
3.1.Eureka Server 集群
我们尝试一下 Eureka Server 多节点注册中心的搭建。很简单。
3.1.1.配置文件
a)创建配置文件 application-peer1.yml,设置端口为 8091,作为 peer1 服务中心的配置,并将 service-url 指向 peer2、peer3 节点。
server:
port: 8091
spring:
application:
name: wei-eureka-server
eureka:
instance:
hostname: peer1
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://peer2:8092/eureka/, http://peer3:8093/eureka/
b)创建配置文件 application-peer2.yml,设置端口为 8092,作为 peer2 服务中心的配置,并将 service-url 指向 peer1、peer3 节点。
server:
port: 8092
spring:
application:
name: wei-eureka-server
eureka:
instance:
hostname: peer2
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://peer1:8091/eureka/, http://peer3:8093/eureka/
c)创建配置文件 application-peer3.yml,设置端口为 8093,作为 peer3 服务中心的配置,并将 service-url 指向 peer1、peer2 节点。
server:
port: 8093
spring:
application:
name: wei-eureka-server
eureka:
instance:
hostname: peer3
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://peer1:8091/eureka/, http://peer2:8092/eureka/
3.2.配置本地 host
drivers/etc 下,修改 hosts 文件,添加配置:
127.0.0.1 peer1 peer2 peer3
3.3.启动 Eureka 注册中心
分别依次以 peer1、peer2、peer3 的配置参数执行以下命令,启动 Eureka 注册中心。
java -jar wei-eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.action=peer1
java -jar wei-eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.action=peer2
java -jar wei-eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.action=peer3
注意:在以 peer1 启动的时候,会在控制台看到诸如 “Cannot execute request on any known server” 之类的异常信息,这个先不用管,接着启动完 peer2、peer3 节点后就好了。
3.4.改造服务提供者
为了接下来的验证,这里改造一下服务提供者 wei-service-provider 的配置文件 application.yml
server:
port: 8010
spring:
application:
name: wei-service-provider # 指定进行服务注册时该服务的名称,服务与服务之间相互调用一般都是根据这个name
eureka:
client:
service-url:
#defaultZone: http://localhost:8090/eureka/ # 指定进行服务注册地址
defaultZone: http://peer1:8091/eureka/ # 指定进行服务注册地址
这里指定服务注册地址为 peer1:8091。
到此,Eureka Server 服务注册中心多节点的配置已经完成。
4.测试
以上启动完成后,访问URL:http://localhost:8091/
![](https://i-blog.csdnimg.cn/blog_migrate/0a10fd5a827b61207760ee411b1b3ef1.png)
上图可以看出 peer1 的注册中心 DS Replicas 已经有了 peer2、peer3 节点的相关配置信息,并且出现在 available-replicas(可用的相邻集群复制节点) 中。
而,再访问 http://localhost:8092/,peer2 注册中心的 DS Replicas 已经有了 peer1、peer3 节点。如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/2f5e0dfe84107aa5f5f5d93173cf6aac.png)
再看看,peer3,访问:http://localhost:8093/
![](https://i-blog.csdnimg.cn/blog_migrate/d534cfd61bdd0258d475a6bcda666cee.png)
如上图,peer3 注册中心的 DS Replicas 也已经有了 peer1、peer2 节点。
也说是,Eureka 服务注册中心 通过互相注册的方式来实现高可用的部署。
既然 peer1 是与 peer2、peer3 互通;peer2 是与 peer1、peer3 互通; peer3 又与 peer1、peer2 互通;那这就是一个闭环,大家都是相通的。当有新的服务注册时,Eureka Server 是对等的,它们都存有相同的信息,通过服务器的冗余来增加可靠性,当有一台服务器宕机了,服务并不会终止,因为另一台服务存有相同的数据。
访问服务提供者:http://localhost:8010/demo/info?name=tester
Hi,tester,我是服务,我被调用了,服务名为:wei-service-provider,端口为:8010
一切正常。
到此,Eureka Server 服务注册中心集群已经完成。
5.总结
不要怕它,也不要怕它,实现下来,其实很简单。
与浅出第一节相比,Eureka Server 集群的实现,只不过是在原有基础上配置文件与属性的功能挖掘。
另外,需要注意的是:
- 在搭建 Eureka Server 集群的时候,要把 application 配置文件中的 eureka.client.register-with-eureka 和 eureka.client.fetch-registry 均改为 true(默认)。否则会出现实例列表为空,且 peer2 等节点不在 available-replicas 而在 unavailable-replicas 的情况(这时其实只是启动了两个单点实例)
- 在注册的时候,多节点的 application 配置文件中的 spring.application.name 必须一致
官方参考文档:https://springcloud.cc/spring-cloud-netflix.html
6.系列
SpringCloud进击 | 一浅出:服务注册与发现(Eureka)【Finchley版本】
SpringCloud进击 | 二浅出:服务消费者(Ribbon+REST)【Finchley版本】
SpringCloud进击 | 三浅出:服务消费者(Feign)【Finchley版本】
SpringCloud进击 | 四浅出:断路器与容错(Hystrix)【Finchley版本】
SpringCloud进击 | 五浅出:服务网关 - 路由(Zuul Router)【Finchley版本】
SpringCloud进击 | 六浅出:服务网关 - 过滤器(Zuul Filter)【Finchley版本】
SpringCloud进击 | 七浅出:配置中心(Git配置与更新)【Finchley版本】
SpringCloud进击 | 一深入:配置中心(服务化与高可用)【Finchley版本】
SpringCloud进击 | 二深入:配置中心(消息总线)【Finchley版本】
SpringCloud进击 | 三深入:服务链路跟踪(Spring Cloud Sleuth)【Finchley版本】
SpringCloud进击 | 四深入:服务链路跟踪(Sleuth+Zipkin+RabbitMQ整合)【Finchley版本】
SpringCloud进击 | 五深入:断路器监控(Hystrix Dashboard)【Finchley版本】
SpringCloud进击 | 六深入:断路器聚合监控(Hystrix Turbine)【Finchley版本】