二, .NET Core 微服务学习 ——集中式代理-Nginx
Nginx 示意图如下:
准备工作:
1. 创建一个Web 工程
2. 创建提供数据的WebAPI服务
3. 用命令行启动WebAPI服务,用不同的端口进行启动
4. 配置Nginx服务
5. 用Nginx地址调用服务
命令行启动命令:
启动Web网站:
dotnet MicroService.dll --urls="http://*:8905" --ip="127.0.0.1" --port=8012
启动WebAPI服务:
dotnet MicroService.WebAPI.dll --urls="http://*:5726" --ip="127.0.0.1" --port=5726
dotnet MicroService.WebAPI.dll --urls="http://*:5727" --ip="127.0.0.1" --port=5727
dotnet MicroService.WebAPI.dll --urls="http://*:5728" --ip="127.0.0.1" --port=5728
Nginx配置:
Web前端调用
public IActionResult Index() { // 单体系统 //ViewBag.Users = this._IUserService.UserAll(); string url = String.Empty; string content = String.Empty; // WebAPI 调用 //string url = "http://localhost:5726/api/users/all"; //string content = InvokeAPI(url); // Nginx url = "http://localhost:8087/api/users/all"; content = InvokeAPI(url); ViewBag.Users = Newtonsoft.Json.JsonConvert.DeserializeObject<IEnumerable<User>>(content); return View(); }
public static string InvokeAPI(string url) { using (HttpClient httpClient = new HttpClient()) { HttpRequestMessage message = new HttpRequestMessage(); message.Method = HttpMethod.Get; message.RequestUri = new Uri(url); var result = httpClient.SendAsync(message).Result; string content = result.Content.ReadAsStringAsync().Result; return content; } }
运行结果
刷新画面:
Nginx 分布式集群 负载均衡默认采用的是轮询的原则进行访问。
负载均衡就是将请求“均衡”地分配到多台业务节点服务器上。这里的“均衡”是依据实际场景和业务需要而定的。
对于Nginx来说,请求到达Nginx,Nginx作为反向代理服务器,有绝对的决策权,可以按照规则将请求分配给它知道的节点中的一个,通过这种分配,使得所有节点需要处理的请求量处于相对平均的状态,从而实现负载均衡。
Nginx支持的负载均衡策略很多,比较重点的如下:
- round robin(轮询)
- random(随机)
- weight(权重)
- fair(按响应时长,三方插件)
- url_hash(url的hash值)
- ip_hash(ip的hash值)
- least_conn(最少连接数)
故障节点摘除与恢复
先看看经典配置,再详细解释。
upstream server_group {
server localhost:5726;
server localhost:5727 max_fails=3 fail_timeout=30s;
server localhost:5728 backup;
}
max_fails=number
这个参数决定了多少次请求后端失败后会暂停这个业务节点,不再给它发新的请求,默认值是1。此参数需要配合fail_timeout一起用。
题外话:如何定义失败,有很多种类型,这里因为主要处理HTTP代理,所以更关注proxy_next_upstream。
proxy_next_upstream:主要定义了当服务节点出现状况时,会将请求发给其他节点,也就是定义了怎么算作业务节点失败。
fail_timeout=time
决定了当Nginx认定这个节点不可用时,暂停多久。不配置默认就是10s。
把上面两个参数联合起来考虑就是:当Nginx发现发送到这个节点上的请求失败了3次的时候,就会把这个节点摘除,摘除时间是30s,30s后才会再次发送请求到这个节点上。