场景说明:
1. 服务不注册到注册中心,需要通过网关转发。
2. 服务基本信息(编码,地址等)存在数据库中,新增服务之后,需要服务能通过网关转发。
3. 服务可能有多个地址需要实现负载均衡。
思路:
1. 因为服务不是固定的,也不注册到注册中心,所以无法直接在gateway的配置文件中配置路由。
2. 服务是动态增加的,可以使用actuator的创建路由接口,在创建服务的同时动态创建路由。
3. 因为每个路由只能对应一个uri,所以服务有几个地址就需要创建几个路由。
actuator创建路由接口:
【接口说明】
要创建一个路由,发送POST请求 /gateway/routes/{id_route_to_create},参数为JSON结构。
{
"id": "first_route",
"predicates": [{
"name": "Path",
"args": {"_genkey_0":"/first"}
}],
"filters": [],
"uri": "https://www.uri-destination.org",
"order": 0
}]
Path | Type | Description |
---|---|---|
id | String | 路由id |
predicates | Array | 断言,包括名字和参数 |
filters | Array | 路由过滤器 |
uri | String | 目标URI |
order | Number | 顺序,值越低,优先级越高。 |
【调用示例】
服务基本信息:
编码:qq-test,地址:http://localhost:8888、http://localhost:8889
需要创建两个路由,这里routeId分别为qq-test1、qq-test2,实现负载均衡配置权重为50,过滤器设置StripPrefix=1去掉第一个路径前缀。
[post] http://localhost:9000/actuator/gateway/routes/qq-test1
{
"id": "qq-test1", // 与路径参数一致
"predicates": [{
"name": "Path",
"args": {"_genkey_0":"/qq-test/**"}
},{
"name":"Weight",
"args":{ "_genkey_0":"qq-test","_genkey_1":"50"} // 配置权重,第一个参数为group
}],
"filters": ["StripPrefix=1"], // 过滤器,StripPrefix=1必需
"uri": "http://localhost:8888",
"order": 0
}
[post] http://localhost:9000/actuator/gateway/routes/qq-test2
{
"id": "qq-test2", // 与路径参数一致
"predicates": [{
"name": "Path",
"args": {"_genkey_0":"/qq-test/**"}
},{
"name":"Weight",
"args":{ "_genkey_0":"qq-test","_genkey_1":"50"} // 配置权重,第一个参数为group
}],
"filters": ["StripPrefix=1"], // 过滤器,StripPrefix=1必需
"uri": "http://localhost:8889",
"order": 1
}
服务接口 http://localhost:8888(8889)/test 通过网关调用:http://localhost:9000/qq-test/test,测试成功,已负载均衡。
注意事项:
在Spring Boot项目中用Feign调用该接口时,需要注意的是:
1. 权重的第一个参数为group,第二个参数为权重值,同一服务使用同一group且不能与其他服务相同,权重值必须为数字。
2. 权重参数_genkey_0、_genkey_1必须是有序的,可使用LinkedHashMap。
actuator api 参考
Spring Cloud Gateway使用说明(7)-- actuator_gateway actuator_xiegwei的博客-CSDN博客