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