首页 > 其他分享 >服务发现全流程解析-APOLLO7.0

服务发现全流程解析-APOLLO7.0

时间:2024-06-11 18:00:10浏览次数:14  
标签:std participant attr 流程 manager APOLLO7.0 rtps conf 解析

cyber服务发现完全依赖于fastDDS,下面从底层一步一步看下服务发现的整个过程。

topology_manager.cc

首先从这个类看起,这个类是和dds接壤的,dds发现后,完全由这个类接管,然后整体开始通信。

TopologyManager::TopologyManager()
    : init_(false),
      node_manager_(nullptr),
      channel_manager_(nullptr),
      service_manager_(nullptr),
      participant_(nullptr),
      participant_listener_(nullptr) {
  Init();
}

从上面的构造函数开始分析,除了赋值一些变量,还有就是调用了init函数, 其中node_manager_、channel_manager_、service_manager_是拓扑结构的一些类成员,participant_、participant_listener_很明显就是FAST_RTPS内部的参与者以及监听事件。紧接着进行了init初始化。

init

init函数就是整个topology_manager初始化的过程,下面逐步分析代码。

bool TopologyManager::Init() {
  if (init_.exchange(true)) {
    return true;
  }

  node_manager_ = std::make_shared<NodeManager>();
  channel_manager_ = std::make_shared<ChannelManager>();
  service_manager_ = std::make_shared<ServiceManager>();

  CreateParticipant();

  bool result =
      InitNodeManager() && InitChannelManager() && InitServiceManager();
  if (!result) {
    AERROR << "init manager failed.";
    participant_ = nullptr;
    delete participant_listener_;
    participant_listener_ = nullptr;
    node_manager_ = nullptr;
    channel_manager_ = nullptr;
    service_manager_ = nullptr;
    init_.store(false);
    return false;
  }

  return true;
}

上面首先是创建了三个share_ptr,分别对应NodeManager、ChannelManager、ServiceManager单个类,然后调用CreateParticipant创建participant_。然后对于三个mangger进行了初始化操作,,我们逐步进入分析。

node_manager_ = std::make_shared<NodeManager>();

首先就是上面的代码创建nodemanger,具体要看nodemanger类里面干了啥,所以暂时跳转到nodemanger.cc.

NodeManager、ChannelManager、ServiceManager他们三个都继承了manger类,主要用于记录节点间的关系及节点网络的图结构,紧接着,调用了CreateParticipant函数创建participant,再调用了initNodeMangger去初始化,具体要看函数实现。

CreateParticipant

bool TopologyManager::CreateParticipant() {
  std::string participant_name =
      common::GlobalData::Instance()->HostName() + '+' +
      std::to_string(common::GlobalData::Instance()->ProcessId());
  participant_listener_ = new ParticipantListener(std::bind(
      &TopologyManager::OnParticipantChange, this, std::placeholders::_1));
  participant_ = std::make_shared<transport::Participant>(
      participant_name, 11511, participant_listener_);
  return true;
}

这个函数就是使用fastdds的接口创建一个用于全局服务发现的participant,对于cyber的rtps相关的操作,可以看下participant.cc,里面可以看到和rtps官方demo一样的代码,用于通信。participant.cc中官方又封装了一层,然后来初始化和创建participant。

participant
Participant::Participant(const std::string& name, int send_port,
                         eprosima::fastrtps::ParticipantListener* listener)
    : shutdown_(false),
      name_(name),
      send_port_(send_port),
      listener_(listener),
      fastrtps_participant_(nullptr) {}
      
eprosima::fastrtps::Participant* Participant::fastrtps_participant() {
  if (shutdown_.load()) {
    return nullptr;
  }

  std::lock_guard<std::mutex> lk(mutex_);
  if (fastrtps_participant_ != nullptr) {
    return fastrtps_participant_;
  }

  CreateFastRtpsParticipant(name_, send_port_, listener_);
  return fastrtps_participant_;
}

