请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

有个转发规则,不知道该怎么写配置?

我想实现下面的转发规则,该怎么写配置呢?

  1. GATEWAY_URL/user-center/** ------>/user-center/**
  2. GATEWAY_URL/content-center/** ------>/content-center/**
  3. GATEWAY_URL/content-center/user/list 必须加请求参数 chid=wx,才能访问 /content-center/user/list
  4. GATEWAY_URL/content-center/user/{id} 请求类型必须是GET类型的,才转发到 /content-center/user/{id}
    如上,有多个规则,该怎么办写配置呢?

正在回答

1回答

四点要求都要满足吗?那只能配置 + 自己写代码才能实现了。

1、2两点写在配置(或者不写也可以,因为gateway会自动从服务发现组件获取微服务名称,自动转发,并且转发规则和你的需求一致。):

routes:
  - id:
    uri: https://user-center
    predicates:
      - Path=/user-center/**
    filters:
      # 配置成原始路径正则, 重写后的路径的正则
      - RewritePath=/user-center/(?<segment>.*), /$\{segment}
  - id:
    uri: https://content-center
    predicates:
      - Path=/content-center/**
    filters:
      # 配置成原始路径正则, 重写后的路径的正则
      - RewritePath=/user-center/(?<segment>.*), /$\{segment}


3、4两点写代码(Gateway支持使用编码方式实现转发,代码就是你平时用的Spring MVC或者Webflux。下面使用Webflux给出结果):

加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-gateway-webflux</artifactId>
</dependency>


写代码:

@RestController
public class GatewayController {
    @Autowired
    private LoadBalancerClient loadBalancerClient;

    @GetMapping("/user-center/users/list")
    public Mono<ResponseEntity<String>> proxy(ProxyExchange<String> proxy) throws Exception {
        // 判断chid=wx

        // 用ribbon选出1个可用的实例,
        ServiceInstance serviceInstance = loadBalancerClient.choose("user-center");
        String uri = serviceInstance.getUri() + "/user/list";
        System.out.println(uri);
        return proxy
            .uri(uri)
            .get();
    }

    @GetMapping("/user-center/users/{id}")
    public Mono<ResponseEntity<String>> proxy(ProxyExchange<String> proxy, @PathVariable Integer id) throws Exception {
        // 用ribbon选出1个可用的实例,
        ServiceInstance serviceInstance = loadBalancerClient.choose("user-center");
        String uri = serviceInstance.getUri() + "/users/" + id;
        System.out.println(uri);
        return proxy
            .uri(uri)
            .get();
    }
}

文档参考:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.2.0.M2/reference/html/#_building_a_simple_gateway_using_spring_mvc_or_webflux

1 回复 有任何疑惑可以回复我~
  • 提问者 zengchen #1
    非常感谢!我以为满足这四点,可以单纯用内置predicate实现呢
    回复 有任何疑惑可以回复我~ 2019-08-24 20:49:50
  • 大目 回复 提问者 zengchen #2
    哈哈,你的需求还是比较复杂的,单纯配置应该实现不了哦。需要代码 + 配置结合的方式去玩。
    我视频更新完成后会将这一节的的用例补充一下。
    感谢您提供了一个比较复杂的转发用例,哈哈哈。
    回复 有任何疑惑可以回复我~ 2019-08-24 21:20:50
  • 提问者 zengchen 回复 大目 #3
    我怎么感觉gateway.routes这个配置应该不是常用的,你想,要转发到微服务,把自动发现微服务的开关打开就行,再细一点的要求直接用代码Controller去写就可以了嘛。配置gateway.routes这个属性,还容易影响其它请求的转发,一些微服务以外的请求,用这个还行
    回复 有任何疑惑可以回复我~ 2019-08-24 21:52:39
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信