之前编译了fdbus后,需要测试下在不同pc下能否互通;因为没搞过这东西,所以在网上查了下,下面列举下具体步骤:
- 架构如下:
- 解释 :
由于name server的地址是固定的,endpoint启动后,会自动连接到name server注册(server)或解析(client)名字。如果有多台主机,每台主机上运行自己的name server,负责各自的名字服务,那么这些主机就成了孤岛,无法通过svc://server_name这样的服务名称互相连接。当然client可以绕开name server,用实际地址直接连接上server,但这样无法灵活部署和组网。为了支持跨网络的名字解析,需要有一个服务来管理系统里所有主机,把主机信息同步给所有name server,进而这些name server之间可以建立连接,协同工作,共同完成全网范围内的名字服务。这个服务就是host server。
host server的工作原理是:整个网络运行一个host server,可以位于任意一台大家都能访问的主机上。所有主机的name server都连接到host server,向它注册自己所在的主机。host server维护一张包含各主机ip地址的主机列表,并把该表同步给网络里所有的name server。name server根据该表与网络里所有主机上的name server建立连接。
一旦所有主机上的name server都两两建立连接,就可以通过一套内部协议完成跨主机的服务名解析和服务上线通知。例如当一台主机上的client向本地name server请求解析服务名对应的地址,本地name server可以把该请求广播给所有相连的name server,在整个网络范围内查找服务。
因此我们需要按照对应的架构启动对应程序
- 具体操作
- 我这里使用QNX开发板作为PC1,Linux系统为PC2
PC1
启动host_server | ./host_server & |
启动name_server | ./name_server & |
启动fdbServer | ./fdbServer |
PC2
启动name_server | ./name_server -n PC2 -u tcp://192.168.1.104:60000 |
启动fdbServer | ./fdbClient |
可以看到现在客户端已经连接上服务端
查看svc可以看到对应服务状态
上述Client和Server是自己仿照fdbus-exmple写的用例;代码如下
client.h
#ifndef __CLIENT_H__
#define __CLIENT_H__
#include <fdbus/fdbus.h>
#include <fdbus/CFdbProtoMsgBuilder.h>
using namespace ipc::fdbus;
static CBaseWorker main_worker;
class Client : public CBaseClient {
public:
Client(const char *name, CBaseWorker *work = nullptr);
~Client();
protected:
void onOnline(const CFdbOnlineInfo &info);
void onOffline(const CFdbOnlineInfo &info);
void onBroadcast(CBaseJob::Ptr &msg_ref);
void onInvoke(CBaseJob::Ptr &msg_ref);
};
#endif //__CLIENT_H__
client.cpp
#include "client.h"
Client::Client(const char *name, CBaseWorker *work)
: CBaseClient(name, work) {
}
Client::~Client() {
}
void Client::onOnline(const CFdbOnlineInfo &info) {
printf("client session online: %d, secure: %d\n", info.mSid, info.mQOS);
}
void Client::onOffline(const CFdbOnlineInfo &info) {
printf("client session shutdown: %d, secure: %d\n", info.mSid, info.mQOS);
}
void Client::onBroadcast(CBaseJob::Ptr &msg_ref) {
printf("client onBroadcast\n");
}
void Client::onInvoke(CBaseJob::Ptr &msg_ref) {
printf("client onInvoke\n");
}
int main() {
printf("fdbus client start!\n");
FDB_CONTEXT->start();
fdbLogAppendLineEnd(true);
FDB_CONTEXT->registerNsWatchdogListener([](const tNsWatchdogList &dropped_list)
{
for (auto it = dropped_list.begin(); it != dropped_list.end(); ++it)
{
printf("Error!!! Endpoint drops - name: %s, pid: %d\n", it->mClientName.c_str(), it->mPid);
}
});
CBaseWorker *worker_ptr = &main_worker;
worker_ptr->start();
std::string server_name = "mjc";
std::string url(FDB_URL_SVC);
url += server_name;
server_name += "_client";
auto client = new Client(server_name.c_str(), worker_ptr);
client->enableReconnect(true);
client->enableUDP(true);
int ret = client->connect(url.c_str());
printf("client connect:%s,ret:%d\n",url.c_str(),ret);
CBaseWorker background_worker;
background_worker.start(FDB_WORKER_EXE_IN_PLACE);
}
server.h
#ifndef __SERVER_H__
#define __SERVER_H__
#include <fdbus/fdbus.h>
#include <fdbus/CFdbProtoMsgBuilder.h>
using namespace ipc::fdbus;
static CBaseWorker main_worker;
class Server : public CBaseServer
{
public:
Server(const char *name, CBaseWorker *work = nullptr);
~Server();
protected:
void onOnline(const CFdbOnlineInfo &info);
void onOffline(const CFdbOnlineInfo &info);
void onSubscribe(CBaseJob::Ptr &msg_ref);
void onInvoke(CBaseJob::Ptr &msg_ref);
};
#endif //__SERVER_H__
server.cpp
#include "server.h"
Server::Server(const char *name, CBaseWorker *work)
: CBaseServer(name, work) {
}
Server::~Server() {
}
void Server::onOnline(const CFdbOnlineInfo &info) {
if(info.mFirstOrLast) {
printf("First Client connected\n");
}
}
void Server::onOffline(const CFdbOnlineInfo &info) {
if(info.mFirstOrLast) {
printf("server session shutdown: %d, secure: %d\n", info.mSid, info.mQOS);
}
}
void Server::onSubscribe(CBaseJob::Ptr &msg_ref) {
printf("Server onSubscribe\n");
}
void Server::onInvoke(CBaseJob::Ptr &msg_ref) {
printf("Server onInvoke\n");
}
int main() {
printf("fdbus server start\n");
FDB_CONTEXT->start();
CBaseWorker *worker_ptr = &main_worker;
worker_ptr->start();
std::string server_name = "mjc";
std::string url(FDB_URL_SVC);
url += server_name;
server_name += "_server";
auto server = new Server(server_name.c_str(), worker_ptr);
server->enableWatchdog(true);
server->enableUDP(true);
server->setExportableLevel(FDB_EXPORTABLE_SITE);
// server->setExportableLevel(FDB_EXPORTABLE_DOMAIN);
server->bind(url.c_str());
printf("server bind:%s\n",url.c_str());
CBaseWorker background_worker;
background_worker.start(FDB_WORKER_EXE_IN_PLACE);
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.0)
project(fdbDemo)
option(COMPILE_PLATFORM_QNX "compile platform is qnx" ON)
if(COMPILE_PLATFORM_QNX)
SET(CMAKE_CXX_COMPILER aarch64-unknown-nto-qnx7.0.0-g++)
SET(CMAKE_C_COMPILER aarch64-unknown-nto-qnx7.0.0-gcc)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/thirdpart/fdbus-qnx/include
${CMAKE_CURRENT_SOURCE_DIR}/thirdpart/protobuf-qnx/include)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/fdbusclient FDBCLIENT)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/fdbusserver FDBSERVER)
LINK_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/thirdpart/fdbus-qnx/lib
${CMAKE_CURRENT_SOURCE_DIR}/thirdpart/protobuf-qnx/lib)
set(LIB_LIST protobuf fdbus)
else()
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/thirdpart/fdbus-linux/include
${CMAKE_CURRENT_SOURCE_DIR}/thirdpart/protobuf-linux/include)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/fdbusclient FDBCLIENT)
aux_source_directory(${CMAKE_CURRENT_SOURCE_DIR}/fdbusserver FDBSERVER)
LINK_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/thirdpart/fdbus-linux/lib
${CMAKE_CURRENT_SOURCE_DIR}/thirdpart/protobuf-linux/lib)
set(LIB_LIST protobuf fdbus pthread)
endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC -Wall -std=c++11")
ADD_EXECUTABLE(fdbServer ${FDBSERVER})
TARGET_LINK_LIBRARIES(fdbServer ${LIB_LIST})
ADD_EXECUTABLE(fdbClient ${FDBCLIENT})
TARGET_LINK_LIBRARIES(fdbClient ${LIB_LIST})
message(${CMAKE_SYSTEM_NAME})
默认打开了QNX宏,需要编译linux的版本关掉即可
- 文件目录结构如下:(tree下载不下来,先这么看吧)
参考文档:
Docker Image for FDBus - 灰信网(软件开发博客聚合) (freesion.com)https://www.freesion.com/article/9824284277/Fast Distributed Bus - FDBus:高速分布式总线以及中间件开发框架_jeremy_cz的博客-CSDN博客
https://blog.csdn.net/jeremy_cz/article/details/89060291