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 服務
首先啓動我們的兩個需要負載均衡的接口服務,運行的端口爲6002
與6001
,在使用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