基于阿里云服务网格流量泳道的全链路流量管理(二):宽松模式流量泳道

作者:尹航

在前文基于阿里云服务网格流量泳道的全链路流量管理(一):严格模式流量泳道中,我们介绍了使用服务网格 ASM 的严格模式流量泳道进行全链路灰度管理的使用场景。该模式对于应用程序无任何要求,只需配置流量泳道即可实现。本文继续介绍流量泳道的第二种模式:宽松模式。

宽松模式流量泳道概述

与严格模式流量泳道相对的就是宽松模式流量泳道。在宽松模式下,您只需要确保创建一条包含调用链路中所有服务的泳道:基线泳道。其它泳道可以不包含调用链路上的全部服务。当一个泳道中的服务进行相互调用时,若目标服务在当前泳道中不存在,则请求将被转发到基线泳道中的相同服务,并在请求目标在当前泳道中存在时将请求重新转发回当前泳道。

使用宽松模式的流量泳道时,您的应用程序必须包含一个能够在整条调用链路中透传的请求头(链路透传请求头),且链路透传请求头的值对于每条请求都各不相同。同时,您需要指定一个引流请求头,ASM 网关将会根据引流请求头的内容将流量发往不同的流量泳道。本文介绍如何在 ASM 中使用宽松模式的流量泳道实现全链路流量管理。

宽松模式演练场景 1:在链路中未透传引流请求头

本文首先介绍宽松模式流量泳道最常用的使用场景,即调用链路中透传的请求头并非引流请求头的情况。

在这个宽松模式示例场景下,将使用如图所示的三个服务 mocka、mockb、mockc 创建代表服务调用链三个版本的三个泳道:s1、s2、s3。其中 s1 为基线泳道,包含完整的三个服务,而 s2 仅包含 mocka、mockc 两个服务,s3 仅包含 mockb 一个服务。

图片

前提条件

  • 已创建 ASM 企业版或旗舰版实例,且版本为 1.18.2.111 及以上。具体操作,请参见创建 ASM 实例[1]。
  • 已添加集群到 ASM 实例。具体操作,请参见添加集群到 ASM 实例[2]。
  • 已创建名称为 ingressgateway 的 ASM 网关。具体操作,请参见创建入口网关服务[3]。
  • 已创建名称为 ingressgateway 且命名空间为 istio-system 的网关规则。具体操作,请参见管理网关规则[4]。
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
 name: ingressgateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - '*'

步骤一:部署示例服务

  1. 为 default 命名空间启用 Sidecar 网格代理自动注入。具体操作,请参见启用自动注入[5]。关于自动注入的更多信息,请参见开启 Sidecar 自动注入[6]。2. 在 ACK 集群中执行以下命令,部署示例服务。
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v1/mock-v1.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v2/mock-v2.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v3/mock-v3.yaml

步骤二:创建泳道组和对应泳道

  1. 创建泳道组。

a. 登录 ASM 控制台[7],在左侧导航栏,选择服务网格 > 网格管理

b. 在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择流量管理中心 > 流量泳道

c. 在流量泳道页面,单击创建泳道组,在创建泳道组面板,配置相关信息,然后单击确定

配置项说明
泳道组名称本示例配置为test。
入口网关选择ingressgateway。
泳道模式选择宽松模式
请求头设定由于示例应用在调用链路中透传了请求头my-request-id,链路透传请求头填写my-request-id。引流请求头用于网关根据请求头内容向不同泳道引流及泳道上下文保持,可任意指定,这里引流请求头填写x-asm-prefer-tag。
泳道服务选择目标Kubernetes集群和default命名空间,在下方列表中选中mocka、mockb和mockc服务,单击图标,添加目标服务到已选择区域。

图片

配置完成后,会自动生成对应的流量标签 TrafficLabel。例如,针对 mocka 服务,会生成如下的流量标签 TrafficLabel。

apiVersion: istio.alibabacloud.com/v1beta1
kind: TrafficLabel
metadata:
 labels:
    asm-system: 'true'
    provider: asm
    swimlane-group: test
  name: asm-swimlane-test-mocka
  namespace: default
