架构师入门:搭建双注册中心的高可用Eureka架构(基于项目实战)
本文的案例是基于 架构师入门:搭建基本的Eureka架构(从项目里抽取) 改写的。
在上文里,我们演示Eureka客户端调用服务的整个流程,在这部分里我们将在架构上有所改进。大家可以想象下,在上文里案例中,Eureka注册中心只部署在一台机器上,这样它一旦出现问题,会导致整个服务调用系统的崩溃,如果这种情况发生在生产环境上,后果是不堪设想的。
大家别以为这是危言耸听,在高并发的场景下(比如双十一的并发环境),这种情况发生的可能性不低。针对这种场景,这里我们将部署两台Eureka注册中心,彼此相互注册,以此搭建一个可用性比较高的Eureka集群。
1 集群的示意图
在这个集群里,我们将配置2台相互注册的Eureka服务器,这样一来,每台服务器都包含着对方的服务注册信息,相当于双机热备,同时,服务提供者只需向其中的一个注册服务。

这样,如果服务器A或B宕机,那么另一台服务器依然可以向外部提供服务列表,服务调用者依然可以据此调用服务。
在并发要求更高的环境里,我们甚至可以搭建2台以上的服务器,不过事实上,双机热备的集群能满足大多数的场景,一方面,不是每个系统的并发量都很高,所以双机热备足以满足大多数的并发需求,另一方面,毕竟两台服务器同时宕机的可能性也不大。
2编写相互注册的服务器端代码
这里为了演示方便,我们在一台机器上模拟双服务器的场景,在真实项目里,我们一般是把两个相互注册的服务器安装在两台主机上,因为如果只安装在一台上,那么该服务器发生故障的话,两个服务器都会失效。具体的实现步骤如下。
第一步,到C:\WINDOWS\system32\drivers\etc目录里,找到hosts文件,在其中加入两个机器名(其实都是指向本机),代码如下。修改后,需要重启机器。
127.0.0.1 ekServer1
127.0.0.1 ekServer2
第二步,创建ek-cluster-server项目,这其实是根据上文 架构师入门:搭建基本的Eureka架构(从项目里抽取) 里的EurekaBasicDemo-Server项目改写而来,和之前的项目相比,我们只改动了application.yml文件,代码如下。
1 server:
2 port: 8888
3 spring:
4 application:
5 name: ekServer1
6 eureka:
7 instance:
8 hostname: ekServer1
9 client:
10 serviceUrl:
11 defaultZone: http://ekServer2:8889/eureka/
这里的端口号没变,依然是8888,但我们在第5行把项目名修改成ekServer1,在第8行把提供服务的主机名也修改成ekServer1,在第11行,我们指定了本服务所在的rul,这里请注意,我们把ekServer1所在的serverUrl指定到ekServer2的8889端口上,也就是说,这里我们指定ekServer1向ekServer2注册。
第三步,由于在真实项目里,我们一般会在两台主机上启动两个Eureka服务,所以这里我们再创建一个Maven类型的项目ek-cluster-server-backup,和之前的ek-cluster-server相比,它们的差别还是在application.yml,代码如下。
1 server:
2 port: 8889
3 spring:
4 application:
5 name: ekServer2
6 eureka:
7 instance:
8 hostname: ekServer2
9 client:
10 serviceUrl:
11 defaultZone: http://ekServer1:8888/eureka/
这里的配置信息其实和刚才的是对偶的,这里的application名和主机名都叫ekServer2,不过请注意第11行,这里的serviceUrl是注册到ekServer1的8888端口上,这里我们同样指定ekServer2向ekServer1注册。结合上文,至此我们实现了双服务器之间的相互注册。
3 服务提供者只需向其中一台服务器注册
虽然在集群里搭建了两台服务器,但服务提供者只需向其中的一台注册即可,否则高可用的便利性就会以牺牲代码可维护性为代价了。
这里我们是在ek-cluster-ServiceProvider项目编写服务提供程序,它是根据上文架构师入门:搭建基本的Eureka架构(从项目里抽取)里的项目EurekaBasicDemo-ServerProvider改写而来,其中只修改了application.yml部分的代码。
1 server:
2 port: 1111
3 spring:
4 application:
5 name: sayHello
6 eureka:
7 client:
8 serviceUrl:
9 defaultZone: http://ekServer1:8888/eureka/
我们只改动了第9行的代码,这说明本服务是向ekServer1的8888号端口注册。
由于这里两个Eureka服务器是相互注册,所以本服务提供者无需同时向两个服务器注册,因为一旦向ekServer1注册后,该服务器会自动把这个服务提供者的信息复制到ekServer2上。
4修改服务调用者的代码
我们把服务调用者的代码放入ek-cluster-ServiceCaller这个Maven项目里,这是根据之前里的EurekaBasicDemo-ServerCaller项目改写而来。其中我们也只修改application.yml代码。
1 spring:
2 application:
3 name: callHello
4 server:
5 port: 8080
6 eureka:
7 client:
8 serviceUrl:
9 defaultZone: http://ekServer1:8888/eureka/
改动点还是在第9行上,这里是向ekServer1服务器的8888号端口注册,同理,这里无需向另外一个机器(ekServer2)注册。
5正常场景下的运行效果
按如下次序启动四个项目的Spring Boot服务。
第一, ek-cluster-server(第一个Eureka服务器)。
第二, ek-cluster-server-backup(第二个Eureka服务器)。
第三, ek-cluster-ServiceProvider(服务提供者)。
第四, ek-cluster-ServiceCaller(服务调用者)。
随后,大家能在http://ekserver1:8888/和http://ekserver2:8889/这两个浏览器上看到如下图所示的四个可用的服务。由于是相互注册,所以它们的内容是一样的。

