概述

freeswitch是一款简单好用的VOIP开源软交换平台。

在之前的文章,我们介绍过distributor模块实现多线路分发的配置方法,但是当线路发生故障时,distributor并不会自动跳过故障线路实现故障转移。

本节中,我们利用gateway的option检测配置,实现中继线路的故障转移。

环境

centos:CentOS  release 7.0 (Final)或以上版本

freeswitch:v1.10.7

GCC:4.8.5

APP接口

distributor的接口格式中,可以追加排除列表“<exception1> <exceptionN>”,distributor在选线的时候会跳过排除列表中的线路。

distributor <list name>[ <exception1> <exceptionN>]

sofia接口检测external下所有的gateway状态,并返回“DOWN”状态的gateway列表。

sofia profile external gwlist down

配置&测试

配置conf/sip_profile/external/gw-138-5080.xml,设置网关参数,gw-138-5090.xml和gw-138-15090.xml设置方法一样。

<include>

<gateway name="gw-138-5080">

<param name="username" value="not-used"/>

<param name="realm" value="10.55.55.138:5080"/>

<param name="password" value="not-used"/>

<param name="register" value="false"/>

<!--send an options ping every x seconds, failure will unregister and/or mark it down-->

<param name="ping" value="20"/>

<param name="ping-min" value="3"/>

<param name="ping-max" value="6"/>

<param name="ping-user-agent" value="proxy"/>

</gateway>

</include>

配置文件conf/autoload_configs/distributor.conf.xml,设置distributor列表。

<configuration name="distributor.conf" description="Distributor Configuration">

<lists>

<list name="test-gw" total-weight="3">

<node name="gw-138-5080" weight="1"/>

<node name="gw-138-5090" weight="1"/>

<node name="gw-138-15090" weight="1"/>

</list>

</lists>

</configuration>

修改配置文件conf/dialplan/test.xml,设置拨号计划,仅仅使用distributor接口。

<extension name="test" continue="false">

<condition field="destination_number" expression="^(\d+)$">

<action application="bridge" data="{sip_invite_call_id=${sip_call_id}}sofia/gateway/${distributor(test-gw)}/$1"/>

</condition>

</extension>

刷新distributor配置数据。

reloadxml

distributor_ctl reload

发起呼叫10011->1002,三次的测试日志如下,可以看到"gw-138-15090"网关有故障但是仍然会被选到。

2022-12-14 11:15:36.478543 [INFO] mod_dialplan_xml.c:637 Processing 10011 <10011>->1002 in context public

...

Dialplan: sofia/external/10011@10.55.55.138 Action bridge({sip_invite_call_id=${sip_call_id}}sofia/gateway/${distributor(test-gw)}/1002)

...

EXECUTE sofia/external/10011@10.55.55.138 bridge({sip_invite_call_id=6b70dbfd-f600-123b-7d99-000c29a63969}sofia/gateway/gw-138-5080/1002)

...

EXECUTE sofia/external/10011@10.55.55.138 bridge({sip_invite_call_id=42ddfe80-f602-123b-7d99-000c29a63969}sofia/gateway/gw-138-5090/1002)

...

EXECUTE sofia/external/10011@10.55.55.138 bridge({sip_invite_call_id=498bf45b-f602-123b-7d99-000c29a63969}sofia/gateway/gw-138-15090/1002)

2022-12-14 11:28:58.618511 [ERR] mod_sofia.c:4511 Gateway 'gw-138-15090' is down!

distributor和gateway联合使用实现出中继线路的负载均衡+故障转移。

修改配置文件conf/dialplan/test.xml,使用distributor和sofia接口。

<extension name="test" continue="false">

<condition field="destination_number" expression="^(\d+)$">

<action application="bridge" data="{sip_invite_call_id=${sip_call_id}}sofia/gateway/${distributor(test-gw ${sofia(profile external gwlist down)})}/$1"/>

</condition>

</extension>

刷新dialplan拨号计划。

reloadxml

发起呼叫10011->1002,三次的测试日志如下,"gw-138-15090"网关不再会被选中。

2022-12-14 13:54:08.495843 [INFO] mod_dialplan_xml.c:637 Processing 10011 <10011>->1002 in context public

...

2022-12-14 13:54:16.435860 [WARNING] sofia.c:6098 Ping failed gw-138-15090 with code 503 - count 3/0/6, state DOWN

...

Dialplan: sofia/external/10011@10.55.55.138 Action bridge({sip_invite_call_id=${sip_call_id}}sofia/gateway/${distributor(test-gw ${sofia(profile external gwlist down)})}/1002)

...

EXECUTE sofia/external/10011@10.55.55.138 bridge({sip_invite_call_id=910ce208-f616-123b-7d99-000c29a63969}sofia/gateway/gw-138-5080/1002)

...

EXECUTE sofia/external/10011@10.55.55.138 bridge({sip_invite_call_id=96142b51-f616-123b-7d99-000c29a63969}sofia/gateway/gw-138-5090/1002)

...

EXECUTE sofia/external/10011@10.55.55.138 bridge({sip_invite_call_id=9a7872ed-f616-123b-7d99-000c29a63969}sofia/gateway/gw-138-5080/1002)

...

总结

freeswitch有非常多好用的功能,每个功能设计简单,能力单一,但是我们可以把不同的功能组合在一起,实现各种复杂的需求。

最好的设计就是功能模块的高内聚,低耦合,职责单一,同时又可以灵活组合。

空空如常

求真得真