spec:
  rules:
    - labels:
        - name: asm-label
          valueFrom:
            - '$getExternalInboundRequestHeader(x-asm-prefer-tag, my-request-id)'
  workloadSelector:
    labels:
      app: mocka
  1. 创建 s1、s2、s3 泳道,并分别绑定 v1、v2、v3 版本。

a. 在流量泳道页面的流量规则定义区域,单击创建泳道

b. 在创建泳道对话框,配置相关信息,然后单击确定

配置项说明
泳道名称对于不同泳道,分别填写s1、s2和s3。
配置服务标签本示例中标签名称配置为ASM_TRAFFIC_TAG,针对s1、s2、s3泳道,标签值分别配置为v1、v2和v3。
添加服务对于s1泳道,选择mocka(default)、mockb(default)和mockc(default)。对于s2泳道,选择mocka(default)、mockc(default)。对于s3泳道,选择mockb(default)。

下图给出了创建 s1 泳道时的界面示例:

图片

默认情况下,您在泳道组中创建的第一个泳道将被设定为基线泳道,您可以修改基线泳道,当流量发往其它泳道中不存在的服务时,通过回退机制将请求转发至基线泳道。三个泳道创建完成后,示例效果如下:

图片

每创建一个泳道,会自动创建对应的目标规则 DestinationRule。例如,所有泳道创建完成后,会针对 s1 服务自动创建如下的目标规则 DestinationRule。

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
 labels:
    asm-system: 'true'
    provider: asm
    swimlane-group: test
  name: trafficlabel-dr-test-default-mocka
  namespace: istio-system
spec:
  host: mocka.default.svc.cluster.local
  subsets:
    - labels:
        ASM_TRAFFIC_TAG: v1
      name: s1
    - labels:
        ASM_TRAFFIC_TAG: v2
      name: s2

三个泳道创建完成后,针对泳道组中的每个服务都将生成泳道规则对应的虚拟服务 VirtualService。例如,针对 mocka 服务会自动创建如下虚拟服务 VirtualService。

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
 labels:
    asm-system: 'true'
    provider: asm
    swimlane-group: test
  name: trafficlabel-vs-test-default-mocka
  namespace: istio-system
spec:
  hosts:
    - mocka.default.svc.cluster.local
  http:
    - name: default
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: $asm-label
          fallback:
            target:
              host: mocka.default.svc.cluster.local
              subset: s1
  1. 创建各个泳道对应的引流规则。下文以创建 s1 泳道的引流规则为例进行说明,请参照以下步骤创建 s2 和 s3 泳道的引流规则。

a. 在流量泳道页面的流量规则定义区域,单击目标泳道右侧操作列下的引流规则

b. 在添加引流规则对话框,配置相关信息,然后单击确定。本文以泳道服务对应入口 API 均为 /mock 为例,为每个泳道配置相同的引流规则。

配置项说明
入口服务选择mocka.default.svc.cluster.local。
引流规则配置名称为r1,域名为*。
匹配请求的URI配置匹配方式为精确,匹配内容为/mock。

图片

三个泳道的引流规则创建成功后,示例效果如下:

图片

创建成功后,会自动生成每条泳道的引流规则,即虚拟服务 VirtualService。例如,针对泳道 s2 会生成如下的虚拟服务 VirtualService:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
 labels:
    asm-system: 'true'
    provider: asm
    swimlane-group: test
  name: swimlane-ingress-vs-test-s2
  namespace: istio-system
spec:
  gateways:
    - istio-system/ingressgateway
  hosts:
    - '*'
  http:
    - match:
        - headers:
            x-asm-prefer-tag:
              exact: s2
          uri:
            exact: /mock
      name: r2
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s2
          fallback:
            target:
              host: mocka.default.svc.cluster.local
              subset: s1

步骤三:验证全链路灰度功能是否生效

  1. 获取 ASM 网关的公网 IP。具体操作,请参见获取 ASM 网关地址[8]。

  2. 执行以下命令,设置环境变量。xxx.xxx.xxx.xxx 为上一步获取的 IP。

