Gateway网关转发demo

作者: 迦叶_金色的人生_荣耀而又辉煌 | 来源:发表于2021-11-20 06:56 被阅读0次

    上一篇 <<<如何保证微服务接口的安全
    下一篇 >>>Zuul的反向代理、过滤及动态网关配置实例


    1.引入依赖包

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.2.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
            <version>2.0.1.RELEASE</version>
        </dependency>
    </dependencies>
    

    不要导入web包,要不然会报下列错误:
    Parameter 0 of method modifyRequestBodyGatewayFilterFactory in org.springframework.cloud.gateway.config.GatewayAutoConfiguration required a bean of type 'org.springframework.http.codec.ServerCodecConfigurer' that could not be found.
    原因就是
    因为SpringCloud gateway基于webflux实现的,不是基于SpringBoot-web,所以应该删除Springboot-web依赖组件。

    2.bootstrap.yml新增配置

    server:
      ###测试的时候,本地端口最好不要用80,容易出错
      port: 9999
    spring:
      application:
        name: test-gateway
      cloud:
        nacos:
          discovery:
            ####开启以服务id去注册中心上获取转发地址
            enabled: true
            #注册发现使用nginx地址
            server-addr: 10.211.55.16:9999
        gateway:
          routes:
          ###静态转发路由策略
          - id: orderss
            uri: http://www.baidu.com/
            ###匹配规则
            predicates:
            - Path=/baidu/**
          ###基于注册中心的路由策略
          - id: member
            #### 基于lb负载均衡形式转发,后面地址为注册中心的服务名称
            uri: lb://member-service
            filters:
            #转发请求时去掉1级前缀,eg:http://localhost:9999/member/test?token=111中间的member字段会被清掉
            - StripPrefix=1
            ###匹配规则
            predicates:
            - Path=/member/**
    

    3.核心代码

    启动下列就可以测试转发情况

    @SpringBootApplication
    public class GateWayApp {
        public static void main(String[] args) {
            SpringApplication.run(GateWayApp.class);
        }
    }
    
    /**
     * 读取头部信息,判断令牌是否存在,需要加入到容器中
     */
    @Component
    public class TokenFilter implements GlobalFilter {
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            String token = exchange.getRequest().getQueryParams().getFirst("token");
            if (token == null || token.isEmpty()) {
                ServerHttpResponse response = exchange.getResponse();
                response.setStatusCode(HttpStatus.BAD_REQUEST);
                String msg = "token not is null ";
                DataBuffer buffer = response.bufferFactory().wrap(msg.getBytes());
                return response.writeWith(Mono.just(buffer));
            }
            return chain.filter(exchange);
        }
    

    推荐阅读:
    <<<网关背景分类及常用框架
    <<<微服务网关与过滤器的区别
    <<<Nginx与Zuul的区别
    <<<Zuul与Gateway有哪些区别
    <<<Nginx与网关的区别
    <<<如何保证微服务接口的安全
    <<<Zuul的反向代理、过滤及动态网关配置实例
    <<<Gateway高可用集群与动态网关
    <<<Gateway的谓词配置实例
    <<<Gateway配置及流程分析

    相关文章

      网友评论

        本文标题:Gateway网关转发demo

        本文链接:https://www.haomeiwen.com/subject/ekppzltx.html