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>
然后设置文件属性,参考下图:
规则说明
- 所有规则从上到下依次匹配,遇到匹配的规则后立即执行
- src 包含 [any] 时
- src 表示要执行匹配的URL模式
- [any] 表示一个占位符,可以匹配任何多个字符
- dest 表示将要转发的目标地址,它必须是一个绝对地址
- dest也必须包含 [any],用于计算转发目标,它的值从 src的[any]中获得
- 实际转发请求时,dest_url = dest + request.QueryString
- src 表示要执行匹配的URL模式
- 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