Spring Cloud alibaba 组件介绍

Nacos

官网文档地址 : https://nacos.io/zh-cn/docs/quick-start.html
缩写就是 Naming Configuration service 本身 nacos 就是一个 service 服务 ,这个服务的功能包括命名管理, 服务 注册发现 配置管理
spring:
  cloud:
    nacos:
      #nacos中注册发现的功能
      discovery:
        #填写nacos的服务端地址
        server-addr: localhost:8848
        #当前启动进程是永久实例还是临时实力 true 表示临时实力 false表示永久实例
        #true是默认值
        ephemeral: true
        #nacos实例的ip地址
        ip: 127.0.0.1
        #命名空间
        namespace: f033ea8e-15ca-4f37-b112-127edc03de9e
        #分组
        group: 1.0
        #心跳检测的间隔时间
        heart-beat-interval: 5
        #超时心跳删除时间
        ip-delete-timeout: 20
nacos 结构 :
        角色2 : 服务端 (nacos-server 进程 ), 客户端 (spring cloud 整合到 web 应用组件 )
nacos 功能 :
        服务注册: 在微服务中 , 服务注册目的 , 是为了让别的服务发现 , 获取当前服务信息
        服务发现: 为了调用别的服务, 从而在 nacos 进行信息的抓取
spring:
  profiles:
    #开启不同环境配置
    active: dev
#bootstrap定义不同环境,在同一个文件bootstrap.yaml
#---区分,每个环境中定义名称
---
spring:
  config:
    activate:
      on-profile: dev
  #告诉bootstrap 远程配置中心nacos地址 和我们要读取的配置文件(先读默认的)
  application:
    #所有的application.name都是服务名称
    name: xxx-xxxx
  cloud:
    nacos:
      config:
        #必须配置的值
        server-addr: localhost:8848
        #文件类型 后缀 默认是properties txt json yaml xml html
        file-extension: yaml
        #前缀,默认是服务名称,不想使用默认值,可以自定义
        #prefix: sdlaslkdfjsdlj
        #多环境运行的 namespace 命名空间的id
        namespace: f033ea8e-15ca-4f37-b112-127edc03de9e
        #持续发布中,保证灰度发布 分组
        group: 1.0
        #是否支持刷新.远程配置一旦修改,本地进程内存数据是否刷新,如果刷新,true,不需要重启
        #false 重启,内存才变动 默认也是true
        refresh-enabled: true
        #读取指定的文件
        shared-configs:
          - data-id: redis.yaml
            group: 1.0
            refresh-enable: true
          - data-id: datasource.yaml
            group: 1.0
            refresh-enable: true
          - data-id: es.yaml
            group: 1.0
            refresh-enable: true

dubbo

远程调用 , 只要走网络通信协议 ,http 也可以实现 . 贴近应用层的协议 , 我们的微服务之间调用是内部访问 , 应该更关心性能 , 如果整个微服务集群对外提供功能 , 关注 方便 程度 .
微服务落地架构 , 已经把内部 http 协议通信 , 换成 RPC.
对内 RPC, 对外 HTTP.
RPC 包含 2 部分内容
        1. 序列化过程 : 是调用 传输 , 存储 过程中 , 从内存到内存设计的数据转化过程 . 有非常多的序列化方法 , 序列化协议.
        2. 通信过程 : 端与端通信对接 , 选择使用的底层通信方式 .(http,tcp)
dubbo 是一个 RPC 框架 . 序列化 , 底层通信协议 , 都可以已经包装好的
官网 : https://cn.dubbo.apache.org/zh-cn/index.html
提供了六大核心能力:面向接口代理的高性能 RPC 调用 ,智能容错和 负载均衡 ,服务自动 注册和发现, 高度可扩展能力,运行期流量调度,可视化的服务治理与运维。

调用业务选择和dubbo角色

provider( 服务提供者 ): 远程调用的被调用的服务实例
consumer( 服务消费者 ): 远程调用的调用发起的服务实例
注册中心 ( 服务协调者 ):dubbo 支持很多不同种类的注册中心 , 比如 zookeeper,redis, nacos
spring:
  application:
    name: xxx-xxxx