export ASM_GATEWAY_IP=xxx.xxx.xxx.xxx
  1. 验证全灰度链路功能是否生效。

a. 执行以下命令,查看 s1 泳道的访问效果。x-asm-prefer-tag 对应的值 s1 为步骤二创建 s1 泳道时配置的泳道名称。

for i in {1..100}; do curl   -H 'x-asm-prefer-tag: s1' -H'my-request-id: x000'$i http://${ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;

预期输出:

-> mocka(version: v1, ip: 172.17.0.54)-> mockb(version: v1, ip: 172.17.0.129)-> mockc(version: v1, ip: 172.17.0.130)

由预期输出得到,通过设置 HTTP 标头 x-asm-prefer-tag: s1 声明的流量流向 s1 泳道下的相关服务,符合预期。

b. 执行以下命令,查看 s2 泳道的访问效果。x-asm-prefer-tag 对应的值 s2 为步骤二创建 s2 泳道时配置的泳道名称。

for i in {1..100}; do curl   -H 'x-asm-prefer-tag: s2' -H'my-request-id: x000'$i http://${ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;

预期输出:

-> mocka(version: v2, ip: 172.17.0.9)-> mockb(version: v1, ip: 172.17.0.129)-> mockc(version: v2, ip: 172.17.0.128)

由预期输出得到,通过设置 HTTP 标头 x-asm-prefer-tag: s2 声明的流量流向 s2 泳道下的相关服务,当流量发往泳道 s2 中不存在的服务 mockb 时,流量通过回退机制发往基线泳道 s1 中的 mockb 服务,后续流量发往 mockc 服务时,目标重新设定为 s2 泳道中的 mockc 服务,符合预期。

c. 执行以下命令,查看 s3 泳道的访问效果。x-asm-prefer-tag 对应的值 s3 为步骤二创建 s3 泳道时配置的泳道名称。

for i in {1..100}; do curl   -H 'x-asm-prefer-tag: s3 -H'my-request-id: x000'$i' http://${ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;

预期输出:

mocka(version: v1, ip: 192.168.1.103)-> mockb(version: v3, ip: 192.168.1.120)-> mockc(version: v1, ip: 192.168.1.105)

由预期输出得到,通过设置 HTTP 标头 x-asm-prefer-tag: s3 声明的流量流向 s3 泳道下的相关服务,当流量发往泳道 s3 中不存在的服务 mockb、mockc 时,流量通过回退机制发往基线泳道 s1 中的 mockb、mockc 服务,符合预期。

宽松模式演练场景 2:在链路中已透传引流请求头

在宽松模式演练场景 1 中,引流请求头与链路透传请求头并不相同(分别为 my-request-id 和 x-asm-prefer-tag)。在这种情况下,需要链路透传请求头中的内容针对每次请求都不相同(即每次调用链路都有唯一的链路 id)。而如果同时将链路透传请求头也指定为引流请求头,则针对链路透传请求头不再需要上述的限制,只需用链路透传请求头的内容向不同泳道引流即可。

在第二个宽松模式示例场景下,将使用如图所示的三个服务 mocka、mockb、mockc 创建代表服务调用链三个版本的三个泳道:s1、s2、s3。其中 s1 为基线泳道,包含完整的三个服务,而 s2 仅包含 mocka、mockc两个服务,s3 仅包含 mockb 一个服务。同时,链路透传请求头与引流请求头都指定为 my-request-id。

图片

前提条件

  • 已创建 ASM 企业版或旗舰版实例,且版本为 1.18.2.111 及以上。具体操作,请参见创建 ASM 实例[1]。
  • 已添加集群到 ASM 实例。具体操作,请参见添加集群到 ASM 实例[2]。
  • 已创建名称为 ingressgateway 的 ASM 网关。具体操作,请参见创建入口网关服务[3]。
  • 已创建名称为 ingressgateway 且命名空间为 istio-system 的网关规则。具体操作,请参见管理网关规则[4]。
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
 name: ingressgateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - '*'

