brpc的二次封装以及brpc与etcd的联合

目的:

搭配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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值