dubbo:
  application:
    #dubbo客户端 在nacos注册,携带的服务名称
    name: ${spring.application.name}
  protocol:
    #port表示dubbo底层通信协议使用的端口 -1 自增的端口号
    #20880开始,查看当前服务,哪个没有被占用
    port: -1
    name: dubbo
  registry:
    #告诉dubbo注册中心类型和地址
    address: nacos://localhost:8848
    #禁止dubbo在nacos中自动创建一些无效的配置文件
    use-as-config-center: false
    use-as-metadata-center: false
  cloud:
    #明确当前服务,订阅的其他服务,如果需要调用其他服务,用多个服务拼接,
    #不配置这个属性,会导致当前的dubbo客户端默认订阅nacos所有服务
    # 不给值,订阅空
    subscribed-services: 
  consumer:
    #如果当前程序 有consumer的角色,不会在启动时检查provider是否存在
    #如果当前程序不是consumer,这个配置没有任何作用
    check: false

注解:

  1. @EnableDubbo:用于启用Dubbo服务。被标注的类通常是一个配置类,用于初始化Dubbo的核心组件,如注册中心、协议等。

  2. @DubboService:用于标注服务提供者接口的实现类。被标注的类会自动注册为Dubbo服务,并暴露给服务消费者。

  3. @DubboReference:用于标注服务消费者接口的成员变量。被标注的成员变量会被Dubbo框架自动注入一个指定接口的代理对象,用于进行远程调用。

Dubbo 负载均衡
负载 : 并发 , 流量 , 请求等被程序处理的任务 , 都可以称为负载 . 微服务中指的一般是流量和并发 .
均衡 : 集群分布式环境下 , 将负载平衡的分配给处理负载的任务单元
Dubbo 负载均衡策略
random: 随机分配负载均衡
roundRobin: 轮训分配负载均衡 , 挨个访问
leastactive: 最小活跃分配负载均衡 , 越闲 , 分配的越多 . 使用相应数量在单位时间处理的越多的 , 越闲
dubbo 配置负载均衡优先级
全局和局部
局部优先级 > 全局优先级
provider consumer
provider 优先级 > consumer 优先级
局部 provider> 全局 provider> 局部 consumer> 全局 consumer

Gateway

