SpringCloud 入门3 - Eureka的高可用及 EurekaClient端初始化

微服务中 Eureka 担当着注册中心的角色,全部服务节点都需要找它注册,这么重要的应用,肯定是不可能单点的,不然挂了怎么办。

一、如何实现多个一份代码多个实例?

大家最常用的可能就是直接跑3个实例,分配不同的端口。
在服务器还好,但是在本地,你同时用IDE 跑3个实例,那就太浪费电脑资源了。而且每次重启项目,都需要改一大堆配置文件,这样真的好?

其实 SpringBoot 是支持多个环境的,我们可以开发环境一个配置文件,生产环境另一个配置文件,这样,我们只需要在启动的时候指定好对应的环境,就可以不用把配置文件改来改去了。
应用到这个项目里,我们也可以做到一份代码,通过不同的启动命令,分别启动3个实例。

1、首先我们把配置文件复制3份,名字分别改成application-eureka1.yml、application-eureka2.yml、application-eureka3.yml


注意:这里是有格式要求的,必须是 application-环境名.yml (通常我们开发的时候会改成 dev 和 prod,dev为开发环境,prod 为生产环境,特殊情况下还有 test 测试环境)。

2、改各自配置文件的内容

#
# Eureka1
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8762/eureka/,http://localhost:8763/eureka/ #向其他两个Eureka注册
    register-with-eureka: false #不显示在注册中心页面
spring:
  application:
    name: eureka1
server:
  port: 8761
# Eureka2
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/,http://localhost:8763/eureka/ #向其他两个Eureka注册
    register-with-eureka: false #不显示在注册中心页面
spring:
  application:
    name: eureka2
server:
  port: 8762
# Eureka3
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/ #向其他两个Eureka注册
    register-with-eureka: false #不显示在注册中心页面
spring:
  application:
    name: eureka3
server:
  port: 8763

3、 pom.xml 文件里面,添加对应的配置

<!--配置环境的profile-->
    <profiles>
        <profile>
            <id>eureka1</id>
            <properties>
                <environment>eureka1</environment>
            </properties>
            <activation>
                <activeByDefault>true</activeByDefault>  <!--如果没指定环境,默认为该环境-->
            </activation>
        </profile>
        <profile>
            <id>eureka2</id>
            <properties>
                <environment>eureka2</environment>
            </properties>
        </profile>
        <profile>
            <id>eureka3</id>
            <properties>
                <environment>eureka3</environment>
            </properties>
        </profile>
    </profiles>

4、打包启动(Maven打包什么的,请你自己搞定)

这里我们就不需要用 IDE 启动了,我们直接通过脚本或者命令行启动就行了,这样比较不占内存,而且还可以后台启动
打开你们的终端(我这里用的是 powerShell,win10 的同学建议使用 )

cd E:\DemoProdect\SpringCloud\eureka #进入到项目目录
java -jar  .\target\eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=eureka1 #通过java命令启动程序

我们直接用 --spring.profiles.active 来指定我们所使用的环境(也就是配置文件)。

这样启动还是太麻烦了,我们可以把它写成脚本


新建一个文本,写入这两行命令,然后另存为.ps1 文件,我们就可以直接在win10下启动了,我们只要把
eureka1 改成 eureka2 和 eureka3 就得到3个启动脚本,linux 和 mac 的同学可以另存为 .sh 文件(注意路径)。



双击打开就启动项目



三个不同的端口,说明环境配置成功了,我们打开页面看看



三个 Eureka 都分别向另外两个注册,再也不怕某个 Eureka实例挂掉了,我们还可以写个定时脚本定时检测他们的状态并报警,这样就更稳当了,有兴趣的可以自己研究一下。

二、构建 Eureka Client

构建 Eureka Client 的过程和 上一章构建 Eureka Server 大致一样,只是有两点需要注意的
1、 这里选的是 Eureka Discovery (不是Server)



2、这里的注解是@EnableDiscoveryClient

package com.show.client;
@SpringBootApplication
@EnableDiscoveryClient // 指定自己是Client端
public class ClientApplication {
  public static void main(String[] args) {
    SpringApplication.run(ClientApplication.class, args);
  }
}

大致的过程就是 新建项目 -> 选择Eureka Discovery -> 把pom文件里面的版本和 server 一致 -> 修改配置文件
application.yml -> 启动

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/,http://localhost:8762/eureka/,http://localhost:8763/eureka/
spring:
  application:
    name: client

这样,client 端就初始化完成了。

三、Eureka总结

1、@EnableEurekaServer 和 @EnableDiscoveryClient
2、@EnableDiscoveryServer 会让该实例变成注册中心,拥有注册功能,各个服务节点启动后,会在 Eureka Server 进行注册,这样 Eureka Server 就有了所有服务节点的信息
3、Eureka Server 会有心跳检测、健康检查、负载均衡等功能
4、Eureka 的高可用,生产上建议至少两台以上,保证注册中心的稳定运行
5、分布式系统中,服务注册中心是最重要的基础部分

四、分布式下服务注册的地位和原理

1、分布式系统中为什么需要服务发现?

传统分布式服务中,我们会使用负载均衡(nginx、apache)来把流量或者不同的请求分发到不同的实例节点B,但是假如实例节点B多起来,这样负载均衡的配置文件,将会变得未必复杂,而且还要针对不同的实例写不同的配置。 而且负载均衡是不会管实例状态的,如果实例挂了,负载均衡就只会直接返回404,找不到该路径。
这样时候,我们就可以使用注册中心,把不同的实例节点B,全部注册到注册中心里面,当其它节点需要调用B的服务时,直接找注册中心拿该节点的服务地址就好了。
这里看起来和负载均衡一样,但是两个对比使用后,你就会发现不一样了

1、当B节点的端口和路径改变的时候,负载均衡是需要改配置文件,重启。注册中心不需要。
2、负载均衡主要负责的是负载和转发,而注册中心还可以健康检查、心跳检测(最简单的体验就是,你想知道这个实例是否正常,找负载均衡是没用的。但是你可以在注册中心页面看到该实例是否已经注册,已注册说明他是能正常提供服务的)


负载均衡

注册中心

因此,分布式系统中,服务注册中心是最重要的基础部分,随时都应该处于提供服务的状态。

2、服务器发现与客户端发现

客户端发现

A需要调用B的服务,找注册中心的时候,注册中心会把B的所有节点信息交给A,A自行确定调用哪个B节点提供服务(轮询、hash等...),这个叫客户端发现。
优点:A可以知道所有B可用服务的地址,没有中间商赚差价
缺点:需要自己实现一套逻辑筛选出一个B节点来提供服务
例: Eureka

服务端发现

A需要调用B服务,找注册中心的时候,注册中心会把B所有节点信息交给"代理","代理"再挑一个节点(轮询、hash等...)告诉A,让A调用,这个叫服务端发现。
优点:B节点对于A是不可见的,A只需要说要什么服务即可
缺点:需要经过一层代理,又需要配多一份配置
例: Nginx、Zookeeper 、Kubernetes

服务端发现

3、原理

微服务的特点就是"异构",也就是可以用不同的语言,不同类型的数据来提供服务,SpringCloud的服务调用方式是基于 Rest ,如果其他语言需要直接注册到 Eureka 中的话,就需要自己实现一个Eureka 客户端程序,比如目前 Node.js 实现了一套 eureka-js-client 。如果其他语言需要写一个 Eureka 客户端程序,只需要调用Eureka对应的 Rest 接口即可。

GitHub:https://github.com/MrXuan3168/springCloud/tree/springCloud-3

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

推荐阅读更多精彩内容