Dapr + .NET Core实战(十一)单机Dapr集群负载均衡
如何单机部署Dapr集群
第十篇讲过了K8S集群下如何使用Dapr运行程序,但是很多人一直在问如何单机下进行Dapr的负载,这节课我们来聊聊如何单机进行Dapr的负载。
首先要说的是单机下,通过 dapr run --app-id xxxxx这个命令是没办法直接运行dapr集群的,因为同一个app-id只能通过dapr run运行一次。这时候我们就需要利用docker来实现dapr的单机集群部署。下面我们就来实现dapr的单机集群部署。
项目拓扑

我们采用在docker内部为frontend部署一个实例,为backend部署两个实例的方法,来实现backend的集群化负载,另外需要为frontend和2个backend分别启动一个sidecar容器。因此此实例一共需要部署6个容器。
项目实战
首先在BackEnd中新增控制器IpController,并添加获取backend实例ip的接口
[Route("api/[controller]")]
[ApiController]
public class IpController : ControllerBase
{
public ActionResult Get()
{
var ip = System.Net.NetworkInformation.NetworkInterface.GetAllNetworkInterfaces().Select(p => p.GetIPProperties()).SelectMany(p => p.UnicastAddresses)
.Where(p => p.Address.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork && !System.Net.IPAddress.IsLoopback(p.Address))
.FirstOrDefault()?.Address.ToString();
return Ok(new List<string> { ip });
}
}
然后需要在FrontEnd的DaprController中添加调用获取backend ip的接口
[HttpGet("ip")]
public async Task<ActionResult> GetIpAsync()
{
using var _daprClient = new DaprClientBuilder().Build();
var result = await _daprClient.InvokeMethodAsync<List<string>>(HttpMethod.Get, "backend", "api/Ip");
return Ok(result);
}
这样我们就可以通过访问frontend的Dapr/ip来验证backend是不是可以实现负载均衡。
Docker运行
在前面的课程里我们已经为backend和frontend建好了Dockerfile,这里不再谈Dockerfile的编写
backend
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 5000 FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["BackEnd/BackEnd.csproj", "BackEnd/"]
RUN dotnet restore "BackEnd/BackEnd.csproj"
COPY . .
WORKDIR "/src/BackEnd"
RUN dotnet build "BackEnd.csproj" -c Release -o /app/build FROM build AS publish
RUN dotnet publish "BackEnd.csproj" -c Release -o /app/publish FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "BackEnd.dll"]
frontend
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 5001 FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["FrontEnd/FrontEnd.csproj", "FrontEnd/"]
RUN dotnet restore "FrontEnd/FrontEnd.csproj"
COPY . .
WORKDIR "/src/FrontEnd"
RUN dotnet build "FrontEnd.csproj" -c Release -o /app/build FROM build AS publish
RUN dotnet publish "FrontEnd.csproj" -c Release -o /app/publish FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "FrontEnd.dll"]
右键backend新增容器适配支持,新增docker-compose支持

修改docker-compose.yaml的内容
version: '3.4'
services:
backend:
image: ${DOCKER_REGISTRY-}backend
build:
context: .
dockerfile: BackEnd/Dockerfile
ports:
- "51000:50001" daprbackend-dapr:
image: "daprio/daprd:latest"
command: [ "./daprd", "-app-id", "backend", "-app-port", "5000" ]
depends_on:
- backend
network_mode: "service:backend" backend2:
image: ${DOCKER_REGISTRY-}backend2
build:
context: .
dockerfile: BackEnd/Dockerfile
ports:
- "53000:50001" daprbackend-dapr2:
image: "daprio/daprd:latest"
command: [ "./daprd", "-app-id", "backend", "-app-port", "5000" ]
depends_on:
- backend2
network_mode: "service:backend2" frontend:
image: ${DOCKER_REGISTRY-}frontend
build:
context: .
dockerfile: FrontEnd/Dockerfile
ports:
- "54000:50001"
- "5001:5001" daprfrontend-dapr:
image: "daprio/daprd:latest"
command: [ "./daprd", "-app-id", "frontend", "-app-port", "5001" ]
depends_on:
- frontend
network_mode: "service:frontend"
其中我们公开了frontend和backend的50001默认GRPC通信端口,给frontend暴露了一个5001端口,另外给backend和frontend分别启动了一个daprd容器,通过depends_on和network_mode实现绑定。
运行并验证
我们通过docker-compose up -d 来运行
docker-compose up -d
看到以下内容则启动成功
Creating dapr-aspnetcore-demo_backend2_1 ... done
Creating dapr-aspnetcore-demo_backend_1 ... done
Creating dapr-aspnetcore-demo_frontend_1 ... done
Creating dapr-aspnetcore-demo_daprbackend-dapr_1 ... done
Creating dapr-aspnetcore-demo_daprbackend-dapr2_1 ... done
Creating dapr-aspnetcore-demo_daprfrontend-dapr_1 ... done
通过postman调用frontend的dapr/ip,发现返回的backend的ip不一致,已成功实现负载均衡