步骤一:部署示例服务

  1. 为 default 命名空间启用 Sidecar 网格代理自动注入。具体操作,请参见启用自动注入[5]。关于自动注入的更多信息,请参见开启 Sidecar 自动注入[6]。2. 在 ACK 集群中执行以下命令,部署示例服务。
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v1/mock-v1.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v2/mock-v2.yaml
kubectl apply -f https://alibabacloudservicemesh.oss-cn-beijing.aliyuncs.com/asm-labs/swimlane/v3/mock-v3.yaml

步骤二:创建泳道组和对应泳道

  1. 创建泳道组。

a. 登录 ASM 控制台[7],在左侧导航栏,选择服务网格 > 网格管理

b. 在网格管理页面,单击目标实例名称,然后在左侧导航栏,选择流量管理中心 > 流量泳道

c. 在流量泳道页面,单击创建泳道组,在创建泳道组面板,配置相关信息,然后单击确定

配置项说明
泳道组名称本示例配置为test。
入口网关选择ingressgateway。
泳道模式选择宽松模式
请求头设定在本例中,引流请求头与链路透传请求头都为my-request-id。
泳道服务选择目标Kubernetes集群和default命名空间,在下方列表中选中mocka、mockb和mockc服务,单击图标,添加目标服务到已选择区域。

图片

  1. 创建 s1、s2、s3 泳道,并分别绑定 v1、v2、v3 版本。

a. 在流量泳道页面的流量规则定义区域,单击创建泳道

b. 在创建泳道对话框,配置相关信息,然后单击确定

配置项说明
泳道名称对于三条泳道,泳道名称分别填写s1、s2和s3。
配置服务标签本示例中标签名称配置为ASM_TRAFFIC_TAG,针对s1、s2、s3泳道,标签值分别配置为v1、v2和v3。
添加服务对于s1泳道,选择mocka(default)、mockb(default)和mockc(default)。对于s2泳道,选择mocka(default)、mockc(default)。对于s3泳道,选择mockb(default)。

下图给出了创建 s1 泳道时的界面示例:

图片

默认情况下,您在泳道组中创建的第一个泳道将被设定为基线泳道,您可以修改基线泳道,当流量发往其它泳道中不存在的服务时,通过回退机制将请求转发至基线泳道。

三个泳道创建完成后,示例效果如下:

图片

每创建一个泳道,会自动创建对应的目标规则 DestinationRule。例如,所有泳道创建完成后,会针对 s1 服务自动创建如下的目标规则 DestinationRule。

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
 labels:
    asm-system: 'true'
    provider: asm
    swimlane-group: test
  name: trafficlabel-dr-test-default-mocka
  namespace: istio-system
spec:
  host: mocka.default.svc.cluster.local
  subsets:
    - labels:
        ASM_TRAFFIC_TAG: v1
      name: s1
    - labels:
        ASM_TRAFFIC_TAG: v2
      name: s2

三个泳道创建完成后,针对泳道组中的每个服务都将生成泳道规则对应的虚拟服务 VirtualService。例如,针对 mocka 服务会自动创建如下虚拟服务 VirtualService。

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
 labels:
    asm-system: 'true'
    provider: asm
    swimlane-group: test
  name: trafficlabel-vs-test-default-mocka
  namespace: istio-system
spec:
  hosts:
    - mocka.default.svc.cluster.local
  http:
    - match:
        - headers:
            my-request-id:
              exact: s1
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s1
          fallback:
            target:
              host: mocka.default.svc.cluster.local
              subset: s1
    - match:
        - headers:
            my-request-id:
              exact: s2
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s2
          fallback:
            target:
              host: mocka.default.svc.cluster.local
              subset: s1
    - match:
        - headers:
            my-request-id:
              exact: s3
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s3
          fallback:
            target:
              host: mocka.default.svc.cluster.local
              subset: s1
  1. 创建各个泳道对应的引流规则。下文以创建 s1 泳道的引流规则为例进行说明,请参照以下步骤创建 s2 和 s3 泳道的引流规则。

a. 在流量泳道页面的流量规则定义区域,单击目标泳道右侧操作列下的引流规则

b. 在添加引流规则对话框,配置相关信息,然后单击确定。本文以泳道服务对应入口 API 均为 /mock 为例,为每个泳道配置相同的引流规则。

