1. 架构

本案例利用了Dapr的self-hosted技术,为了模仿服务间的相互调用,定义了2个service,Service02调用Service01的API。

  • Dapr 可以配置为在本地开发者机器或生产VM上以自托管模式运行(不需要依赖k8s,适用于边缘计算硬件)。
  • 每个运行的服务都有一个 Dapr 运行时进程(Daprd)以Sidecar模式运行。
  • Sidecar 编程模型鼓励每个应用程序与自己的 Dapr 实例对话,Dapr 实例会相互发现并进行通信。
  • Dapr 使用 mDNS 协议提供负载均衡,将Service02的请求平均分布到两个Service01的实例上。

  • 关注点分离

    • Service02只需要知道Service01的app-id即可
    • Service01不需要知道SideCar的存在
  • Service01
    • 不同实例使用相同app-id
    • 不同实例使用不同端口
  • Service02
    • 不需要知道Service01的实例数量
    • 不需要知道Service01的端口号
  • SideCar
    • Service02不需要知道SideCar的端口号
    • Service01的实例可以随意增加和减少
    • SideCar通过心跳发现或剔除Service01的实例

2. 新建一个ASP.NET Core Web API项目 Service01

  • 新建HelloController, 定义一个API: api/hello
  • 每个Service01实例分配不同的InstanceId
  • API被访问时,返回InstanceId,来验证负载均衡效果
using Microsoft.AspNetCore.Mvc;namespace Service01.Controllers
{[ApiController]public class HelloController : ControllerBase{// 每个Service01实例分配不同的InstanceIdprivate static readonly string InstanceId = Guid.NewGuid().ToString();[HttpGet("api/Hello")]public async Task<IActionResult> Hello(){await Task.CompletedTask;// API被访问时,返回InstanceId,来验证负载均衡效果return Ok(new { Service = "Service01", InstanceId });}}
}

3. 新建一个ASP.NET Core Web API项目 Service02

3.1. 引用Dapr.AspNetCore包

<Project Sdk="Microsoft.NET.Sdk.Web"><PropertyGroup><TargetFramework>net6.0</TargetFramework><Nullable>enable</Nullable><ImplicitUsings>enable</ImplicitUsings></PropertyGroup><ItemGroup><!--引用Dapr.AspNetCore包--><PackageReference Include="Dapr.AspNetCore" Version="1.5.0" /></ItemGroup></Project>

3.2. 注入Dapr service

var builder = WebApplication.CreateBuilder(args);builder.Services.AddControllers().AddDapr(); // 注入Dapr servicevar app = builder.Build();app.UseAuthorization();app.MapControllers();app.Run();

3.3. 新建HelloController,通过dapr访问Service01的API

using Dapr.Client;
using Microsoft.AspNetCore.Mvc;namespace Service02.Controllers
{[ApiController]public class HelloController : ControllerBase{private readonly DaprClient _daprClient;public HelloController(DaprClient daprClient){_daprClient = daprClient;}[HttpGet("api/Hello")]public async Task<IActionResult> Hello(){// 通过dapr访问Service01的APIvar result = await _daprClient.InvokeMethodAsync<object>(HttpMethod.Get, "service01", "api/hello");return Ok(result);}}
}

4. 启动service01的第一个实例

4.1. 启动service01

dotnet run service01 --urls=http://localhost:6001

4.2. 看下效果

http://localhost:6001/api/hello

4.3. 启动SideCar

daprd --app-id service01 --app-port 6001 --dapr-http-port 5001  --dapr-grpc-port 4001 --metrics-port 9001

4.4. 看下效果

http://localhost:5001/v1.0/invoke/service01/method/api/hello

5. 启动service01的第二个实例

5.1. 启动service01

dotnet run service01 --urls=http://localhost:6002

5.2. 看下效果

http://localhost:6002/api/hello

5.3. 启动SideCar

daprd --app-id service01 --app-port 6002 --dapr-http-port 5002  --dapr-grpc-port 4002 --metrics-port 9002

5.4. 看下效果

http://localhost:5002/v1.0/invoke/service01/method/api/hello

6. 启动service02唯一实例

6.1. 启动service02和SideCar

dapr run --dapr-http-port 5003 --app-port 6003 --app-id service02 -- dotnet run service02 --urls=http://localhost:6003

6.2. 访问service02,验证负载均衡效果

http://localhost:6003/api/hello
  • 刷新两次页面的效果如下:

6.3. 访问SideCar,验证负载均衡效果

http://localhost:5003/v1.0/invoke/service02/method/api/hello
  • 刷新两次页面的效果如下:

7. 故障排除

7.1. Dapr with ID xxx app is already running

这是dapr CLI施加的限制,但不是daprd运行时施加的限制。运行多个实例,可以通过直接运行daprd来实现。

Daprd将使用mDNS扫描地址:当它收到第一个请求时,在后台,它将扫描更多的地址。如果它找到更多的地址,它将开始通过线性方式遍历这些地址,从而在这些地址之间分发请求。目前没有智能策略来决定向哪个实例发送请求。

7.2. Can't get xxx  locally. Error code: ERR_DIRECT_INVOKE

可能是VPN导致错误的DNS路由,关闭VPN试试。

Dapr+Net6 服务调用02:本地负载均衡(self-hosted)相关推荐

  1. Dapr+Net6 服务调用09:集群指标收集-普罗米修斯

    1. 请参考上一篇文章创建基础工程 Dapr+Net6 服务调用08:本地指标收集-普罗米修斯_敦格-CSDN博客Dapr+Net6 服务调用08:本地指标收集-普罗米修斯https://shuaih ...

  2. java路由架构_《大型分布式网站架构设计与实践》读书笔记之 服务的路由和负载均衡...

    服务的路由和负载均衡 公共的业务被拆分出来,形成可共用的服务,最大程度的保证了代码和逻辑的复用,避免重复建设,这种设计也被成为SOA(Service-Oriented Architecture) SO ...

  3. e盾服务端源码_gRPC服务注册发现及负载均衡的实现方案与源码解析

    今天聊一下gRPC的服务发现和负载均衡原理相关的话题,不同于Nginx.Lvs或者F5这些服务端的负载均衡策略,gRPC采用的是客户端实现的负载均衡.什么意思呢,对于使用服务端负载均衡的系统,客户端会 ...

  4. Centos7+Nginx+Keepalived实现Apache服务的高可用负载均衡

    Centos7+Nginx+Keepalived实现Apache服务的高可用&负载均衡 今天是2017年的第一天,昨天也就是2016年的最后一天,我尝试部署了Centos7+Nginx+Kee ...

  5. gRPC服务注册发现及负载均衡的实现方案与源码解析

    今天聊一下gRPC的服务发现和负载均衡原理相关的话题,不同于Nginx.Lvs或者F5这些服务端的负载均衡策略,gRPC采用的是客户端实现的负载均衡.什么意思呢,对于使用服务端负载均衡的系统,客户端会 ...

  6. 微服务SpringCloud中的负载均衡,你都会么?

    1.什么是负载均衡 首先我们来看看维基百科对负载均衡的说明: 负载平衡(Load balancing)是一种计算机技术,用来在多个计算机(计算机集群).网络连接.CPU.磁盘驱动器或其他资源中分配负载 ...

  7. windows网络服务之配置网络负载均衡(NLB)群集

    O首页51CTO博客我的博客搜索 每日博报 社区:学院论坛博客下载更多            登录注册 家园 学院 博客 论坛 下载 自测 门诊 周刊 读书 技术圈 曾垂鑫的技术专栏 http://5 ...

  8. 【云原生微服务八】Ribbon负载均衡策略之WeightedResponseTimeRule源码剖析(响应时间加权)

    文章目录 一.前言 二.WeightedResponseTimeRule 1.计算权重? 1)如何更新权重? 2)如何计算权重? 3)例证权重的计算 2.权重的使用 1)权重区间问题? 一.前言 前置 ...

  9. 华为云服务-运维篇-负载均衡介绍与平台算法使用

    文章目录 1.前言 2.负载均衡的分类 2.1.硬件负载均衡 2.2.软件负载均衡 2.3.本地负载均衡 2.4.全局负载均衡 3.负载均衡算法 3.1 分类介绍 3.2 静态负载 3.3 动态负载 ...

