SpringCloud-07 GateWay01 网关技术

Spring Cloud Gateway组件的核心是一系列的过滤器,通过这些过滤器可以将客户端发送的请求转发(路由)到对应的微服务。 Spring Cloud Gateway是加在整个微服务最前沿的防火墙和代理器,隐藏微服务结点IP端口信息,从而加强安全保护。Spring Cloud Gateway本身也是一个微服务,需要注册进服务注册中心。


<I--图片均来自尚硅谷-->

Nginx 和 Spring Cloud Gateway 都是流行的网关技术,但它们在多个方面有所不同。Nginx 是一个用 C 语言编写的高性能 Web 服务器和反向代理,适合处理静态资源和负载均衡。而 Gateway 是基于 Spring 生态系统的响应式 API 网关,专为微服务设计,提供动态路由和细粒度的 API 管理。Nginx 通过 Lua 脚本扩展,而 Gateway 支持在 Java 框架上进行代码扩展。选择使用哪一个通常取决于项目需求:Nginx 适合作为流量入口和负载均衡器,Gateway 适合作为微服务架构中的业务网关。

三大核心: 路由(Route) 断言(Predicate) 过滤器(Filter)



客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。

过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(Pre)或之后(Post)执行业务逻辑。

在"pre"类型的过滤器可以做参数校验、权限校验、流量监控、日志输出、协议转换等;

在"post"类型的过滤器中可以做响应内容、响应头的修改,日志的输出,流量监控等有着非常重要的作用。

核心逻辑: 路由转发+断言判断+执行过滤器链

//新建Module

//改pom

java 复制代码
    <dependencies>
        <!--gateway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--服务注册发现consul discovery,网关也要注册进服务注册中心统一管控-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <!-- 指标监控健康检查的actuator,网关是响应式编程删除掉spring-boot-starter-web dependency-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

//改yml

java 复制代码
server:
  port: 9527

spring:
  application:
    name: cloud-gateway #以微服务注册进consul或nacos服务列表内
  cloud:
    consul: #配置consul地址
      host: localhost
      port: 8500
      discovery:
        prefer-ip-address: true
        service-name: ${spring.application.name}

//启动类

java 复制代码
@SpringBootApplication
@EnableDiscoveryClient//注册服务与发现
public class Main9527 {
    public static void main(String[] args) {
        SpringApplication.run(Main9527.class,args);
    }
}

GateWay也会作为一个微服务入驻进服务注册中心

在8001端口新建PayGateWayController类

java 复制代码
@RestController
public class PayGateWayController {
    @Resource
    PayService payService;

    @GetMapping(value = "/pay/gateway/get/{id}")
    public ResultData<Pay> getById(@PathVariable("id") Integer id)
    {
        Pay pay = payService.getById(id);
        return ResultData.success(pay);
    }

    @GetMapping(value = "/pay/gateway/info")
    public ResultData<String> getGatewayInfo()
    {
        return ResultData.success("gateway info test:"+ IdUtil.simpleUUID());
    }
}

修改9527端口yml配置

java 复制代码
server:
  port: 9527

spring:
  application:
    name: cloud-gateway #以微服务注册进consul或nacos服务列表内
  cloud:
    consul: #配置consul地址
      host: localhost
      port: 8500
      discovery:
        prefer-ip-address: true
        service-name: ${spring.application.name}
    gateway:
      routes:
        - id: pay_routh1 #pay_routh1                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8001                #匹配后提供服务的路由地址
          predicates:
            - Path=/pay/gateway/get/**              # 断言,路径相匹配的进行路由


        - id: pay_routh2 #pay_routh2                #路由的ID(类似mysql主键ID),没有固定规则但要求唯一,建议配合服务名
          uri: http://localhost:8001                #匹配后提供服务的路由地址
          predicates:
            - Path=/pay/gateway/info/**              # 断言,路径相匹配的进行路由

访问9527映射到了8001

在通用接口新增

java 复制代码
    @GetMapping(value = "/pay/gateway/get/{id}")
    public ResultData getById(@PathVariable("id") Integer id);

    @GetMapping(value = "/pay/gateway/info")
    public ResultData<String> getGatewayInfo();

在feign80端口新增OrderGateWayController类

java 复制代码
@RestController
public class OrderGateWayController
{
    @Resource
    private PayFeignApi payFeignApi;

    @GetMapping(value = "/feign/pay/gateway/get/{id}")
    public ResultData getById(@PathVariable("id") Integer id)
    {
        return payFeignApi.getById(id);
    }

    @GetMapping(value = "/feign/pay/gateway/info")
    public ResultData<String> getGatewayInfo()
    {
        return payFeignApi.getGatewayInfo();
    }
}

网关关闭和网关开启都能正常访问

这是因为:同一个项目内部自己人,不经过网关,直接找微服务 外部人员访问才会经过网关

在通用接口修改代码(模拟外部人员访问)

java 复制代码
//@FeignClient(value="cloud-payment-service")
@FeignClient(value="cloud-gateway")

网关关闭

网关开启

相关推荐
zzlyyds2 小时前
SpringBoot---------Actuator监控
java·spring boot·spring·actuator
小筱在线4 小时前
在SpringCloud中实现服务间链路追踪
后端·spring·spring cloud
阿乾之铭4 小时前
Spring Service中的@Service注解的使用
java·spring boot·spring
yyyyyyykk4 小时前
Java后端框架---Spring
java·开发语言·spring
计算机学姐4 小时前
基于SpringBoot+Vue的高校门禁管理系统
java·vue.js·spring boot·后端·spring·intellij-idea·mybatis
yuhaiqiang6 小时前
超乎你的想象!SpringBoot处理1 次 Http请求竟需要申请这么一大块内存!
java·spring
砖业洋__6 小时前
Spring高手之路24——事务类型及传播行为实战指南
java·spring·事务·nested·事务传播行为
黄俊懿6 小时前
【深入理解SpringCloud微服务】了解微服务的熔断、限流、降级,手写实现一个微服务熔断限流器
java·分布式·后端·spring cloud·微服务·架构·手写源码
Xua30557 小时前
浅谈Spring Cloud:OpenFeign
后端·spring·spring cloud