配置项说明
入口服务选择mocka.default.svc.cluster.local。
引流规则配置名称为r1,域名为*。
匹配请求的URI配置匹配方式为精确,匹配内容为/mock。

图片

三个泳道的引流规则创建成功后,示例效果如下:

图片

创建成功后,会自动生成每条泳道的引流规则,即虚拟服务 VirtualService。例如,针对泳道 s2 会生成如下的虚拟服务 VirtualService:

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
 labels:
    asm-system: 'true'
    provider: asm
    swimlane-group: test
  name: swimlane-ingress-vs-test-s2
  namespace: istio-system
spec:
  gateways:
    - istio-system/ingressgateway
  hosts:
    - '*'
  http:
    - match:
        - headers:
            my-request-id:
              exact: s2
          uri:
            exact: /mock
      name: r2
      route:
        - destination:
            host: mocka.default.svc.cluster.local
            subset: s2
          fallback:
            target:
              host: mocka.default.svc.cluster.local
              subset: s1

步骤三:验证全链路灰度功能是否生效

  1. 获取 ASM 网关的公网 IP。具体操作,请参见获取 ASM 网关地址[8]。

  2. 执行以下命令,设置环境变量。xxx.xxx.xxx.xxx为上一步获取的 IP。

export ASM_GATEWAY_IP=xxx.xxx.xxx.xxx
  1. 验证全灰度链路功能是否生效。

a. 执行以下命令,查看 s1 泳道的访问效果。my-request-id 对应的值 s1 为步骤二创建 s1 泳道时配置的泳道名称。

for i in {1..100}; do curl -H'my-request-id: s1' http://${ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;

预期输出:

-> mocka(version: v1, ip: 172.17.0.54)-> mockb(version: v1, ip: 172.17.0.129)-> mockc(version: v1, ip: 172.17.0.130)

由预期输出得到,通过设置 HTTP 标头 my-request-id: s1 声明的流量流向 s1 泳道下的相关服务,符合预期。

b. 执行以下命令,查看 s2 泳道的访问效果。my-request-id 对应的值 s2 为步骤二创建 s2 泳道时配置的泳道名称。

for i in {1..100}; do curl -H'my-request-id: s2' http://${ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;

预期输出:

mocka(version: v2, ip: 192.168.1.101)-> mockb(version: v1, ip: 192.168.1.100)-> mockc(version: v2, ip: 192.168.1.116)

由预期输出得到,通过设置 HTTP 标头 my-request-id: s2 声明的流量流向 s2 泳道下的相关服务,当流量发往泳道 s2 中不存在的服务 mockb 时,流量通过回退机制发往基线泳道 s1 中的 mockb 服务,后续流量发往 mockc 服务时,目标重新设定为 s2 泳道中的 mockc 服务,符合预期。

c. 执行以下命令,查看 s3 泳道的访问效果。my-request-id 对应的值 s3 为步骤二创建 s3 泳道时配置的泳道名称。

for i in {1..100}; do curl -H'my-request-id: s3' http://${ASM_GATEWAY_IP}/mock ;  echo ''; sleep 1; done;

预期输出:

mocka(version: v1, ip: 192.168.1.103)-> mockb(version: v3, ip: 192.168.1.120)-> mockc(version: v1, ip: 192.168.1.105)

由预期输出得到,通过设置 HTTP 标头 my-request-id: s3 声明的流量流向 s3 泳道下的相关服务,当流量发往泳道 s3 中不存在的服务 mockb、mockc 时,流量通过回退机制发往基线泳道 s1 中的 mockb、mockc 服务,符合预期。

相关链接:

[1] 创建 ASM 实例

https://help.aliyun.com/document_detail/147793.html#task-2370657

[2] 添加集群到 ASM 实例

https://help.aliyun.com/document_detail/148231.html#task-2372122

[3] 创建入口网关服务

https://help.aliyun.com/document_detail/150510.html#task-2372970

[4] 管理网关规则

https://help.aliyun.com/document_detail/150504.html

[5] 启用自动注入

https://help.aliyun.com/document_detail/150501.html#section-30o-vil-3n7

