Skip to main content

微服务

微服务

microservice & serverless

small, self-contained

代价:性能下降

构建微服务的原因:容错,并行开发, 容易gateway集成等

服务发现(service discovery), 负载均衡(load-balancing),circuit-breaking, distributed tracing, monitoring

服务发现:由spring 来维护service的ip,port等(位置),由于重启等会动态变化。其他服务或代码通过api gateway通过服务名称得到服务

架构是怎么演变的: 微服务架构是什么? - 老刘的回答 - 知乎 https://www.zhihu.com/question/65502802/answer/802678798

这文章写得很好,多看

No silver bullet:

  • 微服务架构整个应用分散成多个服务,定位故障点非常困难
  • 在微服务架构中,一个服务故障可能会产生雪崩效用,导致整个系统故障

在微服务架构下,一个用户的请求往往涉及多个内部服务调用。为了方便定位问题,需要能够记录每个用户请求时,微服务内部产生了多少服务调用,及其调用关系。这个叫做链路跟踪。

实现链路追踪, 在http的header之中添加相关数据, 如traceId, spanId, parentId, reqTime/resTime

日志分析ELK: Elasticsearch, Logstash, Kibana

部署的服务器数量越多,可靠性越低:

  • 减少错误:事前监控(指标采集、存储) + 事后分析(日志收集,日志分析器,链路跟踪,UI呈现)
  • 降低影响:容错 + 服务降级

注册发现

注册中心 Eureka(Spring 默认) ,Zookeeper, Consul、Etcd......

gateway的route规则和转发

从硬编码的ip port到形如 lb://BOOK-SERVICE这样的名字,负载均衡让gateway做

  • GateWay:作为一个统一访问的网关。应用程序(前端)不需要知道具体的是哪个服务器处理对应的服务,只需要对GateWay发送请求就可以。此外,GateWay还可以起到负载均衡的作用,比如登录服务有三个服务器,他们的key名字都是完全一样的,GateWay就会采用相关的负载均衡的策略,提高并发性能
  • 注册中心:(Euraka为例)相当于一个注册表(key-value存储,key代表服务名字,value代表服务器地址,这可能会发生改变),当一个微服务的服务器启动的时候(包括GateWay),他会到Service Registry这个注册表上注册自己的服务,这样Gateway在面对客户端请求到来的时候,就会根据这个注册表来把请求转发给相关的微服务的服务器。

API Gateway:

  • 作用: API 网关充当所有客户端请求的单一入口点。它作为微服务架构的边缘,负责接收来自客户端的所有请求,并根据请求的路由规则将请求转发到相应的微服务。它的行为类似反向代理,隐藏了微服务架构的内部复杂性,为客户端提供了一个简化的接口。同时也方便进行监控、日志、安全控制(不暴露内部服务器的ip接口等)、协议转换(内部可能是rpc等,外部暴露http)等

Service Registry :

  • 作用: 服务注册中心是一个存储所有微服务实例信息的数据库。每个微服务实例在启动时向注册中心注册自身信息(例如 IP 地址、端口号、健康状态等),并在停止时注销。其他微服务可以通过注册中心查找所需服务的可用实例。注册中心简化了相关配置,允许部分服务器下线,不需要硬编码IP, 是弹性扩缩容的必备组件,也方便后续提供服务熔断、服务降级等功能

熔断: 上有需要发现下游宕机并停止添加负载的能力

服务降级: 下游非核心服务宕机不影响上游正常工作

限流: 不能让重试访问变成DDoS

反向代理:

每个服务都额外部署这个代理组件,所有出站入站的流量都通过该组件进行处理和转发。这个组件被称为Sidecar。

Sidecar只负责网络通信。还需要有个组件来统一管理所有sidecar的配置。在Service Mesh中,负责网络通信的部分叫数据平面(data plane),负责配置管理的部分叫控制平面(control plane)。数据平面和控制平面构成了Service Mesh的基本架构。

serverless faas 重点是无状态,幂等性。无状态的可以抽出来作为单独的服务架构

作业之中QA:

解释函数式服务的无状态指的是什么?函数式服务为什么容易扩展?在文档中还需要说明你的服务的部署与使用方式

无状态指的是不依赖于数据库,session等外部的状态, 所有的需要的数据都以参数 (rpc, http)等传入, 而在函数内部也没有持久化的状态, 也就是说函数本身具有幂等性, 可以多次调用得到相同的计算结果

为什么容易:

无持久数据方便动态分配计算资源,根据传入数据的频率和计算时间即可,同时不需要存储资源,也自动具有隔离性和容器的适配性。无服务器让函数式抛开了重量级的依赖,可以轻松在不同的机器上水平调度,而不需要一台具备特定环境的物理机,也不需要考虑兼容问题,水平调度非常简单。

event-driven(和数据无关)

微服务的状态: 登录为例, 要么集中存储session, 要么采取类似jwt的发token形式, 例如OAuth