目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

标签: Microservices (15)

Bus

Bus 简介  Spring Cloud Bus(消息总线)通过一个轻量级的消息中间件可以连接分布式系统中的各个节点。可以使用该总线来广播某些状态的改变(比如配置信息发生变更)或其他管理指令,以下是 Bus 适用的场景: 一个事件,需要广播或者单独传递给某个接口。 配置更新了,但是其他系统不知道是否更新。  SpringCloud 默认使用 RabbitMQ 作为消息队列组件。 分布式配置中心 Config 结合 Bus 部署 MQ 服务 这里基于 Docker 部署 RabbitMQ docker pull rabbitmq:management #拉取镜像 docker run -d --hostname rabbit-host --name="myrabbitmq" -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 5672:5672 -p 15672:15672 rabbitmq:3-management 访问控制台 http://192.168.31.210:15672/ config-c....

Config

配置中心的由来  分布式系统中往往部署在 N 服务器上,逐一管理维护成本很高,所以配置中心应运而生。配置中心被用作集中管理不同环境(Dev、Test、Stage、Prod)和不同集群配置,以及在修改配置后将实时动态推送到应用上进行刷新。 #配置中心应具备的功能 OpenAPI 业务无关性 配置生效监控 一致性 K-V 存储 统一配置实时推送 配合灰度与更新 配置全局恢复、备份与历史 高可用集群 Spring Cloud Config  Spring Cloud Config 是一个集中化外部配置的分布式系统,由服务端和客户端组成。它不依赖于注册中心,是一个独立的配置中心。 支持多种存储配置信息的形式:JDBC、Vault、Native、SVN、Git。 Git 版工作原理 客户端启动时候向 ConfigServer 发起请求 ConfigServer 接收服务端请求后,根据配置的仓库地址,将 Git 上的文件克隆到本地的一个临时目录中(此目录是一个 Git 的本地仓库目录)。 然后 ConfigServer 再读取本地文件返回给客户端(优点:Git 服务器网络故障,依然可以使....

Sleuth

全链路监控  微服务架构下,服务按照不同的维度进行拆分,一次请求可能会涉及多个服务,并且可能由不同的团队开发,使用不同的编程语言,可能部署在几千个节点上,横跨多个不同的数据中心。因此,就需要一些可以帮助理解系统行为、用于分析性能问题的工具,以便发生故障的时候,能够快速定位和解决问题。  APM(Application Performance Management),其中最出名的是谷歌公开的论文提到的 Dapper。Dapper 论文中对实现一个分布式跟踪系统提出了如下需求: 性能低损耗:分布式跟踪系统对服务的性能损耗应该尽可能做到可以忽略不计,尤其是对性能敏感的应用不能产生损耗。 对应用透明:即要求尽可能用非侵入的方式来实现跟踪,尽可能做到业务代码的低侵入,对业务开发人员应该做到透明化。 可伸缩性:是指不能随着微服务和集群规模的扩大而使分布式跟踪系统瘫痪。 跟踪数据可视化和迅速反馈:即要有可视化的监控界面,从跟踪数据收集、处理到结果的展现尽量做到快速,这样就可以对系统的异常状况作出快速反应。 持续监控:即要求分布式跟踪系统必须是 7 *24 小时工作的,佛足额将难以定位到系统偶尔抖动....

Zuul

诞生背景  微服务架构将后端拆解成许多个单独的应用:看似清晰的服务拆分,实则杂乱无章,完成一个业务逻辑,需要到不同主机和不同端口上面调取接口。于是一个面向服务治理、服务编排的㢟出现了——微服务网关。  Zuul 是从设备和网站到后端应用程序所有请求的前门,为内部服务提供可配置的对外 URL 到服务的映射关系,基于 JVM 的后端路由器,其具备以下功能: 统一接入:智能路由、AB 测试、灰度测试、负载均衡、容灾处理、日志埋点 流量监控:限流处理、服务降级 安全防护:鉴权处理、监控、机器网络隔离  虽然 Zuul2.x 采用 Netty 有较大的性能提升,单改动较大,考虑到稳定性 Spring Cloud Finchley 继续沿用 Netflix Zuul 1.x 版本,另外由于 Spring Cloud Gateway 已经孵化成功,相较于 Zuul 在功能以及性能上都有明显提升,Pivotal 公司正在走一条“去 Netflix 化”的路线。 主流开源网关概览 入门案例 Maven 依赖 <dependency> <groupId>org.spring....

