Dapr+Net6 服务调用02:本地负载均衡(self-hosted)
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)相关推荐
- Dapr+Net6 服务调用09:集群指标收集-普罗米修斯
1. 请参考上一篇文章创建基础工程 Dapr+Net6 服务调用08:本地指标收集-普罗米修斯_敦格-CSDN博客Dapr+Net6 服务调用08:本地指标收集-普罗米修斯https://shuaih ...
- java路由架构_《大型分布式网站架构设计与实践》读书笔记之 服务的路由和负载均衡...
服务的路由和负载均衡 公共的业务被拆分出来,形成可共用的服务,最大程度的保证了代码和逻辑的复用,避免重复建设,这种设计也被成为SOA(Service-Oriented Architecture) SO ...
- e盾服务端源码_gRPC服务注册发现及负载均衡的实现方案与源码解析
今天聊一下gRPC的服务发现和负载均衡原理相关的话题,不同于Nginx.Lvs或者F5这些服务端的负载均衡策略,gRPC采用的是客户端实现的负载均衡.什么意思呢,对于使用服务端负载均衡的系统,客户端会 ...
- Centos7+Nginx+Keepalived实现Apache服务的高可用负载均衡
Centos7+Nginx+Keepalived实现Apache服务的高可用&负载均衡 今天是2017年的第一天,昨天也就是2016年的最后一天,我尝试部署了Centos7+Nginx+Kee ...
- gRPC服务注册发现及负载均衡的实现方案与源码解析
今天聊一下gRPC的服务发现和负载均衡原理相关的话题,不同于Nginx.Lvs或者F5这些服务端的负载均衡策略,gRPC采用的是客户端实现的负载均衡.什么意思呢,对于使用服务端负载均衡的系统,客户端会 ...
- 微服务SpringCloud中的负载均衡,你都会么?
1.什么是负载均衡 首先我们来看看维基百科对负载均衡的说明: 负载平衡(Load balancing)是一种计算机技术,用来在多个计算机(计算机集群).网络连接.CPU.磁盘驱动器或其他资源中分配负载 ...
- windows网络服务之配置网络负载均衡(NLB)群集
O首页51CTO博客我的博客搜索 每日博报 社区:学院论坛博客下载更多 登录注册 家园 学院 博客 论坛 下载 自测 门诊 周刊 读书 技术圈 曾垂鑫的技术专栏 http://5 ...
- 【云原生微服务八】Ribbon负载均衡策略之WeightedResponseTimeRule源码剖析(响应时间加权)
文章目录 一.前言 二.WeightedResponseTimeRule 1.计算权重? 1)如何更新权重? 2)如何计算权重? 3)例证权重的计算 2.权重的使用 1)权重区间问题? 一.前言 前置 ...
- 华为云服务-运维篇-负载均衡介绍与平台算法使用
文章目录 1.前言 2.负载均衡的分类 2.1.硬件负载均衡 2.2.软件负载均衡 2.3.本地负载均衡 2.4.全局负载均衡 3.负载均衡算法 3.1 分类介绍 3.2 静态负载 3.3 动态负载 ...
最新文章
- 2022-2028年中国刨花板市场投资分析及前景预测报告(全卷)
- Android中事件分发机制的总结
- nginx——location 优先级
- Mac上使用nginx访问本地文件夹报403的问题
- 教你利用工具将单机游戏改造成对战网游
- 在Windows上安装Elasticsearch 5.0
- 计算机组装的理论知识,计算机组装基本知识点.ppt
- Java .net 心得_我做英文站的心得-如何做好英文站 - 程序员日记 - 做人做技术【关注.NET和JAVA】...
- 学习Unix下C编程的实例
- 学生宿舍管理项目开发计划书_学生宿舍管理系统项目-计划书.doc
- 软件需求说明书怎么写
- 小巧实用的KMS激活工具 AAct特别版
- 使用python画二元二次函数(笔记)
- Escape HDU - 3533
- 上海地铁二号线各车站换乘和时刻表
- Counting Bloom Filter
- 【Xilinx】Zynq\MPSoc\Versal不同速度等级下的ARM主频
- 移动硬盘插入提示需要格式化RAW_为什么U盘插电脑上提示需要格式化?想让资料不丢失,这样就可以...
- Web项目的Excel文件上传、解析、导入
- c语言追光篮球程序,追光篮球游戏下载-追光篮球苹果版v1.0_6137游戏网