什么是网关

  • API Gateway,是系统的唯一对外的入口,介于客户端和服务器端之间的中间层,处理非业务功能提供路由请求、鉴权、监控、缓存、限流等功能。
  • 统一接入
    • 智能路由
    • AB测试、灰度测试
    • 负载均衡、容灾处理
    • 日志埋点(类似Nignx日志)
  • 流量监控
    • 限流处理
    • 服务降级
  • 安全防护
    • 鉴权处理
    • 监控
    • 机器网络隔离
  • 主流的网关
    • zuul:是Netflix开源的微服务网关,和Eureka,Ribbon,Hystrix等组件配合使用,依赖组件比较多,性能教差
    • kong: 由Mashape公司开源的,基于Nginx的API gateway
    • nginx+lua:是一个高性能的HTTP和反向代理服务器,lua是脚本语言,让Nginx执行Lua脚本,并且高并发、非阻塞的处理各种请求
    • springcloud gateway: Spring公司专门开发的网关,替代zuul

注意:AlibabaCloud全家桶还没对应的网关,那么就用SpringCloud官方推荐的Gateway

什么是 SpringCloud Gateway

  • Spring官方出品,基于Spring5+Reactor技术开发的网关
  • 性能强劲基于Reactor+WebFlux、功能多样
  • 基于springboot2.x, 直接可以jar包方式运行

创建SpringCloud网关项目和依赖添加

新建class-api-gateway项目,和之前的新建步骤一样。并且在java目录下新建com.study包
image.png

网关项目添加依赖
image.png

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-gateway</artifactId>
  4. </dependency>

网关项目添加启动类

  1. import org.springframework.boot.SpringApplication;
  2. import org.springframework.boot.autoconfigure.SpringBootApplication;
  3. @SpringBootApplication
  4. public class GatewayApplication {
  5. public static void main(String[] args) {
  6. SpringApplication.run(GatewayApplication.class, args);
  7. }
  8. }

网关项目创建application.yml文件,并配置

server:
  port: 8888
spring:
  application:
    name: class-api-gateway
  cloud:
    gateway:
      routes:   #路由:数组形式,可以是多个
        - id: order-service   #路由唯一标识
          uri: http://127.0.0.1:8000    #想要转发到的地址
          order: 1  #优先级,数字越小优先级越高
          predicates:   #断言 配置哪个路径才转发
            - Path=/order-server/**   #请求时前缀是/order-server/进行转发
          filters:  #过滤器,请求在传递过程中通过过滤器修改
            - StripPrefix=1   #去掉第一层前缀,因为订单服务接口url不包含/order-server,所以会将其过滤掉

#访问路径 http://localhost:8888/order-server/api/v1/video_order/threadTest
#转发路径 http://localhost:8000/order-server/api/v1/video_order/threadTest
#需要过滤器去掉前面第一层,过滤器去掉后url:
# http://localhost:8000/api/v1/video_order/threadTest

启动网关服务和订单服务测试

//访问8888端口,会自动转到8000端口的订单服务
http://localhost:8888/order-server/api/v1/video_order/threadTest