为了账号安全,请及时绑定邮箱和手机立即绑定

SpringCloud微服务实战(三)-服务注册与发现

标签:
Spring Cloud

注册中心Eureka Server


5bd066ec0001b7a605000442.jpg

新建项目


使用@EnableEurekaServer

5bd066ef000122f905000224.jpg


就可以让应用变为Eureka服务器,这是因为spring boot封装了Eureka Server,让你可以嵌入到应用中直接使用
直接运行成功如下

5bd066f20001f94005000303.jpg


但是不断报异常,why?

5bd066f50001b88705000313.jpg


这是因为该应用虽然是 Server 端,但也同时是 Client 端,也需要一个注册中心将自己注册进去
为消除其异常,修改下配置
配置需要注册的地址,也就是往自己身上注册

5bd066f50001440205000057.jpg


通过观察源码,知道其实是一个 map, 所以配置如下

5bd066f80001c6cd05000313.jpg


启动仍旧报错,其实正常问题,因为服务端自己又是 Server, 又是 Client, 服务端未启动完成时,客户端肯定是无法找到服务端的
但是 eureka 的服务端/客户端采用心跳通信方式

5bd066fa0001aba905000303.jpg


可看到地址已随配置被改变


接下来配置实例名


5bd066fb0001bc9c05000313.jpg


5bd066fc0001739d05000303.jpg

实例名被修改成功


但是该应用本身就是个注册中心,不需要将其显示在注册实例中,通过以下配置



为防止冲突,将端口号回改为默认

5bd067c70001a1c105000313.jpg


5bd067c70001b38605000304.jpg

服务中心


为避免每次手动启动,将应用打成 war 包(jar)


5bd067c90001899c05000161.jpg


5bd067c90001faa905000015.jpg

通过 java 命令启动


启动成功效果


Mac 下 Ctrl+C 退出服务


5bd067ca0001103905000021.jpg

后台执行


5bd067cb0001bf9c05000034.jpg

查看其相关进程信息


如此该应用就方便了我们,不需要每次都去手动启动应用,在后台会重启,若想杀死进程直接 kill


3.3 Eureka Client的使用

默认情况下,DiscoveryClient的实现将使用远程发现服务器自动注册本地Spring Boot服务器。可以通过在@EnableDiscoveryClient中设置autoRegister=false来禁用此功能。

启动Server, 再启动 Client


5bd068200001fd5805000294.jpg

发现并没有注册成功实例


因为没有配置注册目标地址信息



之后再次重启,依旧无法注册成功,几经勘察,添加以下依赖后,成功运行,注册到服务器


再指定 client 名字



发现成功注册


此为 client 应用ip 地址

5bd068230001355605000046.jpg


但其实可以自定义

5bd0682300015f6b05000133.jpg


接着点击进入那个链接,URL如下

  • Eureka保证AP
    有时会发现如下红色警戒!


    5bd06c520001856510000045.jpg


    Eureka看明白了这一点,因此在设计时就优先保证可用性。我们可以容忍注册中心返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。
    如果Eureka服务节点在短时间里丢失了大量的心跳连接(注:可能发生了网络故障),那么这个 Eureka节点会进入“自我保护模式”,同时保留那些“心跳死亡”的服务注册信息不过期。此时,这个Eureka节点对于新的服务还能提供注册服务,对于“死亡”的仍然保留,以防还有客户端向其发起请求。当网络故障恢复后,这个Eureka节点会退出“自我保护模式”。Eureka的哲学是,同时保留“好数据”与“坏数据”总比丢掉任何数据要更好。
    在开发模式,最好关闭该模式(默认是开启的),仅能在开发环境关闭!,生产环境禁止关闭!!!


    5bd06c530001133710000254.jpg

3.4 Eureka的高可用

如果一台 eureka宕机了咋办呢,为了实现高可用,如果直接加一台服务器并无任何卵用,考虑将两台 eureka 互相注册


5bd06c540001a22310000308.jpg


复制得到两份 eureka,并以端口区分


5bd06c550001c0bf10000238.jpg


将 eureka1注册到 eureka2上并启动

5bd06c560001c39710000368.jpg


将 eureka2注册到 eureka1上并启动


5bd06c5600014c9f10000369.jpg


5bd06c570001a22010000602.jpg


5bd06c5800018c4810000603.jpg


发现 client 在1,2同时都注册成功了!
假如此时 eureka1宕机了,会发生什么呢?

5bd06c5a0001389d10000329.jpg


我们来将1给关闭

5bd06c5a0001770910000625.jpg


1000


1000


发现2依旧存活,并且 client 还在连接

若此时再 client 端重启又会发生什么呢?


1000


因为无法注册,自然报错了,E2上也没有 client 端再连接了


1000


那么问题来了,怎么才能保证 E1宕机后, client 仍能注册在 E2上呢?只要保持每次都同时往两个 E 注册

1000


同理可得,当有3个 E 时,如此相互注册


1000


1000


1000


新建 E3

1000


1000


1000


对于我们的开发环境,部署一个 E 即可,不再集群

3.5 Eureka总结

1000

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

1000


1000


A 类比青楼中的嫖客, B 类比青楼女子,注册中心呢就相当于青楼中的妈咪
一般 嫖客服务一来,就肯定直接点名春花还是秋月呀,直接问妈咪要花魁就行


1000


1000



作者:芥末无疆sss
链接:https://www.jianshu.com/p/b28e6157cf9b
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。




点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消