SpringCloud-Gateway

一、介绍

(1)网关服务

(2)功能:断言、路由、过滤

(3)能避免用户直接访问到业务主机

二、项目搭建

a、编写pom.xml(注意移除web框架,gateway中自带有)

java 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>demo20220821</artifactId>
        <groupId>com.wsh.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-gateway-gateway9527</artifactId>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>com.wsh.springcloud</groupId>
            <artifactId>cloud-api-common</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>

b、编写application.yml

java 复制代码
server:
  port: 9527

spring:
  application:
    name: cloud-gateway-service

eureka:
  client:
    #    客户端设置为true
    register-with-eureka: true
    #    客户端设置为true
    fetch-registry: true
    service-url:
      #      defaultZone: http://localhost:7001/eureka
      defaultZone: http://eureka1.com:7001/eureka, http://eureka2.com:7002/eureka
  instance:
    instance-id: gateway9527
    prefer-ip-address: true

c、编写启动类

java 复制代码
package com.wsh.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * @ClassName PaymentMain8002
 * @Description: TODO
 * @Author wshaha
 * @Date 2022/8/23
 * @Version V1.0
 **/
@EnableEurekaClient
@SpringBootApplication
public class GatewayMain8002 {
    public static void main(String[] args) {
        SpringApplication.run(GatewayMain8002.class, args);
    }
}

d、application.yml增加路由配置

java 复制代码
server:
  port: 9527

spring:
  application:
    name: cloud-gateway-service
  cloud:
    gateway:
      routes:
        - id: r1
          uri: http://localhost:8001
          predicates:
            - Path=/payment/test/**

eureka:
  client:
    #    客户端设置为true
    register-with-eureka: true
    #    客户端设置为true
    fetch-registry: true
    service-url:
      #      defaultZone: http://localhost:7001/eureka
      defaultZone: http://eureka1.com:7001/eureka, http://eureka2.com:7002/eureka
  instance:
    instance-id: gateway9527
    prefer-ip-address: true

e、运行

(4)路由开启支持负载均衡

java 复制代码
server:
  port: 9527

spring:
  application:
    name: cloud-gateway-service
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true #开启使用微服务名路由
      routes:
        - id: r1
          uri: lb://CLOUD-PAYMENT-SERVICE
          predicates:
            - Path=/payment/test/**

eureka:
  client:
    #    客户端设置为true
    register-with-eureka: true
    #    客户端设置为true
    fetch-registry: true
    service-url:
      #      defaultZone: http://localhost:7001/eureka
      defaultZone: http://eureka1.com:7001/eureka, http://eureka2.com:7002/eureka
  instance:
    instance-id: gateway9527
    prefer-ip-address: true


三、断言配置


四、过滤

(1)

(2)自定义

java 复制代码
package com.wsh.springcloud.config;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

/**
 * @ClassName FiltersConfig
 * @Description: TODO
 * @Author wshaha
 * @Date 2023/10/14
 * @Version V1.0
 **/
@Component
public class FiltersConfig implements GlobalFilter, Ordered {


    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
        queryParams.entrySet().stream()
                .forEach(item -> {
                    System.out.println(item.getKey() + "-" + item.getValue());
                });
        return exchange.getResponse().setComplete();//结束
//        return chain.filter(exchange); //进入下一个过滤器
    }

    @Override
    public int getOrder() {
        return 0;
    }
}


相关推荐
java1234_小锋11 分钟前
Spring事件监听的核心机制是什么?
java·spring·面试
CodeBlossom4 小时前
Spring Cache快速入门
java·数据库·spring
⑩-4 小时前
如何保证Redis和Mysql数据缓存一致性?
java·数据库·redis·mysql·spring·缓存·java-ee
我要去腾讯8 小时前
Springcloud核心组件之Sentinel详解
java·spring cloud·sentinel
虎子_layor9 小时前
实现异步最常用的方式@Async,快速上手
后端·spring
不光头强9 小时前
Spring整合单元测试
spring·单元测试·log4j
没有bug.的程序员10 小时前
Eureka 注册中心原理与服务注册发现机制
java·spring·云原生·eureka·架构·注册中心·服务注册发现
祈祷苍天赐我java之术11 小时前
SpringCache :让缓存开发更高效
前端·spring·bootstrap
程序员小赵同学11 小时前
Spring AI Alibaba语音合成实战:从零开始实现文本转语音功能
人工智能·spring·语音识别
学IT的周星星12 小时前
Spring 框架整合 JUnit 单元测试
java·spring·junit·单元测试