Spring-cloud微服务实战【三】:eureka注册中心(中)
回忆一下,在上一篇文章中,我们创建了两个springboot项目,并且在consumer项目中通过restTemplate进行HTTP通信,成功访问到了producer提供的接口,思考一下这样的实现方式有什么问题?
1.consumer必须知道producer的IP,才能调用对方的HTTP接口,并且在consumer代码中使用硬编码的方式来访问producer的HTTP接口,代码耦合度高,实现方式不优雅.也许有童鞋会说,我们可以在application.properties配置文件进行配置,那么请看第二个问题.
2.一般来说,生产环境的producer是一个集群,有多个IP,那我consumer该怎么写请求地址?并且假如producer集群的IP变了,consumer应用需要修改配置,重新打包上线.这对于一个高并发访问的生产项目来说是不可接受的.因此,consumer应用需要一种机制,可以在访问producer的时候不需要关心producer的IP,并且该机制还应该提供类似于观察者模式的通知机制,在producer的IP进行变更的时候,及时通consumer,并且还能提供类似Nginx的负载均衡的功能,这就是eureka注册中心的作用.
什么是eureka注册中心?
eureka是netflix公司开发的一款用于服务发现的框架,spring-cloud将其集成到spring-cloud-netflix子项目中,包括我们后续会使用的负载均衡ribbon,服务熔断与降级Hystrix等等都是netflix公司开发的.可以看出,springcloud其实整合了许多优秀公司的框架.
我们通过一张图来说明一下eureka工作机制:

假如我们现在有许多的微服务作为服务提供方,每个微服务是一个集群,他们将自己的集群节点的IP与端口号注册到eureka中心,当有消费者需要消费服务的时候,即可从注册中心拉取所有的服务提供方列表,选择需要消费的服务,此时,eureka会根据负载算法将消费者需要的服务的IP与端口号返回给消费者,此时,消费者就可以根据IP和端口号去消费对应的服务了.此外,eureka还必须接收注册服务的心跳,确保注册的服务可用.并且从图中我们可以得知:

代码实战
接下来,我们改造上一篇文章中已有的代码,使用eureka进行服务治理,producer注册自身到eureka,consumer从eureka获取producer的信息并调用.
首先,我们要新建一个子模块,用于充当eureka-server的角色:




将本模块加入父项目中:

然后新增pom.xml中的配置:

修改配置文件:

然后在启动类加上@EnableEurekaServer:

然后启动试一试,此时控制台会有错误信息:

我们暂时先不管这些错误信息,先访问一下,看看是否能访问:

可以看到,eureka是能正常访问的,接下来,我们修改producer的代码,将producer注册到eureka-server中.
首先修改pom.xml:

然后修改配置文件:

最后在启动类加上@EnableEurekaClient:

此时,我们再启动producer项目,然后访问eureka-server,看看是否producer已经注册成功:

此时我们再访问该页面,我们需要关注的主要是笔者使用红框标识的3条信息,其中第一条我们暂时先不管(第一次访问页面不会出现,但过一会儿刷新就可以看到),待会儿我们再倒回来说,第二条,表示我们的producer应用已经注册到eureka-server,但应用名未设置,所以目
前显示的是UNKNOWN,因此需要我们设置应用名.第三条状态为UP(1),表示该服务正常启动,且地址是: DongHP:7001,点击访问试一试:

可以看到,访问的域名是donghp(我的电脑名是DongHP):7001,后面跟的是actuator/info,并且页面报错,报错信息提示我们没有该页面(404),因此我们需要添加spring-actuator,该模块是spring进行健康检查的模块,我们先分别解决第二和第三个问题:先修改配置文件,新增应用名:dhp-micro-service-producer

接下来为了让我们看到真实的IP地址,而不是 donghp:7001 ,我们再加上显示真实IP的配置:

最后,再添加spring-actuator健康检查的依赖:

再重启producer,并刷新eureka-server页面:

可以看到,修改后的producer已经成功注册到eureka-server中了,但是我们会发现,之前注册的服务还在,并没有消失,这是什么原因呢?是缓存吗?并不是,我们可以试一试,过一会儿再刷新,仍然还是有,这并不是缓存,还记得我们之前所说的第一条:

