前提
本次我们将实践dapr的mDns和consul的负载均衡
- service1是一个获取ip的nodejs项目,分别使用dapr部署在
dapr1
、dapr2
的虚拟机上
- 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集群-服务自动发现实践
下面修改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上去了。
问题
待解决
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}
|