Maven父子项目Spring-Cloud(GateWay组件加全局过滤器用法)

一、简介

GateWay:springcloud提供请求过滤转发、负载均衡,的组件。

如果Consumer是集群状态默认进行负载均衡。

可以对请求进行过滤。

二、依赖

1、父项目 pom.xml

<properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <java.version>1.8</java.version>
        <!-- springboot的版本 -->
        <spring-boot.version>2.3.2.RELEASE</spring-boot.version>
        <!-- springcloud的版本 -->
        <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
        <!-- alibaba推出springcloud的对应版本 -->
        <spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
    </properties>
    <!-- 项目打包方式 -->
    <packaging>pom</packaging>
​
    <dependencyManagement>
        <dependencies>
            <!-- spring boot依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- spring-cloud依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- alibaba推出的spring-cloud依赖的父依赖 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

2、GateWay网关项目 pom.xml文件

<dependencies>
        <!-- springboot core -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!-- nacos客户端 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2.2.6.RELEASE</version>
        </dependency>
        <!-- gateway -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!-- 熔断组件依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
</dependencies>

三、配置文件

spring:
    cloud:
        gateway:
            routes: #网关路由配置. 每一组路由包括: id(唯一标识), uri(转发目标服务器路径), predicates(断言,匹配方式), filters(过滤器)
                - id: user-consumer
#               uri: http://localhost:8180 #指定ip和端口转发
                uri: lb://user-consumer #指定服务转发后面的是注册中心的名字
                predicates:
                - Path=/user/** #指定路径匹配方式
#               - Path=/user/**,/token/**
                - Method=POST  #请求类型的匹配
#  - After=2019-01-01T00:00:00+08:00[Asia/Shanghai]  #匹配 2019年1月1日0点0分0秒之后的所有请求, -Before 为之前
#  - Before=2019-01-01T00:00:00+08:00[Asia/Shanghai]  #匹配 2019年1月1日0点0分0秒之前的所有请求, -Before 为之前
#  - Between=2019-01-01T00:00:00+08:00[Asia/Shanghai], 2019-07-01T00:00:00+08:00[Asia/Shanghai] #时间范围之内
#  - Cookie=userName,apple
#  - Cookie=userName,\w+
#  - Header=token, [\w-]+  #请求头匹配
#  - Host=**.baidu.com  #host域名匹配,  www.baidu.com,md.baidu.com
#  - RemoteAddr=192.168.1.1/24 #ip地址匹配
#  - Query=smile  #请求参数匹配 ,eg:localhost:8080?smile=x&id=2
                filters:
                - StripPrefix=1 #转发时, 将指定个数的路径去除
#  - PrefixPath=/user #转发时添加指定的前缀
#  - AddRequestHeader=user-name,apple #转发时, 在请求头中添加指定的参数
#  - AddRequestParameter=color,red #转发时, 添加指定的请求参数
#  - AddResponseHeader=x-response-id,1000  #转发时, 在响应头中添加指定的参数
                - id: no2
                uri:
                predicates:
                filters:

四、GateWay网关项目启动类

/**
 * @Name 周稚林
 * @Data 2022-05-17-16:09
 **/
@SpringBootApplication
@EnableDiscoveryClient
// GateWay和熔断共用一个注解。所以需要添加该注解
@EnableCircuitBreaker
public class Gatewayapplication {
    public static void main(String[] args) {
        SpringApplication.run(Gatewayapplication.class,args);
    }
}

五、通过网关项目访问Consumer

比如:上面配置文件写的路径这样就可以把我们的请求转发到对应的服务器上了。

http://localhost:8080/user-consumer/hello

http://localhost:8080/user-consumer/order

......

六、自定义全局过滤器

  1. 为过滤器类实现接口 GlobalFilter,Ordered

  2. 添加@Component注解

  3. getOrder()方法的值越小越先执行

1、完整的内容

/**
 * @Name 周稚林
 * @Data 2022-05-24-16:15
 **/
@Component
public class orderfilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        //执行目标业务
        Mono<Void> filter = chain.filter(exchange);
        //目标业务执行之后的操作
        return filter;
    }
​
    @Override
    public int getOrder() {
        return 0;
    }
}

2、直接返回json数据写法

/**
 * @Name 周稚林
 * @Data 2022-05-24-16:15
 **/
@Component
public class orderfilter implements GlobalFilter, Ordered {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        ServerHttpRequest request = exchange.getRequest();
        ServerHttpResponse response = exchange.getResponse();
        //执行目标业务
        //不想执行可以重定向走
        try {
            JSONObject message = new JSONObject();
            message.put("status",-1);
            message.put("data","鉴定失败");
            byte[] bits = message.toJSONString().getBytes(StandardCharsets.UTF_8);
            DataBuffer buffer = response.bufferFactory().wrap(bits);
            response.setStatusCode(HttpStatus.UNAUTHORIZED);
            response.getHeaders().add("Content-Type","text/plain;charset=UTF-8");
            return response.writeWith(Mono.just(buffer));
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return chain.filter(exchange);
    }
​
    @Override
    public int getOrder() {
        return 0;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值