提示信息吗?这是eureka提示我们触发了eureka的自我保护机制.
所谓eureka自我保护机制,就是当服务未按时进行心跳续约时(之前我们在介绍eureka的时候说了,服务如果注册到eureka后,会定时向eureka发送心跳),Eureka会统计服务实例最近15分钟心跳续约的比例是否低于了85%(eureka.server.renewal-percent-threshold默认情况下=0.85)。当server在15分钟内,比值低于percent,即少了15%的微服务心跳,server会进入自我保护状态,Self-Preservation。在此状态下,server不会删除任何注册信息,这就有可能导致在调用微服务时,实际上服务并不存在。由此我们可以分析出eureka自我保护机制的缺点:有可能保留确实已经不可用的微服务,但是相比之下,它的优点是能最大化保存所有的微服务,因为在生产环境下,网络问题导致的心跳丢失太常见了,我们不能简单以是否收到心跳来判断一个微服务是否不可用,因此建议生产环境开启自我保护机制,开发时的测试环境可以关闭.
因此上图中出现的问题就能够解释了,首先我们已经关闭了之前的UNKNOWN的微服务,重新修改配置启动了新的DHP-MICRO-SERVICE-PRODUCER,此时eureka服务器并没有重启,UNKNOWN的微服务不再向eureka发送心跳(默认30秒发送一次心跳),因此eureka的心跳比例只有50%,低于85%,页面弹出eureka触发自我保护机制的提示,并且eureka进入自我保护状态,不会删除任何微服务.因此不管我们如何刷新页面,UNKNOWN的微服务始终都在,如果需要禁用eureka的自我保护状态,可以使用配置:eureka.server.enable-self-preservation=false(默认是开启的).

此时先启动eureka-server,再还原producer的配置启动,再修改producer的配置启动:

上图中①提示我们目前关闭了自我保护模式,②说明目前有两个已注册的微服务,但是UNKNOWN已经下线了,因此我们过一分钟刷新:

此时就只有一个了,我们再访问一下:

得出两个信息:
1.我们的ip是192.168.1.105,去验证一下:

2.我们没有配置健康检查的信息,因此我们在producer中配置相关信息:


到此,我们的eureka-server已经成功启动,并且producer也注册到eureka了,一切看似很完美了,但大家是否记得之前我们说eureka-server启动的时候会报错的问题呢?

这是因为eureka-server配置还不完整,我们还需要添加配置:

然后再启动eureka-server和producer:

可以看到,producer服务已经成功注册到eureka中了,并且eureka-server也没有报错信息了.
此时我们再通过consumer项目验证一下.修改consumer项目代码:
首先consumer也需要添加eureka-client的依赖:

其次配置eureka相关信息:

然后在启动类加上注解:

最后修改代码:

可以发现,这里以前是直接使用ip:port,现在通过eureka发现服务,就对应于我们之前所说的不再关心对方服务的ip和端口,并且对方服务地址变化也不会再对我们的代码造成任何影响了,代码的优雅性和可维护性大大提升!
由于这种方式走eureka服务发现,因此还需要加上@LoadBalanced注解:

最后测试一下:

