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

来源:10-6 内置路由谓词工厂详解(Route Predicate Factories)

zengchen

2019-08-24

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

  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回答

大目

2019-08-24

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

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
4
大目
回复
zengchen
看你的需求哈。没有什么常用不常用的。 routes可以配置谓词和过滤器。
2019-08-24
共4条回复

Spring Cloud Alibaba微服务从入门到进阶

面向未来微服务:熟练掌握Spring Cloud Alibaba

3085 学习 · 1324 问题

查看课程