Abp vNext 动态API客户端

2021-11-20  本文已影响0人  王清水

目的:解决客户端因需求的增多和不明确所造成的HhttpClient的复杂性;

过程:
1,客户端需要是模块化项目;
2,客户端系统引用HttpApi.Client;
3,在客户端中使用属性注入的方式,直接调用abp vNext中的相关服务;

原理:
1,abpvNext模块化思想;
2,HttpApi.Client仅依赖Application.Contracts,它是一个接口,它不能为直接使用;
3,上述第二点引出了代理类使用拦截,封装使用了HttpClient来进行请求

详细设置:
1,在客户端appsettings.json中设置上述拦截器的请求接口
    "RemoteServices": { "YourAbpvNextProjectName:" { "BaseUrl" : "https://localhost:44389/" }}
2,HttpApi.Client使用Volo.Abp.Http.Client创建代理
    HttpApi.Client项目Modul中,找到ConfigureServices方法,添加如下代码:
        context.Services.AddHttpClientProxies(typeof(YourAbpvNextProjectNameApplicationContractsModul).Assembly, YourAbpvNextProjectName)
3,拦截器触发创建HttpClient,执行http请求
    ==>>>    按接口创建代理 、把代理类添加到IOC容器
    3.1    通过程序集加载所有的接口;
    3.2    for循环接口集合,使用Volo.Abp.Castle.Core模块创建代理;
    3.3    DynamicHttpProxyInterceptor对象进行请求

使用polly实现失败重试
1,在HttpApi.Client项目中引入Nuget包:Microsoft.Extensions.Http.Polly
2,在HttpApi.Client启动模块中,重写 PreConfigureServices,设置相关信息
    PreConfigure<AbpHttpClientBuilderOptions>(options =>
        {
            options.ProxyClientBuildActions.Add(remoteServiceName, clientBuilder) => {
                clientBuilder.AddTransientHttpErrorPolicy(policyBuilder =>
                    policyBuilder.WaitAndRetryAsync(
                        3,
                        i => TimeSpan.FromSeconds(Math.Pow(2,i))    //等待两秒中重试,总重试3次
                    )
                )
            }
        }
    )

设置重试
上一篇下一篇

猜你喜欢

热点阅读