访问成功!自此,我们成功使用了eureka注册中心来解决文章一开始抛出的两个问题,那是不是这样就完美了?是否还有值得继续优化的地方?敬请期待下一篇文章.
本文由博客一文多发平台 OpenWrite 发布!
Spring-cloud微服务实战【三】:eureka注册中心(中)的更多相关文章
- Spring Cloud 微服务实战——nacos 服务注册中心搭建(附源码)
作为微服务的基础功能之一的注册中心担任重要的角色.微服务将单体的服务拆分成不同的模块下的服务,而不同的模块的服务如果进行通信调用呢?这就需要服务注册与发现.本文将使用阿里开源项目 nacos 搭建服务 ...
- Spring Cloud微服务实战阅读笔记(一) 基础知识
本文系<Spring Cloud微服务实战>作者:翟永超,一书的阅读笔记. 一:基础知识 1:什么是微服务架构 是一种架构设计风格,主旨是将一个原本独立的系统拆分成多个小型服务 ...
- Spring Cloud 微服务实战笔记
Spring Cloud 微服务实战笔记 微服务知识 传统开发所有业务逻辑都在一个应用中, 开发,测试,部署随着需求增加会不断为单个项目增加不同业务模块:前端展现也不局限于html视图模板的形式,后端 ...
- spring cloud微服务实战教程/pdf/视频/百度云资源
资源站:http://www.supan.vip 点击进入直接查找资源: http://www.supan.vip/spring%20cloud微服务实战 <Spring Cloud微服务实战& ...
- Spring cloud微服务实战——基于OAUTH2.0统一认证授权的微服务基础架构
https://blog.csdn.net/w1054993544/article/details/78932614
- SpringCloud Alibaba微服务实战三 - 服务调用
导读:通过前面两篇文章我们准备好了微服务的基础环境并让accout-service 和 product-service对外提供了增删改查的能力,本篇我们的内容是让order-service作为消费者远 ...
- 微服务实战(三):落地微服务架构到直销系统(构建基于RabbitMq的消息总线)
从前面文章可以看出,消息总线是EDA(事件驱动架构)与微服务架构的核心部件,没有消息总线,就无法很好的实现微服务之间的解耦与通讯.通常我们可以利用现有成熟的消息代理产品或云平台提供的消息服务来构建自己 ...
- Spring Cloud(一):服务注册中心Eureka
Spring Cloud 基于 Netflix 的几个开源项目进行了封装,提供包括服务注册与发现(Eureka),智能路由(Zuul),熔断器(Hystrix),客户端负载均衡(Ribbon)等在内的 ...
- Spring Cloud 微服务一:Consul注册中心
Consul介绍 Consul is a service mesh solution providing a full featured control plane with service disc ...
- Spring Cloud Alibaba 使用Nacos作为服务注册中心
为什么需要注册中心? 在分布式架构中,服务会注册到这里,当服务需要调用其它服务时,就到这里找到服务的地址,进行调用:服务管理,核心是有个服务注册表,心跳机制动态维护 : 服务注册 创建普通Spring ...
随机推荐
- (二)C#编程基础复习——变量和常量
今天要复习一下C#基础中的变量和常量,所谓变量,就是用来存储特定类型的数据,分为值类型和引类型,可以根据需要随时改变变量中所村存储的数据值,变量必须先声明,然后才能赋值:常量就是固定不变的值,常量的变 ...
- HDU 2871"Memory Control"(线段树区间和并+set.lower_bound)
传送门 •题意 有 n 个内存单元(编号从1开始): 给出 4 种操作: (1)Reset :表示把所有的内存清空,然后输出 "Reset Now". (2)New x :表示申请 ...
- vue v-for循环使用
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Js 时间戳显示和计算时间间隔
显示时间戳 很多地方会让页面显示当前时间并实时计时功能,例:2019年5月23号 10:28::34 代码实现如下: getTime(){ var mydate = new Date(); var y ...
- Linux 内核Ksets 对象
很多情况, 一个 kset 看来象一个 kobj_type 结构的扩展; 一个 kset 是一个嵌入到相 同类型结构的 kobject 的集合. 但是, 虽然 struct kobj_type 关注的 ...
- 2019前端学习路线心得-黑马程序员pink老师
在规划之前先给大家分享几点心得哈: 1. 学习,特别是在线学习,是非常辛苦的事情,为了少走弯路, 所以一定要系统学习,多借鉴与前辈们总结出来的经验. 2. 不要相信任何说 一周掌握 css, 一周学完 ...
- Visual Studio插件【一】:前端
JQuery Code Snippets https://github.com/kspearrin/Visual-Studio-jQuery-Code-Snippets 简单用法 jq +tab ...
- PHP每日复习任务与复习记录
[2019-10-10 16:05:00] PHP7之Trait详解 https://blog.csdn.net/qq_35255775/article/details/80610586 PHP中的魔 ...
- Excel数据处理
合并计算: 数据面板下的合并计算 然后设置好合并计算的区域 以及勾选 首行跟最左列
- TCP/IP||Traceroute
1.概述 由Van jacobson编写的工具,用于探索tcp/ip协议,使用ICMP报文和首部TTL字段,TTL字段由发送端设置一个8bit字段,初始值为RFC指定,当前值为64, 每个处理数据的路 ...