前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Cloud Gateway微服务网关

Spring Cloud Gateway微服务网关

作者头像
张云飞Vir
发布2022-10-28 10:21:45
4600
发布2022-10-28 10:21:45
举报
文章被收录于专栏:写代码和思考写代码和思考

写在前面

网关为微服务架构的系统提供简单、有效且统一的API路由管理,作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公用逻辑,主要功能包含认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。

GateWay : 是Spring Cloud的一个全新的API网关项目,基于性能的Reactor模式响应式通信框架Netty,异步阻塞模型 等技术开发,性能高于Zuul。旨在为微服务架构提供种简单有效的统的API路由管理式。

spring cloud gateway 核心功能:

  • 路由(route) 路由信息的组成:由一个ID、一个目的URL、一组断言工厂、一组Filter组成。如果路由断言为真,说明请求URL和配置路由匹配。
  • 断言(Predicate) Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的ServerWebExchange。Spring Cloud Gateway的断言函数允许开发者去定义匹配来自于Http Request中的任何信息比如请求头和参数。
  • 过滤器(Filter) 一个标准的Spring WebFilter。 Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理。

一些概念

路由(Route)是GateWay中最基本的组件之一,表示一个具体的路由信息载体,主要由下面几个部分组成:

  • id: 唯一标识,名字
  • uri: 路由的目的地URL,请求被转发到这里
  • predicate:断言,它的作用是进行条件判断,符合判断的才会执行路由
  • filter: 过滤器,用于修改请求和响应信息

对应的先看下怎么配置一个路由,长这样:

代码语言:javascript
复制
# 下面的路由配置了: 来自 /account 开头的请求,都转到 account-service 微服务中。同时 先去掉 url 中的第一个段。

routes:
  - id: account-service
    uri: http://localhost:8803/
    predicates:
      - Path=/account/**
    filters:
      - StripPrefix=1

# StripPrefix 的意思是去掉 url 中的第一个段,比如 /account/user/list 就变成了/user/list 这样的 url 发送到具体的微服务。

路由的逻辑过程:

代码语言:javascript
复制
(1) 请求开始:Gateway Client 向 Spring Cloud Gateway 发送请求,请求首先会被 HttpWebHandlerAdapter 进行提取组装成网关上下文.
(2) 执行断言:网关的上下文会传递到 DispatcherHandler ,它负责将请求分发给 RoutePredicateHandlerMapping
RoutePredicateHandlerMapping 负责路由查找,并根据路由断言判断路由是否可用
(3) 过滤器链:如果过断言成功,由FilteringWebHandler 创建过滤器链并调用
执行所有 前置过滤器逻辑。然后进行代理请求(分发到具体微服务)。完成代理请求后,将运行 后置过滤器逻辑。
(4) 响应:处理完毕之后将 Response 返回到 Gateway 客户端

动手上代码

1、添加依赖

添加 gateway 依赖

代码语言:javascript
复制
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

2、写个 main 函数启动

代码语言:javascript
复制
@EnableDiscoveryClient
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
        System.out.println("启动成功 !");
    }
}

3、写 yml 配置文件

代码语言:javascript
复制
# Tomcat
server:
  port: 8080

# Spring
spring:
  application:
    # 应用名称
    name: gateway
  profiles:
    # 环境配置
    active: dev
  main:
    allow-bean-definition-overriding: true
  cloud:
    gateway:
      discovery:
        locator:
          lowerCaseServiceId: true
          enabled: true
      routes:
        - id: account-service
          uri: http://localhost:8803/
          #uri: lb://account-service
          predicates:
            - Path=/account/**
          filters:
            - StripPrefix=1

配置转发的方式,常用两种: (1) 直接转发,直接写网址,这样配置。

代码语言:javascript
复制
uri: http://localhost:8803/

(2) 负载均衡转发到具体微服务

代码语言:javascript
复制
uri: lb://account-service

扩展:关联到 naocs

如果关联nacos,依赖:

代码语言:javascript
复制
<!-- SpringCloud Alibaba Nacos -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

注意, nacos 不要使用 ribon负载均衡器,建议使用 loadbalancer,添加下面的依赖。 不引入下面这个依赖的话,配置 lb://you_service 格式的url 将无法使用

代码语言:javascript
复制
<!-- SpringCloud Loadbalancer -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-10-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 写在前面
  • 一些概念
  • 动手上代码
    • 1、添加依赖
      • 2、写个 main 函数启动
        • 3、写 yml 配置文件
          • 扩展:关联到 naocs
          相关产品与服务
          负载均衡
          负载均衡(Cloud Load Balancer,CLB)提供安全快捷的流量分发服务,访问流量经由 CLB 可以自动分配到云中的多台后端服务器上,扩展系统的服务能力并消除单点故障。负载均衡支持亿级连接和千万级并发,可轻松应对大流量访问,满足业务需求。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档