微架构 springcloud-09. 搭建Eureka集群

Eureka集群

集群概述

简单陈述下,什么是集群!说直白一点,同一件事多个处理者一起来做,人多力量大,众人拾柴火焰高!比如说车站窗口的售票员!同一件事(都是卖票),交给一个人去完成就得了嘛,何必弄那么多个呢?同样的逻辑,我们部署在电脑(服务器)上的应用系统也可能出现“火车站只有一个售票员”的问题!

集群灵魂

集群灵魂!集群还有灵魂这一说么?刚刚提到,众人拾柴火焰高!人多了,柴就能拾取得更多么?电脑都买回来了并且都放入机房了,这就成集群了吗?当然不是,我们需要一个组织,将这些人、电脑通过一个逻辑组织起来,这才是集群!那么这个组织逻辑就是集群灵魂!

Eureka集群搭建

00 在上一章节,我们实现了这幅图的逻辑:

Eureka 服务

解决了跨App间逻辑调用、通信的问题,中心的Eureka是各个App间的通信“基站”,试想一下,假如这个基站因为要解决通信的逻辑太多、任务太重或因为其他原因宕机而不能正常提供服务会产生怎样的后果?各应用的逻辑间不能互相调用,造成整个应用架构体系的瘫痪!

Eureka 服务宕机

那么首先,实现以下结构:


Eureka 集群

01 新配置两个本地域名:编辑C:\Windows\System32\drivers\etc\hosts 文件,添加 127.0.0.1 的本地域名:

# 将该行添加到末尾
127.0.0.1 slave1 slave2

测试,slave1,slave2 是否配置成功!ping:

C:\Users\wu-chao>ping slave1

正在 Ping slave1 [127.0.0.1] 具有 32 字节的数据:
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64

127.0.0.1 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms
C:\Users\wu-chao>ping slave2

正在 Ping slave1 [127.0.0.1] 具有 32 字节的数据:
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64

127.0.0.1 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
    最短 = 0ms,最长 = 0ms,平均 = 0ms

slave1、slave2 成功访问本机IP地址 127.0.0.1,成功!

02 将上一章节创建的三个工程放入同一个文件夹,如./Eureka,idea open ./Eureka,如此一来,idea 就将三个工程同时打开在一个视图窗口中:

打开maven视图

idea ivew=>Too Windows=> Maven Projects ,打开maven视图,将三个工程的pom.xml 文件添加到maven project:

多工程添加到maven

03 idea 同时打开三个工程目录,相关的运行,故使用maven运行,打开EurekaService pom.xml,添加build配置:

