tnblog
首页
视频
资源
登录

Dapr 负载均衡

5547人阅读 2022/8/11 22:01 总访问:3658102 评论:0 收藏:0 手机
分类: 容器编排

Dapr 负载均衡

实现目标


Dapr 使用 mDNS 协议提供负载均衡,将Service02的请求平均分布到两个Service01的实例上。

创建API接口与服务


创建Service01的服务接口。
我们这里就只提供获取唯一的Guid接口服务。

  1. [ApiController]
  2. [Route("[controller]")]
  3. public class WeatherForecastController : ControllerBase
  4. {
  5. private static readonly string InstanceId = Guid.NewGuid().ToString();
  6. private readonly ILogger<WeatherForecastController> _logger;
  7. public WeatherForecastController(ILogger<WeatherForecastController> logger)
  8. {
  9. _logger = logger;
  10. }
  11. [HttpGet(Name = "guid")]
  12. public async Task<IActionResult> Get()
  13. {
  14. return Ok(new { Service = "Service01", InstanceId });
  15. }
  16. }


创建Service02的服务接口。
首先安装Dapr.AspNetCore包,然后添加好Dapr依赖服务,并创建一个Guid的控制器。

  1. builder.Services.AddControllers()
  2. .AddDapr();
  1. [ApiController]
  2. [Route("[controller]")]
  3. public class GuidController : ControllerBase
  4. {
  5. private readonly DaprClient _daprClient;
  6. public GuidController(DaprClient daprClient)
  7. {
  8. _daprClient = daprClient;
  9. }
  10. [HttpGet]
  11. public async Task<IActionResult> Hello()
  12. {
  13. // 通过dapr访问Service01的API
  14. var result = await _daprClient.InvokeMethodAsync<object>(HttpMethod.Get, "service01", "WeatherForecast");
  15. return Ok(result);
  16. }
  17. }

运行Service01服务


首先启动我们的两个需要负载均衡的接口服务,运行的端口为60026001,在使用daprd命令注册到dapr中。

  1. dotnet run service01 --urls=http://localhost:6002
  2. dotnet run service01 --urls=http://localhost:6001

  1. daprd --app-id service01 --app-port 6001 --dapr-http-port 5001 --dapr-grpc-port 4001 --metrics-port 9001
  2. daprd --app-id service01 --app-port 6002 --dapr-http-port 5002 --dapr-grpc-port 4002 --metrics-port 9002

运行Service02服务


打开Service02项目的目录下,通过powershell执行下面的命令进行启动。

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

测试运行

  1. http://localhost:5001/v1.0/invoke/service01/method/WeatherForecast
  2. http://localhost:5002/v1.0/invoke/service01/method/WeatherForecast
  3. # 测试是否达到了负载均衡
  4. http://localhost:5003/v1.0/invoke/service02/method/guid

部署到k8s中

镜像打包与上传

  1. docker build -t aidasi/dapr_service01:v1 -f ./DaprLoadBalancer/Dockerfile .
  2. docker build -t aidasi/dapr_service02:v1 -f ./DaprLoadBalancerGateway/Dockerfile .
  3. # push
  4. docker push aidasi/dapr_service01:v1
  5. docker push aidasi/dapr_service02:v1

kubernetes 部署相关服务


在确保有dapr的环境下进行部署dapr_service01和dapr_service02服务,并将需要负载均衡的dapr_service01副本数设置为2.

  1. vim service01.yaml
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: service01
  5. labels:
  6. app: service01
  7. spec:
  8. replicas: 2 # 2个副本
  9. selector:
  10. matchLabels:
  11. app: service01
  12. template:
  13. metadata:
  14. labels:
  15. app: service01
  16. annotations:
  17. dapr.io/enabled: "true" # 开启Dapr边车
  18. dapr.io/app-id: "service01"
  19. dapr.io/app-port: "80"
  20. spec:
  21. containers:
  22. - name: service01
  23. image: docker.io/aidasi/dapr_service01:v1
  1. kubectl apply -f service01.yaml


创建Service02的yaml文件

  1. vim service02.yaml
  1. apiVersion: apps/v1
  2. kind: Deployment
  3. metadata:
  4. name: service02
  5. labels:
  6. app: service02
  7. spec:
  8. replicas: 1
  9. selector:
  10. matchLabels:
  11. app: service02
  12. template:
  13. metadata:
  14. labels:
  15. app: service02
  16. annotations:
  17. dapr.io/enabled: "true" # 开启Dapr边车
  18. dapr.io/app-id: "service02"
  19. dapr.io/app-port: "80"
  20. spec:
  21. containers:
  22. - name: service02
  23. image: docker.io/aidasi/dapr_service02:v1
  24. ---
  25. apiVersion: v1
  26. kind: Service
  27. metadata:
  28. name: service02
  29. spec:
  30. type: ClusterIP
  31. selector:
  32. app: service02
  33. ports:
  34. - port: 80
  35. targetPort: 80
  1. kubectl apply -f service02.yaml

