Dapr 使用 mDNS 协议提供负载均衡,将Service02的请求平均分布到两个Service01的实例上。
创建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);
}
}
首先启动我们的两个需要负载均衡的接口服务,运行的端口为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项目的目录下,通过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
镜像打包与上传
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