0.gateway简介

gateway是网关,是spring cloud 生态系统中的网关。gateway的主要作用是所有微服务的“入口”。

核心功能有三个:路由、权限控制、限流。

几个重要的概念:

  • 路由:路由是网关最基础的部分,路由信息有一个ID、一个目的URL、一组断言和一组Filter组成。如果断言路由为真,则说明请求的URL和配置匹配
  • 断言:匹配的规则。Java8中的断言函数。Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自于httprequest中的任何信息,比如请求头和参数等。
  • 过滤器:一个标准的Spring webFilter。Spring cloud gateway中的filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理。

实现流程:

按照前面的框架,我们访问的框架是下面这样:

注意:网关只访问 微服务,不一定访问生产者还是消费者,在此举例一个消费者和一个生产者。

1.创建GateWay网关

我们右击父工程,创建一个模块,

引入POM依赖文件

注意,这个地方不能引入spting boot的依赖,否则启动会报错。

<?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>s-cloud</artifactId>
        <groupId>site.longkui</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>s-cloud-gateway</artifactId>


    <dependencies>
        <!--eureka 客户端-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>3.1.8-SNAPSHOT</version>
        </dependency>
        <!--gateway-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
                <version>3.1.8</version>
             <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-web</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>

</project>

配置文件 application.yml

server:
  port: 10050 #服务的端口
#spring相关配置
spring:
  application:
    name: service-gateway #服务的名称
#eureka配置
eureka:
  client:
    service-url:
      # 填写注册中心服务器地址
      defaultZone: http://localhost:7001/eureka
    # 是否需要将自己注册到注册中心
    register-with-eureka: true
    # 是否需要搜索服务信息
    fetch-registry: true
  instance:
    # 使用ip地址注册到注册中心
    prefer-ip-address: true
    # 注册中心列表中显示的状态参数
    instance-id: ${spring.cloud.client.ip-address}:${server.port}

然后创建主启动类:

package site.longkui.scloudgateway;

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

@SpringBootApplication
@EnableEurekaClient
public class sCloudGateWay {
    public static void main(String[] args) {
        SpringApplication.run(sCloudGateWay.class, args);
    }
}

然后启动eureka和gateway,访问127.0.0.1:7001 可以看到网关正常注册。

2.实现路由功能

我们需要修改gatway的application.yml文件,增加下面的代码(注意格式,强制要求空格)

server:
  port: 10050 #服务的端口
#spring相关配置
spring:
  application:
    name: service-gateway #服务的名称
  #gateWay配置
  cloud:
    gateway:
      routes:
        # 例子1
        - id: s-cloud-gateway1  # 路由ID,命名随意,只要保证唯一性即可
          uri: http://127.0.0.1:8002  # 设置一个地址,指向前面的一个消费者端口
          predicates:
            - Method=GET,POST #只匹配GET和POST请求
     
#eureka配置
eureka:
  client:
    service-url:
      # 填写注册中心服务器地址
      defaultZone: http://localhost:7001/eureka
    # 是否需要将自己注册到注册中心
    register-with-eureka: true
    # 是否需要搜索服务信息
    fetch-registry: true
  instance:
    # 使用ip地址注册到注册中心
    prefer-ip-address: true
    # 注册中心列表中显示的状态参数
    instance-id: ${spring.cloud.client.ip-address}:${server.port}

修改网关的配置文件,增加了两个路由,一个通过固定IP和端口的形式访问8002端口,另一个通过访问注册服务名的方式来访问,实际操作中一般采用后者。

predicates中配置了允许接口的访问规则,这里设置了GET和POST两种方式。

可以看出我们通过10050端口,访问了原来8002端口的功能,同样实现了原来的功能呢。

通过服务的方式进行访问:

server:
  port: 10050 #服务的端口
#spring相关配置
spring:
  application:
    name: service-gateway #服务的名称
  #gateWay配置
  cloud:
    gateway:
      routes:
        # 例子1
#        - id: s-cloud-gateway1  # 路由ID,命名随意,只要保证唯一性即可
#          uri: http://127.0.0.1:8002  # 设置一个地址,指向前面的一个消费者端口
#          predicates:
#            - Method=GET,POST #只匹配GET和POST请求


        #例子2
        - id: s-cloud-gateway2
          uri: lb://service-provider1 #以 lb:// 开头,后面的是注册在eureka上的服务名
          predicates:
            - Method=GET,POST #只匹配GET和POST请求
#eureka配置
eureka:
  client:
    service-url:
      # 填写注册中心服务器地址
      defaultZone: http://localhost:7001/eureka
    # 是否需要将自己注册到注册中心
    register-with-eureka: true
    # 是否需要搜索服务信息
    fetch-registry: true
  instance:
    # 使用ip地址注册到注册中心
    prefer-ip-address: true
    # 注册中心列表中显示的状态参数
    instance-id: ${spring.cloud.client.ip-address}:${server.port}

可以看出,实现了通过服务名的方式来访问微服务接口。