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

2023-12-26 00:45

本文主要是介绍基于阿里云服务网格流量泳道的全链路流量管理(二):宽松模式流量泳道,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

作者:尹航

在前文基于阿里云服务网格流量泳道的全链路流量管理(一):严格模式流量泳道中,我们介绍了使用服务网格 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: ingressgatewaynamespace: istio-system
spec:selector:istio: ingressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- '*'

步骤一:部署示例服务

  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: asmswimlane-group: testname: asm-swimlane-test-mockanamespace: default
spec:rules:- labels:- name: asm-labelvalueFrom:- '$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: asmswimlane-group: testname: trafficlabel-dr-test-default-mockanamespace: istio-system
spec:host: mocka.default.svc.cluster.localsubsets:- labels:ASM_TRAFFIC_TAG: v1name: s1- labels:ASM_TRAFFIC_TAG: v2name: s2

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

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:labels:asm-system: 'true'provider: asmswimlane-group: testname: trafficlabel-vs-test-default-mockanamespace: istio-system
spec:hosts:- mocka.default.svc.cluster.localhttp:- name: defaultroute:- destination:host: mocka.default.svc.cluster.localsubset: $asm-labelfallback:target:host: mocka.default.svc.cluster.localsubset: 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: asmswimlane-group: testname: swimlane-ingress-vs-test-s2namespace: istio-system
spec:gateways:- istio-system/ingressgatewayhosts:- '*'http:- match:- headers:x-asm-prefer-tag:exact: s2uri:exact: /mockname: r2route:- destination:host: mocka.default.svc.cluster.localsubset: s2fallback:target:host: mocka.default.svc.cluster.localsubset: 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: ingressgatewaynamespace: istio-system
spec:selector:istio: ingressgatewayservers:- port:number: 80name: httpprotocol: HTTPhosts:- '*'

步骤一:部署示例服务

  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: asmswimlane-group: testname: trafficlabel-dr-test-default-mockanamespace: istio-system
spec:host: mocka.default.svc.cluster.localsubsets:- labels:ASM_TRAFFIC_TAG: v1name: s1- labels:ASM_TRAFFIC_TAG: v2name: s2

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

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:labels:asm-system: 'true'provider: asmswimlane-group: testname: trafficlabel-vs-test-default-mockanamespace: istio-system
spec:hosts:- mocka.default.svc.cluster.localhttp:- match:- headers:my-request-id:exact: s1route:- destination:host: mocka.default.svc.cluster.localsubset: s1fallback:target:host: mocka.default.svc.cluster.localsubset: s1- match:- headers:my-request-id:exact: s2route:- destination:host: mocka.default.svc.cluster.localsubset: s2fallback:target:host: mocka.default.svc.cluster.localsubset: s1- match:- headers:my-request-id:exact: s3route:- destination:host: mocka.default.svc.cluster.localsubset: s3fallback:target:host: mocka.default.svc.cluster.localsubset: 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: asmswimlane-group: testname: swimlane-ingress-vs-test-s2namespace: istio-system
spec:gateways:- istio-system/ingressgatewayhosts:- '*'http:- match:- headers:my-request-id:exact: s2uri:exact: /mockname: r2route:- destination:host: mocka.default.svc.cluster.localsubset: s2fallback:target:host: mocka.default.svc.cluster.localsubset: 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

这篇关于基于阿里云服务网格流量泳道的全链路流量管理(二):宽松模式流量泳道的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/537548

相关文章

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

使用jenv工具管理多个JDK版本的方法步骤

《使用jenv工具管理多个JDK版本的方法步骤》jenv是一个开源的Java环境管理工具,旨在帮助开发者在同一台机器上轻松管理和切换多个Java版本,:本文主要介绍使用jenv工具管理多个JD... 目录一、jenv到底是干啥的?二、jenv的核心功能(一)管理多个Java版本(二)支持插件扩展(三)环境隔

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

如何搭建并配置HTTPD文件服务及访问权限控制

《如何搭建并配置HTTPD文件服务及访问权限控制》:本文主要介绍如何搭建并配置HTTPD文件服务及访问权限控制的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、安装HTTPD服务二、HTTPD服务目录结构三、配置修改四、服务启动五、基于用户访问权限控制六、

Python中bisect_left 函数实现高效插入与有序列表管理

《Python中bisect_left函数实现高效插入与有序列表管理》Python的bisect_left函数通过二分查找高效定位有序列表插入位置,与bisect_right的区别在于处理重复元素时... 目录一、bisect_left 基本介绍1.1 函数定义1.2 核心功能二、bisect_left 与

Spring中管理bean对象的方式(专业级说明)

《Spring中管理bean对象的方式(专业级说明)》在Spring框架中,Bean的管理是核心功能,主要通过IoC(控制反转)容器实现,下面给大家介绍Spring中管理bean对象的方式,感兴趣的朋... 目录1.Bean的声明与注册1.1 基于XML配置1.2 基于注解(主流方式)1.3 基于Java

基于Python+PyQt5打造一个跨平台Emoji表情管理神器

《基于Python+PyQt5打造一个跨平台Emoji表情管理神器》在当今数字化社交时代,Emoji已成为全球通用的视觉语言,本文主要为大家详细介绍了如何使用Python和PyQt5开发一个功能全面的... 目录概述功能特性1. 全量Emoji集合2. 智能搜索系统3. 高效交互设计4. 现代化UI展示效果

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

Mysql中的用户管理实践

《Mysql中的用户管理实践》:本文主要介绍Mysql中的用户管理实践,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录13. 用户管理13.1 用户 13.1.1 用户信息 13.1.2 创建用户 13.1.3 删除用户 13.1.4 修改用户

SpringCloud整合MQ实现消息总线服务方式

《SpringCloud整合MQ实现消息总线服务方式》:本文主要介绍SpringCloud整合MQ实现消息总线服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、背景介绍二、方案实践三、升级版总结一、背景介绍每当修改配置文件内容,如果需要客户端也同步更新,