首页 文章 精选 留言 我的

精选列表

搜索[记忆机制],共10000篇文章
优秀的个人博客,低调大师

探索 Gateway API 在 Service Mesh 中的工作机制

前几天 Gateway API 宣布在 0.8.0 中支持服务网格,这意味着 GAMMA(GatewayAPI forMeshManagement andAdministration)有了新进展,虽然目前还是实验阶段。去年 6 月 Gateway API 发布 0.5.0 时,我还写了一篇 SMI 与 Gateway API 的 GAMMA 倡议意味着什么?。如今,SMI 作为 sandbox 项目的年度审查已经 过了几个月仍未提交,唏嘘。 废话不多说,我们来看下 0.8.0 下的 Gateway API 如何在 Service Mesh 中工作。 TL;DR Gateway API 对服务网格的支持仍然是实验阶段,但是已经有厂商跟进(当然也都是实验阶段)。 相比 Gateway API 处理南北向流量将路由绑定到 Gateway 资源 相比,在网格中路由则是与 Service 进行绑定。简单理解成 Service 代理了 Gateway 的角色,不过该 Service 是目标 Service。 Gateway API 中的服务网格 要说服务网格,我们先来看下服务 Service。 抽象 Service Service 中 Kubernetes 中是一个独立的资源,这里说的抽象是从逻辑上进行抽象,抽象成前端和后端两部分。 前端(Frontend)通常就是 Service 的 DNS 名字或者 ClusterIP;后端(Backend)则是通过标签选择器选择的 Endpoint 或者 EndpointSlice。 路由与服务 把路由直接绑定到 Service 上,被认为是当下最优的选择。Service 与其他资源的耦合度太高,比如 IP 分配、DNS、端点集合、负载均衡等等,但在目前的网格设计中也是唯一的最优选择,未来会寻求更好的选择,比如 ServiceBinding(见后文) 这样做的好处呢,就是将服务的前后端分别与现在的 xRoute API 中的 parentRef 和 backendRef 关联,无需引入额外的 API。 不同的时候,在 xRoute API 中的 backendRef 也可以是一个 Service,但是最终在路由请求时,目标还是 Endpoint 或者 EndpointSlice,只不过他们与 parentRef 中的 Service 不是强关联的。 kind: HTTPRoute metadata: name: smiley-route namespace: faces spec: parentRefs: - name: smiley kind: Service group: core port: 80 rules: ... 如果一个 Service 上配置了多个路由,匹配到多条路由的请求将被拒绝。 请求流程 客户端发送请求 网格数据面代理拦截请求 通过虚拟 IP 地址、DNS 主机名、或者名字来确认流量是属于哪个 Service(不会使用 xRoute 上的 hostname 字段) 如果 Service 没有配置路由,将使用请求的原始目的地进行转发 找到匹配的优先级最高(消费者路由高于生产者路由,见下文)的路由进行转发 如果配置了路由,但都无法匹配,则拒绝请求 路由的命名空间 为什么要提命名空间,是因为路由与服务在相同或者不同命名空间下所代表的含义不同。 同命名空间 路由 smiley-route 与 Service smiley 位于同一个命名空间 faces,该路由上设置了请求超时时间 100ms。这意味着,所有访问 Service smiley (来自任一命名空间下的任一工作负载)并匹配 smiley-route 路由规则的请求,都受该超时配置的影响。 这种路由被称为 生产者路由(Producer Route),影响目标为该服务的所有请求。 kind: HTTPRoute metadata: name: smiley-route namespace: faces spec: parentRefs: - name: smiley namespace: faces kind: Service group: core port: 80 rules: ... timeouts: request: 100ms 不同命名空间 路由 smiley-route 与 Service smiley 位于不同的命名空间,与上面不同的是,所有访问 Service smiley (来自命名空间 fast-clients 下的任一工作负载)并匹配 smiley-route 路由规则的请求,都受该超时配置的影响。 这种路由被称为 消费者路由(Consumer Route),影响同命名空间下访问木雕服务的所有请求。 kind: HTTPRoute metadata: name: smiley-route namespace: fast-clients spec: parentRefs: - name: smiley namespace: faces kind: Service group: core port: 80 rules: ... timeouts: request: 100ms 同一 Service 上的多个路由 这里的前提条件是这些路由都位于同一命名空间下,即同为生产者路由,或同为消费者路由。这种情况将会遵循 路由合并规则 多这个路由进行合并,如果要为同一命名空间下的多个工作负载配置不同的消费者路由,目前还无法实现。唯一的 比如下面定义了两个消费者路由 smiley-route-50 和 smiley-route-100 kind: HTTPRoute metadata: name: smiley-route-50 namespace: fast-clients spec: parentRefs: - name: smiley namespace: faces kind: Service group: core port: 80 rules: ... timeouts: request: 50ms --- kind: HTTPRoute metadata: name: smiley-route-100 namespace: fast-clients spec: parentRefs: - name: smiley namespace: faces kind: Service group: core port: 80 rules: ... timeouts: request: 100ms 路由与策略 之前也写文介绍过 Gateway API 中的策略,有兴趣的可以看一下 一文搞懂 Kubernetes Gateway API 的 Policy Attachment。 在网格中策略附加可以非常简单。策略可以应用于任何命名空间中的任何资源,但如果目标位于不同的命名空间中,则它只能应用于来自同一命名空间的请求(跟随消费者路由的逻辑)。 网格一致性测试 首先来看下何为 一致性配置文件: Gateway API 会提供用于一致性测试的配置文件,在运行一致性测试可以选择这些配置文件。然后将一致性结果报告回网关 API 项目并获得认证(例如徽章)。除了测试核心的功能,也可以自主添加厂商的特定实现中的扩展功能进行测试。 这些 Gateway API 的实现会将测试报告提交到 官方仓库的一致性测试报告目录 中,可以作为大家选型时的依据之一。 目前有 HTTP、TLS、TLSPassthrough(基本上都是根据 xRoute 来进行组织,因此后续也会有 GRPC、TCP、UDP)。针对服务网格,也提出了 mesh 配置文件。 官方博客 中提到 Kuma 2.3+、Linkerd 2.14+、和 Istio 1.16+ 中的 Gateway API 实现已经全部通过 mesh 一致性测试,但截止目前未看到测试报告,估计还在上传中。

