API网关:Gateway
原创大约 3 分钟
什么是API网关

虽然Spring Cloud已经提供了Gateway组件,但它并非开箱即用的。
对于生产级别的网关来说,仍然有许多功能需要自己来做,除了上面那张图上显示的,还包括但不限于灰度路由
、IP追踪
、统一Token认证
、CORS过滤
、统一的异常处理
、黑白名单过滤
等特性,特别麻烦。
引入依赖
新创建一个Maven子模块项目funcun-gateway
。
然后引入下面这些依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
因为Spring Cloud Gateway使用的是Spring WebFlux,所以要用它替换掉之前的spring-boot-starter-web
。
除上面这些,其他的依赖都可以去掉。
添加配置
添加bootstrap.yml
文件,内容如下。
server:
port: 9000
spring:
application:
# 应用名称
name: funcun-gateway
cloud:
gateway:
discovery:
locator:
enabled: true # 是否与服务注册于发现组件进行结合,通过serviceId转发到具体的服务实例,默认为false
lower-case-service-id: true # 将请求路径的服务名配置改成小写
routes:
- id: payment # 当前路由的标识, 要求唯一
uri: http://127.0.0.1:9001 # 通过http转发
# uri: lb://funcun-payment-center # 通过服务注册中心的应用名转发
order: 1 # 路由优先级,数字越小级别越高
predicates: # 断言,就是路由转发要满足的条件
- Path=/payment/** # 当请求路径满足Path指定的规则时才进行路由转发,多路径匹配时用英文逗号分隔
# filters: # 过滤器,从实际测试的效果来看,这个不但不起作用,反而起到相反的作用,例如,只有通过 http://localhost:9000/payment/payment/pay?money=10 才能访问成功,而 http://localhost:9000/payment/pay?money=10 就会404,但去掉它就正常了
# - StripPrefix=1 # 去掉一级前缀
- id: order
uri: http://127.0.0.1:9002
# uri: lb://funcun-order-center
order: 2
predicates:
- Path=/order/**
- id: message
uri: http://127.0.0.1:9003
# uri: lb://funcun-message-center
order: 3
predicates:
- Path=/message/**
nacos:
discovery:
# 服务注册地址
server-addr: localhost:8848
编写代码
编写一个网关启动类文件。
package com.funcun.cloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 服务启动类
*
*/
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
测试运行
启动服务后,就可以通过Postman或其他接口测试工具进行测试了,可以依次访问下面三个接口看是否能成功。
如果都调用成功,就说明网关服务已经生效了。
这是最简单的网关应用,至于实际生产环境中的网关,可能会非常复杂。
此外,可以加入Sentinel、Spring Cloud Sleuth和Zipkin的依赖,看看整合效果。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-sleuth</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-sleuth-zipkin</artifactId>
</dependency>
感谢支持
更多内容,请移步《超级个体》。