void Participant::CreateFastRtpsParticipant(
    const std::string& name, int send_port,
    eprosima::fastrtps::ParticipantListener* listener) {
  uint32_t domain_id = 80;

  const char* val = ::getenv("CYBER_DOMAIN_ID");
  if (val != nullptr) {
    try {
      domain_id = std::stoi(val);
    } catch (const std::exception& e) {
      AERROR << "convert domain_id error " << e.what();
      return;
    }
  }

  auto part_attr_conf = std::make_shared<proto::RtpsParticipantAttr>();
  auto& global_conf = common::GlobalData::Instance()->Config();
  if (global_conf.has_transport_conf() &&
      global_conf.transport_conf().has_participant_attr()) {
    part_attr_conf->CopyFrom(global_conf.transport_conf().participant_attr());
  }

  eprosima::fastrtps::ParticipantAttributes attr;
  attr.rtps.port.domainIDGain =
      static_cast<uint16_t>(part_attr_conf->domain_id_gain());
  attr.rtps.port.portBase = static_cast<uint16_t>(part_attr_conf->port_base());

  attr.rtps.builtin.discovery_config.discoveryProtocol =
      eprosima::fastrtps::rtps::DiscoveryProtocol_t::SIMPLE;
  attr.rtps.builtin.discovery_config.m_simpleEDP
      .use_PublicationWriterANDSubscriptionReader = true;
  attr.rtps.builtin.discovery_config.m_simpleEDP
      .use_PublicationReaderANDSubscriptionWriter = true;

  attr.domainId = domain_id;

  /**
   * The user should set the lease_duration and the announcement_period with
   * values that differ in at least 30%. Values too close to each other may
   * cause the failure of the writer liveliness assertion in networks with high
   * latency or with lots of communication errors.
   */

  attr.rtps.builtin.discovery_config.leaseDuration.seconds =
      part_attr_conf->lease_duration();
  attr.rtps.builtin.discovery_config.leaseDuration_anno

标签:std,participant,attr,流程,manager,APOLLO7.0,rtps,conf,解析
From: https://blog.csdn.net/qq_38643642/article/details/139604429

相关文章

  • 优化MySQL连接管理:深入解析max_connections参数与解决Too Many Connections策略
    前言​在现代的数据库管理中,合理配置max_connections参数对于确保MySQL数据库的稳定性和高效性至关重要。本文将深入探讨max_connections的基本概念,分析导致“Toomanyconnections”错误的常见原因,并提供一系列解决方案,以帮助数据库管理员和开发者优化数据库性能。基本......
  • 爬虫 | xpath + lxml 库 解析爬取网页
    lxml库是用来解析XML和HTML网页内容的Xpath库则是用来查询数据(XPath表达式是一种在XML文档中查找信息的语言,它同样适用于HTML文档)简单示例:#先pipinstalllxmlimportrequestsfromlxmlimportetree#etree主要是用来解析和操作XML/HTML文档#步骤3:获取......
  • NAT-DDNS内网穿透技术,快解析DDNS的优势
    进行NAT穿透,是为了使具有某一个特定源IP地址和源端口号的数据包不被NAT设备屏蔽而正确路由到内网主机。对于穿透类型,一般分为两大类,一是基础NAT,另一个是NAPT,大家可能并不怎么了解。今天小编来为大家详细说一说内网穿透技术中基础NAT和NAPT,以及NAPT中对称型NAT和非对称型N......
  • 内网穿透的方式有哪些——快解析的优势
    外网穿透内网技术,即内网映射,是把目标本地内网地址和端口发布到互联网,是一种由内网开放到外网的权限操作。那么,内网穿透的方法有哪些呢?做映射外网的方法。需要结合自己本地网络环境和应用场景来实施。这里分享三种方法,只要是能上网的网络环境,都可以通过这三种方式实现内网穿透。......
  • Redis:原理、概念、用法与实例解析
    Redis:原理、概念、用法与实例解析在当今风起云涌的技术领域中,Redis犹如一颗璀璨的明星,闪耀着独特的光芒。它作为一种备受瞩目的数据存储和缓存解决方案,以其卓越的性能、丰富多样的功能以及简单易用的特性,成为了众多开发者的心头好。在这篇博客中,我们将全方位、深层次地探......
  • 印尼slots游戏pwa推广脸书fb广告代投流程
    印尼slots游戏pwa推广脸书fb广告代投合作流程脸书广告代投合作流程在印尼推广slots游戏PWA(ProgressiveWebApp)的过程中,选择脸书FB广告平台进行投放是一个明智的选择。为了顺利进行这一合作流程,我们需要明确以下几个关键步骤:首先,与广告代投公司建立联系并进行初步沟通。这包......
  • 安全防护与隐私保护:淘宝在线扭蛋机用户数据安全的深度解析
    淘宝在线扭蛋机作为一种集购物与娱乐于一体的新型平台,用户数据的安全性至关重要。本文将深入探讨如何采取有效措施,确保在线扭蛋机用户数据的安全性,防止数据泄露和滥用。一、构建多层次安全防护体系为了应对复杂的网络安全威胁,我们将构建多层次的安全防护体系。这包括网络层......
  • presto 查询调度流程 (Coordinator Scheduler)
    basedontag:0.287presto的scheduler是SqlQueryScheduler这个类控制的,这个class主要是负责调度物理执行计划。调度具体的每个SqlStageExecution.这个Stage可以当成Fragment的一个概念他会先把所有的stage创建一个schedule计划。一共有两种schedule计划,一个是all-at-on......
  • 蓝桥杯软件测试第十五届蓝桥杯模拟赛1期题目解析
    PS需要第十五界蓝桥杯模拟赛1期功能测试模板、单元测试被测代码、自动化测试被测代码请加......
  • 浙大版PTA python程序设计 第四章题目及知识点解析整理
    第四章--1--在循环中continue语句的作用是(结束本次循环)退出循环的当前迭代  √ 带有else子句的循环如果因为执行了break语句而退出的话,会执行else子句的代码。×因为break是跳出整个循环,所以如果循环体内有else子句,且循环是通过break退出的,那么else子句中的代码也不......