为什么80%的码农都做不了架构师?>>>   

第2节( 跟我学Spring Cloud(Finchley版)-02-构建分布式应用 )说过:

地址硬编码问题——电影微服务中将用户微服务的地址写死,如果用户微服务地址发生变化,难道要重新上线电影微服务吗?

本节来解决该问题。

不妨先思考一下,怎样才能让服务消费者总能找到服务提供者呢?或者说,怎样才能让服务消费者感知到服务提供者地址的变化呢?

TIPS

目前市面上把服务消费者找到服务提供者的这种机制称为服务发现,又或者服务注册。下面来探索服务发现究竟是怎么回事。

服务发现原理初探

其实,服务发现机制非常简单,不妨用大家熟悉的MySQL来类比——只需一张表(图中的registry表)即可实现服务发现!

如图,如果我们能在:

  • 应用启动时,自动往registry表中插入一条数据,数据包括服务名称、IP、端口等信息。
  • 应用停止时,自动把自己在registry表中的数据的status设为DOWN

这样,服务消费者不就永远都能找到服务提供者了嘛!当服务消费者想调用服务提供者接口时,只需向数据库发送SQL语句 SELECT * FROM registry where service_name = 'user' and status = 'UP' 即可找到服务提供者的所有实例!IP、端口啥的都有了,自己拼接一下,再去调用就行了!

TIPS

看,服务发现机制是不是很简单?程序猿给图中的”MySQL“的组件起了一个牛叉的名字叫:”注册中心“,也有的书将其称为”服务发现组件“。

但,这毕竟只是一个最简陋的服务发现原理。完整的服务发现要考虑的问题有很多,例如:

  • 当服务抑或所在主机突然崩溃或者进入某种不正常的情况无法提供服务(例如应用的数据库挂了)时,对应的数据理应标记DOWN,或者索性删除;
  • 如果每次调用之前,都得向服务发现组件发送类似SELECT * FROM registry where service_name = 'user' and status = 'UP' 的语句,那么服务发现组件的压力得有多大?更重要的,这与当下流行的去中心化设计的思想相悖;
  • 服务发现组件即使挂掉,也不应该影响微服务之间的调用。

那么,一个完善的服务发现组件应该具备哪些能力呢?

服务发现原理深入

不妨来看一下使用服务发现组件后的架构图,如图所示。

服务提供者、服务消费者、服务发现组件这三者之间的关系大致如下:

  • 各个微服务在启动时,将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息;
  • 服务消费者可从服务发现组件查询服务提供者的网络地址,并使用该地址调用服务提供者的接口;
  • 各个微服务与服务发现组件使用一定机制(例如心跳)通信。服务发现组件如长时间无法与某微服务实例通信,就会自动注销(即:删除)该实例;
  • 当微服务网络地址发生变更(例如实例增减或者IP端口发生变化等)时,会重新注册到服务发现组件;
  • 客户端缓存:各个微服务将需要调用服务的地址缓存在本地,并使用一定机制更新(例如定时任务更新、事件推送更新等)。这样既能降低服务发现组件的压力,同时,即使服务发现组件出问题,也不会影响到服务之间的调用。

综上,服务发现组件应具备以下功能。

  • 服务注册表:服务注册表是服务发现组件的核心(其实就是类似于上面的registry表),它用来记录各个微服务的信息,例如微服务的名称、IP、端口等。服务注册表提供查询API和管理API,查询API用于查询可用的微服务实例,管理API用于服务的注册和注销;
  • 服务注册与服务发现:服务注册是指微服务在启动时,将自己的信息注册到服务发现组件上的过程。服务发现是指查询可用微服务列表及其网络地址的机制;
  • 服务检查:服务发现组件使用一定机制定时检测已注册的服务,如发现某实例长时间无法访问,就会从服务注册表中移除该实例。

综上,使用服务发现的好处是显而易见的。Spring Cloud为我们提供多种服务发现组件的支持,例如Eureka、Consul(spring-cloud-consul)、Zookeeper(spring-cloud-zookeeper)、Aliaba Nacos(孵化中:spring-cloud-alibaba)、Etcd(孵化中:spring-cloud-etcd)等。下一节,本教程将以Eureka为例,为大家详细讲解Spring Cloud中的服务注册与服务发现;基于Consul以及Nacos的服务发现,则会以番外形式出现。

拓展阅读

  • spring-cloud-consul:https://github.com/spring-cloud/spring-cloud-consul
  • spring-cloud-zookeeper:https://github.com/spring-cloud/spring-cloud-zookeeper
  • spring-cloud-alibaba:https://github.com/spring-cloud-incubator/spring-cloud-alibaba
  • spring-cloud-etcd:https://github.com/spring-cloud-incubator/spring-cloud-etcd

本文首发

http://www.itmuch.com/spring-cloud/finchley-4/

干货分享

转载于:https://my.oschina.net/eacdy/blog/2996239

