|
|
@ -95,6 +95,7 @@
|
|
|
|
"global using Polly.Wrap;\n",
|
|
|
|
"global using Polly.Wrap;\n",
|
|
|
|
"global using Polly.Registry;\n",
|
|
|
|
"global using Polly.Registry;\n",
|
|
|
|
"global using Polly.Telemetry;\n",
|
|
|
|
"global using Polly.Telemetry;\n",
|
|
|
|
|
|
|
|
"global using Polly.Extensions.Http;\n",
|
|
|
|
"\n",
|
|
|
|
"\n",
|
|
|
|
"global using Refit;\n",
|
|
|
|
"global using Refit;\n",
|
|
|
|
"//global using Refit.HttpClientFactory;\n",
|
|
|
|
"//global using Refit.HttpClientFactory;\n",
|
|
|
@ -1884,7 +1885,7 @@
|
|
|
|
"\n",
|
|
|
|
"\n",
|
|
|
|
" services\n",
|
|
|
|
" services\n",
|
|
|
|
" .AddHttpClient(\"timeoutPolicy2\")\n",
|
|
|
|
" .AddHttpClient(\"timeoutPolicy2\")\n",
|
|
|
|
" //转换通用策略\n",
|
|
|
|
" //AsAsyncPolicy转换通用策略\n",
|
|
|
|
" .AddPolicyHandler(timeoutPolicy2.AsAsyncPolicy<HttpResponseMessage>());\n",
|
|
|
|
" .AddPolicyHandler(timeoutPolicy2.AsAsyncPolicy<HttpResponseMessage>());\n",
|
|
|
|
"}\n",
|
|
|
|
"}\n",
|
|
|
|
"\n",
|
|
|
|
"\n",
|
|
|
@ -1934,6 +1935,59 @@
|
|
|
|
"### 应用多个策略"
|
|
|
|
"### 应用多个策略"
|
|
|
|
]
|
|
|
|
]
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
|
|
|
"execution_count": null,
|
|
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
|
|
"dotnet_interactive": {
|
|
|
|
|
|
|
|
"language": "csharp"
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"polyglot_notebook": {
|
|
|
|
|
|
|
|
"kernelName": "csharp"
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"vscode": {
|
|
|
|
|
|
|
|
"languageId": "polyglot-notebook"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"outputs": [],
|
|
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
|
|
"{\n",
|
|
|
|
|
|
|
|
" var services = new ServiceCollection();\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
" services.AddHttpClient(string.Empty)\n",
|
|
|
|
|
|
|
|
" .ConfigureHttpClient(client => \n",
|
|
|
|
|
|
|
|
" {\n",
|
|
|
|
|
|
|
|
" client.BaseAddress = new Uri(webApiBaseUrl);\n",
|
|
|
|
|
|
|
|
" })\n",
|
|
|
|
|
|
|
|
" .AddTransientHttpErrorPolicy(builder => builder.WaitAndRetryAsync\n",
|
|
|
|
|
|
|
|
" (\n",
|
|
|
|
|
|
|
|
" new[]\n",
|
|
|
|
|
|
|
|
" {\n",
|
|
|
|
|
|
|
|
" TimeSpan.FromSeconds(1),\n",
|
|
|
|
|
|
|
|
" TimeSpan.FromSeconds(2),\n",
|
|
|
|
|
|
|
|
" TimeSpan.FromSeconds(3),\n",
|
|
|
|
|
|
|
|
" }\n",
|
|
|
|
|
|
|
|
" ))\n",
|
|
|
|
|
|
|
|
" //断路器\n",
|
|
|
|
|
|
|
|
" .AddTransientHttpErrorPolicy(builder => builder.CircuitBreakerAsync(\n",
|
|
|
|
|
|
|
|
" handledEventsAllowedBeforeBreaking: 3,\n",
|
|
|
|
|
|
|
|
" durationOfBreak: TimeSpan.FromSeconds(30)\n",
|
|
|
|
|
|
|
|
" ));\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
" try\n",
|
|
|
|
|
|
|
|
" {\n",
|
|
|
|
|
|
|
|
" var factory = services.BuildServiceProvider().GetRequiredService<IHttpClientFactory>();\n",
|
|
|
|
|
|
|
|
" var content = await factory.CreateClient().GetStringAsync(\"/api/polly8/RandomException\");\n",
|
|
|
|
|
|
|
|
" Console.WriteLine(content);\n",
|
|
|
|
|
|
|
|
" }\n",
|
|
|
|
|
|
|
|
" catch(Exception ex)\n",
|
|
|
|
|
|
|
|
" {\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
" Console.WriteLine(\"API异常:\"+ex.Message);\n",
|
|
|
|
|
|
|
|
" }\n",
|
|
|
|
|
|
|
|
"}"
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"metadata": {},
|
|
|
|
"metadata": {},
|
|
|
@ -1941,6 +1995,48 @@
|
|
|
|
"### 动态选择策略"
|
|
|
|
"### 动态选择策略"
|
|
|
|
]
|
|
|
|
]
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
|
|
|
"execution_count": null,
|
|
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
|
|
"vscode": {
|
|
|
|
|
|
|
|
"languageId": "polyglot-notebook"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"outputs": [],
|
|
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
|
|
"//实质是AddPolicyHandler中选择一个策略\n",
|
|
|
|
|
|
|
|
"{\n",
|
|
|
|
|
|
|
|
" var retryPolicy = Polly.Extensions.Http.HttpPolicyExtensions\n",
|
|
|
|
|
|
|
|
" .HandleTransientHttpError()\n",
|
|
|
|
|
|
|
|
" .WaitAndRetryAsync(new[]\n",
|
|
|
|
|
|
|
|
" {\n",
|
|
|
|
|
|
|
|
" TimeSpan.FromSeconds(1),\n",
|
|
|
|
|
|
|
|
" TimeSpan.FromSeconds(2),\n",
|
|
|
|
|
|
|
|
" TimeSpan.FromSeconds(4)\n",
|
|
|
|
|
|
|
|
" });\n",
|
|
|
|
|
|
|
|
" var noOpPolicy = Policy.NoOpAsync().AsAsyncPolicy<HttpResponseMessage>();\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
" var services = new ServiceCollection();\n",
|
|
|
|
|
|
|
|
" services.AddHttpClient(string.Empty, client =>\n",
|
|
|
|
|
|
|
|
" {\n",
|
|
|
|
|
|
|
|
" client.BaseAddress = new Uri(webApiBaseUrl);\n",
|
|
|
|
|
|
|
|
" })\n",
|
|
|
|
|
|
|
|
" // 根据请求方法,选择策略\n",
|
|
|
|
|
|
|
|
" .AddPolicyHandler(request => request.Method == HttpMethod.Get ? retryPolicy : noOpPolicy);\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
" var factory = services.BuildServiceProvider().GetRequiredService<IHttpClientFactory>();\n",
|
|
|
|
|
|
|
|
" var client1 = factory.CreateClient(string.Empty);\n",
|
|
|
|
|
|
|
|
" var content1 = await client1.GetStringAsync(\"/api/hello/get\");\n",
|
|
|
|
|
|
|
|
" Console.WriteLine(content1);\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
" var client2 = factory.CreateClient(string.Empty);\n",
|
|
|
|
|
|
|
|
" var response2 = await client2.PostAsync(\"/api/hello/post\",null);\n",
|
|
|
|
|
|
|
|
" var content2 = await response2.Content.ReadAsStringAsync();\n",
|
|
|
|
|
|
|
|
" Console.WriteLine(content2);\n",
|
|
|
|
|
|
|
|
"}"
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"metadata": {},
|
|
|
|
"metadata": {},
|
|
|
@ -1948,6 +2044,53 @@
|
|
|
|
"### 从注册表中选择策略"
|
|
|
|
"### 从注册表中选择策略"
|
|
|
|
]
|
|
|
|
]
|
|
|
|
},
|
|
|
|
},
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
"cell_type": "code",
|
|
|
|
|
|
|
|
"execution_count": null,
|
|
|
|
|
|
|
|
"metadata": {
|
|
|
|
|
|
|
|
"vscode": {
|
|
|
|
|
|
|
|
"languageId": "polyglot-notebook"
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
|
|
|
"outputs": [],
|
|
|
|
|
|
|
|
"source": [
|
|
|
|
|
|
|
|
"{\n",
|
|
|
|
|
|
|
|
" var registry = new PolicyRegistry()\n",
|
|
|
|
|
|
|
|
" {\n",
|
|
|
|
|
|
|
|
" { \"defaultretrystrategy\", HttpPolicyExtensions.HandleTransientHttpError().WaitAndRetryAsync(new TimeSpan[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(2), TimeSpan.FromSeconds(3)}) },\n",
|
|
|
|
|
|
|
|
" { \"defaultcircuitbreaker\", HttpPolicyExtensions.HandleTransientHttpError().CircuitBreakerAsync(5, TimeSpan.FromSeconds(30)) },\n",
|
|
|
|
|
|
|
|
" };\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
" var services = new ServiceCollection();\n",
|
|
|
|
|
|
|
|
" services.AddPolicyRegistry(registry);\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
" services.AddHttpClient(\"a\", client => { client.BaseAddress = new Uri(webApiBaseUrl); })\n",
|
|
|
|
|
|
|
|
" .AddPolicyHandlerFromRegistry(\"defaultretrystrategy\")\n",
|
|
|
|
|
|
|
|
" //.AddPolicyHandlerFromRegistry(\"defaultcircuitbreaker\")\n",
|
|
|
|
|
|
|
|
" ;\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
" services.AddHttpClient(\"b\", client => { client.BaseAddress = new Uri(webApiBaseUrl); })\n",
|
|
|
|
|
|
|
|
" //.AddPolicyHandlerFromRegistry(\"defaultretrystrategy\")\n",
|
|
|
|
|
|
|
|
" .AddPolicyHandlerFromRegistry(\"defaultcircuitbreaker\")\n",
|
|
|
|
|
|
|
|
" ;\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
" var factory = services.BuildServiceProvider().GetService<IHttpClientFactory>();\n",
|
|
|
|
|
|
|
|
" var clientA = factory.CreateClient(\"a\");\n",
|
|
|
|
|
|
|
|
" var clientB = factory.CreateClient(\"b\");\n",
|
|
|
|
|
|
|
|
"\n",
|
|
|
|
|
|
|
|
" try\n",
|
|
|
|
|
|
|
|
" {\n",
|
|
|
|
|
|
|
|
" var resultA = await clientA.GetStringAsync(\"/api/polly8/exception\");\n",
|
|
|
|
|
|
|
|
" }\n",
|
|
|
|
|
|
|
|
" catch (Exception ex)\n",
|
|
|
|
|
|
|
|
" {\n",
|
|
|
|
|
|
|
|
" Console.WriteLine(ex.Message);\n",
|
|
|
|
|
|
|
|
" }\n",
|
|
|
|
|
|
|
|
" \n",
|
|
|
|
|
|
|
|
" var resultB = await clientB.GetStringAsync(\"/api/polly8/hello\");\n",
|
|
|
|
|
|
|
|
"}"
|
|
|
|
|
|
|
|
]
|
|
|
|
|
|
|
|
},
|
|
|
|
{
|
|
|
|
{
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"cell_type": "markdown",
|
|
|
|
"metadata": {},
|
|
|
|
"metadata": {},
|
|
|
|