🏆 作者简介,愚公搬代码
🏆《头衔》:华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,阿里云专家博主,腾讯云优秀博主,掘金优秀博主,51CTO博客专家等。
🏆《近期荣誉》:2022年CSDN博客之星TOP2,2022年华为云十佳博主等。
🏆《博客内容》:.NET、Java、Python、Go、Node、前端、IOS、Android、鸿蒙、Linux、物联网、网络安全、大数据、人工智能、U3D游戏、小程序等相关领域知识。
🏆🎉欢迎 👍点赞✍评论⭐收藏
🚀前言
Web服务负载均衡是一种将Web服务请求分发到多个服务器上的技术,以提高系统的可靠性、可用性和性能。具体来说,它会将用户的请求分发到不同的服务器上,每个服务器只处理一部分请求,从而减轻单一服务器的负担,避免单点故障,并提高系统的响应速度和吞吐量。
Web服务负载均衡可以实现多种算法,如轮询、加权轮询、随机、最少连接等。其中,轮询算法是最简单的一种,它将请求依次分发给每个服务器,直至所有服务器都获得请求。加权轮询算法则是在轮询的基础上,为每个服务器设置不同的权重,以更加合理地分配请求。随机算法会随机选择一个服务器来处理每个请求,适用于负载均衡比较均衡的情况。最少连接算法则会选择当前连接量最少的服务器来处理请求,有助于避免负载不均衡的问题。
Web服务负载均衡可以通过硬件或软件实现,硬件负载均衡器通常是一台专门的服务器,通过物理或虚拟方式将请求分发给多台后端服务器;而软件负载均衡器则是通过在每个后端服务器上运行负载均衡软件来实现。常见的软件负载均衡器包括Nginx、HAProxy、Apache等。
本文主要介绍DeveloperSharp的使用,DeveloperSharp是一个研发中大型项目必备的系统平台,也是一个低代码平台。
它主要包括了如下一些功能:
- 基于Sql语句、存储过程、事务、分页的数据库操作。并几乎支持市面上所有种类的数据库。
- 图片操作。裁剪、缩放、加水印。
- http请求调用(Post与Get)
- 高效分页
- Web服务/WebApi的负载均衡
- 数据库的负载均衡,以及读写分离
- CORS跨域访问
- UUID全球通用唯一识别码
- MQ消息队列(请另行使用DeveloperSharp.RabbitMQ包)
- Redis缓存(请另行使用DeveloperSharp.Redis包)
- “异种数据库”的负载均衡
- 其他相关功能
🚀一、Web服务负载均衡
🔎1.接口类
我们首先在Visual Studio中新建“IBase接口”与“Person实体类”,代码分别如下:
IBase接口:
using System.ServiceModel;//需要添加对System.ServiceModel.dll程序集的引用
using System.ServiceModel.Web;//需要添加对System.ServiceModel.Web.dll程序集的引用
namespace YZZ.Interface
{
[ServiceContract]
public interface IBase
{
[OperationContract]
[WebInvoke(Method = "POST", UriTemplate = "/AccessRight", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.WrappedRequest)]
Person AccessRight(int age);
}
}
Person实体类:
namespace YZZ.Interface
{
public class Person
{
public string name;
public int age;
public int right;
}
}
如上代码所示,IBase接口中定义了一个通过年龄来做权限判断的AccessRight方法,并在该方法上附加了OperationContract与WebInvoke两个属性。
- OperationContract这个属性是用来给方法赋予WCF的特性
- WebInvoke这个属性则是给方法赋予了Web Api的特性
编译该解决方案,获得YZZ.Interface.dll
🔎2.服务端
🦋2.1 服务类
我们首先在Visual Studio中新建WCF服务文件,该文件的后台代码如下:
using YZZ.Interface;//需要添加前述IBase接口定义的YZZ.Interface.dll的引用
namespace YZZ.Service
{
public class MyBaseService : IBase
{
public Person AccessRight(int age)
{
if (age > 27)
return new Person { name = "管理员", age = age, right = 1 };
else
return new Person { name = "学生/员工", age = age, right = 0 };
}
}
}
此时我们还需要在此工程的Web.config中做如下两项配置,才能使得WCF与Web Api的特性在AccessRight方法身上完全见效。
配置一:在<system.serviceModel>节点下添加如下配置
<!--用来对外发布WCF与WebAPI-->
<services>
<service name="YZZ.Service.MyBaseService">
<!-- 对应Web API的End Point -->
<endpoint address="webapi" binding="webHttpBinding" contract="YZZ.Interface.IBase" behaviorConfiguration="WebApiEndPointBehavior" />
<!-- 对应WCF的End Point -->
<endpoint address="" binding="basicHttpBinding" contract="YZZ.Interface.IBase" />
</service>
</services>
配置二:在节点下添加如下配置
<!-- WCF Service转换为Web API后,使用的behavior -->
<endpointBehaviors>
<behavior name="WebApiEndPointBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
如此一来,AccessRight方法就兼具了Web Api与WCF的双重特性。其WCF和Web Api(Web服务)的调用路径如下:
http://139.244.52.136:120/MyBaseService.svc
http://部署的服务器路径(ip+port)/MyBaseService.svc/webapi/AccessRight
🦋2.2 部署服务
为了演示Web服务的负载均衡的效果,现在我们把AccessRight方法的内容稍做修改成3个版本,分别编译YZZ.Service工程后部署在3个不同的地方(如何部署请参考其它资料,这是基础知识)。如下:
对应AccessRight代码1:
public Person AccessRight(int age)
{
if (age > 27)
return new Person { name = "管理员", age = age, right = 1 };
else
return new Person { name = "学生/员工", age = age, right = 0 };
}
对应AccessRight代码2:
public Person AccessRight(int age)
{
if (age > 27)
return new Person { name = "管理员1", age = age, right = 1 };
else
return new Person { name = "学生/员工1", age = age, right = 0 };
}
对应AccessRight代码3:
public Person AccessRight(int age)
{
if (age > 27)
return new Person { name = "管理员2", age = age, right = 1 };
else
return new Person { name = "学生/员工2", age = age, right = 0 };
}
🔎3.客户端
🦋3.1 安装包
DeveloperSharp
🦋3.2 配置文件
1、DeveloperSharp.xml
DeveloperSharp.xml的配置文件,并在该文件中设置如上3个web服务的负载均衡策略。文件内容如下:
<?xml version="1.0" encoding="utf-8" ?>
<DeveloperSharp>
<IServiceList>
<IService Id="YZZ.Interface.IBase">
<Service Id="A11" Enable="true" Weight="100" BindType="basicHttpBinding" Address="http://139.244.52.136:120/MyBaseService.svc"/>
<Service Id="A22" Enable="true" Weight="100" BindType="basicHttpBinding" Address="http://139.244.52.136:220/MyBaseService.svc"/>
<Service Id="A33" Enable="true" Weight="100" BindType="basicHttpBinding" Address="http://139.244.52.136:230/MyBaseService.svc"/>
</IService>
</IServiceList>
</DeveloperSharp>
对此xml配置文件说明如下:
每一个IService节点代表了一组Web服务,此节点的Id值(本文示例值是:YZZ.Interface.IBase)必须是这组Web服务的“基类接口”的完全限定名。
Service节点中的Weight属性代表了使用权重。本文示例的3个服务的Weight值分别是100、100、100,则这3个服务的负载均衡使用分配比例将会是1:1:1。若把这三个值分别设置为100、50、50,则这3个服务的使用分配比例将会变为2:1:1。设置成你想要的比例吧。
Service节点中的Enable属性代表了是否可用。true代表可用,false代表不可用。
2、App.config
在工程配置文件App.config(或Web.config)中添加appSettings节点,节点内容如下:
<appSettings>
<add key="DatabaseType" value="" />
<add key="ConnectionString" value="" />
<add key="ErrorPage" value="" />
<add key="ErrorLog" value="D:\Test2\YZZ.Client\log.txt" />
<add key="ConfigFile" value="D:\Test2\YZZ.Client\DeveloperSharp.xml" />
</appSettings>
其中,ConfigFile的设置是为了链接前述的DeveloperSharp.xml这个配置文件。ErrorLog则是设置一个错误日志文件。它们均需要设置为文件的“绝对路径”(此处使用“绝对路径”而不是“相对路径”,一是有利于安全性,二是有利于分布式部署)
🦋3.3 使用
class Program
{
static void Main(string[] args)
{
YZZ.Interface.Person p;
DeveloperSharp.Framework.CoreUtility.IUtility IU = new DeveloperSharp.Framework.CoreUtility.Utility();//创建“Web服务”负载均衡调用的工具
//第一次调用远程Web服务
p = IU.GetService<YZZ.Interface.IBase>().AccessRight(20);
Console.WriteLine(p.name);
//第二次调用远程Web服务
p = IU.GetService<YZZ.Interface.IBase>().AccessRight(20);
Console.WriteLine(p.name);
//第三次调用远程Web服务
p = IU.GetService<YZZ.Interface.IBase>().AccessRight(20);
Console.WriteLine(p.name);
Console.ReadLine();
}
}
🚀感谢:给读者的一封信
亲爱的读者,
我在这篇文章中投入了大量的心血和时间,希望为您提供有价值的内容。这篇文章包含了深入的研究和个人经验,我相信这些信息对您非常有帮助。
如果您觉得这篇文章对您有所帮助,我诚恳地请求您考虑赞赏1元钱的支持。这个金额不会对您的财务状况造成负担,但它会对我继续创作高质量的内容产生积极的影响。
我之所以写这篇文章,是因为我热爱分享有用的知识和见解。您的支持将帮助我继续这个使命,也鼓励我花更多的时间和精力创作更多有价值的内容。
如果您愿意支持我的创作,请扫描下面二维码,您的支持将不胜感激。同时,如果您有任何反馈或建议,也欢迎与我分享。
再次感谢您的阅读和支持!
最诚挚的问候, “愚公搬代码”