跟我学Spring Cloud(Finchley版)-04-服务注册与服务发现-原理剖析相关推荐

  1. Spring Cloud Finchley版中Consul多实例注册的问题处理

    由于Spring Cloud对Etcd的支持一直没能从孵化器中出来,所以目前来说大多用户还在使用Eureka和Consul,之前又因为Eureka 2.0不在开源的消息,外加一些博眼球的标题党媒体使得 ...

  2. hystrix 全局熔断_跟我学Spring Cloud(Finchley版)14Feign使用Hystrix

    Feign默认已经整合了Hystrix,本节详细探讨Feign使用Hystrix的具体细节. 服务降级 1 加配置,默认Feign是不启用Hystrix的,需要添加如下配置启用Hystrix,这样所有 ...

  3. Spring Cloud Eureka(一)搭建一个注册中心

    Spring Cloud Eureka(一)搭建一个注册中心 服务治理 名词解释 spring cloud eureka:spring cloud eureka 使用Netflix Eureka来服务 ...

  4. 跟我学Spring Cloud(Finchley版)-10-Feign深入

    上一节( 跟我学Spring Cloud(Finchley版)-09-Feign )讲了Feign的入门姿势并深入对比了RestTemplate,本节来深入探讨Feign的高级特性.总的来说,Feig ...

  5. 跟我学Spring Cloud(Finchley版)-07-Ribbon入门

    经过前文讲述,我们已经实现了服务发现.本节来解决 跟我学Spring Cloud(Finchley版)-02-构建分布式应用 提到的如下问题: 负载均衡如何考虑?难道得在电影微服务和用户微服务之间加个 ...

  6. 告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目(实际项目开发的浓缩精华版)

    告诉老默我想学Spring Cloud了(新手篇):从0到1搭建Spring Cloud项目 一.前言 二.如何选择版本 2.1 SpringCloud 和 Spring Boot 版本选型 2.1. ...

  7. 一起来学Spring Cloud | 第五章:熔断器 ( Hystrix)

    在微服务项目中,一个系统可以分割成很多个不同的服务模块,不同模块之间我们通常需要进行相互调用.springcloud中可以使用RestTemplate+Ribbon和Feign来调用(工作中基本都是使 ...

  8. Spring Cloud Finchley OpenFeign的重试配置相关的坑

    如题,本文基于Spring Cloud Finchley.SR2 OpenFeign的重试 OpenFeign配置重试后,逻辑分析 对比Daltson和Finchley的基本组件,发现Ribbon还有 ...

  9. Spring Cloud Alibaba基础教程:几种服务消费方式(RestTemplate、WebClient、Feign)

    热门:Spring Cloud Greenwich.RELEASE 正式发布!一个非常有看头的版本! 通过<Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现&g ...

最新文章

  1. [MAC] Mac OS X下快速复制文件路径的方法
  2. 【数据结构与算法】之深入解析“学生出勤记录II”的求解思路与算法示例
  3. linux ssh 时间设置,Linux下设置SSH Server设置时间链接限制(示例代码)
  4. linux kernel 调度,在Linux中,实时调度_kernel_开发99编程知识库
  5. java正则表达式 ppt_Java正则表达式演示
  6. mysql c 调用存储过程返回值_Mysql:使用返回值调用存储过程
  7. 51 SD配置-定价配置-维护定价过程
  8. SQL Server Report Server 报表用户权限T-SQL查询
  9. 【前端】CKeditor屏蔽“浏览服务器”功能
  10. c语言图书管理系统简单代码,C语言图书管理系统代码
  11. 小米上市之后的危与机
  12. Pycharm-SSH连接服务器
  13. 【电子电路】USB串口驱动下载
  14. 移动端产品设计(02)-移动APP产品结构
  15. DNS解析与CDN加速
  16. 想开咖啡店要怎么入手?
  17. 串口发送+RAM+VGA传图
  18. 勃林格殷格翰战略入股新瑞鹏,进一步拓展中国宠物市场
  19. 用计算机打生僻字的歌,学子写抖音最火《生僻字》歌,70多个生僻字,懵了~
  20. Pid控制算法-专家PID与模糊PID的C++实现

热门文章

  1. systemtap原理及使用
  2. 标准的的Flash插入
  3. 第四点没有重定义吧,第一个i的作用域就是那个循环,它出了这个域就被释放了。...
  4. python时间str转datetime_深入了解Python中的小知识
  5. python结构_Python 项目的结构
  6. 内大计算机学院研究生奖学金,通知 | 【研究生评奖评优】关于做好浙江大学2017-2018学年计算机学院研究生学年小结及评奖评优工作的通知...
  7. 提升UI设计界面高级感的小技巧
  8. 在大厂工作5年的大神,给前端初学者的四大建议,收藏咯
  9. 2021年JavaScript的发展前景如何呢?
  10. F - 上升子序列-超详细注释版