(更新时间)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 Action
pollyHttpClientOptions {
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, IDictionary
middleParam) {
// 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, IDictionary
middleParam) {
// 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 IList
serviceUrls = 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, IDictionary
middleParam) {
// 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 IDictionary
resultDic {
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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:(更新时间)2021年5月28日 商城高并发秒杀系统(.NET Core版) 05-断路器Polly组件的封装
下一篇:(更新时间)2021年5月28日 商城高并发秒杀系统(.NET Core版) 03-微服务架构设计

发表评论

最新留言

关注你微信了!
[***.104.42.241]2024年04月30日 11时51分13秒