API网关Gateway应用实践

张嘉
2023-12-01

API网关Gateway应用实践

背景

随着微服务的兴起,业务基本都会拆分开来,那么这就会产生很多问题,比如,每一个服务都需要提供一个访问链路,到后期随着服务的增多,这种模式的管理也就愈加繁琐,这时通过网关来管理,就很大程度上减少了服务之间调用的复杂性.

网关概述

API网关是随着微服务而兴起的一种架构模式,他是运行于外部请求和内部服务之间的一个流量入口,用于实现对外部请求的协议转换、鉴权、流控、参数校验、监控等通用功能。Spring Cloud Gateway就是Spring公司基于Spring 5.0,Spring Boot 2.0 和 等技术开发的一个API网关组件。其特点如下:

1.性能好,是第一代网关Zuul的1.6倍

2.功能强大:内置很多功能,例如转发,监控,限流等

3.设计优雅,容易扩展

缺点:

1.依赖Netty与WebFulx,不是传统的Servlet编程模型,学习成本高

2.需要spring2.0以上才支持

入门

业务:通过网关作为访问服务入口,对服务进行访问

第一步:在sca-qty-gateway的pom文件中配置依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
    </dependencies>

第二步:创建application.yml文件

server:
  port: 9000
spring:
  application:
    name: sca-gateway
  cloud:
    gateway:
      routes: #配置网关路由规则
        - id: route01  #路由id,自己指定一个唯一值即可
          uri: http://localhost:8083/ #网关帮我们转发的url
          predicates: ###断言(谓词):匹配请求规则
            - Path=/nacos/provider/echo/**  #请求路径定义,此路径对应uri中的资源
          filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理
            - StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos,保护了真正的路径,因为真正的provider服务中时没有nacos

解释:

route路由是最基本的组件之一,表示一个具体的路由信息载体,其中有以下配置

id:标识符,起到了区别其他路由的作用

uri:网关最终帮我们访问的地址

predicates:断言,就是规则,符合规则即可访问,其中规则有很多稍后再谈

filters:网关过滤器,对于断言中的内容进行判断分析以及处理

测试准备

创建启动类

@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class,args);
    }
}

启动项目进行测试,sca-qty-provider以及sca-qty-gateway服务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f6Jxeavv-1646716249374)(C:\Users\11500\AppData\Local\Temp\1646311287904.png)]

访问成功

负载均衡设计

因为网关是服务访问的入口,所有的服务都会在网关层面进行底层映射,所以在访问服务时,根据service id查找对应的服务,让请求从网关层进行均衡转发,以平衡服务的处理能力.

添加依赖

 <dependency>
       <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 </dependency>

配置yml文件

server:
  port: 9000
spring:
  application:
    name: sca-gateway
  cloud:
    gateway:
      routes: #配置网关路由规则
        - id: route01  #路由id,自己指定一个唯一值即可
          #uri: http://localhost:8083/ #网关帮我们转发的url
          uri: lb://sca-qty-provider # 这里的lb代表负载均衡,sca-qty-provider代表服务名
          predicates: ###断言(谓词):匹配请求规则
            - Path=/nacos/provider/echo/**  #请求路径定义,此路径对应uri中的资源
          filters: ##网关过滤器,用于对谓词中的内容进行判断分析以及处理
            - StripPrefix=1 #转发之前去掉path中第一层路径,例如nacos,保护了真正的路径,因为真正的provider服务中时没有nacos的

启动多个provider服务进行访问测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3WooSMJX-1646716249375)(C:\Users\11500\AppData\Local\Temp\1646312112485.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yPRo8N64-1646716249376)(C:\Users\11500\AppData\Local\Temp\1646312123663.png)]

执行流程分析

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mwX91k8V-1646716249376)(C:\Users\11500\AppData\Local\Temp\1646312168568.png)]

从spring官网中我们可以找到此图,我们来分析以下

Gateway Client相当于是客户端,通过网关进行服务的访问,这时候程序先会判断请求链路是否符合断言的规则,符合断言规则后,再根据filter网关过滤器,对断言中的内容进行判断.

小结:

什么是网关:服务访问的一个入口,类似生活中的海关

为什么使用网关:服务安全,统一服务入口管理,负载均衡,限流,鉴权

使用网关的条件:添加依赖,配置yml或者properties文件

Gateway的底层启动实现是:Netty网络编程框架-ServerSocket

Gateway服务做请求转发时必须注册中心注册吗:不一定,可以通过url直接远程访问服务

网关层面如何实现负载均衡:通过服务名查找具体的服务实例

网关层面是如何通过服务名查找服务实例的:通过Ribbon

Ribbon中有哪些负载均衡策略:轮询,ip hash值,权重可通过IRule查查看

Gateway服务做请求转发时必须注册中心注册吗:不一定,可以通过url直接远程访问服务

网关层面如何实现负载均衡:通过服务名查找具体的服务实例

网关层面是如何通过服务名查找服务实例的:通过Ribbon

Ribbon中有哪些负载均衡策略:轮询,ip hash值,权重可通过IRule查查看

 类似资料: