我希望能够从非结构应用或服务调用有状态HTTP / WebApi服务。我可以使用已发布的URL来进行有状态服务,但希望通过解析分区端点来利用故障转移到其他主服务器。
我首先尝试在桌面控制台应用中进行测试,但无法在InvokeWithRetryAsync中执行通信Lambda函数。
这是一个死胡同(非结构应用程序无法解析有状态服务)还是有另一种方法可以从非结构应用程序解析端点。否则,我可能会将请求包装在“中间人”无状态服务(如Wordcount Webservice)中。
var result = await servicePartitionClient.InvokeWithRetryAsync(
client =>
{
//never reaches here.
Uri serviceAddress = new Uri(client.BaseAddress, "SetConfiguration");
HttpWebRequest request = WebRequest.CreateHttp(serviceAddress);
request.Method = "POST";
//Add the content into the body
byte[] byteArray = Encoding.UTF8.GetBytes(_datapacket);
request.ContentType = "application/json";
request.ContentLength = byteArray.Length;
Stream dataStream = request.GetRequestStream();
dataStream.Write(byteArray, 0, byteArray.Length);
dataStream.Close();
request.Timeout = (int)client.OperationTimeout.TotalMilliseconds;
request.ReadWriteTimeout = (int)client.ReadWriteTimeout.TotalMilliseconds;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
//for now, just return ok
return Task.FromResult<string>("ok");
});
答案 0 :(得分:4)
我尝试过这段时间已经有一段时间了,但结果应该是一样的:建立一个无状态服务,作为你的有状态服务的门户。
我遇到的问题首先是连接到群集 - 如果它是一个安全的群集,那么你需要加载客户端证书才能建立安全连接。
解决后,您可能会遇到命名服务将分区解析为本地地址的问题,而不是可以从群集外部解析的地址。
因此,最终结果是我们构建了一个无状态服务,可以作为典型的REST API进行访问,并将分区抽象移动到集群中的这一层。
答案 1 :(得分:2)
是的,绝对是在Service Fabric群集之外运行的非Service Fabric应用程序与Service Fabric应用程序通信。 Service Fabric本身并没有施加任何限制,因为正是您的服务本身正在打开通信端点(最终您的服务只是在EXE中运行,并且它们可以像您之前编写的任何EXE一样监听地址和端口) 。当您使用通信客户端API(如ServicePartitionClient)时,您只是要求命名服务解析服务的地址和端口,然后您可以像往常一样连接到该服务。
当您的Service Fabric群集外部有客户端时,有两个潜在的问题:
因此,Darran提到的最简单的解决方案通常是拥有一个无状态服务,作为客户端请求的入口点。一旦你“进入”群集,你就不再有这些问题了。