[6] 开启 Sidecar 自动注入

https://help.aliyun.com/document_detail/186136.html#task-1962690

[7] ASM 控制台

https://servicemesh.console.aliyun.com/

[8] 获取 ASM 网关地址

https://help.aliyun.com/document_detail/444079.html#section-ida-zt6-md7

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/268586.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

4. java——多态(java巅峰设计,超越了C++的理解,取其精华,去其糟粕)

多态指的是同—个行为具有多个不同表现形式 。是指—个类实例(对象)的相同方法在不同情形下具有 不同表现形式。封装和继承是多态的基础,也就是说,多态只是—种表现形式而已。一个对象,同一个方法不同形态,方法必须重…

Redis源码精读:准备工作

文章目录 前言拉取源码项目结构源码阅读技巧最后 前言 我是醉墨居士,未来的一段时间里面我准备写一些关于Redis源码的文章,来帮助大家深入浅出Redis,希望大家多多支持🫠 拉取源码 git clone https://github.com/redis/redis项目…

大数据----基于sogou.500w.utf8数据的MapReduce编程

目录 一、前言二、准备数据三、编程实现3.1、统计出搜索过包含有“仙剑奇侠传”内容的UID及搜索关键字记录3.2、统计rank<3并且order>2的所有UID及数量3.3、上午7-9点之间&#xff0c;搜索过“赶集网”的用户UID3.4、通过Rank&#xff1a;点击排名 对数据进行排序 四、参…

爬虫响应cookie阿里系案例:某财经

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、响应cookie阿里系特点 cookie中一定有acw_sc__v2清除所有cookie刷新页面时&#xff0c;会自动debugger到设置cookie的文件…

YOLOv8改进 | 主干篇 | 利用SENetV2改进网络结构 (全网首发改进)

一、本文介绍 本文给大家带来的改进机制是SENetV2&#xff0c;其是2023.11月的最新机制(所以大家想要发论文的可以在上面下点功夫)&#xff0c;其是一种通过调整卷积网络中的通道关系来提升性能的网络结构。SENet并不是一个独立的网络模型&#xff0c;而是一个可以和现有的任何…

Spark集群部署与架构

在大数据时代&#xff0c;处理海量数据需要分布式计算框架。Apache Spark作为一种强大的大数据处理工具&#xff0c;可以在集群中高效运行&#xff0c;处理数十TB甚至PB级别的数据。本文将介绍如何构建和管理Spark集群&#xff0c;以满足大规模数据处理的需求。 Spark集群架构…

微服务实战系列之Dubbo(上)

前言 随着一年一度冬至的到来&#xff0c;2023的步伐也将远去。而博主的系列文章&#xff0c;也将从今天起&#xff0c;越来越聚焦如何构建微服务“内核”上。前序系列文章几乎囊括了微服务的方方面面&#xff0c;无论使用什么框架、组件或工具&#xff0c;皆可拿来用之。 那么…

数据处理系列课程 02:数据处理的科学性之初识NumPy

前面我们才提到数据处理是一件非常重要的事情&#xff0c;数据处理的是否得当直接关系到最终的成果&#xff0c;所以针对数据要做缺失值处理、离群点处理、重复值处理、噪声处理、规范化处理、离散化处理、稀疏化处理等处理&#xff0c;这些处理操作的基础都是建立在数学的基础…

[论文阅读笔记28] 对比学习在多目标跟踪中的应用

这次做一篇2D多目标跟踪中使用对比学习的一些方法. 对比学习通过以最大化正负样本特征距离, 最小化正样本特征距离的方式来实现半监督或无监督训练. 这可以给训练MOT的外观特征网络提供一些启示. 使用对比学习做MOT的鼻祖应该是QDTrack, 本篇博客对QDTrack及其后续工作做一个总…

Mac电脑如何彻底删除清除数据?CleanMyMac X软件更专业

虽然不用杀毒&#xff0c;但是日常的清理还是有必要的&#xff0c;特别是卸载一些软件会有残留&#xff0c;可以用命令mdfind来找&#xff0c;然后删&#xff0c;这里给新手用户推荐一款应用clean my mac x&#xff0c;定期清理一下&#xff0c;不用的时候关掉就可以。 CleanM…

