1.微服务解决的问题
1、如何发现新节点以及检查各节点的运行状态?
2、如何发现服务及负载均衡如何实现?
3、服务间如何进行消息通信?
4、如何对使用者暴露服务API?
5、如何集中管理各节点配置文件?
6、如何收集各节点日志并统一管理?
7、如何直观的了解各节点间的调用链路?
8、如何对系统进行链路保护,避免服务雪崩?
2.微服务架构包含哪些组件
1.注册中心(Service Registry)
Eruka、nacos解决(如何发现新节点以及检查各节点的运行状态)的问题
2.负载均衡(Load Balance)
服务端负载均衡:如 Nginx、HAProxy、Consul、Envoy、Istio、Traefik
客户端负载均衡:如 Ribbon、Spring Cloud Load Balancer
解决(服务及负载均衡如何实现)的问题
3.服务通信(Communication)
服务通信组件解决了问题3(服务间如何进行消息通信)。
服务间通信采用轻量级协议,通常是HTTP RESTful风格。但因为RESTful风格过于灵活,必须加以约束,通常应用时对其封装。
在SpringCloud中就提供了OpenFeign(http请求调用的轻量级框架,它集成了 Ribbon 以实现负载均衡,并且与 Eureka、Consul 等服务发现组件无缝对接)和RestTemplate两种技术屏蔽底层的实现细节,所有开发者都是基于封装后统一的SDK进行开发,有利于团队间的相互合作。
@FeignClient("providerNacos")
public interface USerServices {
@GetMapping("user/findAll/{id}")
public usersss questUser(@PathVariable("id") Integer id);
}
OpenFeign 是 Spring Cloud 在Feign 的基础上支持了 SpringMVC的注解如 @RequesMapping 等等。
OpenFeign 的 @FeignClient 可以解析 SpringMVC 的 @RequestMapping 注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。
所以OpenFeign可以不实现Services的实现类(注:consumer的controller方法映射的provider中的controller中的方法参数以及Restful风格请求必须相同)
4、API服务网关(API Gateway)
Spring Cloud Gateway旨在为微服务架构提供一种简单而有效的统一的API路由管理方式
服务网关主要是解决问题4(如何对使用者暴露服务API),对于最终调用方来说,微服务的通信与各种实现细节应该是透明的,调用者只需关注他要使用的 API 接口即可。
因此微服务架构引入的服务网关控制用户的访问权限。
服务网关是外部环境访问内部微服务的唯一途径;
在这个基础上还可以扩展出其他功能,例如:用户认证与授权、容错限流、动态路由、A/B测试、灰度发布等。
GateWay和Nginx的区别与联系
下图当中圈出来的就是Gateway所在的位置。
而Nginx属于在Gateway上层。甚至可以在外部请求的上层,因为Nginx可以用来做网关层的负载均衡,同时他还可以用来做流量入口。因为他本身就是服务器,实际开发当中都是通过Nginx来做流量入口的。
流量入口的意思就是假如我有个html放到linux当中,那么外面的人怎么才能访问到linux当中的页面呢?
Nginx可以用来解决这个问题,他本身就是一个服务器,使用过程就是开启端口然后监听请求,当请求来了,可以将请求 指向本机的任意可访问的html文件。
Gateway可以称之为微服务网关(业务网关)
,而Nginx可以作为整个应用的流量网关
,以及微服务网关的负载均衡。
gateway三大核心概念
Route(路由):路由是构建网关的基本模块,它由ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由。
Predicate(断言):参考的是Java8的java.util.function.Predicate,开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由。
Filter(过滤):指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改。
+---------------------------+
| 请求到达网关 (Client) |
+---------------------------+
|
v
+---------------------------+
| 请求进入网关(Dispatcher) |
| (网关的入口处理模块) |
+---------------------------+
|
v
+---------------------------+
| 过滤器链执行 (Filters) | <-- 过滤操作(例如认证、授权、日志记录等)
| **(过滤)** |
+---------------------------+
|
v
+---------------------------+
| 路由 (Routing) | <-- 根据路由规则选择目标服务
| **(路由)** |
+---------------------------+
|
v
+---------------------------+
| 服务发现 & 负载均衡 (Load | <-- 选择合适的后端实例
| Balancing) |
+---------------------------+
|
v
+---------------------------+
| 转发请求到后端服务 |
+---------------------------+
|
v
+---------------------------+
| 响应返回给网关 |
+---------------------------+
|
v
+---------------------------+
| 响应过滤器链执行 (Response) | <-- 处理响应(例如修改响应内容、增加头信息等)
| **(过滤)** |
+---------------------------+
|
v
+---------------------------+
| 响应返回给客户端 |
+---------------------------+
5.配置中心(Config Management)
配置中心主要解决了问题5(如何集中管理各节点配置文件);
在微服务架构下,所有的微服务节点都包含自己的各种配置文件,如jdbc配置、自定义配置、环境配置、运行参数配置等。要知道有的微服务可能可能有几十个节点,如果将这些配置文件分散存储在节点上,发生配置更改就需要逐个节点调整,将给运维人员带来巨大的压力。
配置中心便由此而生,通过部署配置中心服务器,将各节点配置文件从服务中剥离,集中转存到配置中心。一般配置中心都有UI界面,方便实现大规模集群配置调整。
1. Spring Cloud Config
Spring Cloud Config 是 Spring 官方提供的配置中心,支持将配置集中化存储,并通过服务端和客户端的方式动态获取和管理配置。它支持 Git、SVN 等版本控制工具作为配置的存储源,还可以将配置存储在数据库、文件系统等地方。
- Spring Cloud Config Server:作为配置服务器,管理配置信息,并向客户端提供配置。
- Spring Cloud Config Client:配置客户端,应用通过它来获取配置,并支持动态刷新配置。
2. Nacos
Nacos 是阿里巴巴开源的动态服务发现、配置管理和服务管理平台。它不仅支持配置中心的功能,还提供服务注册和发现的功能,是一个统一的微服务管理平台。Nacos 提供了丰富的功能,包括多种配置存储方式、配置的实时推送、以及支持分布式环境的配置管理。
特点:
- 支持服务发现和配置管理功能。
- 支持多种数据源存储配置,包括 MySQL、文件系统等。
- 实时推送配置,支持动态配置更新。
- 多环境、多语言支持。
- 提供简洁的 Web 控制台管理界面。
使用场景:
- 微服务架构下的服务发现和配置中心合并使用。
- 需要统一管理服务与配置的场景。
3. Zookeeper
Zookeeper 是 Apache 提供的一个分布式协调服务,常用于配置管理、服务发现、锁机制等场景。虽然 Zookeeper 不是专门为配置管理而设计的,但它广泛应用于分布式系统中,且可以通过其提供的键值存储机制来实现配置管理。
特点:
- 高可用性和一致性,适用于分布式系统。
- 支持配置动态更新。
- 适合用于存储少量、关键的配置信息。
- 提供丰富的原子操作,适合高并发访问。
使用场景:
- 在需要分布式协调和配置管理的场景下使用。
- 与大规模的分布式系统结合使用,如大数据平台。
6、集中式日志管理(Centralized Logging)
集中式日志主要是解决了问题6(如何收集各节点日志并统一管理)。
微服务架构默认将应用日志分别保存在部署节点上,当需要对日志数据和操作数据进行数据分析和数据统计时,必须收集所有节点的日志数据。
那么怎么高效收集所有节点的日志数据呢?业内常见的方案有ELK、EFK。通过搭建独立的日志收集系统,定时抓取各节点增量日志形成有效的统计报表,为统计和分析提供数据支撑。
1. 日志采集(Log Collection)
日志采集是集中式日志管理的第一步,主要目的是将各个微服务产生的日志信息收集并传输到日志存储系统。
Fluentd:
- 一个开源的数据收集器,可以收集、聚合、转发日志数据。支持多种输入和输出插件,广泛应用于微服务架构中。
- Fluentd 具有高度的可扩展性和灵活性,可以将日志从各个微服务收集到中央存储,如 Elasticsearch、Kafka 等。
Logstash:
- Logstash 是 Elastic Stack 的一部分,广泛用于日志的收集、过滤、转换和转发。
- 它能够处理不同类型的日志源,并支持各种输出目标,如 Elasticsearch、文件系统等。
Filebeat:
- 也是 Elastic Stack 的一部分,Filebeat 是一个轻量级的日志收集器,通常用于从各个微服务节点或容器中收集日志文件并转发到 Logstash 或 Elasticsearch。
- 它适用于日志文件或标准输出流日志的收集。
2. 日志存储(Log Storage)
存储日志数据的主要目标是保证高效查询和分析。常见的日志存储组件有:
Elasticsearch:
- 是一个分布式搜索引擎,广泛用于日志存储和搜索。它是 Elastic Stack(以前的 ELK Stack,Elasticsearch、Logstash、Kibana)的核心组件,能够高效地存储大规模日志数据,并支持高效的查询和分析。
- 配合 Logstash 或 Fluentd,可以实现强大的日志存储和索引功能。
Kafka:
- Kafka 是一个分布式的消息队列系统,也可以作为日志存储的中间层,特别适用于实时日志流处理。
- Kafka 将日志数据分区并存储在分布式日志系统中,可以承载高吞吐量的日志流。
OpenSearch:
- OpenSearch 是基于 Elasticsearch 的开源搜索和分析引擎,常作为替代 Elasticsearch 的解决方案。它同样支持强大的日志存储和检索功能。
3. 日志分析与可视化(Log Analysis and Visualization)
一旦日志数据被收集并存储,接下来的工作就是对日志进行分析和可视化,以便能够从中提取有价值的信息,如错误分析、性能监控、趋势分析等。
Kibana:
- Kibana 是 Elastic Stack 的可视化工具,常与 Elasticsearch 配合使用,提供强大的日志分析、可视化和监控能力。你可以使用 Kibana 创建实时的仪表板、图表、聚合查询等,帮助开发者和运维人员快速发现问题。
Grafana:
- Grafana 是一个开源的数据可视化和监控工具,通常与 Prometheus 配合使用,但也可以集成 Elasticsearch 用于日志数据的展示。
- 它支持创建自定义仪表板,提供多种图形、表格、时间序列数据展示,帮助分析日志的趋势和异常。
4. 日志管理平台(Log Management Platforms)
除了单独的开源组件,许多企业选择使用全功能的集中式日志管理平台来简化日志收集、存储和分析的工作:
ELK Stack(Elasticsearch + Logstash + Kibana):
- 这是最常用的开源日志管理平台,能够提供日志的收集、存储、索引、搜索和可视化的完整解决方案。
- ELK Stack 是目前微服务架构中非常受欢迎的选择,尤其适用于需要实时日志分析和强大查询能力的场景。
EFK Stack(Elasticsearch + Fluentd + Kibana):
- EFK Stack 与 ELK Stack 相似,只是使用 Fluentd 代替了 Logstash 作为日志收集器。Fluentd 的配置和扩展能力使得它适合在大规模分布式环境中使用。
Graylog:
- Graylog 是一个基于 Elasticsearch 和 MongoDB 的集中式日志管理平台。它提供了强大的日志搜索和分析功能,并且可以轻松地处理来自多种数据源的日志数据。
- Graylog 提供了易于使用的用户界面,适用于中大型企业进行日志管理。
Splunk:
- Splunk 是一个商业化的日志管理平台,广泛应用于企业级应用中。它支持高效的日志收集、存储、搜索和分析,并且提供了丰富的报表和告警功能。
- Splunk 支持与微服务架构的集成,可以有效地处理大规模日志数据。
5. 日志聚合与管理(Log Aggregation and Management)
除了上述的日志收集、存储和分析工具外,还有一些专门的日志聚合和管理工具,用于简化日志流的处理和优化查询。
Prometheus(主要用于监控,但也可以与日志结合):
- Prometheus 是一个开源的监控和警报系统,通常与容器和微服务配合使用。虽然它主要用于指标监控,但也可以与日志处理系统集成,为日志数据提供实时监控能力。
Jaeger / Zipkin(分布式追踪):
- 虽然 Jaeger 和 Zipkin 是用于分布式追踪的工具,但它们也能生成与日志数据紧密相关的追踪信息,帮助调试和分析微服务架构中的问题。
总结
集中式日志管理的关键组件包括日志采集工具(如 Fluentd、Logstash、Filebeat)、日志存储系统(如 Elasticsearch、Kafka、OpenSearch)、日志分析与可视化工具(如 Kibana、Grafana)以及日志管理平台(如 ELK Stack、Graylog、Splunk)。这些工具可以协同工作,实现对微服务架构中海量日志数据的高效收集、存储、分析和可视化,帮助开发和运维团队监控系统、诊断问题并优化性能。
7、分布式链路追踪(Distributed Tracing)
分布式链路追踪解决了问题7(如何直观的了解各节点间的调用链路)。
系统中一个复杂的业务流程,可能会出现连续调用多个微服务,我们需要了解完整的业务逻辑涉及的每个微服务的运行状态,通过可视化链路图展现,可以帮助开发人员快速分析系统瓶颈及出错的服务。
- OpenTelemetry:标准化的追踪工具,支持多种后端。
- Jaeger:强大的开源追踪系统,适合大规模微服务架构。
- Zipkin:轻量级的分布式追踪系统,易于部署。
- AWS X-Ray:AWS 提供的托管追踪服务。
- Google Cloud Trace:专为 Google Cloud 环境设计的链路追踪工具。
- Honeycomb:专注于事件流和高效查询的现代追踪平台。
8、服务保护(Service Protection)
服务保护主要是解决了问题8(如何对系统进行链路保护,避免服务雪崩)。
在业务运行时,微服务间互相调用支撑,如果某个微服务出现高延迟导致线程池满载,或是业务处理失败。这里就需要引入服务保护组件来实现高延迟服务的快速降级,避免系统崩溃。
服务保护(Service Protection) 是指确保微服务系统的可用性、安全性和稳定性,防止单个服务的故障、恶意攻击或异常流量对整个系统产生影响。服务保护涉及多个方面,包括流量控制、故障隔离、限流、熔断、鉴权、认证、加密、日志监控等。以下是常用的服务保护组件和技术,它们在微服务架构中起到了重要的保护作用。
1. 流量控制与负载均衡
流量控制的目的是确保系统在高负载、突发流量的情况下能够稳定运行。负载均衡组件可以有效地分配流量,防止单个服务或节点承受过大压力。
常见组件:
- Nginx / HAProxy:作为反向代理和负载均衡器,它们可以根据负载动态分配请求,提供高可用性。
- Istio:作为服务网格,Istio 提供了丰富的流量控制功能,如流量路由、重试、超时、限流等。它能自动进行负载均衡,基于策略调节流量流向。
- Envoy:作为微服务架构中的数据平面代理,Envoy 能处理入站和出站流量,提供高级的流量管理、负载均衡、路由和熔断等功能。
- Consul:提供健康检查和负载均衡能力,帮助服务之间的流量调度。
2. 限流与熔断
限流和熔断是服务保护中最重要的两项功能,目的是防止某个服务因过载而崩溃,进而影响整个系统的稳定性。
限流:
- Rate Limiting:通过限制每个客户端或每个用户在一定时间内的请求次数,防止系统过载。
- 常见组件:
- Envoy:通过其代理功能可以配置细粒度的流量管理和限流策略。
- API Gateway:如 Kong、Zuul 等 API 网关一般都具备限流功能,能够根据请求频率限制访问。
- Redis:可用于实现分布式限流,通过 Redis 存储用户的请求计数和时间戳,进行实时流量限制。
- Sentinal流量防卫兵
熔断:
熔断的作用是在服务出现异常时,及时中断故障请求,防止错误进一步蔓延到其他系统。
- Hystrix(Netflix):Hystrix 是一个流行的熔断器实现,能够在服务失败时迅速触发熔断机制,避免服务连锁崩溃。虽然 Netflix 已经不再积极维护 Hystrix,但它仍然是熔断机制的经典实现。
- Resilience4j:是 Hystrix 的轻量级替代品,提供限流、熔断、重试等功能。
- Istio:提供了基于策略的熔断、重试、故障注入等功能,可以保护微服务免受依赖服务的不稳定性影响。
3. 身份验证与授权
微服务中的身份验证和授权确保系统资源只能被合法用户访问,防止未授权的访问或恶意攻击。
常见组件:
- OAuth 2.0 & OpenID Connect:通过授权服务器和身份提供者管理身份验证和授权。OAuth 2.0 用于访问令牌的颁发,OpenID Connect 扩展了 OAuth 2.0,用于用户身份验证。
- Keycloak:开源的身份和访问管理工具,支持 OAuth 2.0、OpenID Connect 和 SAML 协议,集成方便,常用于微服务架构中的身份验证和授权。
- Auth0:一个云托管的身份验证服务,支持多种认证协议,并能方便地与微服务架构结合。
- Okta:另一种身份和访问管理服务,提供集中化的身份认证服务。
API Gateway 鉴权:
- Kong、Zuul、Ambassador:这些 API 网关通常提供集中的身份认证和授权服务,在请求进入微服务之前进行验证,确保请求是合法的。
4. 加密与数据保护
微服务架构中的通信需要通过加密来保护数据的隐私和完整性。加密技术确保数据在传输过程中的安全性,避免敏感信息泄露。
常见组件:
- TLS / SSL:加密协议(如 TLS 和 SSL)可用于加密微服务间的通信,防止中间人攻击和数据窃听。
- HashiCorp Vault:开源的秘密管理工具,可以安全地存储和访问敏感数据(如 API 密钥、证书、数据库凭据等)。
- AWS KMS / Google Cloud KMS:云服务提供商的密钥管理服务,用于加密数据,确保数据的保密性。
- Envoy:在服务网格中提供加密通信,支持透明的 TLS 加密和解密。
5. 故障恢复与隔离
微服务架构的高可用性和稳定性依赖于良好的故障恢复机制和服务隔离设计。通过容错设计,可以让系统在出现问题时能够自动恢复,保证服务的可用性。
常见组件:
- Istio:作为服务网格,Istio 提供了强大的流量管理和故障隔离能力。比如可以实现基于请求的重试、超时控制和熔断。
- Kubernetes:Kubernetes 提供了容器编排和自动化部署的功能,支持水平扩展和故障恢复。通过 Pod 的副本和健康检查,Kubernetes 可以确保服务的高可用性。
- Circuit Breaker (熔断器):如 Hystrix、Resilience4j 等熔断器工具,帮助系统在部分服务出现故障时避免 cascading failure(级联故障),并快速恢复。
6. 审计与日志监控
通过日志记录和监控,可以实时发现并应对系统中的潜在问题,防止攻击和服务滥用。审计日志可以帮助追踪每个用户和服务的行为,确保透明性和合规性。
常见组件:
- ELK Stack (Elasticsearch, Logstash, Kibana):用于日志收集、存储和可视化。可以帮助团队实时监控系统日志,发现潜在的攻击或异常。
- Prometheus + Grafana:Prometheus 用于收集微服务的监控数据,Grafana 用于可视化和报警。可以对微服务的性能进行全面监控。
- Fluentd:用于日志收集、转发和处理,通常与 ELK Stack 或其他日志分析工具配合使用。
- Jaeger:分布式链路追踪工具,可以帮助追踪服务间的请求流,发现服务间的瓶颈或异常。
7. API Gateway 保护功能
API 网关是微服务架构中的重要组件,它不仅提供统一的流量入口,还可以实现多种服务保护功能,如:
- 身份认证(集成 OAuth、JWT)
- 流量限流与熔断
- 访问控制(基于角色的访问控制,RBAC)
- 请求/响应转换(如 JSON 转换、API 版本管理)
- 负载均衡和故障转移
常见的 API Gateway 组件:
- Kong:一个高性能的开源 API 网关,支持流量管理、认证、限流等功能。
- Ambassador:基于 Envoy 的 API 网关,具有强大的流量控制、API 安全性和监控能力。
- Zuul:Netflix 提供的 API Gateway,支持路由、限流、认证等功能。
总结
微服务架构中的服务保护是确保系统稳定性、安全性和可靠性的关键。常见的服务保护技术和组件包括:
- 流量控制与负载均衡:如 Nginx、Istio、Envoy、Kong 等。
- 限流与熔断:如 Hystrix、Resilience4j、Istio、API Gateway 等。
- 身份验证与授权:如 OAuth 2.0、OpenID Connect、Keycloak、Auth0、Okta 等。
- 加密与数据保护:如 TLS/SSL、HashiCorp Vault、AWS KMS 等。
- 故障恢复与隔离:如 Kubernetes、Istio、熔断器模式等。
- 日志监控与审计:如 ELK Stack、Prometheus + Grafana、Jaeger 等。
这些组件和技术可以有效地保障微服务架构的高可用性、安全性以及故障恢复能力,帮助开发团队实现服务的保护。