Dapr 負載均衡

實現目標

Dapr 使用 mDNS 協議提供負載均衡,將 Service02 的請求平均分佈到兩個 Service01 的實例上。

創建 API 接口與服務

創建 Service01 的服務接口。
我們這裏就只提供獲取唯一的 Guid 接口服務。

[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 });
    }
}

創建 Service02 的服務接口。
首先安裝 Dapr.AspNetCore 包,然後添加好 Dapr 依賴服務,並創建一個 Guid 的控制器。

builder.Services.AddControllers()
    .AddDapr();
[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 服務

首先啓動我們的兩個需要負載均衡的接口服務,運行的端口爲60026001,在使用daprd命令註冊到 dapr 中。

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

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

運行 Service02 服務

打開 Service02 項目的目錄下,通過 powershell 執行下面的命令進行啓動。

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

測試運行

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

部署到 k8s 中

鏡像打包與上傳

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 部署相關服務

在確保有 dapr 的環境下進行部署 dapr_service01 和 dapr_service02 服務,並將需要負載均衡的 dapr_service01 副本數設置爲 2.

vim service01.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
kubectl apply -f service01.yaml

創建 Service02 的 yaml 文件

vim service02.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
kubectl apply -f service02.yaml

測試

# 查看資源創建情況
kubectl get pod,svc
# 訪問guid
curl http://10.110.174.130/guid
curl http://10.110.174.130/guid

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/-zPISElakFahRJzCtJfRZg