Eureka集群
集群概述
简单陈述下,什么是集群!说直白一点,同一件事多个处理者一起来做,人多力量大,众人拾柴火焰高!比如说车站窗口的售票员!同一件事(都是卖票),交给一个人去完成就得了嘛,何必弄那么多个呢?同样的逻辑,我们部署在电脑(服务器)上的应用系统也可能出现“火车站只有一个售票员”的问题!
集群灵魂
集群灵魂!集群还有灵魂这一说么?刚刚提到,众人拾柴火焰高!人多了,柴就能拾取得更多么?电脑都买回来了并且都放入机房了,这就成集群了吗?当然不是,我们需要一个组织,将这些人、电脑通过一个逻辑组织起来,这才是集群!那么这个组织逻辑就是集群灵魂!
Eureka集群搭建
Eureka 服务00 在上一章节,我们实现了这幅图的逻辑:
解决了跨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,成功!
打开maven视图02 将上一章节创建的三个工程放入同一个文件夹,如./Eureka,idea open ./Eureka,如此一来,idea 就将三个工程同时打开在一个视图窗口中:
多工程添加到mavenidea ivew=>Too Windows=> Maven Projects ,打开maven视图,将三个工程的pom.xml 文件添加到maven project:
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)以指定使用哪个配置文件启动
MAven命令05 idea 添加maven命令,启动项目,编辑启动配置:【Edit Configurations】,添加maven启动命令:
同样的方法,再添加一个EurekaSlave2,其Command line如下:
exec:java -Dexec.mainClass=person.jack.eureka.EurekaService -Dspring.profiles.active=slave2
启动EurekaService1 启动EurekaService206 运行EurekaService1,EurekaService2 那么1、2就会自动抓取互为客户端;先启动EurekaService1,自动抓取EurekaService2(eureka.client.service-url.defaultZone=http://localhost:8762/eureka/),其实EurekaService2还未启动,所以此启动过程是会报异常的,不理它,下一步同样的方法启动EurekaService2,就不会报错了!
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/
mavenOrders.png03 现在一个app有两个配置文件了,同样配置maven 命令启动对应的App:
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/abc、http://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客户端刷新“通讯录”。
网友评论