当前位置: 首页 > article >正文

服务发现和代理实例的自动更新

☞ 返回总目录

1.服务发现的两种方式

  • StartFindService 方法

    • 这是一个在后台启动的连续 “FindService” 活动,当服务实例的可用性发生变化时,会通过回调通知调用者。

    • 它返回一个FindServiceHandle,可通过调用StopFindService来停止正在进行的监视服务实例可用性的后台活动。

    • 其第一个参数是一个用户提供的处理函数(具有特定签名std::function<void(ServiceHandleContainer<T>, FindServiceHandle)>),每当匹配的服务实例可用性改变时,就会调用该处理程序,并提供更新后的服务实例句柄列表。

  • FindService 方法

    • 这是一次性调用,使用实例标识符的不同有两种重载方式(使用 ara::com::InstanceIdentifier 或 ara::core::InstanceSpecifier)。

    • 它为匹配的服务实例返回一个句柄容器,如果当前没有匹配的服务实例,容器可能为空。

2.Auto Update Proxy instance 相关问题

  • 服务启停后的重用问题

    • 当服务实例停止运行后又重新运行时,ara::com的设计要求从绑定实现中解决服务消费者端代理实例的重用问题。

    • 例如在服务消费者应用程序从 FindService 返回的句柄实例化服务代理实例后,在服务实例关闭再出现的过程中,服务代理实例的通信管理会被通知并静默更新(如在 T3 阶段传输层部分颜色从蓝色更改为玫瑰色),使得服务方法调用在服务实例再次可用时能够成功(T4 阶段)。

  • 对开发者的好处

    • 这种设计使客户端应用程序的实现者无需通过 GetSubscriptionState () 对事件进行轮询(仅在服务实例已关闭时才需调用)、无需重新调用 FindService 获取新句柄、无需重新注册FindServiceHandler(回调)以及重新创建代理实例和重新进行事件订阅调用等操作。

  • 代码示例说明

    • 在给定的代码片段中,radarServiceAvailabilityHandler函数展示了在服务实例可用性变化的处理函数中,与现有 Proxy 实例进行交互的情况。当服务实例再次启动时,对代理实例的调用(如myRadarProxy->Calibrate("test"))不应导致服务实例不可达的异常,因为代理实例应该已经自动更新。

3.StartFindService方法的大致实现步骤:

3.1. 启动服务查找后台活动

  • 初始化操作:当调用 StartFindService() 方法时,首先在后台开启一个持续的服务查找进程,这个进程负责不断监测符合条件的服务实例的可用性。

  • 参数接收:接收用户提供的处理函数(具有std::function<void(ServiceHandleContainer<T>, FindServiceHandle)>签名)作为第一个特定参数,同时进行其他必要参数的初始化。

3.1.1 监测服务实例可用性

  • 绑定检测机制:通过特定的绑定检测机制来跟踪服务实例的状态变化。这些绑定是由服务接口部署形式的服务实例清单中的相应服务接口配置的技术绑定。

  • 状态变化检测:持续检测那些与StartFindService() 的调用相匹配的服务实例的可用性是否发生改变。

3.1.2 回调处理

  • 触发条件:每当绑定检测到服务实例的可用性发生改变时,触发回调操作。

  • 回调执行:调用用户提供的处理函数,将包含当前可用的服务实例的句柄的更新列表(以 ServiceHandleContainer 容器形式)以及 FindServiceHandle 参数传递给该处理函数。

  • 初始调用:在 StartFindService() 被调用后,即使在初始阶段没有服务实例可用性的变化,也会使用当前可用的服务实例(可能是空的句柄列表)来触发用户提供的处理函数,类似于一次性的 FindService() 方法的行为。

3.1.3 停止服务查找

  • 停止机制:用户可以通过调用 StopFindService() 方法(使用 StartFindService() 返回的 FindServiceHandle)来停止正在进行的监视服务实例可用性的后台活动。

  • 序列化处理:在整个过程中,由于处理者不必是可重入的,所以绑定实现者必须负责序列化对用户提供的处理函数的调用,确保操作的有序性和正确性。


http://www.kler.cn/news/312041.html

相关文章:

  • Linux 基本使用和 web 程序部署 ( 8000 字 Linux 入门 )
  • 【python】后台程序初始化全流程
  • electron-vue安装与打包问题解决
  • js中箭头函数与普通函数的区别
  • 删除视频最后几帧 剪切视频
  • Vue3:el-table实现日期的格式化
  • 安卓 uniapp跨端开发
  • JVM 内存模型:堆、栈、方法区讲解
  • 如何使用Postman搞定带有token认证的接口实战!
  • VSCode C++ Tasks.json中的变量
  • 住宅HTTP代理:提升网络隐私与安全的新选择
  • Electron-vue asar 局部打包优化处理方案——绕开每次npm run build 超级慢的打包问题
  • 1.MySQL在Centos 7环境安装
  • STM32 -中断
  • mysql使用sql函数对json数组的处理
  • 首席数据官(CCRC-CDO)的职业价值
  • 学习最佳实践G4F中的编程技术:获得python项目的当前安装版本
  • 2024年【汽车驾驶员(高级)】考试报名及汽车驾驶员(高级)模拟考试题
  • 项目实战bug修复
  • pikachu XXE(XML外部实体注入)通关
  • TCP协议分析《实验报告》
  • 第三方接口-苹果-获取天气接口
  • Flask、Werkzeug 和 WSGI 间的关系
  • 代码随想录算法训练营第三十二天 | 509. 斐波那契数,70. 爬楼梯,746. 使用最小花费爬楼梯
  • PHP 实现 redis 分布式锁
  • 中间件安全(二)
  • 作品集生成链接或二维码:设计师求职
  • 数据结构和算法之线性结构
  • Java中Integer的缓存池是怎么实现的?
  • 旧系统迁移新框架:FastAPI 的 WSGIMiddleware 让过程变得简单