干货---实现思路:RPC Thrift 服务端 注册服务端信息到zookeeper上。客户端从zookeeper获取服务端信息,并实现负载。
经验---注意事项。
如图:
Thrift 坑:
1)Thrift 二次封装的socket 使用 using (TBufferedTransport transport = new TBufferedTransport(GetTSocket())),会被活生生坑死。IDisposable中为实现close()..
所以必须使用如下代码, transport.Close();是重点
using (TBufferedTransport transport = new TBufferedTransport(GetTSocket()))
{
try
{
transport.Open();
TProtocol protocol = new TBinaryProtocol(transport);
CityService.Client client = new CityService.Client(protocol);
return func(client);
//return "";
}
catch (Exception e)
{
Console.WriteLine(e.StackTrace);
return "fales:" + e.Message;
}
finally
{
transport.Close();
}
}
经验:
1)当zookeeper服务器节点信息如有异常服务时,会自动轮询可用RPC Thrift服务。(指无法连接RPC Thrift服务端,代码层面报错不在此范围内。)
2)客户端实现注意去除异常服务器连接,如下代码实现。
/// <summary>
/// 记录error数
/// </summary>
private int errorCount = 0;