最近項目中采用了微服務的軟件體系,導致服務之間數據流通會產生一些問題,有部分需求需要服務之間互相調用接口來完成數據的流通。
首先第一時間是想到了RPC來做數據流通,但是一個人感覺短時間內搞不定
然后退而求其次采用了HttpClient來進行接口請求,可是哪怕封裝了相關的請求代碼,還是會有很多的冗余代碼,頻繁的調用接口從而產生一系列的問題
這個時候WebApiClient.JIT就可以派上用場了,這是個什么東西呢?
是個基於HttpClient的開源項目。您只需要定義c#接口並修改相關功能即可異步調用遠程http接口的客戶端庫。
使用起來也很簡單,下面是一個demo
新建一個webapicore項目,新建一個控制器WeatherForecastController
代碼如下:
[ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { private static readonly string[] Summaries = new[] { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController (ILogger<WeatherForecastController> logger) { _logger = logger; } [HttpGet("/Get")] public string Get (string val) { return $"{val}:{DateTime.Now.Ticks}"; } }
然后創建一個控制台應用程序
nuget引入WebApiClient.JIT
新建接口IWebApiClientTest
//[TraceFilter(OutputTarget = OutputTarget.Console | OutputTarget.Debug)] [TraceFilter(OutputTarget = OutputTarget.Debug)] [HttpHost("http://192.168.2.223:8001/")] // HttpHost可以在Config傳入覆蓋 public interface IWebApiClientTest: IHttpApi { [HttpGet] [Cache(1 * 1000)] Task<string> GetAsyc ([Uri] string url,string val); }
接口要求為public;
在Program.cs代碼如下
class Program { static void Main (string[] args) { Console.WriteLine("Hello World!"); Init(); for (var i = 0; i < 10; i++) { Thread.Sleep(500); RequestAsync().Wait(); } Console.ReadLine(); } /// <summary> /// 初始化配置 /// </summary> static void Init () { // 注冊IUserApi 配置其工廠 HttpApi.Register<IWebApiClientTest>().ConfigureHttpApiConfig(c => { c.HttpHost = new Uri("http://192.168.2.223:8001/"); c.FormatOptions.DateTimeFormat = DateTimeFormats.ISO8601_WithMillisecond; c.GlobalFilters.Add(new ApiTokenFilter(""));//添加Hearder }); } /// <summary> /// 請求接口 /// </summary> /// <returns></returns> private static async Task RequestAsync () { var userApi = HttpApi.Resolve<IWebApiClientTest>(); //string value = "{\"name\":\"1\",\"id\":\"2\"}"; var about = await userApi .GetAsyc("Get","余承浩"); Console.WriteLine(about); } } class ApiTokenFilter : IApiActionFilter { private string token { get; set; } public ApiTokenFilter (string token) { this.token = token; } public Task OnBeginRequestAsync (ApiActionContext context) { context.RequestMessage.Headers.Add("Authorization", $"Basic {token}"); return Task.FromResult<object>(null); } public Task OnEndRequestAsync (ApiActionContext context) { return Task.FromResult<object>(null); } }
調用起來極為簡單,堪稱神器
運行的效果如下
因為我加了1秒鍾的緩存,所以每兩次請求的結果是相同的