微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.NetCore下使用Polly结合IHttpClientFactory实现聚合服务

在使用微服务的过程中经常会遇到这样的情况,就目前我遇到的问题做下分析

情况一:

这里服务对于前后端分离情况来说,多使用查询服务,前端直接获取不同服务的数据展示,如果出现其中的服务失败,对业务数据无影响,只对前端数据展示出现影响

分享图片

情况二

这列聚合服务主要出现在操作上,各个服务存在相互调用,相互协作完成某一项操作的情况

分享图片

接下来我在API中添加了聚合服务模块,利用 IHttpClientFactory处理了情况的服务根目录及授权问题

  services.AddHttpContextAccessor();
            services.AddHttpClient("userservicesapi",client=> {
                client.BaseAddress = new Uri("http://localhost:40001");
               // client.DefaultRequestHeaders.Add("","");
            });

这里可以动态配置管理你的一些注册服务

在聚合服务中我们根据我们自己业务情况 可以采用 Polly+  消息队列处理

对于除程序代码外的外部原因造成的异常情况,可以使用Polly 来处理,比如:网络情况 等原因 可以发起重试  服务内部使用消息队列保持操作最终一致

var client= httpClientFactory.CreateClient("userservicesapi");

根据配置的名称创建相关的请求,这里涉及到在ServiceA中调用ServiceB的时候,ServiceB需要Accesstoken

这里需要获取下Accesstoken来处理

public async Task<string> testAddData(School school)
        {
           var client= httpClientFactory.CreateClient("userservicesapi");
            string token = await httpContextAccessor.HttpContext.GetTokenAsync(OpenIdConnectParameterNames.Accesstoken);
            client.SetBearerToken(token);
            //访问例子

            var res=  await client.PostAsJsonAsync("addData",school);
            res.EnsureSuccessstatusCode();
          return  await res.Content.ReadAsstringAsync();


        }

这就OK了,在结合Polly之前封装的处理下,这里接受下返回值

  await _polly.PollyResultRetryAsync<Exception,string>(async () => { return await _httpClient.testAddData(new School { }); },3);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