Dapr 负载均衡 电脑版发表于:2022/8/11 22:01 ![](https://img.tnblog.net/arcimg/hb/896fd38e95b346f9a0d98c54b135bb94.jpg) >#Dapr 负载均衡 [TOC] ## 实现目标 tn2>Dapr 使用 mDNS 协议提供负载均衡,将Service02的请求平均分布到两个Service01的实例上。 ![](https://img.tnblog.net/arcimg/hb/f6486f67aa844e2e902f39f7577c7b36.png) ## 创建API接口与服务 tn2>创建Service01的服务接口。 我们这里就只提供获取唯一的Guid接口服务。 ```bash [ApiController] [Route("[controller]")] public class WeatherForecastController : ControllerBase { private static readonly string InstanceId = Guid.NewGuid().ToString(); private readonly ILogger<WeatherForecastController> _logger; public WeatherForecastController(ILogger<WeatherForecastController> logger) { _logger = logger; } [HttpGet(Name = "guid")] public async Task<IActionResult> Get() { return Ok(new { Service = "Service01", InstanceId }); } } ``` tn2>创建Service02的服务接口。 首先安装Dapr.AspNetCore包,然后添加好Dapr依赖服务,并创建一个Guid的控制器。 ![](https://img.tnblog.net/arcimg/hb/43863ae84e554692b37f9de669227510.png) ```csharp builder.Services.AddControllers() .AddDapr(); ``` ```csharp [ApiController] [Route("[controller]")] public class GuidController : ControllerBase { private readonly DaprClient _daprClient; public GuidController(DaprClient daprClient) { _daprClient = daprClient; } [HttpGet] public async Task<IActionResult> Hello() { // 通过dapr访问Service01的API var result = await _daprClient.InvokeMethodAsync<object>(HttpMethod.Get, "service01", "WeatherForecast"); return Ok(result); } } ``` ## 运行Service01服务 tn2>首先启动我们的两个需要负载均衡的接口服务,运行的端口为`6002`与`6001`,在使用`daprd`命令注册到dapr中。 ```bash dotnet run service01 --urls=http://localhost:6002 dotnet run service01 --urls=http://localhost:6001 ``` ![](https://img.tnblog.net/arcimg/hb/68bab738e8534d5ead7b8c412eb7f6c4.png) ```bash daprd --app-id service01 --app-port 6001 --dapr-http-port 5001 --dapr-grpc-port 4001 --metrics-port 9001 daprd --app-id service01 --app-port 6002 --dapr-http-port 5002 --dapr-grpc-port 4002 --metrics-port 9002 ``` ![](https://img.tnblog.net/arcimg/hb/176999a4e4e0418ea6284fcfb15e672b.png) ## 运行Service02服务 tn2>打开Service02项目的目录下,通过powershell执行下面的命令进行启动。 ```bash dapr run --dapr-http-port 5003 --app-port 6003 --app-id service02 -- dotnet run service02 --urls=http://localhost:6003 ``` ![](https://img.tnblog.net/arcimg/hb/39d87463fe98401fb4959a69482dff77.png) ## 测试运行 ```bash http://localhost:5001/v1.0/invoke/service01/method/WeatherForecast http://localhost:5002/v1.0/invoke/service01/method/WeatherForecast # 测试是否达到了负载均衡 http://localhost:5003/v1.0/invoke/service02/method/guid ``` ![](https://img.tnblog.net/arcimg/hb/ca9d45dc71444ff085bf5d02bddc7295.png) ![](https://img.tnblog.net/arcimg/hb/e01856f60ac64c3dbf6ffae8a620a192.png) ![](https://img.tnblog.net/arcimg/hb/a38885616d16457b91d92789cd50e0a2.png) ![](https://img.tnblog.net/arcimg/hb/6de290713f144e40a77bdc9749fcfb33.png) ## 部署到k8s中 >### 镜像打包与上传 ```bash docker build -t aidasi/dapr_service01:v1 -f ./DaprLoadBalancer/Dockerfile . docker build -t aidasi/dapr_service02:v1 -f ./DaprLoadBalancerGateway/Dockerfile . # push docker push aidasi/dapr_service01:v1 docker push aidasi/dapr_service02:v1 ``` >### kubernetes 部署相关服务 tn2>在确保有dapr的环境下进行部署dapr_service01和dapr_service02服务,并将需要负载均衡的dapr_service01副本数设置为2. ```bash vim service01.yaml ``` ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: service01 labels: app: service01 spec: replicas: 2 # 2个副本 selector: matchLabels: app: service01 template: metadata: labels: app: service01 annotations: dapr.io/enabled: "true" # 开启Dapr边车 dapr.io/app-id: "service01" dapr.io/app-port: "80" spec: containers: - name: service01 image: docker.io/aidasi/dapr_service01:v1 ``` ```bash kubectl apply -f service01.yaml ``` tn2>创建Service02的yaml文件 ```bash vim service02.yaml ``` ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: service02 labels: app: service02 spec: replicas: 1 selector: matchLabels: app: service02 template: metadata: labels: app: service02 annotations: dapr.io/enabled: "true" # 开启Dapr边车 dapr.io/app-id: "service02" dapr.io/app-port: "80" spec: containers: - name: service02 image: docker.io/aidasi/dapr_service02:v1 --- apiVersion: v1 kind: Service metadata: name: service02 spec: type: ClusterIP selector: app: service02 ports: - port: 80 targetPort: 80 ``` ```bash kubectl apply -f service02.yaml ``` >### 测试 ```yaml # 查看资源创建情况 kubectl get pod,svc # 访问guid curl http://10.110.174.130/guid curl http://10.110.174.130/guid ``` ![](https://img.tnblog.net/arcimg/hb/979f4ca8d29841639af137e2d618ec43.png)