文章目录
微服务架构的常见概念
服务治理
服务注册:服务实例将自身服务信息注册到注册中心
服务发现:服务实例通过注册中心,获取到注册到其中的服务实例的信息,通过这些信息去请求它们提供的服务。
服务剔除:服务注册中心将出问题的服务自动剔除到可用列表之外,使其不会被调用到。
服务调用
基于
HTTP的RESTful
RPC(Remote Promote Call)
比较项 | RESTful | RPC |
---|---|---|
通讯协议 | HTTP | 一般使用TCP |
性能 | 略低 | 较高 |
灵活度 | 高 | 低 |
应用 | 微服务架构 | SOA架构 |
服务网关
将所有API调用统一接入到API网关层,由网关层统一接入和输出。
基本功能有:统一接入、安全防护、协议适配、流量管控、长短链接支持、容错能力。
服务容错
不被外界环境影响
不被上游请求压垮
不被下游响应拖垮
链路追踪
对一次请求涉及的多个服务链路进行日志记录,性能监控
SpringCloud
Spring Cloud是一系列框架的集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。
Spring Cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理
- 服务注册发现:Eureka、Zookeeper、Consul、Nacos
组件名称 | 所属公司 | 组件简介 |
---|---|---|
Eureka | Netflix | springcloud最早的注册中心,目前已经进入停更进维 了 |
Zookeeper | Apache | zookeeper是一个分布式协调工具,可以实现注册中心功能 |
Consul | Hashicorp | Consul 简化了分布式环境中的服务的注册和发现流程,通过 HTTP 或者 DNS 接口发现。支持外部 SaaS 提供者等。 |
Nacos | Alibaba | Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 |
- 断路器:Hystrix Sentinel
- 网关:Zuul2,Spring Cloud Gateway
- 配置中心:Spring Cloud Config
- 监控:Spring Boot Admin,Spring Boot Actuator
- 链路跟踪:Spring Cloud Sleuth
负载均衡概述
负载均衡是分布式架构的重点,负载均衡机制决定着整个服务集群的性能与稳定。
负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡、分摊到多个操作单元上进行运行。
负载均衡解决的是将一个客户端的流量以某种符合最大化资源利用率的方式均摊到服务端所提供的所有实例上的问题。在这个问题的场景中,后端服务的实例是通过水平扩展的方式来提供高可用的。
负载均衡分类
服务器负载均衡:由服务端来决定调用哪个节点,可通过硬件设备或软件来实现,硬件比如:F5、Array等,软件比如:LVS、Nginx等
客户端负载均衡
客户端实际上是指服务调用者。在 SpringCloud 中调用者本身集成负载均衡,由调用者决定来调用哪个节点的服务,这就是客户端负载均衡。
SpringCloud Load Balance是基于客户端的负载均衡工具,它可以将面向服务的 REST 模板请求自动转换成客户端负载均衡的服务调用。
Gateway
内置了 10 种 Router,使得我们可以直接配置一下就可以随心所欲的根据 Header、或者 Path、或者 Host、或者 Query 来做路由。
区分了一般的 Filter 和全局 Filter,内置了 20 种 Filter 和 9 种全局 Filter,也都可以直接用。当然自定义 Filter 也非常方便
注册中心:Spring Cloud Alibaba Nacos Discovery
基于 Spring Cloud 的编程模型,接入 Nacos 作为注册中心,实现服务的注册与发现。
Nacos Discovery 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。
除此之外,Nacos Discovery 也将服务实例自身的一些元数据信息-例如 host,port, 健康检查URL,主页等内容注册到 Nacos。
使用注册中心时,一共有三种角色:服务提供者(Service Provider)、服务消费者(Service Consumer)、注册中心(Registry)。
在一些文章中,服务提供者被称为 Server,服务消费者被称为 Client。
① Provider:
启动时,向 Registry 注册自己为一个服务(Service)的实例(Instance)。
同时,定期向 Registry 发送心跳,告诉自己还存活。
关闭时,向 Registry 取消注册。
② Consumer:
启动时,向 Registry 订阅使用到的服务,并缓存服务的实例列表在内存中。
后续,Consumer 向对应服务的 Provider 发起调用时,从内存中的该服务的实例列表选择一个,进行远程调用。
关闭时,向 Registry 取消订阅。
③ Registry:
Provider 超过一定时间未心跳时,从服务的实例列表移除。
服务的实例列表发生变化(新增或者移除)时,通知订阅该服务的 Consumer,从而让 Consumer 能够刷新本地缓存。
使用命令行参数进行 --spring.profiles.active 配置项,实现不同环境,读取不同配置文件
配置Namespace来区分不同的注册中心环境。
通过 Nacos 的 Namespace 实现不同环境下的服务隔离。在开源版本 Nacos 权限完善之后,每个 Namespace 提供不同的 AccessKey、SecretKey,保证只有知道账号密码的服务,才能连到对应的 Namespace,进一步提升安全性。
监控端点
http://127.0.0.1:28080/actuator/nacos-discovery
Spring Boot 监控端点 Actuator
应用的管理与监控
访问 http://127.0.0.1:8080/actuator/beans 地址,获得应用的所有 Spring Bean 信息
项目统一依赖管理 BOM
一个pom文件,定义项目模块中所需要依赖的第三方组件和公共模块
Nacos 中提供了两种健康检查机制:
Nacos 中提供了两种健康检查机制:临时实例的客户端主动上报机制和永久实例的服务端反向探测机制。临时实例每隔 5s 发送一个心跳包给 Nacos 服务器端,服务器端接收到心跳包之后再将健康状况同步给其他注册中心。永久实例支持 3 种探测协议,TCP、HTTP 和 MySQL,默认探测协议为 TCP,也就是通过不断 ping 的方式来判断实例是否健康。
-
客户端主动上报机制。
每隔 5 秒会主动上报一次自己的健康状况,发送的数据包叫做心跳包,发送心跳包的机制叫做心跳机制。如果心跳包的间隔时间超过了 15 秒,那么 Nacos 服务器端就会将此服务实例标记为非健康实例,如果心跳包超过了 30s 秒,那么 Nacos 服务器端将会把此服务实例从服务列表中删除掉。 -
服务器端反向探测机制。
-
反向探测的方式实现健康检查的,它的探测周期是 2000 毫秒 + 随机数(5000 毫秒以内),如果检测异常会将此服务实例,标记为非健康实例,但不会把服务实例向临时实例那样进行删除。Nacos 服务器反向探测目前内置了 3 种探测协议:HTTP 探测、TCP 探测和 MySQL 探测。⼀般而言 HTTP 和 TCP 探测已经可以涵盖绝大多数的健康检查场景,MySQL 主要用于特殊的业务场景,例如数据库的主备需要通过服务名对外提供访问,需要确定当前访问数据库是否为主库时,那么我们此时的健康检查接口,是⼀个检查数据库是否为主库的 MySQL 命令。
-
集群下的健康检查机制可以用一句话来概括,那就是“各司其职”。每个服务对应了一个主注册中心,当注册中心接收到临时实例的心跳包之后,将健康状态同步给其他注册中心。而永久实例也是类似的,每个服务对应了一个主注册中心,当负责的注册中心探测到服务实例的健康状态发生改变时,再会将实例的健康状况同步到其他注册中心,从而实现了集群下的健康检查机制。