distributor和gateway联合实现出中继的负载均衡+故障转移的更多相关文章

  1. Spring cloud gateway 如何在路由时进行负载均衡

    本文为博主原创,转载请注明出处: 1.spring cloud gateway 配置路由 在网关模块的配置文件中配置路由: spring: cloud: gateway: routes: - id: ...

  2. Azure Application Gateway(一)对后端 Web App 进行负载均衡

    一,引言 今天,我们学习一个新的知识点-----Azure Application Gateway,通过Azure 应用程序网关为我么后端的服务提供负载均衡的功能.我们再文章头中大概先了解一下什么是应 ...

  3. Azure上七层负载均衡APP Gateway

    Azure的SLB和ILB是最常用的4层负载均衡工具.但有些场景是7层的负载均衡,SLB和ILB就无能为力了. Azure上已经推出了APP Gateway的服务,就是7层负载均衡的负载均衡器. 如上 ...

  4. 构建api gateway之 负载均衡

    什么是负载均衡 负载均衡,英文名称为Load Balance,其含义就是指将负载(工作任务)进行平衡.分摊到多个操作单元上进行运行 以下为几种负载均衡策略介绍 1.随机(Random) 大家很多时候说 ...

  5. Windows Azure支持七层负载均衡--Application Gateway

    一直以来Windows Azure的负载均衡(Loadbalancer)功能一直被客户诟病,无法其竞争对手(特别是国内的云厂商)匹敌. Windows Azure的负载均衡器是四层的,前期的版本不支持 ...

  6. Spring Cloud Gateway Ribbon 自定义负载均衡

    在微服务开发中,使用Spring Cloud Gateway做为服务的网关,网关后面启动N个业务服务.但是有这样一个需求,同一个用户的操作,有时候需要保证顺序性,如果使用默认负载均衡策略,同一个用户的 ...

  7. 关于Ocelot和Consul 实现GateWay(网关) 服务注册 负载均衡等方面

    Ocelot   路由  请求聚合  服务发现 认证  鉴权 限流熔断 内置负载均衡器 Consul   自动服务发现    健康检查 通过Ocelot搭建API网关   服务注册   负载均衡 1. ...

  8. API网关spring cloud gateway和负载均衡框架ribbon实战

    通常我们如果有一个服务,会部署到多台服务器上,这些微服务如果都暴露给客户,是非常难以管理的,我们系统需要有一个唯一的出口,API网关是一个服务,是系统的唯一出口.API网关封装了系统内部的微服务,为客 ...

  9. Azure Application Gateway(二)对后端 VM 进行负载均衡

    一,引言 上一节有讲到使用 Azure Application Gateway 为我们后端类型为 Web App 的 Demo 项目提供负载均衡,Azure Application Gateway 的 ...

  10. Spring cloud gateway自定义filter以及负载均衡

    自定义全局filter package com.example.demo; import java.nio.charset.StandardCharsets; import org.apache.co ...

随机推荐

  1. [GDOIpj222B] 网页浏览

    第二题 网页浏览 提交文件: webpage.cpp 输入文件: webpage.in 输出文件: webpage.out 时间空间限制: 1 秒, 256 MB 我们在上网时,从一个网页上的链接打开 ...

  2. cmd命令根据端口号杀进程

    1.根据端口查到进程pid netstat –ano|findstr 端口号 1 2.使用taskkill命令杀死进程 taskkill /pid pid 1 温馨提醒: 1.执行完第一步后,命令行显 ...

  3. ElasticSearch之Search settings

    相关参数 indices.query.bool.max_clause_count 本参数当前已失效. search.max_buckets 本参数用于控制在单个响应中返回的聚合的桶的数量. 默认值为6 ...

  4. Blazor入门100天 : 身份验证和授权之 OpenID 与 OAuth2

    目录: OpenID 与 OAuth2 基础知识 Blazor wasm Gitee 码云登录 Blazor wasm GitHub 登录 Blazor wasm Google 登录 Blazor w ...

  5. Provider MVVM架构

    MVVM架构分为M(Model).V(View).VM(ViewModel)三个部分,他们分别处理自己的分工,在View和Model之间使用ViewModel作为中介者,使View和Model不受业务 ...

  6. java中根据公网IP获取地址

    package com.dashan.utils.iputils; import com.fasterxml.jackson.databind.ObjectMapper; import okhttp3 ...

  7. C++篇:第九章_字符串_知识点大全

    C++篇为本人学C++时所做笔记(特别是疑难杂点),全是硬货,虽然看着枯燥但会让你收益颇丰,可用作学习C++的一大利器 九.字符串 可以用[ ]进行下标访问 使用string类需将头文件包含在程序中, ...

  8. 从4个特点为你解密华为云媒体网络底座AND

    本文分享自华为云社区<解密华为云媒体网络底座ADN>,作者: Satan.D . 互联网的痛点与解决思路 互联网自1968年起源依赖,已经发展了半个多世纪.互联网仅从中文字面意思,可以简单 ...

  9. 数据库技术丨GaussDB(DWS)数据同步状态查看方法

    摘要:针对数据同步状态查看方法,GaussDB(DWS)提供了丰富的系统函数.视图.工具等可以直观地对同步进度进行跟踪,尤其是为方便定位人员使用,gs_ctl工具已集合了大部分相关系统函数的调用,可做 ...

  10. 带你掌握不同平台下,探索JDK源码所需的native方法

    摘要:要探索JDK的核心底层源码,那必须掌握native用法.文章中会以"获取系统的默认时区"为例,介绍说明如何查看native对应方法的源码. 本文分享自华为云社区<要探索 ...