Dapr 负载均衡 电脑版发表于:2022/8/11 22:01  >#Dapr 负载均衡 [TOC] ## 实现目标 tn2>Dapr 使用 mDNS 协议提供负载均衡,将Service02的请求平均分布到两个Service01的实例上。  ## 创建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的控制器。  ```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 ```  ```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 ```  ## 运行Service02服务 tn2>打开Service02项目的目录下,通过powershell执行下面的命令进行启动。 ```bash dapr run --dapr-http-port 5003 --app-port 6003 --app-id service02 -- dotnet run service02 --urls=http://localhost:6003 ```  ## 测试运行 ```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 ```     ## 部署到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 ``` 