优秀的个人博客,低调大师

声网 Token 鉴权机制,以及常见的问题

Token鉴权是什么? Token也称为动态密钥,是在加入频道时用于校验用户权限的一组字符串;鉴权是指在用户访问你的系统前,对其进行身份校验。用户在使用声网服务,如加入音视频通话或登录信令系统时,声网会使用 Token 对其鉴权。 我们为这种方式提供了一个较为形象的比喻,即: 某个展览馆需要游客实名认证后,获取专属入场券才可参观。游客在完成实名认证后可以获取到具备有效期限制的专属入场券,在进场时提供在有效期内的入场券,方能进场。其中: 展览馆相当于声网的服务,即音视频频道或信令系统等; 专属入场券相当于 Token; 实名认证步骤相当于结合 声网 AppID、频道号、用户 ID 等信息 获取到专属 Token 的步骤; 进场时校验入场券相当于鉴权,即校验 Token 是否和 声网 AppID、频道号、用户 ID 等信息匹配,且在有效期内。 声网的产品和服务中大部分采用Token 鉴权的方式。下面,我们针对如何生成和使用 Token,以及 Token 鉴权中常见的问题进行详细的讲解。 如何生成和使用Token? 1、Token 鉴权原理 在了解如何生成和使用Token 前,需要先了解 Token 鉴权的原理。 如图所示,共分为9个步骤: 1.客户端根据需要,向 app 服务端申请 Token 2.App 服务端生成并返回 Token 3.客户端以 UID、频道名以及获取到的 Token 加入频道 4.声网平台读取该 Token 中包含的信息,并进行校验 5.客户端收到加入频道成功回调,并获取用户 UID 6.Token 最大有效期为 24 小时。当即将过期时,客户端会收到 Token 即将过期的回调 7.此时,如果客户端需要继续进行音视频互动,需要申请新的 Token 8.App 服务端生成并返回 Token 9.客户端更新 Token 这个过程中,用户需要自行实现步骤1、2、3、7、8、9 的代码逻辑。 其中,对应的Token 包含以下信息: 你在声网控制台创建项目时生成的 App ID 频道名 用户 ID 用户权限,如是否能发流或收流 Token 的过期时间 2、申请与生成Token 可以看到,在用户加入频道前,客户端需要先向服务器申请Token,并在 服务器 生成 Token,且 Token 必须与 需要加入频道的用户所对应的 AppID、频道名、用户 ID(UID)信息、用户权限(是否能发流或收流) 一一对应,并且确保生成的 Token 在有效期内。然后才能以 UID、频道号 和 Token 加入对应频道。 向服务器申请Token,可以通过向服务器发送 GET 请求等方式自行实现,以下文章以供参考: 部署 Token 服务器(官方文档): https://docs.agora.io/cn/live-streaming-premium-4.x/token_server_ios_ng?platform=iOS#部署-token-服务器 用Token-Flutter 连接 Agora (2021-09-15) https://www.rtcdeveloper.cn/cn/community/blog/22929 使用 Swift 部署声网 Token 服务器 (2022-10-27): https://www.rtcdeveloper.cn/cn/community/blog/24981 在NET Core 上建立 Agora AccessToken 服务 (2020-11-14): https://www.rtcdeveloper.cn/cn/community/blog/19790 如何用 GoLang 为声网 Agora 应用构建 Token 服务器 (2020-12-09): https://www.rtcdeveloper.cn/cn/community/blog/20102 如何使用 NodeJS 为声网 Agora 应用构建 Token 服务器 (2020-12-03): https://www.rtcdeveloper.cn/cn/community/blog/20024 使用 Java 构建 Agora 令牌服务器 (2021-02-07): https://www.rtcdeveloper.cn/cn/community/blog/20709 用 Java 构建声网令牌服务器 (2023-01-10): https://www.rtcdeveloper.cn/cn/community/blog/25430 生成Token,可以使用声网提供的 Demo 实现,Demo 地址请参考:Token 生成器代码 请务必注意:例如用户使用 UID=123456(int 型)加入频道 ChannelName="test",那么生成 Token 时传入的参数 UID 和 ChannelName 必须是相对应的,即 UID=123456(int 型)且 ChannelName="test",否则会导致鉴权失败。 3、Token 过期处理 Token最大有效期为 24 小时。当即将过期时,客户端会收到 Token 即将过期的回调;Token 过期时,SDK 会触发 Token 过期回调。具体处理方式如下: 在 Token 过期前 30 秒,SDK 会触发 tokenPrivilegeWillExpire 回调。收到该回调后,客户端需要从服务器获取新的Token 并调用 renewToken 将新生成的 Token 传给 SDK。 Token 过期时,SDK 会触发 rtcEngineRequestToken 回调。收到该回调后,客户端需要从服务器获取新的 Token 并调用 joinChannel 方法,再使用新的 Token 重新加入频道。 一般来说,我们建议在Token 过期前,及时更新 Token,即从服务器获取新的 Token 并调用 renewToken 将新生成的Token 传给 SDK。 常见问题 当你的声网项目中不存在无证书并且启用了主要/次要证书,则表示你选择使用动态密钥 Token 对用户进行鉴权。 由于Token 具有一定的时效性,因此 app 在运行过程中,你有可能会收到如下与 Token 相关的错误码或事件回调。本文对这些事件进行了梳理,提供触发的原因以及解决方法,帮助你在 App 出现异常时进行问题排查。 101:App ID无效 问题描述: Native 端:SDK 在初始化声网服务时返回错误码 ERR_INVALID_APP_ID(101);或调用 joinChannel 方法加入频道时,SDK 回调 onError 事件,并报告错误码 ERR_INVALID_APP_ID(101)。 Web 端:在初始化 声网服务或调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_INVALID_VENDOR_KEY(101)。 问题原因: 不是有效的App ID,一般是由于 App ID 的数据类型不对引起的。 解决方法: 建议检查 App ID 数据格式是否有效。声网的 App ID 为 String 型,请使用正确数据类型的 App ID,重新初始化声网服务。 109/118/2:Token 已过期 问题描述: Native 端:调用 joinChannel 方法加入频道时,SDK 回调 onError 事件,并报告错误码 ERR_TOKEN_EXPIRED(109)。 Web 端:调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_DYNAMIC_KEY_TIMEOUT(109)或ERR_DYNAMIC_KEY_EXPIRED(118)。 问题原因: Token过期。 解决方法: Token一旦过期,你就需要在服务端重新生成一个 Token,然后调用 renewToken 方法尝试重新加入频道。 110:Token 无效 问题描述: Native 端:调用 joinChannel 方法加入频道时,SDK 回调 onError 事件,并报告错误码 ERR_INVALID_TOKEN(110)。 Web 端:调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_NO_AUTHORIZED(110)。 问题原因: 生成的 Token 无效。一般有以下原因: 你的声网项目中不存在无证书并且启用了主要/次要证书,但是加入频道时却未传入 Token;或者项目未开启主要/次要证书,就试图使用 Token 加入频道。 你在服务端生成 Token 时填入的 App ID、用户 ID 和频道名,与你初始化和加入频道时填入的 App ID、用户 ID 和频道名不匹配。 解决方法: 在加入频道前,请确认你在初始化时填入的 App ID 对应的项目是否已启用主要/次要证书。 如果未启用主要/次要证书,则不能使用 Token 加入频道。 如果项目中存在无证书并且已启用主要/次要证书,则既可以仅使用 App ID 加入频道,也可以使用主要/次要证书生成的 Token 加入频道。 如果项目中不存在无证书并且已启用主要/次要证书,则必须使用 Token 加入频道。 当确认使用 Token 加入频道时,还需要确认: 用于生成 Token 的 App ID 和初始化服务时填入的 App ID 一致。 用于生成 Token 的用户 ID 和加入频道时填入的用户 ID 一致,且数据类型也一致。 用于生成 Token 的频道名和加入频道时填入的频道名一致。 119:静态厂商使用动态密钥 该错误码仅适用于RTC Web SDK。 问题描述: Web端调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_STATIC_USE_DYNAMIC_KEY(119)。 问题原因: 表示静态厂商使用了动态密钥。一般是由于使用的 App ID 对应的声网项目未启用主要/次要证书,却试图使用 Token 加入频道引起。 解决方法: 对于未开启主要/次要证书的项目,你可以不使用 Token 加入频道。你也可以先启用主要/次要证书,然后在服务端生成 Token 后重新加入频道。 120:动态厂商使用静态密钥 该错误码仅适用于RTC Web SDK。 问题描述: Web端调用 Client.join 方法加入频道时,Console 控制台打印错误码 ERR_DYNAMIC_USE_STATIC_KEY(120)。 问题原因: 表示动态厂商使用了静态密钥。一般是由于使用的 App ID 对应的声网项目中不存在无证书并且已启用主要/次要证书,加入频道时却没有传入 Token 引起。 解决方法: 如果 App ID 对应的项目中不存在无证书并且已启用主要/次要证书,则必须使用 Token 进行鉴权。你也可以换一个没有启用主要/次要证书的项目的 App ID,然后尝试重新加入频道。 Token过期相关事件回调 为保证通信体验,声网提供如下两个回调,提醒用户Token 即将过期或已经过期: onTokenPrivilegeWillExpire:该回调表示 Token 即将在 30 秒内失效。收到这个回调时,你需要在服务端重新生成Token,然后调用 renewToken 方法,将新生成的 Token 传给 SDK。 onRequestToken(Web 平台为 onTokenPrivilegeDidExpire):该回调表示 Token 已经失效。收到这个回调时,你需要在服务端重新生成 Token,然后调用 joinChannel 方法重新尝试加入频道。 各语言Token错误码对照 附录 注册并试用每月 10000 分钟免费的声网视频SDK,体验四行代码、三十分钟快速构建沉浸式实时互动场景 下载体验声网相关 SDK & Demo

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册