1.思路
在使用spring cloud gateway时,如果两个服务的路由地址相同,可以通过predicate(断言)和filter(过滤器)的组合来实现根据请求的不同条件将请求分发到不同的服务下的地址。
-
使用predicate进行路由条件的判断:
- 在定义路由时,可以使用不同的predicate来区分相同路由地址的不同服务。例如,可以根据请求的header、参数或者路径来区分请求应该被路由到哪个服务。
-
使用filter对请求进行重定向:
- 通过自定义filter,可以根据请求的条件对请求进行重定向到不同的服务地址。在filter中可以获取到请求的信息,并根据需要修改路由的目标地址。
2.在你的路由配置类中根据请求头跳转到不同的服务上
@configuration
public class customrouteconfig {
//service1_route 是路由id,
//lb://service1 中的 service1服务名
@bean
public routelocator customroutelocator(routelocatorbuilder builder) {
return builder.routes()
//校验用户名密码都要在服务1上
.route("service1", r -> r
.path("/sys/caslogin")
.uri("lb://service1")
)
//服务1的请求头到服务1上
.route("service1_route", r -> r.path("/sys/**")
.and().header("servicename", "service1")
//.filters(f -> f.rewritepath("/sys/(?<segment>.*)", "/${segment}"))
.uri("lb://service1")
)
//服务2的请求头到服务2上
.route("service2_route", r -> r.path("/sys/**")
.and().header("servicename", "service2")
// .filters(f -> f.rewritepath("/sys/(?<segment>.*)", "/${segment}"))
.uri("lb://service2")
)
.build();
}
}
在上面的例子中,我们定义了两个路由,它们的路径都是"/api/**",但是通过predicate中的header条件来区分应该路由到哪个服务。当请求的header中包含"x-service"并且值为"service1"时,请求将被路由到service1服务;当值为"service2"时,则被路由到service2服务。
3.vue前端:在全局的api方法中增加配置的服务名
#对接后台服务名
vite_my_service_name=service1
//动态配置请求头,找到对应的服务
const glob = useglobsetting();
let servicename= glob.myservicename;
let myheaders={
'servicename': servicename
};
if(config.headers==undefined){
config.headers=myheaders;
}else{
config.headers.servicename = servicename
}
发表评论