sidecar构架之dapr的跨物理机负载均衡(mDns和consul)

前提

本次我们将实践dapr的mDns和consul的负载均衡

服务示例

  1. service1是一个获取ip的nodejs项目,分别使用dapr部署在dapr1dapr2的虚拟机上
  2. service2是另外一个服务,调用server1的getIp服务,部署在dapr3的虚拟机上

我们的目标是通过postman访问service2,调用部署在dapr1、dapr2的getIp服务,看看是否能达到负载均衡

service1核心代码:

index.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
const express = require('express')
const os = require('os');
const app = express()
const port = 3000

function getIpAddress() {
var interfaces=os.networkInterfaces()

for (var dev in interfaces) {
let iface = interfaces[dev]

for (let i = 0; i < iface.length; i++) {
let {family, address, internal} = iface[i]

if (family === 'IPv4' && address !== '127.0.0.1' && !internal) {
return address
}
}
}
}

app.get('/getIp', (req, res) => {
const ipAddress = getIpAddress()
res.send(ipAddress)
})

app.listen(port, () => {
console.log(`Example app listening on port ${port}`)
})

mDns负载均衡(局域网内)

1
2
3
4
5
6
7
8
9
10
11
12

dapr1 192.168.10.201: dapr部署service1
dapr run --dapr-http-port 3600 --app-port 3000 --app-id service1 node index.js


dapr2 192.168.10.202: dapr部署service1
dapr run --dapr-http-port 3600 --app-port 3000 --app-id service1 node index.js


dapr3: 192.168.10.203: dapr部署service2
dapr run --dapr-http-port 3500 --app-id service2

多次访问,可看到达到了负载的效果

1
curl http://192.168.10.203:3500/v1.0/invoke/service1/method/getIp
1
2
3
4
192.168.10.202
192.168.10.201
192.168.10.202
192.168.10.201

consul的负载均衡(夸机房,不需要在同一局域网)

前面的负载我们使用了mDNS,官方还为我们提供了Consul名字解析组件,我们新建一个虚拟机Consul(192.168.10.204)来安装Consul
安装步骤可参考:Consul集群-服务自动发现实践

Q7hLRH

下面修改Dapr1和Dapr2机器上的~/.dapr/config.yaml配置,让其使用Consul来解析名字

1
2
3
4
5
6
7
8
9
10
11
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: daprConfig
spec:
nameResolution:
component: "consul"
configuration:
client:
address: "192.168.10.204:8500"
selfRegister: true

修改Dapr3机器上的~/.dapr/config.yaml配置

1
2
3
4
5
6
7
8
9
10
11
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: daprConfig
spec:
nameResolution:
component: "consul"
configuration:
client:
address: "10.8.99.45:8500"
selfRegister: false

当我们重新启动dapr1和dapr2的service1后,我们看到,已经注册到consul上去了。
fmRPJh

问题

待解决
consul如何自动剔除失效服务

Consul移除失效服务

1
curl -X PUT http://127.0.0.1:8500/v1/agent/service/deregister/{service_id}

Consul移除正常关机nodes节点

1
curl -X PUT http://127.0.0.1:8500/v1//agent/force-leave/{node}