SpringCloudGateway--服务网关

微服务中网关的作用

  • 统一入口:为全部微服务提供一个唯一的入口,网关起到外部和内部隔离的作用,保障了后台服务的安全性
  • 鉴权校验:识别每个请求的权限,拒绝不符合要求的请求
  • 动态路由:动态的将请求路由到不同的后端集群中
  • 减少客户端与服务端的耦合:服务可以独立发展,通过网关层来做映射

spring cloud gateway 权限认证 spring cloud gateway 网关认证登录_java

例如本项目中:

spring cloud gateway 权限认证 spring cloud gateway 网关认证登录_spring cloud_02

gateway 网关的动态路由(通过注册中心获取路由服务实例)

往往在微服务环境中,一个服务可能是要有多个实例的,这时就要有一种动态的路由机制,实现一种类似于 ribbon 的负载均衡机制,让其路由到某个服务的不同实例上
动态配置路由是通过服务注册名来实现的,路由的配置不再是配置固定的访问端口,可以动态来实现。默认情况下 gateway 会根据注册中心注册的服务列表,以注册中心上服务名为路由创建动态路由进行转发,从而实现动态路由的功能

创建网关模块

spring cloud gateway 权限认证 spring cloud gateway 网关认证登录_负载均衡_03

服务网关依赖:

<dependency>
   <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

nacos和gateway pom.xml

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bootstrap</artifactId>
           <version>3.1.3</version>
           <exclusions>
               <exclusion>
                   <artifactId>spring-cloud-commons</artifactId>
                   <groupId>org.springframework.cloud</groupId>
               </exclusion>
               <exclusion>
                   <artifactId>spring-cloud-context</artifactId>
                   <groupId>org.springframework.cloud</groupId>
               </exclusion>
           </exclusions>
       </dependency>

         <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>2021.0.1.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

         <dependency>
             <groupId>com.alibaba.cloud</groupId>
             <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
             <version>2021.0.1.0</version>
         </dependency>

        <!--替代ribbon-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
            <version>3.1.3</version>
            <exclusions>
                <exclusion>
                    <artifactId>spring-cloud-commons</artifactId>
                    <groupId>org.springframework.cloud</groupId>
                </exclusion>
                <exclusion>
                    <artifactId>spring-cloud-context</artifactId>
                    <groupId>org.springframework.cloud</groupId>
                </exclusion>
            </exclusions>
        </dependency>

         <dependency>
             <groupId>org.springframework.cloud</groupId>
             <artifactId>spring-cloud-starter-gateway</artifactId>
             <version>3.1.3</version>
         </dependency>

bootstap.yml

spring:
  application:
    name: cloud-gateway
  cloud:
    nacos:
      config:
        server-addr: 172.31.184.217:8848
        file-extension: yml
        namespace: 3b5f2ab6-ff67-4497-9233-ae4eb8ea7a89
        group: SEATA_GROUP

在nacos中建立网关的路由配置

spring cloud gateway 权限认证 spring cloud gateway 网关认证登录_spring_04

server:
  port: 8084
  servlet:
    context-path: /
Spring:
  cloud:
    nacos:
      discovery:
        # 服务注册地址
        server-addr: 172.31.184.217:8848/
      config:
        # 配置中心地址
        server-addr: 172.31.184.217:8848
        # 配置文件格式
        file-extension: yml
    #网关    
    gateway:
     #网关服务注册进eureka,开启根据serviceId创建路由的功能
      discovery:
        locator:
          enabled: true 
      routes:
      - id: product-service
        uri: lb://product-service
        predicates:
          - Path=/product/**
      - id: account-service
        uri: lb://account-service
        predicates:
          - Path=/account/**
      #我们自定义的路由ID,保持唯一
      - id: order-service 
      #目标,要路由的服务地址
        uri: lb://order-service
        #路由条件
        predicates:
          - Path=/order/**

配置详解:

  • id: 在所有路由定义中需要唯一,不能重复
  • uri: lb://** lb://为固定写法,表示开启负载均衡; ** 即服务在Nacos中注册的名字
  • predicates:- Path=/product/** 使用"Path Route Predicate
    Factory",规则为/product/** 的请求都还转发至微服务product-service中

上面的配置逻辑为:
① 以http://localhost:8084/product/** 的访问路径会转发到product-service微服务的/**
② 以http://localhost:8084/account/** 的访问路径会转发到account-service微服务的/**
③ 以http://localhost:8084/order/** 的访问路径会转发到order-service微服务的/**

启动所有服务,确认是否转发

order-service的一个接口

spring cloud gateway 权限认证 spring cloud gateway 网关认证登录_java_05


直接调用order-service

spring cloud gateway 权限认证 spring cloud gateway 网关认证登录_spring_06

从网关调用

spring cloud gateway 权限认证 spring cloud gateway 网关认证登录_spring_07