网关路由技术

网关

目前我们把一个单体项目拆分成了多个功能各异的服务,并且每个服务的端口都不一样,那么前端怎么知道该访问哪一个端口呢?如果某个服务需要用户信息,那也要在这个服务里写登录和令牌校验吗?显然是不合理的

解决方法就是------网关

网关:就是网络的关口,负责请求的路由、转发、身份校验

前端请求不能直接访问微服务,而是要请求网关:

  • 网关可以做安全控制,也就是登录身份校验,校验通过才放行
  • 通过认证后,网关再根据请求判断应该访问哪个微服务,将请求转发过去

工作原理概述:前端发起请求,网关根据请求的路径判断是哪一个服务,然后从注册中心调用这个服务对应的某个实例

因此,网关其实也算是服务消费者

网关路由

快速入门

一共四步:

  1. 创建新模块
  2. 引入网关依赖
  3. 编写启动类
  4. 配置路由规则

创建新模块

创建一个名字和gateway相关的模块就行

引入网关依赖

XML 复制代码
    <dependencies>
        <!--网关-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--nacos discovery-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--负载均衡-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
    </dependencies>

这些是必要的,但是可能不全,具体看自己的项目

编写启动类

java 复制代码
@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

配置路由规则

bash 复制代码
server:
  port: 8080 # 前端访问端口号
spring:
  application:
    name: gateway # 微服务名称
  cloud:
    nacos:
      server-addr: 192.168.100.128:8848 # 注册中心地址和端口
    gateway:
      routes:
        - id: item-service # 路由规则id,自定义,唯一
          uri: lb://item-service # 路由的目标服务,lb代表负载均衡,会从注册中心拉取服务列表
          predicates: # 路由断言,判断当前请求是否符合当前规则,符合则路由到目标服务
            - Path=/items/**,/search/** # 这里是以请求路径作为判断规则
        - id: user-service
          uri: lb://user-service
          predicates:
            - Path=/users/**,/addresses/**
        - id: cart-service
          uri: lb://cart-service
          predicates:
            - Path=/carts/**
        - id: trade-service
          uri: lb://trade-service
          predicates:
            - Path=/orders/**

路由属性

网关路由对应的Java类型是RouteDefinition,其中常见的属性有:

  • id:路由唯一标示
  • uri:路由目标地址
  • predicates:路由断言,判断请求是否符合当前路由
  • filters:路由过滤器,对请求或响应做特殊处理