springcloudspring 整合使用spring framework

Gateway网关转发demo

2021-11-20  本文已影响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配置及流程分析

上一篇下一篇

猜你喜欢

热点阅读