微服务架构

去中心化的架构
SOA集中式的架构 ESB nginx
Service Mesh
Spring 基于bean mybatis:SqlSessionFactory xml @bean
SpringBoot 基于Application 自动配置
SpringCloud 基于service 微服务架构共性功能 集成

微服务和微服务之间调用存在什么问题

rpc调用:feign dubbo
服务注册和发现 nacos
配置统一管理 zk nacos
服务链路的排查,微服务的监控 skywalking业务零侵入 zipkin+sleuth
服务熔断降级限流 sentinel

版本2.2.1
boot2.2.5
seata1.2.0
服务调用RestTemplate webclient ClientHttpRequestInterceptor扩展点
LoadBalancerInterceptor负载均衡器拦截器
feign底层依赖ribbon

注册中心架构

心跳(服务续约:客户端定时向服务端发心跳,服务端接收到心跳修改服务续约时间)
注册instance 是什么存储的?
临时节点存在内存 持久节点持久化磁盘 data/naming/namespace的id
2.0 grpc protobuf

边车模式
将别的服务挂载其上接入异构任务

内存注册表

Service #类就是微服务 mall-order mall-user
Map(namespace, Map(group::serviceName, Service))
namespace隔离的作用 No instances available for mall-order
group::serviceName 隔离作用 group所有服务用用一个 group (通常用于配置中心,起到环境隔离的作用)
Map clusterMap #集群

persistentInstances持久实例
ephemeralInstances临时实例
instance:8020 8021 mall-order节点
nacos:拉取 持久实例和临时实例一次性全部拉取的

核心功能

服务注册:client通过发送rest请求方式向server注册自己的服务,提供自身元数据(ip+端口)。server接受请求存在一个双层内存map中
服务心跳:默认5s发一次心跳
服务同步:集群间相互同步服务实例,保证服务信息的一致性 leader raft算法
服务发现:client调用服务提供者的服务时,发送一个rest请求给nacos server,获取注册服务清单,缓存在client本地,同时开启定时任务拉取服务端最新的注册表信息到本地缓存
服务监控:健康检查 超过15s没有收到客户端心跳将healthy属性置为false(客户端服务发现时不会发现),如果超过30s没心跳,直接剔除(被剔除后如果恢复心跳则重新注册)

NamingService注册中心核心服务

  1. 引入依赖
  2. 指向注册中心地址 改配置
  3. 早期需要加@EnableDiscoveryClient 现在自动注册

nacos是如何实现自动注册的: registerInstance

  • nacos 整合 springcloud Alibaba Nacos ->spring cloud -> springboot -> spring
    • 自动注册 ServiceRegistry 服务注册的接口ServiceRegistry#register
    • onApplicaitonEvent 事件监听接口 自动服务注册的实现 AbstractAutoServiceRegistration
    • spring容器调用(扩展点) 发布事件 ->服务自动注册事件 ->自动注册

客户端负载均衡器Ribbon

原理

利用LoadBalancerInterceptor拦截器获取注册中心得到的服务列表 同时修改url

客户端负载均衡

  1. 引入依赖
  2. @LoadBalanced

负载均衡算法

  • 随机 使用较少
  • 轮询 默认实现方式,请求来之后排队
  • 加权轮询 高配置、低负载的服务器分配高权重,均衡服务器压力
  • 地址hash 通过client请求地址hash值取模映射进行服务调度 好处:同ip保证访问同一台服务器
  • 最小连接数 根据服务器的情况,比如请求挤压数等参数,将请求分配到当前压力最小的服务器上
    spring的扩展点
    填充拦截器 负载均衡器
    更改负载均衡算法
    @Bean
    IRule ribbonRule(){
    return new NacosRule();
    }
    ribbion的扩展点
    被调用的微服务名 指定特定负载均衡策略

饥饿加载

eager-load

调用组建Feign&Dubbo

远程过程调用

  1. @Enable
  2. @FeignClient(value = “mall-order”, path = “/order”)

配置中心架构