测试

  1. # 查看资源创建情况
  2. kubectl get pod,svc
  3. # 访问guid
  4. curl http://10.110.174.130/guid
  5. curl http://10.110.174.130/guid


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739

评价

Dapr 安装与介绍

Dapr 安装与介绍[TOC] Dapr 介绍Github: https://github.com/dapr/daprDapr是一种可移植的,事件驱动的,无服务器运行时...

Dapr 简单使用的内置API

Dapr 简单使用的内置API[TOC] 您的本地环境具有 Dapr sidecar 二进制文件以及状态管理和消息代理(均使用 Redis)的默认组...

Dapr 定义一个组件

Dapr 定义一个组件[TOC] 在上一步中,您调用了 Dapr HTTP API 来从 Redis 支持的状态存储中存储和检索状态。Dapr通过初始...

Dapr 官方教程第一章(Hello World)

Dapr 官方教程第一章(Hello World)[TOC] 本教程将演示如何在您的机器上本地运行 Dapr。您将部署一个 Node.js 应用程序,该...

Dapr 官方教程第二章(Hello World Kubernetes)

Dapr 官方教程第二章(Hello World Kubernetes)[TOC] 本教程将帮助您在 Kubernetes 集群中使用 Dapr。您将从Hello World部...

Dapr 官方教程第三章(分布式计算器)

Dapr 官方教程第三章(分布式计算器)[TOC] 本快速入门通过分布式计算器展示了 Dapr 的方法调用和状态持久性功能,其中每个...

Dapr 官方教程第四章(发布订阅)

Dapr 官方教程第四章(发布订阅)[TOC] 在本快速入门中,您将创建一个发布者微服务和两个订阅者微服务,以演示 Dapr 如...

Dapr 官方教程第五章(Dapr 绑定kafka)

Dapr 官方教程第五章(Dapr 绑定kafka)[TOC] 在本快速入门中,您将创建两个微服务,一个具有输入绑定,另一个具有输出绑定...

Dapr .netcore与go的方法调用

Dapr .netcore与go的方法调用[TOC] 主要回顾一下dapr是如何调用方法的。这里是通过.netcore程序调用go程序中的方法。本章...

Dapr .NetCore 调用方法

Dapr .NetCore 调用方法[TOC] 创建客户端项目(InvokeMethod) 在Program类中设置日志控制台输出,在 launchSettings.jso...

Dapr .NetCore 状态管理

Dapr .NetCore 状态管理[TOC] 使用状态管理,您的应用程序可以将数据作为键/值对存储在支持的状态存储中。使用状态管理时...

Dapr .NetCore grpc调用

Dapr .NetCore grpc调用[TOC] 本文介绍如何使用 Dapr 连接使用 gRPC 的服务。通过使用 Dapr 的 gRPC 代理功能,您可以使用...

Dapr .NetCore 订阅与发布(上)

Dapr .NetCore 订阅与发布[TOC] 介绍Pub/Sub 是分布式系统中的一种常见模式,具有许多想要利用解耦异步消息传递的服务。使...

Dapr .NetCore 订阅与发布(下)

Dapr .NetCore 订阅与发布(下)[TOC] 解决关于运行是报错问题我们将为InvokeMethodServerAPI项目做一些修改。首先添加一些...

Dapr .NetCore Actor

Dapr .NetCore Actor[TOC] Actor简介简单来讲就是锁的作用,可以用作单线程调用实例,起到加锁的效果。解决了并发抢票的。...

Dapr .NetCore 绑定输入输出

Dapr .NetCore 绑定输入输出[TOC] 输入绑定简单来说通过你的应用所对应的dapr边车绑定队列的消息处理,但是这个消息中间件...
这一世以无限游戏为使命!
排名
2
文章
657
粉丝
44
评论
93
docker中Sware集群与service
尘叶心繁 : 想学呀!我教你呀
一个bug让程序员走上法庭 索赔金额达400亿日元
叼着奶瓶逛酒吧 : 所以说做程序员也要懂点法律知识
.net core 塑形资源
剑轩 : 收藏收藏
映射AutoMapper
剑轩 : 好是好,这个对效率影响大不大哇,效率高不高
ASP.NET Core 服务注册生命周期
剑轩 : http://www.tnblog.net/aojiancc2/article/details/167
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术