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学习笔记:跨物理机负载均衡服务调用相关推荐

  1. Dapr牵手.NET学习笔记:状态管理之docker-compose发布

    Dapr牵手.NET学习笔记:想入非非的服务调用 Dapr牵手.NET学习笔记:跨物理机负载均衡服务调用 Dapr牵手.NET学习笔记:用docker-compose部署服务 说明:为了给出demo的 ...

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

    dapr,一个为分布式应用程序的运行时,为开发者在对接分布式组件时,提供了便利.使用dapr带来的好处可扩展性,因为它是通过sidecar的理概念来集成其他运行时的.同时dapr还提供了多种语言的SD ...

  3. 【官方文档】Nginx负载均衡学习笔记(二)负载均衡基本概念介绍

    简介 负载均衡(Server Load Balancer)是将访问流量根据转发策略分发到后端多台 ECS 的流量分发控制服务.负载均衡可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应 ...

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

    上一篇聊到用两个物理机(一个win,一个mac)来部署dapr和服务 ,实现order调用pay的负载均衡.本篇说一下在windows上的docker部署这三个服务,达到与上一篇的效果. 三个服务的部 ...

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

    demo运行环境:Windows10,Docker(dapr_zipkin,dapr_redid,dapr_placement) 安装:dapr init 卸载:dapr uninstall,然后删除 ...

  6. 后台系统可扩展性学习笔记(五)负载均衡

    文章目录 Load balancer(负载均衡器) 请求传输拆解 DNS 负载均衡 客户端负载均衡 OSI 七层模型回顾 2 层.3 层负载均衡 3/4 层负载均衡 7 层负载均衡 在 第一节谈到了系 ...

  7. nginx tcp转发_Nginx学习(九):负载均衡服务

    介绍 对于请求而言,负载均衡能很好的均摊请求,提高服务端吞吐率和整体性能,多个服务节点部署的方式,也提高了容灾和服务高可用. 一.负载均衡分类 负载均衡分为:GSLB和SLB. 1. GDLB 全局负 ...

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

    在上一篇文章中说到,dapr默认的状态是不可能跨appid的,也就是只能在相同的应用内访问自己设置的状态数据,dapr支持三种状态的共享配置:appid,nam,none,是通过修改component ...

  9. Dapr牵手.NET学习笔记:Actor一个场景

    接上一篇最后的场景,为了解决相同帐户并发引起的数据库行级锁,可以引入Actor的串机制,相同ActorID的实例,串行,这样就能在应用层把读取余额的资源争抢解决掉,剩下的工作就是一定时间间隔,把内存中 ...

最新文章

  1. Linux centos6.7 关闭防火墙
  2. ConditionObject源码
  3. python怎么实现类似#define宏定义_Python系列学习笔记
  4. 常用的机器学习数据挖掘知识点【转】
  5. 迷宫搜索问题最短路_【算法常用模板】总结(更新中)
  6. oracle ebs 采购订单 为员工分配职务,oracle—EBS-采购功能点操作手册
  7. 关于header('location:url')的一些说明,php缓冲区
  8. android selector
  9. 《我是一只IT小小鸟》阅读笔记
  10. cfd软件matlab,【流体】| 10个目前流行的CFD仿真软件,你了解几个?
  11. 循迹小车三个感应c语言程序,循迹小车的C语言程序(带注释)
  12. Mimikatz的攻击及防御
  13. libtorrent源码分析(四)LSD实现
  14. C语言例题5: 三角形周长面积
  15. 孙飞脸色一变,惊讶道:“修者,你也是修者?”
  16. 验证码短信收不到的原因及解决办法
  17. Bootstrap学习笔记——缩略图、警示框、进度条、媒体对象、列表组、画板
  18. java内部窗口无法实现,java 既不是内部命令也不是外部命令的解决办法
  19. 艾美智能影库服务器ip,艾美影库MS-300 到底怎么样?
  20. 【js】onchange事件不被触发

热门文章

  1. 数据可视化----我在寻找一款类似vfp或是access这样自带可视化风格的数据库或是键盘数据库...
  2. python 切片_全面解读Python高级特性切片
  3. 如何使用Nikto漏洞扫描工具检测网站安全
  4. LeetCode 最大正方形
  5. UESTC 电子科大专题训练 DP-N
  6. 天天写日记争当文艺青年 2014-5-13
  7. HDU 2516 (Fabonacci Nim) 取石子游戏
  8. Binding在WPF中的使用
  9. CRM学习笔记(一)
  10. 微软相关的开发资源列表(update)