Hystrix

服务可用性  复杂分布式体系结构中的服务具有多个依赖关系,每个依赖关系在某些时候都将不可避免地失败。如果主服务未能与这些外部故障隔离,则他们可能会收。  例如,对于依赖于 30 个服务的服务 A,其中每个服务的正常运行时间为 99.99%,服务 A 的最终可用性如下: 99.99^30 = 99.7%正常运行时间 十亿次请求中的 0.3%= 3,000,000 请求失败次数 每月平均 2 小时的服务宕机时间,即使所有依赖项都具有出色 99.99%的正常运行时间。  现实情况通常更糟。即使所有依赖项都表现良好,如果您没有为整个系统设计弹性,那么即使 0.01%停机时间对数十种服务中的每项服务的总体影响也相当于每月停机时间可能达到数小时。 分布式体系结构中服务之间的依赖问题 由业务原因在某一时刻,某服务并发请求骤增,导致该服务的延迟,响应过慢。 复杂分布式体系结构中的应用程序之间往往存在多层级联赖的关系,当 Provider 服务在某一时刻出现故障,如果 Consumer 服务如果没有与这些故障服务隔离,会导致 Consumer 服务也会出现请求堆积、资源占用、宕机不可....

Feign

简介 v.假装,人如其名,是一个伪 RPC 客户端,是一种声明式、模板化的 HTTP 客户端。在 Spring Cloud 中使用 Feign,可以做到使用 HTTP 请求访问远程服务,就像调用本地方法一样,开发者完全感知不到这是在调用远程方法,更感知不到在访问 HTTP 请求,Feign 的具体特性如下: 可插拔的注解支持,包括 Feign 注解和 JAX-RS 注解。 支持可插拔的 HTTP 编码器和解码器 支持 Hystrix 和 Hystrix 的 Fallback 机制。 支持 Ribbon 的负载均衡。 支持 HTTP 请求和响应的压缩。 Feign 是一个声明式的 Web Service 客户端,它的目的就是让 Web Service 调用更加简单。它整合了 Ribbon 和 Hystrix,避免了开发者需要针对 Feign 进行二次的整合。Feign 提供了 HTTP 请求模版,通过编写简单的接口和注解,就可以定义好 HTTP 请求的参数、格式、地址等信息,Feign 会完全代理 HTTP 的请求,在使用过程开发者只需要依赖注入 Bean,然后调用对应的方法并传递参数....

Eureka

服务发现的由来 单体架构时代  服务自成一体,对于依赖的少数外部服务采用配置域名的方式访问。 SOA 架构时代  单体架构拆分为较粗粒度的服务化架构,依赖内部服务较多,内部服务间相互调用较多,以基于 HTTP 形式暴露服务为例,B 服务需要调用 A 服务: B 服务自己维护 A 服务的所有实例 IP,耦合度高。 A 服务自己恢复其所有实例的 IP,暴露统一的内网域名供调用者消费,解耦合。 微服务架构时代  底层运维方式发生了巨大的变化,随着 Docker 的流行,业务服务不再部署在固定的虚拟机上,其 ip 地址也不再固定,此时前面的解决方式就显得捉襟见肘,以 Nginx 为例: 在没有引入注册中心时候,需要手工或者通过脚本的方式,在部署的时候去更新 Nginx 的配置文件,然后 reload,或者是使用 ngx_http_dyups_module 通过 rest API 来在运行时直接更新 upstream 而不需要 reload. 将注册中心作为一个标配的分布式服务组件,网关等中间件服务都可以从注册中心获取相关的实例信息,实现动态路由。比如 consul-template + ....