目的:
搭配etcd的注册中心管理能知道谁能提供什么服务,并用rpc进行服务调用
封装思想:
信道管理,将不同服务主机的通信信道管理起来
封装:
1.指定的信道管理类
一个服务通常会有多个节点,每个节点都会有自己的信道类,建立信道与服务的映射关系,服务一对多信道。
2.总体的信道管理类
管理多个服务的信道管理类管理起来
tips:我们没必要将所有的服务信道都建立起来,我们得申明我们关心的服务,不关心的就可以不管理这个服务
#pragma once
#include <brpc/channel.h>
#include <string>
#include <vector>
#include <unordered_map>
#include <mutex>
#include <iostream>
#include "./logger.hpp"
namespace common{
class ServerChannel
{
public:
using ChannelPtr = std::shared_ptr<brpc::Channel>;
using Ptr = std::shared_ptr<ServerChannel>;
ServerChannel(const std::string &servername)
: _service_name(servername), _index(0)
{
}
void append(const std::string &host)
{
ChannelPtr newchannel=std::make_shared<brpc::Channel>();
brpc::ChannelOptions options;
options.connect_timeout_ms = -1; // 尝试连接时长
Default: 200 (milliseconds)
options.timeout_ms = -1; // rpc调用等待时间
// Max duration of RPC over this Channel RPC调用在信道的期间
options.protocol = "baidu_std";
options.max_retry = 3;
int ret = newchannel->Init(host.c_str(), &options);
if (ret == -1)
{
LOG_ERROR("初始化{}-{}信道失败!", _service_name, host);
return;
}
std::unique_lock<std::mutex> lock(_mutex);
_channels.push_back(newchannel);
_hosts.insert({host, newchannel});
}
// 服务器下线了一个节点,则把这个信道删除
void remove(const std::string &host)
{
std::unique_lock<std::mutex> lock(_mutex);
auto score = _hosts.find(host);
if (score == _hosts.end())
{
// 没找到
LOG_WARN("没有找到该服务中的服务为{}主机名为{}的信道", _service_name, host);
return;
}
// 找到了
ChannelPtr scoreptr = score->second;
for (auto it = _channels.begin(); it != _channels.end(); ++it)
{
if (*it == scoreptr)
{
_channels.erase(it);
break;
}
}
_hosts.erase(host);
LOG_INFO("服务为{}主机名为{}的信道已经删除", _service_name, host);
}
// 选择一个信道给这个服务
ChannelPtr choose()
{
std::unique_lock<std::mutex> lock(_mutex);
if (_channels.size() == 0)
{
LOG