最新文章

  1. 2022-2028年中国刨花板市场投资分析及前景预测报告(全卷)
  2. Android中事件分发机制的总结
  3. nginx——location 优先级
  4. Mac上使用nginx访问本地文件夹报403的问题
  5. 教你利用工具将单机游戏改造成对战网游
  6. 在Windows上安装Elasticsearch 5.0
  7. 计算机组装的理论知识,计算机组装基本知识点.ppt
  8. Java .net 心得_我做英文站的心得-如何做好英文站 - 程序员日记 - 做人做技术【关注.NET和JAVA】...
  9. 学习Unix下C编程的实例
  10. 学生宿舍管理项目开发计划书_学生宿舍管理系统项目-计划书.doc
  11. 软件需求说明书怎么写
  12. 小巧实用的KMS激活工具 AAct特别版
  13. 使用python画二元二次函数(笔记)
  14. Escape HDU - 3533
  15. 上海地铁二号线各车站换乘和时刻表
  16. Counting Bloom Filter
  17. 【Xilinx】Zynq\MPSoc\Versal不同速度等级下的ARM主频
  18. 移动硬盘插入提示需要格式化RAW_为什么U盘插电脑上提示需要格式化?想让资料不丢失,这样就可以...
  19. Web项目的Excel文件上传、解析、导入
  20. c语言追光篮球程序,追光篮球游戏下载-追光篮球苹果版v1.0_6137游戏网

热门文章

  1. 头条校招(今日头条2017秋招真题)1——python解法
  2. 在线考试系统的性能需求分析
  3. html 字母全部大写,HTML文本框录入字母自动大写问题解决方法
  4. 毕业有感-抉择的重要性
  5. QT中的视频显示优化
  6. 根据GEOHASH,查找附近的人,判断距离远
  7. 基于Socket实现远程木马
  8. 步进电机和步进驱动器的介绍、接线、细分和控制方法
  9. 苹果手机显示无法与服务器建立安全连接,苹果手机那个safari浏览器无法与访问器建立安全链接是什么意思...
  10. windows画图板 ESL转RGB 实现区间渐变色