SpringCloud 网关 Gateway

1. 历史


  • API Gateway(APIGW / API 网关),顾名思义,是出现在系统边界上的一个面向 API 的、串行集中式的强管控服务,这里的边界是企业 IT 系统的边界,可以理解为企业级应用防火墙,主要起到隔离外部访问与内部系统的作用。在微服务概念的流行之前,API 网关就已经诞生了,例如银行、证券等领域常见的前置机系统,它也是解决访问认证、报文转换、访问统计等问题的。

  • API 网关的流行,源于近几年来移动应用与企业间互联需求的兴起。移动应用、企业互联,使得后台服务支持的对象,从以前单一的Web应用,扩展到多种使用场景,且每种使用场景对后台服务的要求都不尽相同。这不仅增加了后台服务的响应量,还增加了后台服务的复杂性。随着微服务架构概念的提出,API网关成为了微服务架构的一个标配组件

  • API 网关是一个服务器,是系统对外的唯一入口。API 网关封装了系统内部架构,为每个客户端提供定制的 API。所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有非业务功能。API 网关并不是微服务场景中必须的组件,如下图,不管有没有 API 网关,后端微服务都可以通过 API 很好地支持客户端的访问。

2. 作用


  • 代码解耦: 在客户端与后端加了一层网关,将后端与前端的耦合度降低
  • 功能强大:方便安全、监控、流控、过滤、计费等功能
  • 管理方便:聚合了所有接口,让api对调用者透明,降低了管理成本

3. 创建

3.1 创建模块

创建gateway模块

3.2 添加依赖

/gateway/pom.xml

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">
    <parent>
        <artifactId>springcloudalibaba</artifactId>
        <groupId>org.example</groupId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>gateway</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <!--导入公共部分实体类cloud-api-commons-->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>shop-common</artifactId>
            <version>1.0.0</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-webflux</artifactId>
        </dependency>

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

3.3 修改配置

/gateway/src/main/resources/application.yml

yaml 复制代码
server:
  port: 8000  #端口号
spring:
  application:
    name: service-gateway
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://192.168.88.151:3306/springcloud-alibaba-gateway?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
    username: root
    password: root
  cloud:
    gateway: #网关路由配置
      routes:
        #将 micro-service-cloud-provider-dept-8001 提供的服务隐藏起来,不暴露给客户端,只给客户端暴露 API 网关的地址 9527
        - id: service-product   #路由 id,没有固定规则,但唯一,建议与服务名对应
          uri: lb://service-product      #匹配后提供服务的路由地址
          predicates:
            #以下是断言条件,必选全部符合条件
            - Path=/service-product/**   #断言,路径匹配 注意:Path 中 P 为大写
          filters:
            - StripPrefix=1
        #将 micro-service-cloud-provider-dept-8001 提供的服务隐藏起来,不暴露给客户端,只给客户端暴露 API 网关的地址 9527
        - id: service-order   #路由 id,没有固定规则,但唯一,建议与服务名对应
          uri: lb://service-order        #匹配后提供服务的路由地址
          predicates:
            #以下是断言条件,必选全部符合条件
            - Path=/service-order/**    #断言,路径匹配 注意:Path 中 P 为大写
          filters:
            - StripPrefix=1
    nacos:
      discovery:
        server-addr: 192.168.88.151:8848
        register-enabled: true

3.4 编辑代码

/gateway/src/main/java/org/example/GatewayApplication.java

java 复制代码
package org.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;


@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }
}

4. 验证

4.1 启动服务

启动service-gateway服务后,访问其他服务的url:

http://127.0.0.1:8000/service-product/product/1

说明:
:8000 是 service-gateway 服务的端口
/service-product 是 service-gateway 添加的服务路由前缀
/product/1 这个才是真实的服务路由
http://127.0.0.1:8003/product/3 才是这次请求的真实完整的url

4.2 效果

5. FAQ

5.1 创建空项目报错: error datasource url

参考链接

相关推荐
啊松同学16 分钟前
【Java】设计模式——工厂模式
java·后端·设计模式
枫叶_v44 分钟前
【SpringBoot】20 同步调用、异步调用、异步回调
java·spring boot·后端
源码12152 小时前
ASP.NET MVC宠物商城系统
后端·asp.net·宠物
Ai 编码助手3 小时前
Go语言 实现将中文转化为拼音
开发语言·后端·golang
hummhumm3 小时前
第 12 章 - Go语言 方法
java·开发语言·javascript·后端·python·sql·golang
杜杜的man3 小时前
【go从零单排】Directories、Temporary Files and Directories目录和临时目录、临时文件
开发语言·后端·golang
wywcool3 小时前
JVM学习之路(5)垃圾回收
java·jvm·后端·学习
喜欢打篮球的普通人4 小时前
rust高级特征
开发语言·后端·rust
代码小鑫5 小时前
A032-基于Spring Boot的健康医院门诊在线挂号系统
java·开发语言·spring boot·后端·spring·毕业设计
豌豆花下猫5 小时前
REST API 已经 25 岁了:它是如何形成的,将来可能会怎样?
后端·python·ai