(更新时间)2021年5月28日 商城高并发秒杀系统(.NET Core版) 04-中台调用组件的封装
发布日期:2021-06-29 15:16:34
浏览次数:3
分类:技术文章
本文共 20664 字,大约阅读时间需要 68 分钟。
一:中台调用组件的封装
////// 中台ServiceCollection扩展方法/// public static class MiddlewareServiceCollectionExtensions{ ////// 添加中台 /// ////// /// public static IServiceCollection AddMiddleware(this IServiceCollection services) { AddMiddleware(services, options => { }); return services; } /// /// 添加中台 /// ////// /// public static IServiceCollection AddMiddleware(this IServiceCollection services, Action options) { MiddlewareOptions middlewareOptions = new MiddlewareOptions(); options(middlewareOptions); // 1、注册到IOC services.Configure (options); // 2、添加HttpClient // services.AddHttpClient(middlewareOptions.HttpClientName); services.AddPollyHttpClient(middlewareOptions.HttpClientName, middlewareOptions.pollyHttpClientOptions); // 3、注册中台 services.AddSingleton (); return services; }}
二:配置选项
////// 中台配置选项/// public class MiddlewareOptions{ public MiddlewareOptions() { this.HttpClientName = "Micro"; pollyHttpClientOptions = options => { }; } ////// polly熔断降级选项 /// public ActionpollyHttpClientOptions { get; } /// /// 客户端名称 /// public string HttpClientName { set; get; }}
三:中台服务(服务交互)
////// 中台服务(服务交互)/// public class MiddleService : IMiddleService{ private readonly IMiddleTransport middleTransport; private readonly IMiddleUrl middleUrl; public MiddleService(IMiddleTransport middleTransport, IMiddleUrl middleUrl) { this.middleTransport = middleTransport; this.middleUrl = middleUrl; } public void Delete(string urlShcme, string serviceName, string serviceLink, IDictionarymiddleParam) { // 1、获取中台url string url = middleUrl.GetMiddleUrl(urlShcme, serviceName); // 2、请求 MiddleResult middleResult = middleTransport.Delete(url + serviceLink, middleParam); // 3、判断是否成功 IsSuccess(middleResult); } public IList GetList (string urlShcme, string serviceName, string serviceLink, IDictionary middleParam) where T : new() { // 1、获取中台url string url = middleUrl.GetMiddleUrl(urlShcme, serviceName); // 2、请求 MiddleResult middleResult = middleTransport.Get(url + serviceLink, middleParam); // 3、判断是否成功 IsSuccess(middleResult); // 4、结果进行转换对象 return ConvertUtil.MiddleResultToList (middleResult); } public T Get (string urlShcme, string serviceName, string serviceLink, IDictionary middleParam) where T : new() { // 1、获取中台url string url = middleUrl.GetMiddleUrl(urlShcme, serviceName); // 2、请求 MiddleResult middleResult = middleTransport.Get(url + serviceLink, middleParam); // 3、判断是否成功 IsSuccess(middleResult); // 4、结果进行转换对象 return ConvertUtil.MiddleResultToObject (middleResult); } public void Post(string urlShcme, string serviceName, string serviceLink, IDictionary middleParam) { // 1、获取中台url string url = middleUrl.GetMiddleUrl(urlShcme, serviceName); // 2、请求 MiddleResult middleResult = middleTransport.Post(url + serviceLink, middleParam); // 3、判断是否成功 IsSuccess(middleResult); } public dynamic PostDynamic(string urlShcme, string serviceName, string serviceLink, dynamic middleParam) { // 1、获取中台url string url = middleUrl.GetMiddleUrl(urlShcme, serviceName); // 2、请求 MiddleResult middleResult = middleTransport.PostDynamic(url + serviceLink, middleParam); // 3、判断是否成功 IsSuccess(middleResult); return middleResult.Result; } public void Post(string urlShcme, string serviceName, string serviceLink, IList > middleParams) { // 1、获取中台url string url = middleUrl.GetMiddleUrl(urlShcme, serviceName); // 2、请求 MiddleResult middleResult = middleTransport.Post(url + serviceLink, middleParams); // 3、判断是否成功 IsSuccess(middleResult); } public void Put(string urlShcme, string serviceName, string serviceLink, IDictionary middleParam) { // 1、获取中台url string url = middleUrl.GetMiddleUrl(urlShcme, serviceName); // 2、请求 MiddleResult middleResult = middleTransport.Put(url + serviceLink, middleParam); // 3、判断是否成功 IsSuccess(middleResult); } public dynamic PutDynamic(string urlShcme, string serviceName, string serviceLink, dynamic middleParam) { // 1、获取中台url string url = middleUrl.GetMiddleUrl(urlShcme, serviceName); // 2、请求 MiddleResult middleResult = middleTransport.PutDynamic(url + serviceLink, middleParam); // 3、判断是否成功 IsSuccess(middleResult); return middleResult.Result; } public void Put(string urlShcme, string serviceName, string serviceLink, IList > middleParams) { // 1、获取中台url string url = middleUrl.GetMiddleUrl(urlShcme, serviceName); // 2、请求 MiddleResult middleResult = middleTransport.Put(url + serviceLink, middleParams); // 3、判断是否成功 IsSuccess(middleResult); } private void IsSuccess(MiddleResult middleResult) { if (!middleResult.ErrorNo.Equals("0")) { throw new FrameException(middleResult.ErrorNo, middleResult.ErrorInfo); } } public IList > GetList(string urlShcme, string serviceName, string serviceLink, IDictionary middleParam) { // 1、获取中台url string url = middleUrl.GetMiddleUrl(urlShcme, serviceName); // 2、请求 MiddleResult middleResult = middleTransport.Get(url + serviceLink, middleParam); // 3、判断是否成功 IsSuccess(middleResult); return middleResult.resultList; } public IDictionary Get(string urlShcme, string serviceName, string serviceLink, IDictionary middleParam) { // 1、获取中台url string url = middleUrl.GetMiddleUrl(urlShcme, serviceName); // 2、请求 MiddleResult middleResult = middleTransport.Get(url + serviceLink, middleParam); // 3、判断是否成功 IsSuccess(middleResult); return middleResult.resultDic; } /// /// 返回动态结果 /// /// /// /// /// ///public dynamic GetDynamic(string urlShcme, string serviceName, string serviceLink, IDictionary middleParam) { // 1、获取中台url string url = middleUrl.GetMiddleUrl(urlShcme, serviceName); // 2、请求 MiddleResult middleResult = middleTransport.Get(url + serviceLink, middleParam); // 3、判断是否成功 IsSuccess(middleResult); return middleResult.Result; } public dynamic DeleteDynamic(string urlShcme, string serviceName, string serviceLink, IDictionary middleParam) { // 1、获取中台url string url = middleUrl.GetMiddleUrl(urlShcme, serviceName); // 2、请求 MiddleResult middleResult = middleTransport.Delete(url + serviceLink, middleParam); // 3、判断是否成功 IsSuccess(middleResult); return middleResult.Result; }}
四:中台传输
////// Http中台传输/// public class HttpMiddleTransport : IMiddleTransport{ private IHttpClientFactory httpClientFactory; private const string HttpConst = "mrico"; public HttpMiddleTransport(IHttpClientFactory httpClientFactory) { this.httpClientFactory = httpClientFactory; } public MiddleResult Delete(string middleUrl, IDictionarymiddleParam) { // 1、获取httpClient HttpClient httpClient = httpClientFactory.CreateClient(HttpConst); // 2、Delete请求 HttpResponseMessage httpResponseMessage = httpClient.DeleteAsync(middleUrl).Result; return GetMiddleResult(httpResponseMessage); } public MiddleResult Get(string middleUrl, IDictionary middleParam) { // 1、获取httpClient HttpClient httpClient = httpClientFactory.CreateClient(HttpConst); // 2、参数转换为url方式 string urlParam = HttpParamUtil.DicToHttpUrlParam(middleParam); // 3、Get请求 HttpResponseMessage httpResponseMessage = httpClient.GetAsync(middleUrl + urlParam).Result; return GetMiddleResult(httpResponseMessage); } public MiddleResult Post(string middleUrl, IDictionary middleParam) { // 1、获取httpClient HttpClient httpClient = httpClientFactory.CreateClient(HttpConst); // 2、转换成json参数 HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(middleParam), Encoding.UTF8, "application/json"); // 3、Post请求 HttpResponseMessage httpResponseMessage = httpClient.PostAsync(middleUrl, httpContent).Result; return GetMiddleResult(httpResponseMessage); } public MiddleResult Post(string middleUrl, IList > middleParams) { // 1、获取httpClient HttpClient httpClient = httpClientFactory.CreateClient(HttpConst); // 2、转换成json参数 HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(middleParams), Encoding.UTF8, "application/json"); // 3、Post请求 HttpResponseMessage httpResponseMessage = httpClient.PostAsync(middleUrl, httpContent).Result; return GetMiddleResult(httpResponseMessage); } public MiddleResult PostDynamic(string middleUrl, dynamic middleParam) { // 1、获取httpClient HttpClient httpClient = httpClientFactory.CreateClient(HttpConst); // 2、转换成json参数 HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(middleParam), Encoding.UTF8, "application/json"); // 3、Post请求 HttpResponseMessage httpResponseMessage = httpClient.PostAsync(middleUrl, httpContent).Result; return GetMiddleResult(httpResponseMessage); } public MiddleResult Put(string middleUrl, IDictionary middleParam) { // 1、获取httpClient HttpClient httpClient = httpClientFactory.CreateClient(HttpConst); // 2、转换成json参数 HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(middleParam), Encoding.UTF8, "application/json"); // 3、Put请求 HttpResponseMessage httpResponseMessage = httpClient.PutAsync(middleUrl, httpContent).Result; return GetMiddleResult(httpResponseMessage); } public MiddleResult Put(string middleUrl, IList > middleParams) { // 1、获取httpClient HttpClient httpClient = httpClientFactory.CreateClient(HttpConst); // 2、转换成json参数 HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(middleParams), Encoding.UTF8, "application/json"); // 3、Put请求 HttpResponseMessage httpResponseMessage = httpClient.PutAsync(middleUrl, httpContent).Result; return GetMiddleResult(httpResponseMessage); } public MiddleResult PutDynamic(string middleUrl, dynamic middleParam) { // 1、获取httpClient HttpClient httpClient = httpClientFactory.CreateClient(HttpConst); // 2、转换成json参数 HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(middleParam), Encoding.UTF8, "application/json"); // 3、Put请求 HttpResponseMessage httpResponseMessage = httpClient.PutAsync(middleUrl, httpContent).Result; return GetMiddleResult(httpResponseMessage); } private MiddleResult GetMiddleResult(HttpResponseMessage httpResponseMessage) { // 3、将HttpResponseMessage转换成MiddleResult if (httpResponseMessage.StatusCode.Equals(HttpStatusCode.OK) || httpResponseMessage.StatusCode.Equals(HttpStatusCode.Created) || httpResponseMessage.StatusCode.Equals(HttpStatusCode.Accepted)) { string httpJsonString = httpResponseMessage.Content.ReadAsStringAsync().Result; // 3.1 创建MiddleResult return MiddleResult.JsonToMiddleResult(httpJsonString); } else { throw new FrameException($"{ HttpConst}服务调用错误:{ httpResponseMessage.Content.ReadAsStringAsync().ToString()}"); } }}
////// 中台传输/// public interface IMiddleTransport{ ////// Get请求 /// /// 中台链接 /// 中台参数 ///public MiddleResult Get(string middleUrl, IDictionary middleParam); /// /// Post请求 /// /// 中台链接 /// 中台参数 ///public MiddleResult Post(string middleUrl, IDictionary middleParam); /// /// Post请求,动态参数 /// /// 中台链接 /// 中台参数 ///public MiddleResult PostDynamic(string middleUrl, dynamic middleParam); /// /// Post请求 /// /// 中台链接 /// 中台集合参数 ///public MiddleResult Post(string middleUrl, IList > middleParams); /// /// Delete请求 /// /// 中台链接 /// 中台参数 ///public MiddleResult Delete(string middleUrl, IDictionary middleParam); /// /// Put请求 /// /// 中台链接 /// 中台参数 ///public MiddleResult Put(string middleUrl, IDictionary middleParam); /// /// Put请求,动态参数 /// /// 中台链接 /// 中台参数 ///public MiddleResult PutDynamic(string middleUrl, dynamic middleParam); /// /// Put请求 /// /// 中台链接 /// 中台集合参数 ///public MiddleResult Put(string middleUrl, IList > middleParams);}
五:中台URL
////// 中台url/// public interface IMiddleUrl{ ////// 获取中台Url /// /// 中台url /// 服务名称 ///public string GetMiddleUrl(string urlShcme, string serviceName);}
////// 默认获取Url/// public class DefaultMiddleUrl : IMiddleUrl{ private readonly IServiceDiscovery serviceDiscovery; private readonly ILoadBalance loadBalance; public DefaultMiddleUrl(IServiceDiscovery serviceDiscovery, ILoadBalance loadBalance) { this.serviceDiscovery = serviceDiscovery; this.loadBalance = loadBalance; } public string GetMiddleUrl(string urlShcme, string serviceName) { // 1、获取服务url IListserviceUrls = serviceDiscovery.Discovery(serviceName).Result; // 2、url负载均衡 ServiceUrl serviceUrl = loadBalance.Select(serviceUrls); // 3、创建url StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(urlShcme); stringBuilder.Append("://"); stringBuilder.Append(serviceUrl.Url); return stringBuilder.ToString(); }}
六:相关依赖的类文件
////// 中台服务/// public interface IMiddleService{ ////// Get请求 /// /// 中台链接 /// 中台参数 ///public MiddleResult Get(string middleUrl, IDictionary middleParam); /// /// Post请求 /// /// 中台链接 /// 中台参数 ///public MiddleResult Post(string middleUrl, IDictionary middleParam); /// /// Post请求,动态参数 /// /// 中台链接 /// 中台参数 ///public MiddleResult PostDynamic(string middleUrl, dynamic middleParam); /// /// Post请求 /// /// 中台链接 /// 中台集合参数 ///public MiddleResult Post(string middleUrl, IList > middleParams); /// /// Delete请求 /// /// 中台链接 /// 中台参数 ///public MiddleResult Delete(string middleUrl, IDictionary middleParam); /// /// Put请求 /// /// 中台链接 /// 中台参数 ///public MiddleResult Put(string middleUrl, IDictionary middleParam); /// /// Put请求,动态参数 /// /// 中台链接 /// 中台参数 ///public MiddleResult PutDynamic(string middleUrl, dynamic middleParam); /// /// Put请求 /// /// 中台链接 /// 中台集合参数 ///public MiddleResult Put(string middleUrl, IList > middleParams);}
////// Http中台请求结果/// public class HttpMiddleService : IMiddleService{ private IHttpClientFactory httpClientFactory; private const string HttpConst = "mrico"; public HttpMiddleService(IHttpClientFactory httpClientFactory) { this.httpClientFactory = httpClientFactory; } public MiddleResult Delete(string middleUrl, IDictionarymiddleParam) { // 1、获取httpClient HttpClient httpClient = httpClientFactory.CreateClient(HttpConst); // 2、Delete请求 HttpResponseMessage httpResponseMessage = httpClient.DeleteAsync(middleUrl).Result; return GetMiddleResult(httpResponseMessage); } public MiddleResult Get(string middleUrl, IDictionary middleParam) { // 1、获取httpClient HttpClient httpClient = httpClientFactory.CreateClient(HttpConst); // 2、参数转换为url方式 string urlParam = HttpParamUtil.DicToHttpUrlParam(middleParam); // 3、Get请求 HttpResponseMessage httpResponseMessage = httpClient.GetAsync(middleUrl + urlParam).Result; return GetMiddleResult(httpResponseMessage); } public MiddleResult Post(string middleUrl, IDictionary middleParam) { // 1、获取httpClient HttpClient httpClient = httpClientFactory.CreateClient(HttpConst); // 2、转换成json参数 HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(middleParam), Encoding.UTF8, "application/json"); // 3、Post请求 HttpResponseMessage httpResponseMessage = httpClient.PostAsync(middleUrl, httpContent).Result; return GetMiddleResult(httpResponseMessage); } public MiddleResult Post(string middleUrl, IList > middleParams) { // 1、获取httpClient HttpClient httpClient = httpClientFactory.CreateClient(HttpConst); // 2、转换成json参数 HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(middleParams), Encoding.UTF8, "application/json"); // 3、Post请求 HttpResponseMessage httpResponseMessage = httpClient.PostAsync(middleUrl, httpContent).Result; return GetMiddleResult(httpResponseMessage); } public MiddleResult PostDynamic(string middleUrl, dynamic middleParam) { // 1、获取httpClient HttpClient httpClient = httpClientFactory.CreateClient(HttpConst); // 2、转换成json参数 HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(middleParam), Encoding.UTF8, "application/json"); // 3、Post请求 HttpResponseMessage httpResponseMessage = httpClient.PostAsync(middleUrl, httpContent).Result; return GetMiddleResult(httpResponseMessage); } public MiddleResult Put(string middleUrl, IDictionary middleParam) { // 1、获取httpClient HttpClient httpClient = httpClientFactory.CreateClient(HttpConst); // 2、转换成json参数 HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(middleParam), Encoding.UTF8, "application/json"); // 3、Put请求 HttpResponseMessage httpResponseMessage = httpClient.PutAsync(middleUrl, httpContent).Result; return GetMiddleResult(httpResponseMessage); } public MiddleResult Put(string middleUrl, IList > middleParams) { // 1、获取httpClient HttpClient httpClient = httpClientFactory.CreateClient(HttpConst); // 2、转换成json参数 HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(middleParams), Encoding.UTF8, "application/json"); // 3、Put请求 HttpResponseMessage httpResponseMessage = httpClient.PutAsync(middleUrl, httpContent).Result; return GetMiddleResult(httpResponseMessage); } public MiddleResult PutDynamic(string middleUrl, dynamic middleParam) { // 1、获取httpClient HttpClient httpClient = httpClientFactory.CreateClient(HttpConst); // 2、转换成json参数 HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(middleParam), Encoding.UTF8, "application/json"); // 3、Put请求 HttpResponseMessage httpResponseMessage = httpClient.PutAsync(middleUrl, httpContent).Result; return GetMiddleResult(httpResponseMessage); } private MiddleResult GetMiddleResult(HttpResponseMessage httpResponseMessage) { // 3、将HttpResponseMessage转换成MiddleResult if (httpResponseMessage.StatusCode.Equals(HttpStatusCode.OK) || httpResponseMessage.StatusCode.Equals(HttpStatusCode.Created) || httpResponseMessage.StatusCode.Equals(HttpStatusCode.Accepted)) { string httpJsonString = httpResponseMessage.Content.ReadAsStringAsync().Result; // 3.1 创建MiddleResult return MiddleResult.JsonToMiddleResult(httpJsonString); } else { throw new FrameException($"{ HttpConst}服务调用错误:{ httpResponseMessage.Content.ReadAsStringAsync().ToString()}"); } }}
2.返回结果集的封装
////// 中台结果/// public class MiddleResult{ public const string SUCCESS = "0"; public string ErrorNo { set; get; } // 是否成功状态 public string ErrorInfo { set; get; } // 失败信息 public IDictionaryresultDic { set; get; }// 用于非结果集返回 public IList > resultList { set; get; }// 用于结果集返回 public dynamic Result { set; get; }// 返回动态结果(通用) public MiddleResult() { resultDic = new Dictionary (); resultList = new List >(); } public MiddleResult(string jsonStr) { MiddleResult result = JsonConvert.DeserializeObject (jsonStr); } /// /// 中台结果串转换成为MiddleResult /// /// ///public static MiddleResult JsonToMiddleResult(string jsonStr) { MiddleResult result = JsonConvert.DeserializeObject (jsonStr); return result; } public MiddleResult(string errorNo, string errorInfo) { this.ErrorNo = errorNo; this.ErrorInfo = errorInfo; resultDic = new Dictionary (); resultList = new List >(); } public MiddleResult(string errorNo, string erroInfo, IDictionary resultDic, IList > resultList) : this(errorNo, erroInfo) { this.resultDic = resultDic; this.resultList = resultList; this.resultDic = resultDic; this.resultList = resultList; }}
转载地址:https://codeboy.blog.csdn.net/article/details/117375528 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
关注你微信了!
[***.104.42.241]2024年04月30日 11时51分13秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
SpringFox接口文档API DOC
2019-04-29
netty优化策略
2019-04-29
架构师知识体系全景图
2019-04-29
guava中EventBus(事件总线)源码分析与使用
2019-04-29
程序员成神之路文章目录
2019-04-29
SASS软件的成熟度模型总结
2019-04-29
一次搞定redis使用
2019-04-29
最全架构设计实践方法论: 微服务
2019-04-29
Linux下简单几步安装AI开发环境-ROS(超有意思)
2019-04-29
epoll详解
2019-04-29
linux入门--磁盘管理之分区、格式化与挂载
2019-04-29
鸿蒙(二)基于小熊派实现LOT上云的智慧家居项目
2019-04-29
开发必备:HTTP 及 TLS
2019-04-29
Windows 11答疑:大家最关心的10个问题
2019-04-29
select、poll、epoll之间的区别
2019-04-29
Shopify!Shopify!Shopify!
2019-04-29
这是美国MarTech最大的一家独立公司:HubSpot
2019-04-29
从开发到产出:关于机器学习的七则干货建议
2019-04-29
你想成为数据科学家吗?不要把机器学习当成入门第一课
2019-04-29
你想成为数据科学家吗?不要把机器学习当成入门第一课
2019-04-29