2021SC@SDUSC
将服务器添加到Upstream
int UpstreamManager::upstream_add_server(const std::string& name,
const std::string& address,
const AddressParams *address_params)
{
WFNameService *ns = WFGlobal::get_name_service();
UPSGroupPolicy *policy = dynamic_cast<UPSGroupPolicy *>(ns->get_policy(name.c_str()));
if (policy)
{
policy->add_server(address, address_params);
return 0;
}
errno = ENOENT;
return -1;
}
upstream_add_server(const std::string& name, const std::string& address,const AddressParams *address_params),使用自定义配置将服务器加到Upstream。
需要传入第一个形参是upstream name。
address可以是IP / host / ip:port / host:port / unix-domain-socket,ip用于在tcp/ip网络上唯一标识一台机器,host用于在系统山标识一台机器,port用于指定特定的端口。
unix-domain-socket 用于实现同一主机上的进程间通信,它不需要经过网络协议栈,不需要打包拆包、计算校验和、维护序号和应答等,只是将应用层数据从一个进程拷贝到另一个进程。它是全双工的,即允许数据在两个方向上同时传输。Unix-domain-socket目前已成为使用最广泛的IPC机制。
在WFServiceGovernance.h文件中可看见AddressParams的结构,并给出了详细的注释。下面还有默认配置ADDRESS_PARAMS_DEFAULT。
struct AddressParams
{
struct EndpointParams endpoint_params; ///< Connection config
unsigned int dns_ttl_default; ///< in seconds, DNS TTL when network request success
unsigned int dns_ttl_min; ///< in seconds, DNS TTL when network request fail
/**
* - The max_fails directive sets the number of consecutive unsuccessful attempts to communicate with the server.
* - After 30s following the server failure, upstream probe the server with some live client`s requests.
* - If the probes have been successful, the server is marked as a live one.
* - If max_fails is set to 1, it means server would out of upstream selection in 30 seconds when failed only once
*/
unsigned int max_fails; ///< [1, INT32_MAX] max_fails = 0 means max_fails = 1
unsigned short weight; ///< [1, 65535] weight = 0 means weight = 1. only for main server
int server_type; ///< 0 for main and 1 for backup
int group_id; ///< -1 means no group. Backup without group will be backup for any main
};
//默认配置
static constexpr struct AddressParams ADDRESS_PARAMS_DEFAULT =
{
ENDPOINT_PARAMS_DEFAULT,
12 * 3600,
180,
200,
1,
0, /* 0 for main and 1 for backup. */
-1
};
下面显示的方法使用默认参数ADDRESS_PARAMS_DEFAULT将服务器加到Upstream,它的具体配置已经在上文介绍啦。
int UpstreamManager::upstream_add_server(const std::string& name,
const std::string& address)
{
return UpstreamManager::upstream_add_server(name, address,
&ADDRESS_PARAMS_DEFAULT);
}
将服务器从Upstream上移除
int UpstreamManager::upstream_remove_server(const std::string& name,
const std::string& address)
{
WFNameService *ns = WFGlobal::get_name_service();
UPSGroupPolicy *policy = dynamic_cast<UPSGroupPolicy *>(ns->get_policy(name.c_str()));
if (policy)
return policy->remove_server(address);
errno = ENOENT;
return -1;
}
dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换(cross cast) 。
在类层次间进行上行转换时,dynamic_cast和static_cast的效果是一样的。static_cast相当于传统的C语言里的强制转换,该运算符把expression转换为new_type类型,用来强迫隐式转换如non-const对象转为const对象,编译时检查,用于非多态的转换,可以转换指针及其他,但没有运行时类型检查来保证转换的安全性。
在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。dynamic_cast是唯一无法由旧式语法执行的动作,也是唯一可能耗费重大运行成本的转型动作。
这里的UPSGroupPolicy继承自WFServiceGovernance ,下篇博客介绍UpstreamPolicies相关内容
int WFServiceGovernance::remove_server(const std::string& address)
{
int ret;
this->rwlock.wlock();
ret = this->remove_server_locked(address);
this->rwlock.unlock();
return ret;
}