负载均衡

负载均衡主要是配合服务发现一起使用,暂时 Swoft 只支持随机策略,后续会提供更多选择。

配置

通常情况可以不用配置,系统已经配置了默认值。app/config/beans/base.php

  1. return [
  2. // ...
  3. 'balancerSelector' => [
  4. 'class' => \Swoft\Sg\BalancerSelector::class,
  5. 'balancer' => 'random',
  6. 'balancers' => [
  7. 'random' => \Swoft\Sg\Balancer\RandomBalancer::class
  8. ]
  9. ],
  10. // ...
  11. ];
  • balancer 定义默认负载类型
  • balancers 配置定义的负载,通过KEY名字使用

consul 负载均衡配置说明

就用例子中user服务器实现负载均衡举例说明,内网机器(192.168.7.197)分别开启两台user服务器,端口分别为8099和8089

1, 打开端口为8099服务器配置文件app/config/properties/provider.php配置如下:

  1. return [
  2. 'consul' => [
  3. 'address' => '127.0.0.1',
  4. 'port' => 8500,
  5. 'register' => [
  6. 'id' => 'user',
  7. 'name' => 'user',
  8. 'tags' => [user],
  9. 'enableTagOverride' => false,
  10. 'service' => [
  11. 'address' => '192.168.1.197',
  12. 'port' => '8099',
  13. ],
  14. 'check' => [
  15. 'id' => 'user',
  16. 'name' => 'user',
  17. 'tcp' => '192.168.1.197:8099',
  18. 'interval' => 10,
  19. 'timeout' => 1,
  20. ],
  21. ],
  22. 'discovery' => [
  23. 'name' => 'user',
  24. 'dc' => 'dc',
  25. 'near' => '',
  26. 'tag' =>'',
  27. 'passing' => true
  28. ]
  29. ],
  30. ];

2, 打开端口为8089服务器配置文件app/config/properties/provider.php配置如下:

  1. return [
  2. 'consul' => [
  3. 'address' => '127.0.0.1',
  4. 'port' => 8500,
  5. 'register' => [
  6. 'id' => 'user1',
  7. 'name' => 'user',
  8. 'tags' => [user1],
  9. 'enableTagOverride' => false,
  10. 'service' => [
  11. 'address' => '192.168.1.197',
  12. 'port' => '8089',
  13. ],
  14. 'check' => [
  15. 'id' => 'user1',
  16. 'name' => 'user',
  17. 'tcp' => '192.168.1.197:8089',
  18. 'interval' => 10,
  19. 'timeout' => 1,
  20. ],
  21. ],
  22. 'discovery' => [
  23. 'name' => 'user',
  24. 'dc' => 'dc',
  25. 'near' => '',
  26. 'tag' =>'',
  27. 'passing' => true
  28. ]
  29. ],
  30. ];
  • 前提条件,consul已经安装好了并启动,服务器已经开启了注册发现配置,配置开启请参考.env文件
  • id 定义consul服务的唯一id
  • name 定义consul服务名字,发现服务时会用到这个名字找对应服务,name是一对多,多服务器可以同名不同tags实现负载均衡
  • tags 服务标记,多台同name服务时,可以用tags来区分
  • PS注意,discovery.tag 如果负载均衡时, 请配置为空, 如果配置了,就会只找这台tag,导致负载均衡不成功

3, 分别打开端口为8099和8089服务器配置文件app/config/properties/service.php配置如下:

  1. return [
  2. 'user' => [
  3. 'name' => 'user',
  4. 'uri' => [
  5. '192.168.7.197:8099',
  6. '192.168.7.197:8089',
  7. ],
  8. 'minActive' => 8,
  9. 'maxActive' => 8,
  10. 'maxWait' => 8,
  11. 'maxWaitTime' => 3,
  12. 'maxIdleTime' => 60,
  13. 'timeout' => 8,
  14. 'useProvider' => true,
  15. 'balancer' => 'random',
  16. 'provider' => 'consul',
  17. ]
  • name 连接池的名字, 这里配置为user
  • uri 服务器ip和端口,可以配置多个实现负载均衡,走配置负载均衡
  • useProvider 开启consul负载均衡,这个参数要配置为true,才会走consul,这个参数为true后uri失效,服务器列表会走consul拉取
  • balancer 制定负载均衡算法,swoft只实现了random算法,可以自己扩展实现算法