虽然这里我们也可以通过http://localhost:8888/和http://localhost:8889/看到相同的效果,但不推荐。这是因为,在真实的项目里,Eureka的服务器应该是和开发机器分开的,也就是说它们应该被部署在其它机器上,只不过这里我们为了演示方便,把它们都放在本机。
当我们确认服务启动后,可以在浏览器里输入http://ekserver1:8080/hello来查看服务调用的效果,这里其实触发了ek-cluster-ServiceCaller中Controller里的hello方法。
和之前一样,这里的输出还是“In Caller, hello Eureka“,这说明双机热备的Eureka架构至少不会影响基本的功能。同样,这里不建议通过http://localhost:8080/hello来查看运行效果。
6 一台服务器宕机后的运行效果
这里我们可以故意关闭ek-cluster-server服务,以此来模拟一台服务器宕机的情况。
关闭后,我们在浏览器里输入http://ekserver1:8080/hello,虽然我们在服务提供者和服务调用者的application.yml里指定的serviceUrl.defaultZone都是http://ekServer1:8888/eureka/,但在一台Eureka服务器失效的情况下,我们依然能看到正确的结果,如下图所示。

如果我们在刚才关闭的是ek-cluster-server-backup,让ek-cluster-server运行,这里我们还是能看到同样的效果。也就是说,在这个Eureka双服务器的集群里,一台服务器宕机后,整个服务体系依然可用,这就大大提升的系统的可用性。
7 寻求大牛帮助
本人在写完java web轻量级开发面试教程后,再想写一本Spring Cloud方面的书,请各位大神告诉我该写哪些方面的内容,或者是提些建议,谢谢了。
8 本文代码和版权声明
如果大家想要本案例中代码,请给我站内留言。
本人保留本文中文字和代码的版权,转载请注明出处。
架构师入门:搭建双注册中心的高可用Eureka架构(基于项目实战)的更多相关文章
- 架构师入门:Spring Cloud系列,Hystrix与Eureka的整合
和Ribbon等组件一样,在项目中,Hystrix一般不会单独出现,而是会和Eureka等组件配套出现.在Hystrix和Eureka整合后的框架里,一般会用到Hystrix的断路器以及合并请求等特性 ...
- spring clound微服务架构实践(1)——搭建服务注册中心
一.创建一个空maven parent模板 1-1.新建project,选择maven 1-2.给此模板起名 1-3.此模板的保存位置,此处放入我的git项目spring-clound-learnin ...
- Spring-Cloud(三)Eureka注册中心实现高可用
前言: spring-cloud为基础的微服务架构,所有的微服务都需要注册到注册中心,如果这个注册中心阻塞或者崩了,那么整个系统都无法继续正常提供服务,所以,这里就需要对注册中心进行集群,换言之,高可 ...
- 资深P7架构师详解淘宝服务端高并发分布式架构演进之路
1. 概述 本文以淘宝作为例子,介绍从一百个并发到千万级并发情况下服务端的架构的演进过程,同时列举出每个演进阶段会遇到的相关技术,让大家对架构的演进有一个整体的认知,文章最后汇总了一些架构设计的原则. ...
- 【架构师之路】 LVS+Keepalived实现高可用负载均衡
一.原理 1.概要介绍 如果将TCP/IP划分为5层,则Keepalived就是一个类似于3~5层交换机制的软件,具有3~5层交换功能,其主要作用是检测web服务器的状态, ...
- 架构师入门:搭建基本的Eureka架构(从项目里抽取)
没有废话,直接上干货,理论部分大家可以看其它资料. 这里是部分关键代码,如果需要全部可运行的代码,请给本人留言. 在后继,还将给出搭建高可用Eureka架构的方式. 1 Eureka的框架图 在Eur ...
- 使用Spring Cloud搭建服务注册中心
我们在之前的博客中已经介绍过阿里的分布式服务框架dubbo[Linux上安装Zookeeper以及一些注意事项][一个简单的案例带你入门Dubbo分布式框架],但是小伙伴们应该也看到了,阿里的dubb ...
- Spring cloud Eureka 服务治理(搭建服务注册中心)
服务之类是微服务架构中最为核心的基础模块,它主要用来实现各个微服务实例的自动化注册和发现. 1. 服务注册 在服务治理框架中,通常会构建一个注册中心,每个服务单元向注册中心登记自己提供的服务,将主机. ...
- 使用Redis为注册中心的Dubbo微服务架构(基于SpringBoot)
title: 使用Redis为注册中心的Dubbo微服务架构(基于SpringBoot) date: 2019-07-30 14:06:29 categories: 架构 author: mrzhou ...
随机推荐
- IntelliJ IDEA 2016.2.x 激活
注册码获取:http://idea.lanyus.com/
- [知了堂学习笔记]_eclipse引入svn插件,并将项目同步到svn
1. eclipse中不存在SVN问题的解决 1.1发现Team->Share project 下没有svn. 1.2下载安装svn插件. 选择help->Eclipse Marketpl ...
- 【笔记】css 实现宽度自适应屏幕 高度自适应宽度
如果说宽高自适应屏幕尺寸那么大家可能会想到 div{ width: 100%; height: 100% } 但是如果我要自适应屏幕尺寸的同时还要变成正方形呢?(高度和宽度相等而高度不能写死) 那就要 ...
- 在Pycharm中运行Scrapy爬虫项目的基本操作
目标在Win7上建立一个Scrapy爬虫项目,以及对其进行基本操作.运行环境:电脑上已经安装了python(环境变量path已经设置好), 以及scrapy模块,IDE为Pycharm .操作如下: ...
- mybatis-pageHelper做分页
Mybatis-PageHelpera是一个很好的第三方分页插件,支持很多数据库,几乎主流的数据库都支持 github地址:https://github.com/pagehelper/Mybatis- ...
- scss 初学笔记 二 混合宏
混合宏 格式 @mixin 定义混合宏 (相当于变量声明 var $ ?) //不带参数混合宏 @mixin borderRadius{ -webkit-border-radius: 5px; b ...
- String 类的选择输出
package com.day_08.strings; /* * 通过API可知/String是在Java.lang包下的类,所以不用导包 */ public class StringDemo { p ...
- Ceph,TFS,FastDFS,MogileFS,MooseFS,GlusterFS 对比
系统整体对比 对比说明 /文件系统 TFS FastDFS MogileFS MooseFS GlusterFS Ceph 开发语言 C++ C Perl C C C++ 开源协议 GPL V2 GP ...
- Linux make nginx 的时候报错
报错如下: `conf/koi-win' and `/usr/local/nginx/conf/koi-win' are the same file 原因: 可能在编译 nginx 的时候步骤不对 ...
- ajax请求获取实时数据
<!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...