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

参考链接

相关推荐
郝同学的测开笔记12 分钟前
一次业务投诉引发的思考:如何优雅地将K8s服务暴露给外部?
后端·kubernetes
壹米饭21 分钟前
Java程序员学Python学习笔记一:学习python的动机与思考
java·后端·python
全栈派森29 分钟前
机器学习第五课: 深度神经网络
后端·神经网络·机器学习
白露与泡影1 小时前
springboot + nacos + k8s 优雅停机
spring boot·后端·kubernetes
菜鸟谢1 小时前
windows xp 下载 sp0 sp1 sp2 sp3 sp4
后端
AirMan1 小时前
你真的懂 MySQL 的一致性读和当前读的区别吗?
后端·面试
David爱编程1 小时前
容器性能优化实战指南——防止“吃爆”服务器就靠这些招!
后端·docker·容器
Android洋芋1 小时前
GitHub项目部署的终极指南:从零到一掌握Docker实战
后端
林太白2 小时前
Next.js超简洁完整篇
前端·后端·react.js
前端付豪2 小时前
汇丰登录风控体系拆解:一次 FaceID 被模拟攻击的调查纪实
前端·后端·架构