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;
}