• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于java:spring-cloud-gateway路由过滤器

java 搞代码 3年前 (2022-01-27) 51次浏览 已收录 0个评论

1 pom.xml中引入依赖,最新GA版本

<code class="java">    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-gateway</artifactId>
      <version>3.1.0</version>
    </dependency>

2 启动类

<code class="java">@SpringBootApplication
public class DemoApplication {
    @Bean
    public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
        return builder.routes().route("routeA", r -> r.path("/pathA")
        .uri("http://www.a.com")).build();
    }

    public static void main(String[] args) {
        System.setProperty("reactor.netty.ioWorkerCount", "n");
        SpringApplication.run(DemoApplication.class, args);
    }

}

3 yaml

<code class="java">server:
    port: 80
logging:
    level:
        org.springframework.cloud.gateway: INFO
        org.springframework.http.server.reactive: INFO
        org.springframework.web.reactive: INFO
        reactor.ipc.netty: INFO
        reactor.netty: INFO
spring:
    cloud:
        gateway:
            routes:
                - id: routeB
                  uri: http://www.b.com
                  predicates:
                      - Path=/pathB

4 启动
这样启动后具备一个最简略的工程能力,外面具备两条动态路由性能:
pathA 转发至 http://www.a.com
pathB 转发至 http://www.b.com

5 动静路由
需路实现该接口:

<code class="java">package org.springframework.cloud.gateway.route;

public interface RouteDefinitionRepository extends RouteDefinitionLocator, RouteDefinitionWriter {

}

接下来来一个简略的小例子看一下:

<code class="java">@Component
public class DemoRouteDefinitionRepository implements RouteDefinitionRepository {
    private int idx = 1;

    @Override
    public Flux<RouteDefinition> getRouteDefinitions() {
        System.out.println("===========执行getRouteDefinitions");
        RouteDefinition definition = new RouteDefinition();
        definition.setId("routeC");
        if (idx++ % 2 == 0) {
            definition.setUri(URI.create("http://www.c1.com"));
        } else {
            definition.setUri(URI.create("http://www.c2.com"));
        }

        PredicateDefinition predicate = new PredicateDefinition();
        predicate.setName("Path");
        Map<String, String> map = new HashMap<>();
        map.put("pattern", "/pathC");
        predicate.setArgs(map);

        definition.setPredicates(Arrays.asList(predicate));
        return Flux.fromIterable(Arrays.asList(definition));
    }

    @Override
    public Mono<Void> save(Mono<RouteDefinition> route) {
        return null;
    }

    @Override
    public Mono<Void> delete(Mono<String> routeId) {
        return null;
    }

}

能够看到getRouteDefinitions()提供路由信息,启动的时候会读取一次。在这里为模仿一下动静的情景,须要有事件去触发调用getRouteDefinitions()来更新路由,触发的动作是发送一个RefreshRoutesEvent事件:

<code class="java">@RestController
public class HomeController implements ApplicationEventPublisherAware{
    private ApplicationEventPublisher publisher;

    @GetMapping("/change")
    public Mono<Void> msg() {
        publisher.publishEvent(new RefreshRoutesEvent(this));
        return Mono.empty();
    }

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        this.publisher = applicationEventPublisher;
    }
}

每调用一次/change,路由信息会变动一次,当然,也能够减少一条或者删除一条路由信息,本例子中save、delete都未实现。


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于java:spring-cloud-gateway路由过滤器

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址