SpringCloud 微服务网关Gateway介绍及简单路由配置

概述:什么是微服务网关?为了解决用户客户端在调用微服务系统中的多个消费者工程接口时,需要维护非常多的消费者应用接口地址等信息,以及可能存在不同应用见的调用跨域等问题,微服务网关组件随即出现。网关作为用户客户端和微服务接口之间的一个统一路由及其他功能的组件,方便了用户客户端请求接口时不用去关注不同接口的地址路径等。只需要统一调用网关的服务即可。微服务网关为一个服务器服务,是系统对外的唯一入口。网关可以提供身份验证、监控、负载均衡、缓存、请求分片与管理、等功能。

一、Gateway 简介

微服务网关比较流行的有Zuul和Gateway。Gateway作为Spring Cloud生态系统中的网关,目标是替代Netfix Zuul,其基于filter链的方式在提供了基本的路由之外,还提供了网关的其他功能,如:安全、监控/埋点,和限流等。他是基于Netty的响应式开发模式。

gateway 与 zuul rps 对比。可以看出 Gateway 的RPS 几乎为Zuul 的 1.6倍。

组件RPS(request per second)
Spring Cloud Gateway32212.38
Netfix Zuul1x20800.13

 

 

 

 

 

Gateway 核心概念:

1,路由(routes)路由为网关最基础功能,Gateway网关路由信息由一个ID、一个目的URL、一组断言工厂和一组Filter组成,如果断言为真,则会对改请求路由到对应的url上。

2,断言(predicates) Java8中的断言函数,SpringCloud Gateway中的断言函数允许开发者去定义匹配来自用户端的请求request中的任何信息,如请求参数和Header中的信息。

3,过滤器(Filters) 一个标准的Spring webFilter,SpringCloud Gateway中的过滤器分为两种,针对服务的Gateway Filter 和全局的Global Filter。过滤器可以对请求和响应进行处理。

二、简单路由配置

 

准备步骤:

  1. 创建maven子工程

  2. pom文件引入Gateway依赖

  3. 创建主启动类

  4. 编写配置文件

1,父工程pom.xml 文件如下:

<?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">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.xiaohui.springCloud</groupId>
  <artifactId>SpringCloud</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.2.2.RELEASE</version>
  </parent>

  <modules>
    <module>product_service</module>
    <module>order_service</module>
    <module>cloud-api-common</module>
    <module>eureka_server</module>
    <module>eureka_server2</module>
    <module>cloud-import-test</module>
    <module>consul_product_service</module>
    <module>consul_order_service</module>
    <module>openfeign_order_service</module>
      <module>hystrix_order_service_ipconn</module>
      <module>hystrix_order_service_rest</module>
      <module>hystrix-turbine</module>
      <module>sentinel_order_service_rest</module>
    <module>sentinel_order_service_feign</module>
      <module>api_gateway_server</module>
  </modules>

  <!-- 统一jar包管理 -->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <junit.version>4.12</junit.version>
    <log4j.version>1.2.17</log4j.version>
    <lombok.version>1.16.18</lombok.version>
    <mysql.version>5.1.47</mysql.version>
    <druid.version>1.1.16</druid.version>
    <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
  </properties>

  <!-- 子模块继承之后,提供作用:锁定版本+子模块不用写groupId和version -->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>Hoxton.SR1</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <!-- springcloud alibaba -->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2.1.0.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>

      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>${druid.version}</version>
      </dependency>
      <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>${mybatis.spring.boot.version}</version>
      </dependency>

      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
      </dependency>

      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
      </dependency>

      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
        <optional>true</optional>
      </dependency>

    </dependencies>
  </dependencyManagement>

  <build>
    <plugins>
      <!-- maven 插件 -->
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <fork>true</fork>
          <addResources>true</addResources>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

2,创建子模块maven工程,并引入gateway依赖

<?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>SpringCloud</artifactId>
        <groupId>com.xiaohui.springCloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>api_gateway_server</artifactId>

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

3,创建主启动类

package com.xiaohui.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

4,编写配置文件

server:
  port: 8080
spring:
  application:
    name: api-gateway-server #服务名称
  cloud:
    gateway:
      routes:
      #配置路由: 路由id,路由到微服务的uri,断言(判断条件)
        - id: product-service #保持唯一
          uri: http://127.0.0.1:8001 #目标为服务地址
          predicates:
            - Path=/payment/** #路由条件 path 路由匹配条件

在配置文件中,我们断言位置配置了一个当访问网关时以 /payment/开始的请求时都会转发到uri 配置的地址127.0.0.1:8001上。

5,启动测试

我们首先保证我们的8001服务正常启动,以及再启动gateway 网关服务。都启动成功后我们访问 http://127.0.0.1:8080/payment/get/1 则会转发到 http://127.0.0.1:8001/payment/get/1 服务地址上。

至此最简单的gateway 服务我们搭建完成,并实现了最简单的服务路由功能。

三、其他路由配置规则:

在上面第二部分我们使用了比较简单的-Path 路径匹配规则,进行了服务路由。SpringCloud Gateway 处理路径匹配之外还有很多其他的匹配规则,比如请求参数、时间等,如下:

例如如下表示:2028年xxxx 时间之后的可以被路由转发。

spring: 
  cloud:
    gateway:
      routes:
        #配置路由: 路由id,路由到微服务的uri,断言(判断条件)
        - id: product-service #保持唯一
          uri: http://127.0.0.1:8001 #目标为服务地址
          predicates:
            - After=2028-03-18T17:32:58.129+08:00[Asia/Shanghai] #路由条件 After 路由匹配条件

参考:https://docs.spring.io/spring-cloud-gateway/docs/2.2.7.RELEASE/reference/html/#gateway-request-predicates-factories

 

 

 

 

  • 7
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值