网关路由转发
网关路由转发提供两种使用场景:一是用于跨域访问,二是用于服务转调
app.m 参数介绍
网关路由转发通过定义 app.m 实现,app.m 中的参数说明如下,详情参考《接口注册程序》
name:服务或路由的唯一标识符(建议名称同所在目录名)
示例:如果创建了一个名为 my-service 的服务,那么在配置路由或其他相关设置时,
可以通过这个名字来引用它。
request_path:Http 请求的 URL 路径部分,不包括查询字符串
示例:如果有一个请求路径为 /users/123,那么 request_path 就是 /users/123
preserve_host:布尔值参数,用于控制是否保留原始请求头中的 Host 字段
示例:如果 preserve_host 设置为 true,且原始请求头的 Host 为 example.com,
那么即使路由配置的 upstream_url 是 http://backend.example.com,
传递到上游服务的 Host 字段仍然是 example.com。
strip_request_path:布尔值参数,用于控制是否从请求路径中去除与路由匹配的部分
示例:如果路由配置的路径为 /api,而请求路径为 /api/users/123,
并且 strip_request_path 设置为 true,那么转发到上游服务的路径将是 /users/123
upstream_url:指定上游服务的 URL,Kong 会将匹配到的请求转发到这个 URL
示例:如果 upstream_url 设置为 http://backend.example.com,
那么所有匹配到此服务的请求都会被转发到 http://backend.example.com
新建服务目录
在 model/service 目录下,有两种方法创建服务目录
新建服务模块
在架构中添加服务模块,就会在 model/service 目录下创建目录,创建后必须删除“服务模块.meta”,因为此文件中包括 health-check 会导致执行健康检查,导致请求返回425
新建文件夹
在代码页中,在 model/service 目录下新建文件夹,注意此目录下必须包括 deploy.m 文件和 deploy 目录,deploy 目录包括 dev.def.xml 和 production.def.xml 两个文件,文件内容参考 health-check 目录下的文件
新建 app.m
一个 app.m 注册一个路由,实现一个网关路由转发。在应用中如果需要设置多个转发,就需要定义多个 app.m。每个 app.m 需要在同名目录下,就需要建多个目录。本例实现两个转发,在 model/service 目录下新建 redirect 目录,在 redirect 目录下新建两个路由目录 baidu 和 product,在这两个目录下分别新建两个 app.m 文件,目录结构如下图所示
服务转调
product 目录下的 app.m 实现服务转调,将 /product 转调到 /main/fuwu/queryproduct。app.m 设置如下图所示
- name:路由名称
- request_path:请求路径(必填)
- preserve_host:false
- strip_request_path:true
- upstream_url:转发的请求地址(必填)
运行效果,如下图所示
跨域访问
某些第三方请求不支持跨域访问,导致前端直接调用会出现跨域安全报错,此时可以通过网关 Kong 转调的方式解决前端不能调用的问题。实现第三方系统地址本地域名访问,如下图所示
baidu 目录下的 app.m 实现跨域访问,将 /baidu 转调到 https://www.baidu.com
。app.m 设置如下图所示
- name:路由名称
- request_path:请求路径(必填)
- preserve_host:false
- strip_request_path:true
- upstream_url:转发的请求地址(必填)
运行效果,如上图所示
特别说明
- 在页面的 JS 代码中,可以调用 this.getServiceUrl("/baidu"),获取完整路径,包括前面的门户域名和应用名
案例位置
桌面-页面-服务-网关路由转发.w