JS常用事件大全

事件 事件通常与函数配合使用&#xff0c;这样就可以通过发生的事件来驱动函数执行。 注意&#xff1a;事件名称大小写敏感。若是事件监听方式&#xff0c;则在事件名的前面取消on。 1. 鼠标事件 给btn按钮添加点击事件&#xff0c;点击弹出 你好&#xff01; 2. 键盘事件…

智能优化算法应用:基于沙猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于沙猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于沙猫群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.沙猫群算法4.实验参数设定5.算法结果6.参考文…

YOLOv8改进 | 2023注意力篇 | MSDA多尺度空洞注意力(附多位置添加教程)

一、本文介绍 本文给大家带来的改进机制是MSDA&#xff08;多尺度空洞注意力&#xff09;发表于今年的中科院一区(算是国内计算机领域的最高期刊了)&#xff0c;其全称是"DilateFormer: Multi-Scale Dilated Transformer for Visual Recognition"。MSDA的主要思想是…

变量的存储类型(storage class)

变量的存储类型(storage class) 对于变量的存储类型&#xff0c;前面遇到过一些疑惑&#xff0c;再简单的在这里说一下。存储类型是指存储变量值的内存类型&#xff0c;它用来决定存储空间的大小。变量的存储类型决定着变量的存储器和作用域。有三个地方可以用于存储变量&#…

netstat的使用

netstat命令查看系统中网络连接状态&#xff0c;可以从显示的Linux网络系统状态信息得知整个Linux系统的网络情况&#xff0c;包括网络连接、路由表、接口状态、伪装连接、网络链路和组播成员组等信息。 语法&#xff1a;netstat [-acCeFghilMnNoprstuvVwx][-A<网络类型>…

算法学习系列(十):用数组模拟链表、双链表、栈、队列、单调栈、单调队列

目录 引言一、数组模拟链表1.模板2.例题3.测试 二、数组模拟双链表1.模板2.例题3.测试 三、数组模拟栈1.模板2.例题3.测试 四、数组模拟队列1.模板2.例题3.测试 五、数组模拟单调栈1.例题模板2.测试 六、数组模拟单调队列1.例题模板2.测试 引言 首先说一下为什么要拿数组来模拟…

DshanMCU-R128s2 SDK 架构与目录结构

R128 S2 是全志提供的一款 M33(ARM)C906(RISCV-64)HIFI5(Xtensa) 三核异构 SoC&#xff0c;同时芯片内部 SIP 有 1M SRAM、8M LSPSRAM、8M HSPSRAM 以及 16M NORFLASH。 本文档作为 R128 FreeRTOS SDK 开发指南&#xff0c;旨在帮助软件开发工程师、技术支持工程师快速上手&am…

[机器人-3]:开源MIT Min cheetah机械狗设计(三):嵌入式硬件设计

目录 概述&#xff1a; 1、硬件组成 2、通信速率 3、通信协议 4、mbedOS 概述&#xff1a; 以1条腿进行设计&#xff0c;其它腿也一样&#xff1a; 腿部硬件组成 1、硬件组成 1&#xff09;UP board计算机板卡&#xff08;Linux OS&#xff09;&#xff1a; 腿部控制器…

【重点!!!】【单调栈】84.柱状图中最大矩形

题目 法1&#xff1a;单调栈[原版] O(N)O(N) 必须掌握算法&#xff01;&#xff01;&#xff01; class Solution {public int largestRectangleArea(int[] heights) {int n heights.length, res 0;int[] leftMin new int[n], rightMin new int[n];Stack<Integer>…

基于HC-SR04传感器的避障机器人设计与实现

本文介绍了如何设计和实现一个基于HC-SR04超声波传感器的避障机器人。我们将详细讨论硬件和电路连接&#xff0c;并提供完整的Arduino代码。该机器人可以利用超声波传感器检测周围的障碍物&#xff0c;并采取相应的动作进行避障&#xff0c;实现自主导航。 引言&#xff1a; 避…