如何单机部署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_onnetwork_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集群负载均衡的更多相关文章

  1. .net core 跨平台开发 微服务架构 基于Nginx反向代理 服务集群负载均衡

    1.概述 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客 ...

  2. 图文解说:Nginx+tomcat配置集群负载均衡

    图文解说:Nginx+tomcat配置集群负载均衡 博客分类: appserver nginxTomcatUbuntuLinux网络应用  作者:niumd Blog:http://ari.iteye ...

  3. ngnix apache tomcat集群负载均衡配置

    http://w.gdu.me/wiki/Java/tomcat_cluster.html 参考: Tomcat与Apache或Nginx的集群负载均衡设置: http://huangrs.blog. ...

  4. lunix 集群,负载均衡,location

       nginx location语法: location支持的语法优先级: 复制代码location匹配顺序 #  www.s14hanju.com/1.location = / {  我是代码1} ...

  5. Apache + Tomcat集群 + 负载均衡

    Part I: 取经处: http://www.ramkitech.com/2012/10/tomcat-clustering-series-simple-load.html  http://blog ...

  6. 转】Nginx+tomcat配置集群负载均衡

    原博文出自于:http://blog.csdn.net/bruce_6/article/details/38228299         感谢! 相信很多人都听过nginx,这个小巧的东西慢慢地在吞食 ...

  7. Apache+Tomcat +mod_proxy集群负载均衡及session

      序言: 在玩Apache+Tomcat +mod_jk集群负载均衡及session的时候发现,还有一种方式可以实现,就是网上各位大牛们说的mod_proxy反向代理. 实在弄的我的知识细胞洋洋.实 ...

  8. 【nginx+tomcat集群】Nginx1.12.2+Tomcat7集群+负载均衡+Session共享

    今天想着将项目优化一下,就想的实现集群分布,在本机测试:利用nginx+tomcat实现 通过上一篇博客(http://www.cnblogs.com/qlqwjy/p/8535235.html),N ...

  9. 运维小知识之nginx---nginx配置Jboss集群负载均衡

      codyl 2016-01-26 00:53:00 浏览385 评论0 负载均衡 转自 运维小知识之nginx---nginx配置Jboss集群负载均衡-博客-云栖社区-阿里云https://yq ...

  10. 【Nginx(三)】Nginx配置集群 负载均衡策略

    Nginx配置集群 负载均衡策略 一.安装环境 1.安装JDK8的环境,配置JDK8的环境变量 2.上传jar包demo-1.jar 和 demo-2.jar demo-1.jar 监听8080端口; ...

随机推荐

  1. Jemeter压力测试

    Jmeter教程 简单的压力测试 Jmeter是一个非常好用的压力测试工具.  Jmeter用来做轻量级的压力测试,非常合适,只需要十几分钟,就能把压力测试需要的脚本写好. 转载自小坦克:https: ...

  2. Faiss使用多线程出现的性能问题

    Faiss使用多线程出现的性能问题 faiss在增加CPU的情况下,反而出现效率低下的问题. 从理论上看,作为一个CPU/GPU计算型的应用,更多的核意味着更大的计算吞吐能力,性能只会越来越好才是. ...

  3. http请求包含哪几个部分(请求行、请求头、请求体)

    http协议报文     1.请求报文(请求行/请求头/请求数据/空行)         请求行             求方法字段.URL字段和HTTP协议版本             例如:GET ...

  4. centos7 配置 ftp 服务器(本地用户)

    2021-09-02 1. 安装 # 安装 vsftpd yum -y install vsftpd 2. 启动服务并添加到开机自启 # 启动 vsftpd systemctl start vsftp ...

  5. Django的form组件——正则校验

    from django.contrib import admin from django.urls import path from app01 import views urlpatterns = ...

  6. 20210811 Dove 打扑克,Cicada 与排序,Cicada 拿衣服

    考场 开考感觉 T3 比较可做.T1 看上去不难但毫无思路. 先想了 25min T3,想到一个确定左端点,二分最长的右端点,甚至想到了用猫树维护区间 or and...上厕所回来发现假了,没有单调性 ...

  7. 记一次《C语言踩内存》问题定位有感

    踩内存问题,个人认为算是比较容易出现但是有很难定位的问题,被踩者轻者功能瘫痪,重者一命呜呼,直接诱发死机.产生踩内存的的原因也比较多样,比较典型的有如下几种: 数组越界访问 字符串越界操作 直接操作野 ...

  8. WinForm控件常用设置(转)

    本来想自己整理一份,但找到了一份挺全的,就直接用到直接找吧 A0 ---- 通用A1 ---- Form 类A2 ---- Control 类A3 ---- MessageBox 类A4 ---- B ...

  9. 一文搞懂如何使用Node.js进行TCP网络通信

    摘要: 网络是通信互联的基础,Node.js提供了net.http.dgram等模块,分别用来实现TCP.HTTP.UDP的通信,本文主要对使用Node.js的TCP通信部份进行实践记录. 本文分享自 ...

  10. 机器学习——支持向量机SVM

    前言 学习本章节前需要先学习: <机器学习--最优化问题:拉格朗日乘子法.KKT条件以及对偶问题> <机器学习--感知机> 1 摘要: 支持向量机(SVM)是一种二类分类模型, ...