Dapr + .NET Core实战(十一)单机Dapr集群负载均衡的更多相关文章
- .net core 跨平台开发 微服务架构 基于Nginx反向代理 服务集群负载均衡
1.概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客 ...
- 图文解说:Nginx+tomcat配置集群负载均衡
图文解说:Nginx+tomcat配置集群负载均衡 博客分类: appserver nginxTomcatUbuntuLinux网络应用 作者:niumd Blog:http://ari.iteye ...
- ngnix apache tomcat集群负载均衡配置
http://w.gdu.me/wiki/Java/tomcat_cluster.html 参考: Tomcat与Apache或Nginx的集群负载均衡设置: http://huangrs.blog. ...
- lunix 集群,负载均衡,location
nginx location语法: location支持的语法优先级: 复制代码location匹配顺序 # www.s14hanju.com/1.location = / { 我是代码1} ...
- Apache + Tomcat集群 + 负载均衡
Part I: 取经处: http://www.ramkitech.com/2012/10/tomcat-clustering-series-simple-load.html http://blog ...
- 转】Nginx+tomcat配置集群负载均衡
原博文出自于:http://blog.csdn.net/bruce_6/article/details/38228299 感谢! 相信很多人都听过nginx,这个小巧的东西慢慢地在吞食 ...
- Apache+Tomcat +mod_proxy集群负载均衡及session
序言: 在玩Apache+Tomcat +mod_jk集群负载均衡及session的时候发现,还有一种方式可以实现,就是网上各位大牛们说的mod_proxy反向代理. 实在弄的我的知识细胞洋洋.实 ...
- 【nginx+tomcat集群】Nginx1.12.2+Tomcat7集群+负载均衡+Session共享
今天想着将项目优化一下,就想的实现集群分布,在本机测试:利用nginx+tomcat实现 通过上一篇博客(http://www.cnblogs.com/qlqwjy/p/8535235.html),N ...
- 运维小知识之nginx---nginx配置Jboss集群负载均衡
codyl 2016-01-26 00:53:00 浏览385 评论0 负载均衡 转自 运维小知识之nginx---nginx配置Jboss集群负载均衡-博客-云栖社区-阿里云https://yq ...
- 【Nginx(三)】Nginx配置集群 负载均衡策略
Nginx配置集群 负载均衡策略 一.安装环境 1.安装JDK8的环境,配置JDK8的环境变量 2.上传jar包demo-1.jar 和 demo-2.jar demo-1.jar 监听8080端口; ...
随机推荐
- HuaWeiJava 上机
1 /* 2 * 第二题,输入字符串长度,字符串,计数m.从前往后计数,当数到m个元素时,m个元素出列,同时将该元素赋值给m, 3 * 然后从下一个数计数循环,直到所有数字都出列,给定的数全部为大于0 ...
- 使用Operator State方式
使用 operator state的方式有以下几种: 方式一: stateful function(RichFunction) 实现 CheckpointFunction 接口 必须实现两个方法:Vo ...
- 你的域名是如何变成 IP 地址的?
我的 个人网站 上线了,上面可以更好的检索历史文章,并且可以对文章进行留言,欢迎大家访问 可能大家都知道或者被问过一个问题,那就是很经典的「从浏览器输入 URL 再到页面展示,都发生了什么」.这个问题 ...
- vue 输入框禁止输入空格 ,只能输入数字,禁止输入数字
正则表达式: @input="form.userName = form.userName.replace(/\s+/g,'')" ( 禁止输入空格) @input=&q ...
- tomcat漏洞总结
描述 Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache.Sun 和其他一些公司及个人共同开发而成.由 ...
- GRE隧道协议
1. GRE协议简介 GRE(General Routing Encapsulation ,通用路由封装)是对某些网络层协议(如IP和IPX)的数据报文进行封装,使这些被封装的报文能够在另一网络层协议 ...
- JS010. 三元运算符扩展运用(多层判断语句 / 多条表达式)
MDN - 三元运算符 语法 Condition ? exprIfTrue : exprIfFalse 用例: function getFee(isMember) { return(isMember ...
- Maven专题2——聚合与继承
聚合 聚合模块的<packaging>元素为pom 聚合模块通过<modules>元素标识自己的子模块,每个子模块对应了一个module元素 module元素中指定的是子模块所 ...
- qsc oj-17 喵哈哈村的排队
http://qscoj.cn/problem/17/ 喵哈哈村的排队 描述 有一堆喵哈哈村的村民们在排队,他们从队列的尾部开始标号,标号为1的村民站在最后面,标号为n的村民站在队列的最前面,而且每个 ...
- 回忆之placeholder
直接看效果点这里 HTML <!DOCTYPE html> <html> <head lang="zh-CN"> <meta charse ...