HTTP转发代理

使用场景:

  • 少部分InternalService的服务接口需要通过PublicService对外公开,此时就需要在PublicService收到请求时转发到InternalService

新建一个PublicService

核心步骤就是在启动时调用 AppStartup.RunAsPublicServices(...) 方法,例如:

public class Program
{
    public static void Main(string[] args)
    {
        AppStartup.RunAsPublicServices("Nebula.Demo", args);
    }
}



新建配置文件

在应用程序目录下创建一个名为 Nebula.Demo.TransferMapRule.xml 的配置文件。

请注意转发配置文件的命名规则 :

  • 前缀,当前程序的名称,在这个示例中:Nebula.Demo
  • 后缀,固定为:.TransferMapRule.xml

配置文件内容示例如下:

<ProxyMapRule>
    <Rules>
        <rule src="/new/api/test/add"           dest="{service1_Url}/v20/api/WebSiteApp/test/Add.aspx" />
        <rule src="/new/api/test/ShowRequest"   dest="{service1_Url}/v20/api/WebSiteApp/test/ShowRequest.aspx" />
        <rule src="/new/api/test/login"         dest="{service2_Url}/v20/api/WebSiteApp/auth/login.aspx" />
        <rule src="/new/api/test/findByTel"     dest="{service2_Url}/v20/api/WebSiteApp/Customer/findByTel.aspx" />

        <rule src="/v20/api/moon/[any]"         dest="{configServiceUrl}/v20/api/moon/[any]" />
    </Rules>
</ProxyMapRule>

然后设置文件属性,参考下图:
xx



规则说明

  • 所有规则从上到下依次匹配,遇到匹配的规则后立即执行

  • src 包含 [any] 时
    • src 表示要执行匹配的URL模式
      • [any] 表示一个占位符,可以匹配任何多个字符
    • dest 表示将要转发的目标地址,它必须是一个绝对地址
      • dest也必须包含 [any],用于计算转发目标,它的值从 src的[any]中获得
    • 实际转发请求时,dest_url = dest + request.QueryString

  • src 不 包含 [any] 时
    • src 表示要执行匹配的URL路径
    • dest 表示将要转发的目标地址,它必须是一个绝对地址
    • 实际转发请求时,url = dest + request.Query

  • src = * 时
    • 表示匹配当前站点所有请求,所以如果需要这个规则,一定要放在最后。
    • dest 是一个URL路径前缀
    • 实际转发请求时,url = dest + request.PathAndQuery



举例说明

假设当前站点的根地址:http://www.abc.com/

src = "/new/api/test/add",
dest = "http://localhost2:8206/v20/api/WebSiteApp/test/Add.aspx"

示例请求:http://www.abc.com/new/api/test/add?id=2
转发目标:http://localhost2:8206/v20/api/WebSiteApp/test/Add.aspx?id=2



src = "/v20/api/moon/[any]",
dest = "http://LinuxTest:8503/v20/api/moon/[any]"

示例请求:http://www.abc.com/v20/api/moon/setting/get.svc?name=xxx
转发目标:http://LinuxTest:8503/v20/api/moon/setting/get.svc?name=xxx