Dapr牵手.NET学习笔记:跨物理机负载均衡服务调用

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dapr牵手.NET学习笔记:跨物理机负载均衡服务调用相关的知识,希望对你有一定的参考价值。

dpar在同一台电脑上不能run 相同appid,这个在上篇说过,所以就用外部负载均衡nginx来对应,那在不同的host中跑同一服务,看看dapr内部的负载均衡是怎么实现的。

说说现有的服务,两个服务,订单服务,支付服务;下完订单后同步调支付服务。

一、demo项目的mock代码

OrderSystem项目,端口5000

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using System;
using System.Net.Http;
using System.Threading.Tasks;


namespace OrderSystem.Controllers;
[ApiController]
[Route("[controller]")]
public class HomeController : ControllerBase
{
    private readonly ILogger<HomeController> _logger;
    private readonly IHttpClientFactory _clientFactory;
    private readonly string? _payUrl;
    public HomeController(ILogger<HomeController> logger, IHttpClientFactory clientFactory, IConfiguration configuration)
    {
        _payUrl = configuration.GetSection("payurl").Value;
        _clientFactory = clientFactory;
        _logger = logger;
    }
    [HttpGet("/order")]
    public async Task<IActionResult> Order()
    {
        _logger.LogInformation($"下单开始");
        await Task.Delay(400);
        _logger.LogInformation($"订单完成   调用支付系统");
        var client = _clientFactory.CreateClient();
        var content = await client.GetStringAsync(_payUrl);
        return new JsonResult(new { pay_result = content });
    }
}

appsettings.json

{
  "Urls": "http://*:5000",
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "PayUrl": "http://localhost:3500/v1.0/invoke/payment/method/pay"
}

PaymentSystem项目,端口6000

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System.Net;
using System.Runtime.InteropServices;
using System.Threading.Tasks;


namespace PaymentSystem.Controllers;
[ApiController]
[Route("[controller]")]
public class HomeController : ControllerBase
{
    private readonly ILogger<HomeController> _logger;
    public HomeController(ILogger<HomeController> logger)
    {
        _logger = logger;
    }


    [HttpGet("/pay")]
    public async Task<IActionResult> TestGet()
    {
        _logger.LogInformation($"开始支付");
        await Task.Delay(200);
        _logger.LogInformation($"支付完成");
        return new JsonResult(new { result = true, message = "支付成功", host = Dns.GetHostName() });
    }
}

appsettings.json

{
  "Urls": "http://*:6000",
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*"
}

二、应用部署调用关系图

在windows10部署order服务,并启动sidecar

dapr run --app-id order --app-port 5000  --dapr-http-port 3500

在windows10和mac下分别部署pay服务,并启动sidecar

dapr run --app-id pay --app-port 6000 --dapr-http-port 3600

三、测试

postman调用地址:localhost:3500/v1.0/invoke/order/method/order

在多次调用中,支付接口返回的结果中的host是在变换的,说明pay达到了负载均衡的效果(dapr本地部署负载均衡的服务发现是用mDNS来实现的,通过sidecar把各自代码服务的信息多路广播到局域网中的其他sidecar,来共享同步服务的相关信息)。

返回结果1:

返回结果2:

心得:

受到传统的负载均衡器的测试影响,总想把Pay服务在两个电脑上跑起来,用postman直接连http://localhost:3600/v1.0/invoke/pay/method/pay调用,看两个服务是不是轮询访问,这里就与dapr的思想不一致了。

dapr最核心的功能通过sidecar代表应用,来处理一切事务,sidecar是全权代表,意思调用者也有自己的sidecar,给自己的sidecar索要外部资源。上例中order端口5000,sidecare的http端口是3500,它们是一组;pay端口是6000,sidecar的http端口是3600;如果order调用pay,那order应该在自己sidecare的3500端口上调用pay,所以调用地址是:http://localhost:3500/v1.0/invoke/pay/method/pay。

换句话说,如果想用postman调用pay服务,同理,需要给postman起个3400的sidecare,也可以用postman调http://localhost:3400/v1.0/invoke/pay/method/pay来访问pay服务了,相当于postman和3400的sidecar是一家人,内部调用,全权代理,这样被调用的pay就会在win和mac上轮询调用了。

所以这里需要默念10次:服务和它的sidecar是一家人,有困难找自己的sidecar……

以上是关于Dapr牵手.NET学习笔记:跨物理机负载均衡服务调用的主要内容,如果未能解决你的问题,请参考以下文章

Dapr牵手.NET学习笔记:用docker-compose部署服务

Dapr牵手.NET学习笔记:状态管理进阶

Dapr牵手.NET学习笔记:想入非非的服务调用

Dapr牵手.NET学习笔记:开篇

Dapr牵手.NET学习笔记:可观测性-分布式跟踪

Dapr牵手.NET学习笔记:状态管理进阶