微服务网关是一个用于 管理 监控 微服务的 入口 ,用于转发和路由来自客户端的请求。微服务网关可以将来自客户端的请求转发给后端的多个微服务,同时也可以处理跨域 身份验证 限流 缓存 流量控 等一系列与微服务相关的功能,从而简化了微服务架构的服务开发的复杂度。
总结网关功能 , 需求 :
集中管理 : 微服务很多 , 接口 api 也很多 , 所以通过网关为所有的微服务 api 接口提供统一管理维护的功
能。
安全考虑: 为了安全考虑 , 几乎绝大部分微服务都需要认证授权 , 和访问控制 , 网关可以提前完成这个任务, 为微服务提供保障 .。
流量控制限流: 从网关层面对入口流量进行监控管理 , 一旦超出预计的请求数量 , 直接限制访问 , 防止后端微服务宕机. 每一个微服务也要自行管理流量控制 (sentinel)
网关有多少中落地方案 :
1. Spring Cloud Gateway : Spring Cloud Gateway 是由 Spring Cloud 社区提供的一种基于 Spring
框架的全新微服务网关解决方案,它致力于为 Spring Boot 微服务应用提供简单、高效、可靠的路
由服务。
2. Netflix Zuul : Netflix Zuul 是一个轻量级的微服务网关,它能够为微服务应用提供负载均衡、路
由、过滤等功能。 Zuul Eureka 之间的协作能够让 Zuul 帮助微服务应用自动处理负载均衡和服
务发现。
3. Kong : Kong 是一个企业级微服务 API 网关,它能够帮助开发者轻松创建、部署和管理微服务,同时提供灵活的路由、负载均衡、限流、监控、安全等功能。
4. Istio : Istio 是一个开源的服务网格平台,它能够集成多种微服务网关、负载均衡、服务发现、流量控制等功能,以实现微服务之间的高效通信和流量管理。
5. Nginx : Nginx 是一个轻量级的反向代理和负载均衡服务器,它可以充当微服务网关的角色。通过Nginx 提供的路由和负载均衡功能,开发者可以为微服务提供一种快速、可靠的访问方式。
spring:
  application:
    name: xxx-xxxx 
  #由于gateway底层不是tomcat 和mvc有冲突的
  main:
    web-application-type: reactive
  #配置cloud gateway 逻辑,实现转发需求
  cloud:
    gateway:
      #路由转发配置 路由逻辑可以配置多个
      routes:
        # 一个- 是一个路由信息,配置一个路由的对象属性
        # id表示唯一的标识
        - id: stock-redirect
          # 目的地请求地址
          uri: http://127.0.0.1:20003
          # 断言,assert,判断进入网关的请求,哪些符合这个路由匹配
          # 所有请求都到网关转发给stock
          # /** 匹配所有请求 ** 代表多级路径,且每一级都可以是任意长度字符串
          # ant匹配规范 * ? **
          predicates:
            - Path=/**
启动测试
stock 真正处理请求的人
gateway 启动 , 做转发
断言:
springCloud gateway 内置很多断言规则 . Path Host 使用的比较多的。详细规则另行查询
nacos整合网关案例
spring:
  application:
    name: xxx-xxxx
  #由于gateway底层不是tomcat 和mvc有冲突的
  main:
    web-application-type: reactive
  #配置cloud gateway 逻辑,实现转发需求
  cloud:
    nacos:
      #nacos中注册发现的功能
      discovery:
        #填写nacos的服务端地址
        server-addr: localhost:8848
        #命名空间
        namespace: f033ea8e-15ca-4f37-b112-127edc03de9e
        #分组
        group: 1.0
    gateway:
      #路由转发配置 路由逻辑可以配置多个
      routes:
        # 一个- 是一个路由信息,配置一个路由的对象属性
        # id表示唯一的标识
        - id: stock-redirect
          # 负载均衡的访问服务名称csmall-stock
          uri: lb://csmall-stock
          # 断言,assert,判断进入网关的请求,哪些符合这个路由匹配
          # 所有请求都到网关转发给stock
          # /** 匹配所有请求 ** 代表多级路径,且每一级都可以是任意长度字符串
          # ant匹配规范 * ? **
          predicates:
            - Path=/**
            - Host=localhost:8099
http://localhost:8080/doc.html --> 进入网关 --> 使用路由断言匹配 --> Path 匹配 Host 匹配 --> uri --> lb://xxx-xxxx --> loadbalancer 获取 nacos 抓取信息 --> xxx-xxxx 注册信息
127.0.0.1:xxxx --> 负载均衡访问 --> http://127.0.0.1:xxxx/doc.html
动态路由

在网关中,我们可以通过上述对路由转发的学习,实现微服务集群的各种服务的路由匹配routes的配置.Gateway中,提供了一种动态路由配置服务的方式.根据服务名称自动拼接url地址,实现路由功能,要想使用,需要满足一定访问条件.

spring:
  application:
    name: xxx-xxxx
  #由于gateway底层不是tomcat 和mvc有冲突的
  main:
    web-application-type: reactive
  #配置cloud gateway 逻辑,实现转发需求
  cloud:
    nacos:
      #nacos中注册发现的功能
      discovery:
        #填写nacos的服务端地址
        server-addr: localhost:8848
        #命名空间
        namespace: f033ea8e-15ca-4f37-b112-127edc03de9e
        #分组
        group: 1.0
    gateway:
      #动态路由
      discovery:
        locator:
          enabled: true
spring.cloud.gateway.discovery.locator.enabled=true 属性值开启发现动态路由逻辑 .
会根据抓取的服务名称 , 配置 Path=/{ 服务名称 }/** 同时转发的时候 , 将一级路径过滤掉
按照当前服务逻辑 相当于人为配置路由
routes:
 - id: stock
   uri: lb://csmall-stock
   predicates:
   - Path=/csmall-stock/**
   filters:
   #会在转发时,去掉拼接的1级路径
   - StrimFilter = 1
 - id: cart
   uri: lb://csmall-cart
   predicates:
   - Path=/csmall-cart/**
   filters:
   #会在转发时,去掉拼接的1级路径
   - StrimFilter = 1

过滤器

网关除了路由匹配功能意外,为了微服务集群访问安全考虑,还需要实现管理入口流量,身份校验的问题(解析JWT).

网关提供了过滤器功能.

 网关Gateway跨域的问题

Path Host断言都可以实现多服务网关入口.

Path做断言没有跨域问题的(路径断言 域名和端口统一的)

跨域: 只要资源访问请求原始域和目标域其中域名和端口有一个不一样,就叫做跨域.

spring:
  application:
    name: xxx-xxxx
  #由于gateway底层不是tomcat 和mvc有冲突的
  main:
    web-application-type: reactive
  #配置cloud gateway 逻辑,实现转发需求
  cloud:
    nacos:
      #nacos中注册发现的功能
      discovery:
        #填写nacos的服务端地址
        server-addr: localhost:8848
        #命名空间
        namespace: f033ea8e-15ca-4f37-b112-127edc03de9e
        #分组
        group: 1.0
    gateway:
      #动态路由
      discovery:
        locator:
          enabled: true
      globalcors:
        #解决options请求被拦截的问题
        add-to-simple-url-handler-mapping: true
        cors-configurations:
          #对那些路径请求,通过gateway网关管理跨域 /**
          '[/**]':
            #允许的跨域原地址 匹配范围
            allowedOriginPatterns: "*"
              #- "http://**.csmall.com"
              #- "http://*.baidu.com"
            #允许跨域原地址 具体的值
            #allowedOrigins: "http://www.csmall.com"
            allowedHeaders: "*"
              #- "Accept"
              #- "Cache-Enabled"
            allowedMethods: "*"
              #- "POST"
              #- "GET"
              #- "PUT"
              #- "DELETE"
              #- "OPTIONS"
            #是否允许携带凭证 比如jwt token等
            allowCredentials: true
            #预检测请求Options成功之后,有效时长,超过时长,再次预检测
            maxAge: 7200

sentinel

微服务架构中 , 切分的服务越多 , 调用关系就越复杂 .
如果在多个服务调用过程中 , 由于某个服务的实例故障 , 导致调用失败 , 延迟 , 等待 .
熔断降级
由调用者处理调用失败 , 影响导致全部链路瘫痪的问题 , 要使用的策略叫做熔断降级 .
        熔断
牺牲局部 , 保存全局 , 就是熔断 .( 局部就是故障的实例 )
在现有熔断机制中 , 都是采用 断路器 的规则 . 像一个开关一样 , 一旦发现调用出现临界阈值 ( 故障 ). 断路器将会处在断开 状态 , 实例之间就不可以相互访问 , 过一段时间 , 断路器 半开 状态 , 允许部分请求访问 , 如果访问成功 ,说明故障解除, 回归到 闭合 状态 , 如果不成功 , 继续断开状态 , 循环这个流程 .
短路器的三种状态 : 闭合 , 断开 , 半开
1. 发现调用失败 , 统计失败次数 , 次数达到断路器断开的要求 -- 断开
2. 断开一段时间之后 -- 半开
3. 半开请求成功执行 -- 闭合
4. 半开的请求没有成功 -- 断开
        降级
在服务 , 功能不可用的时候 , 采用退而求其次的数据 , 进行用户请求的响应 . 前提条件是 业务组成部分 , 当前 故障的数据 , 不是必要数据 ( 查询商品的时候 , 价钱 , 库存 , 商品信息是必要数据 , 但是评论缺少部分 , 全部缺少并不影响)
限流降级
目的 : 限流的目的 , 防止服务接收超过上限的请求 , 导致崩溃 .
根据服务器性能 , 配置 , 所有的实例都有上限访问量 , 比如 4C8G 运行的一个 tomcat 软件 , 承受的 并发 200-500,占用 cpu 线程 50 个左右 . 不可能无上限的承受访问 , 为了防止 访问雪崩 , 冲垮服务进程 , 要对程序做限流处理, 超出流量上限的 , 直接拒绝 , 或者排队等待 , 目的是保护服务进程 .
访问雪崩 : 功能服务集群 ( 微服务 ), 某个实例宕机 , 并发请求没有消失 , 压力 , 转给了其他人 .
流量计算中的一些概念和公式 : RT qps 并发 日 pv .
RT: Reaction Time 表示一次请求 , 服务器处理时长 .
服务器没有连接任何工具 ,mysql,redis,es,rocketmq. SS 框架 . 请求 10ms ( 时间花费 90% 都在
网络上 )
如果有第三方工具 (redis),10ms 左右
如果有第三方工具 (mysql 数据库 ),30-50ms, 考虑表格的具体数据量大小 , 考虑表格的优化 .
QPS: web 应用中 , 每秒访问的请求次数 .
并发 : web 应用中 , 同时在服务器中存在的请求数据量 ( 线程处理的请求 ). 服务器实例 ,web 实例的并发
是有上限的 ( 很大一部分程度取决于 CPU, 另一部分取决于代码设计 , 系统调优 )
pv(page view) : pv 表示一次请求 ( 静态数据 js css html json, 动态数据 ), QPS 有紧密的关系 .
需要通过 pv 计算 QPS.
QPS= 并发 /RT 一般计算上限使用的公式 .
pv=2 亿 能计算平均 qps 2300/s, 不是最高 QPS. 计算原则 : 2/8 原则 , 20% 时间段产生 80%pv .
2 亿 *0.8/(24*0.2*3600)=9000/s 如果每个服务 3000/s 需要 3
假设问的问题 : 集群什么规模 ,qps 最高多少 pv 多少 ?
1. pv=10 个亿 (RT 预估 80ms tomcat 并发 100 单台 qps1250) qps 上限 5 40 .
2. 数据库规模 redis 规模 ( 运维负责搭建集群 mysql 2000/s( 10 个左右 ) redis 1 /s(6 个左右 ))
sentinel重要的核心概念
资源
资源是 Sentinel 的关键概念。它可以是 Java 应用程序中的任何内容,例如,由应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。在接下来的文档中,我们都会用资源来描述代码块。只要通过 Sentinel API 定义的代码,就是资源,能够被 Sentinel 保护起来。大部分情况下,可以使用方法签名,URL ,甚至服务名称作为资源名来标示资源。
规则
围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
sentine 整合 nacos 读取文件数据源依赖
spring:
  cloud:
    sentinel:
      datasource:
        #定义一个数据源的名称
        key1:
          nacos:
            #数据源具体属性 nacos address namespace group-id 文件名称
            server-addr: localhost:8848
            #public DEFAULT_GROUP
            data-id: flowRules.json
            data-type: json
            #如果sentinel版本高于1.7 必须配置nacos用户名密码
            username: nacos
            password: nacos

限流的规则

  • resource: 定义当前规则绑定限制的资源id 名称

  • count: 限流的阈值,grade=1 表示qps上限,grade=0 表示并发上限

  • grade: 1 qps类型的限流 0 并发类型限流

  • strategy: 限流策略.以哪种方案和逻辑来限流 0直接 1关联 2链路

  • limitApp: 流控针对的调用来源,默认default不区分调用来源,配合strategy=1的是后和2的时候使用.

  • controlBehavior: 限流效果(0直接拒绝,1Warm up,2排队)

[
    {
       "resource":"addOrder",
       "count":"1",
       "grade":"1",
       "strategy":"1",
       "limitApp":"queryOrder",
       "controlBehavior":"0"
    }
]

常用注解:

  1. @SentinelResource:用于标注需要进行流量控制和熔断的方法。被标注的方法会被Sentinel框架自动保护,可以配置流控规则和熔断规则对方法的访问进行限制。

  2. @SentinelParam:用于标注方法参数,指示此参数应该被用于定义流量控制规则。被标注的参数会被用作限流规则的条件。

  3. @SentinelTransportFilter:用于标注需要进行流控的方法。可以通过在方法上标注该注解,并配置相应的流控规则,实现对方法的访问进行限制。

  4. @SentinelAuthority:用于标注需要进行授权的方法。被标注的方法会被Sentinel框架自动进行权限校验,只有通过授权的用户才能调用该方法。

  5. @SentinelFallback:用于标注熔断方法。被标注的方法会在被保护方法出现异常或触发熔断时被调用,用于提供降级的逻辑处理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值