当前位置:网站首页 / .NET CORE / 正文

AY学习基于.NET Core的web api框架-FastHttpApi【6/12】

时间:2018年12月28日 | 作者 : aaronyang | 分类 : .NET CORE | 浏览: 994次 | 评论 0

参考文章:https://www.ikende.com/blog/83.html

新建项目AyTestClusterAPI

代码简化了一下,正常API的服务都部署在多台服务器构建应用集群,一般情况都是通过nginx或其他反向代理服务器接管Client的请求,然后针对负载配置进行转发处理。但接下来需要讲解的是通过开源组件实现无中心化的集群负载调用


定义接口

引用

using BeetleX.FastHttpApi;
using BeetleX.FastHttpApi.Clients;
using System;
using System.Threading.Tasks;
 [JsonFormater]
        [Controller(BaseUrl = "Home")]
        public interface IDataService
        {
            [Get]
            Task<DateTime> GetTime();
            [Get]
            Task<string> Hello(string name);
            [Get]
            Task<bool> Login(string name, string pwd);

            //[Get]
            //Task<List<Employee>> Employees();
            //[Get]
            //Task<Employee> EmployeeGet(int id);
            //[Post]
            //Task<int> EmployeeAdd(params Employee[] items);
            //[Post]
            //Task<Employee> EmployeeEdit([CQuery]int id, Employee emp);
            //[Get]
            //Task<List<EmployeeName>> EmployeesGetName();
            //[Get]
            //Task<List<Customer>> Customers(int count);
            //[Get]
            //Task<List<CustomerName>> CustomersGetName();
            //[Get]
            //Task<List<Order>> Orders(int? employeeid, string customerid, int index, int size);
        }

组件支持Task和非Task返回值的方法定义,由于基础网络访问是基于异步,所以最好还是定义Task返回值的方法。如果定义了非Task返回值访问组件内部会同步等待完成返回,在并发服务下这不利于线程资源的利用。



接口定义好之后,就可以通过接口来调用并把请求调用负载到不同服务器的服务上。这样做首先需要定义一个集群化服务访问对象:

private static HttpClusterApi HttpClusterApi = new HttpClusterApi();

HttpClusterApi对象是线程安全的,所以定义成静态即可;也可以根据服务分类来定义不同的HttpClusterApi(之于内部的工作原理这里就不详细解说了,可以到GitHub上过一步了解)。创建了集群接口对象之后就可以用它来创建接口实例。


private static IDataService DataService;

DataService = HttpClusterApi.Create<IDataService>();


同样接口实例也是线程安的,只需要创建一个即可在不同线程和方法里同时调用。其实这样创建接口后还没能正常使用,因为没有定义相应服务地址,可以通过HttpClusterApi添加不同服务地址:

通过 计算机web节点

image.png

      HttpClusterApi.AddHost("*", Host25, Host29);

以上是所有请求都负载到Host25和Host29,一般情况都不会直这样定义;的优先级是最低的,只有没有匹配到其他url描述的情况才会匹配


平均负载是一种最常用的方式,主要是把并发请求平均到不同的服务器上;以下是针对employee相关请求的地址负载到5个服务上.

 HttpClusterApi.AddHost("employee.*", Host26, Host27, Host28, Host29, Host30);

看了HttpClusterApi是这个对外真正的机器,然后有点像 消息队列,路由到不同的服务器处理

  System.Threading.ThreadPool.QueueUserWorkItem(async (o) =>
            {
                while (true)
                {
                    try
                    {
                        await DataService.EmployeeGet(2);
                    }
                    catch (Exception e_)
                    {
                        Console.WriteLine(e_.Message);
                    }
                }
            });

image.png


权重定义  优先给哪个服务器处理

现实中由于服务器配置不同,服务器运行的服务也有所差异,所以一般情况都不会平均化负载;

这时候权重定义就起到一个非常重要的作用,针对不同地址的服务制定不同的权重值

这样可以让服务资源得到更好地利用!