<build>
  <resources>
        <resource>
            <directory>src/main/java</directory>
            <excludes>
                <exclude>**/*.java</exclude>
            </excludes>
        </resource>
        <resource>
            <directory>src/main/resources</directory>
        </resource>
    </resources>

    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>person.jack.eureka.EurekaService</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

04 删除EurekaService 工程删除application.properties 配置文件,添加application-slave1.properties、application-slave2.properties:

resources
    application-slave1.properties
    application-slave2.properties
# 内容分别如下

# application-slave1.propertie
profile=slave1
server.port=8761
spring.application.name=EurekaService1
eureka.client.service-url.defaultZone=http://localhost:8762/eureka/

# application-slave2.properties
profile=slave2
server.port=8762
spring.application.name=EurekaService2
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

# 如此一来,该工程就有了两个配置文件,通过配置启动参数(spring.profiles.active)以指定使用哪个配置文件启动

05 idea 添加maven命令,启动项目,编辑启动配置:【Edit Configurations】,添加maven启动命令:

MAven命令

同样的方法,再添加一个EurekaSlave2,其Command line如下:

exec:java -Dexec.mainClass=person.jack.eureka.EurekaService -Dspring.profiles.active=slave2

06 运行EurekaService1,EurekaService2 那么1、2就会自动抓取互为客户端;先启动EurekaService1,自动抓取EurekaService2(eureka.client.service-url.defaultZone=http://localhost:8762/eureka/),其实EurekaService2还未启动,所以此启动过程是会报异常的,不理它,下一步同样的方法启动EurekaService2,就不会报错了!

启动EurekaService1
启动EurekaService2

07 访问 http://localhost:8761 http://localhost:8762

 http://localhost:8761 页面打印信息

Instances currently registered with Eureka

Application AMIs Availability Zones Status
EUREKASERVICE1 n/a (1) (1) UP (1) - LAPTOP-TJDLNJHK:EurekaService1:8761
EUREKASERVICE2 n/a (1) (1) UP (1) - LAPTOP-TJDLNJHK:EurekaService2:8762
 http://localhost:8762 页面打印信息

Instances currently registered with Eureka

Application AMIs Availability Zones Status
EUREKASERVICE1 n/a (1) (1) UP (1) - LAPTOP-TJDLNJHK:EurekaService1:8761
EUREKASERVICE2 n/a (1) (1) UP (1) - LAPTOP-TJDLNJHK:EurekaService2:8762

Eureka集群搭建成功

搭建应用集群

现在基站已经是集群了,那么我们的应用呢?举例,假如我们购买火车票只能去一个火车站(不考虑网络订票),那么该火车站势必人脉为患,排队的长龙势必超长,车站势必“宕机”!所以就得考虑以下结构:

Eureka_App_group.png

如此,应用也成集群了!

01 改造AppOne,删除application.properties 文件,添加 application-8081.properties 、application-8082.properties,内容分别如下:

###### application-8081.properties ######
server.port=8081
# 应用名称
spring.application.name=AppOne
# eureka服务端地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/

###### application-8082.properties ######
server.port=8082
# 应用名称
spring.application.name=AppOne
# eureka服务端地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/

02 同样,改造AppTwo:

###### application-8083.properties ######
server.port=8083
# 应用名称
spring.application.name=AppTwo
# eureka服务端地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/

###### application-8084.properties ######
server.port=8084
# 应用名称
spring.application.name=AppTwo
# eureka服务端地址
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/

03 现在一个app有两个配置文件了,同样配置maven 命令启动对应的App:

mavenOrders.png

04 依次启动EurekaSlave1、EurekaSlave2、AppOne_8081、AppOne_8082、AppTwo_8083、AppTwo_8084,注意 各Controller代码逻辑:

# AppTwo/AppTwoHello 代码:
package person.jack.controller

@RestController
public class AppTwoHello {

    @Autowired
    private RestTemplate restTemplate;

    @ResponseBody
    @RequestMapping("/getAppOneMesg/{mesg}")
    public String getAppOneMesg(@PathVariable String mesg){
        String strMesg=restTemplate.getForObject("http://APPONE/sayMesg/" + mesg, String.class);
        return "访问App2,从App1 收到信息:“"+strMesg+"“";
    }
}

# AppOne/HelloController 代码:
package person.jack.controller;

@RestController
public class HelloController {

    @Value("${spring.application.name}")
    private String springAppName;

    @Value("${spring.profiles.active}")
    private String active;


    @ResponseBody
    @RequestMapping(value = "/sayMesg/{word}")
    public String sayMesg(@PathVariable String word){
        System.out.println(springAppName);
        System.out.println(active);
        return springAppName+":"+active + word ;
    }
}

05 测试:访问AppTwo 8083,http://localhost:8083/getAppOneMesg/abc 并多次刷新:

# 页面交替打印
访问App2,从App1 收到信息:“AppOne:8081abc“
访问App2,从App1 收到信息:“AppOne:8082abc“

06 测试:访问AppTwo 8084,http://localhost:8084/getAppOneMesg/abc 并多次刷新:

# 页面交替打印
访问App2,从App1 收到信息:“AppOne:8081abc“
访问App2,从App1 收到信息:“AppOne:8082abc“

07 如此,AppTwo 调用AppOne,那么调用的就不是一个AppOne 实例,而是调用AppOne 的集群,其实例会被轮次调用!测试通过!

08 应用集群搭建成功!

重新认识Eureka

停止EurekaSlave1、EurekaSlave2 服务,重新测试 http://localhost:8083/getAppOneMesg/abchttp://localhost:8084/getAppOneMesg/abc

# 页面依然交替交替打印
访问App2,从App1 收到信息:“AppOne:8081abc“
访问App2,从App1 收到信息:“AppOne:8082abc“

这是为什么?“基站”服务不存在了,App2 同App1 应该是不能通信了才对!可事实上,他们没有断开!

Eureka,它实际上起到的是一个注册服务!它就像一个云端通讯录!AppOne、AppTwo 启动到并注册到云端,那么AppOne(AppTwo)就同时获取了其他云端成云的联系信息【并缓存到本App】,所以若“基站”服务突然不存在了,并不妨碍宕机之前以注册到“基站”App间的通信!但若一个新的App也试着注册到Eureka,首先,它无法注册,因为“基站”服务已经不存在了,其二,那么新注册的App无法与之前的App进行通信,因为它们之间没有在一个云端里交流!若想更新“通讯方式”,需重启Eureka服务以自动捕获Eureka客户端刷新“通讯录”。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,651评论 18 139
  • Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgb...
    毛宇鹏阅读 46,804评论 6 342
  • Eureka 何为 Eureka? 简单来说Eureka 就是一个服务管理中心。 思考:在现实的开发逻辑中,我们把...
    程序员_超阅读 491评论 0 0
  • 最近在学习大数据技术,朋友叫我直接学习Spark,英雄不问出处,菜鸟不问对错,于是我就开始了Spark学习。 为什...
    Plokmijn阅读 26,533评论 6 26
  • 赵照的《一把破吉他》唱出了我刚毕业时的心境。 那会儿青涩,毕业的样子显得很天真,一身了无牵挂,却也是一无所有,只身...
    飞屋ZA阅读 243评论 0 0