接下来还是针对以上测试代码,针对不同的服务器设置不同的权重

HttpClusterApi.GetUrlNode("employee.*").Add(new string[] { Host26, Host27, Host28 }).Add(Host29,5).Add(Host30,5);



定义备份节点 权重为0,备份的,没有可以用的,就顶上去,权重高的机器恢复了,又移除了

所谓的备份节点,其实就是不参与负载处理,但所有可用点都故障的情况,备份节点就生效。其实在组件中没有所谓的备份节点,不过可以通过0权重这个值来实现。当存在其他重权的节点可用时,0权重的节点是不会存在于权重表中的,只有当所有节点不可用的情况下,0权重的节点才会移入到权重表;当有效节点恢复后0权重的节点也会被移出权重表。



故障迁移和恢复

组件会自动把存在N次连接错的服务地址在权重表中排除出去,所以当服务不可用的情况会短暂有部分请求会引发访问异常;接下来组件会每隔一段时间去检测有问题的服务地址,直到服务连接可用的情况才会把服务地址重新添加回重权表里接受负载轮循处理。



自定义集群信息源

如果在代码中把负载设置写死了,那到增加节点的时候就非常麻烦需要重新发布程序;组件为了解决这一问题制定了一个接口方便使用者制定自己的集群信息来源配置。通过实现INodeSourceHandler并设置到HttpClusterApi即可以动态更新节点信息便于更改和管理。

以下是针对负载源实现的一个HTTP获取负载源信息实现

    public class HTTPRemoteSourceHandler : INodeSourceHandler
    {
        private HttpClusterApi mHttpClusterApi = new HttpClusterApi();

        private IHttpSourceApi mRemoteSourceApi;

        public HTTPRemoteSourceHandler(string name, params string[] hosts)
        {
            mHttpClusterApi.AddHost("*", hosts);
            mRemoteSourceApi = mHttpClusterApi.Create<IHttpSourceApi>();
            Name = name;
        }

        public string Name { get; set; }

        public int UpdateTime { get; set; } = 5;

        public Task<ApiClusterInfo> Load()
        {
            return mRemoteSourceApi._GetCluster(Name);
        }
    }

image.png

实现是每5秒钟检则一下信息源,集成到HttpClusterApi如下:

            HTTPRemoteSourceHandler remoteSourceHandler = new HTTPRemoteSourceHandler("default", "http://localhost:8080");
            HttpClusterApi.NodeSourceHandler = remoteSourceHandler;
            var result =  HttpClusterApi.LoadNodeSource();

设置INodeSourceHandler后组件就会检配置信息,检测错误或版本没有变化的情况就不会更新配置。以下是针对测编写的一个HTTP配置服务:

image.png

这个网页我也不知道在哪里。




推荐您阅读更多有关于“FastHttpApi,”的文章

猜你喜欢

额 本文暂时没人评论 来添加一个吧

发表评论

必填

选填

选填

必填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

  查看权限

合肥科大智能常年招聘.NET,Java,Web前端,有想找想换工作的私聊我AY唯一QQ:875556003和AY交流

抖音号:wpfui,可以看到我的很多作品效果

AYUI8社区版Github地址:前往获取

作者:杨洋(AaronYang简称AY,安徽六安人)目前是个人,还没公司AY唯一QQ:875556003和AY交流

高中学历,2015年1月17日开始,兴趣学习研究WPF,目前工作繁忙,不接任何活

声明:AYUI7个人与商用免费,源码可购买。部分DEMO不免费.AY主要靠卖技术服务挣钱

不是从我处购买的ayui7源码,我不提供任何技术服务,如果你举报从哪里买的,我可以帮你转正为我的客户,并送demo

查看捐赠

AYUI7.X MVC教程 更新如下:

第一课 第二课 程序加密教程

vs2015 企业版密钥HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

vs2017 企业版密钥NJVYC-BMHX2-G77MM-4XJMR-6Q8QF

标签列表