统一服务入口-Gateway(一)

目录

1.网关介绍

1.1含有问题

1.2什么是API网关

网关核心功能:

2.Spring Cloud Gateway

2.1什么是Spring Cloud Gateway

2.2快速上手

2.2.1创建网关项目

2.2.2引入网关依赖

2.2.3添加Gateway的路由配置

2.2.4测试

2.3Predicate

2.3.1Predicate的其他写法

2.3.2Predicate的其他方法

2.4Route Predicate Factories

2.4.1代码演示


1.网关介绍

1.1含有问题

当前所有微服务的接口都是直接对外暴露的,可以直接通过外部访问,为了保证对外服务的安全性,服务端实现的微服务接口通常都带有一定的权限校验机制,由于使用了微服务,原本一个应用的多个模块拆分成了多个应用,我们不得不实现多次校验逻辑,当这套逻辑需要修改时,我们需要修改多个应用,加重开发人员的负担

针对以上问题,一个常用的解决方案是API网关

比如企业管理
外部人员去公司办理业务,公司需要先核实对方的身份再去进行办理. 最开始只有一个员工,这个员工核实之后直接办理即可.(单体架构)

随着公司的发展,划分了多个部门,每个部门负责的事情不同,每个部门都需要先核实对方的身份再进行办理.(微服务架构)
 这个流程存在一些问题:
 1.办事效率低
 2.增加了员工的工作流程
我们对此进行改进,设立前台,统一由前台来进行身份的校验,前台身份校验通过后,其他部门就设置信任,直接办理.

1.2什么是API网关

API网关(简称网关)也是一个服务,通常是后端服务的唯一入口.

它的定义类似设计模式中的Facade模式 (门面模式,也称外观模式).它就类似整个微服务架构的门面,所有的外部客户端访问,都需要经过它来进行调度和过滤.

网关核心功能:

权限控制:作为微服务的入口,对用户进行权限校验,如果校验失败则进行拦截

动态路由:一切请求先经过网关,网关不处理业务,而是根据某种规则,把请求转发到某个微服务

负载均衡:当路由的目标服务有多个时,还需要做负载均衡

限流:请求流量过高时,按照网关中配置微服务能够接受的流量进行放行,避免服务压力过大.

2.Spring Cloud Gateway

2.1什么是Spring Cloud Gateway

Spring Cloud Gateway是Spring Cloud的一个全新的API网关项目,基于Spring+SpringBoot等技术 开发,目的是为了替换掉Zuul.旨在为微服务架构提供一种简单而有效的途径来转发请求,并为他们提供横切关注点,比如:安全性,监控/指标和弹性.

在性能方面,根据官方提供的测试报告,SpringCloud Gateway的RPS(每秒请求数)是Zuul的1.6倍.

2.2快速上手

2.2.1创建网关项目

2.2.2引入网关依赖

 <!--⽹关-->
 <dependency>
     <groupId>org.springframework.cloud</groupId>
     <artifactId>spring-cloud-starter-gateway</artifactId>
 </dependency>
 <!--基于nacos实现服务发现依赖-->
 <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-loadbalancer</artifactId>
 </dependency>

2.2.3添加Gateway的路由配置

创建application.yml文件,添加如下配置:

server:
  port: 10030
spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: 110.41.51.65:10020
    gateway:
      metrics:
        enabled: true
      routes:
        - id: order-service   #路由规则id, 随便起, 不重复即可
          uri: lb://product-service/ #目标服务地址
          predicates:   #路由条件
            - Path=/order/**,/feign/**,/product/**
            - After=2024-03-20T00:00:22.370856700+08:00[Asia/Shanghai]

配置字段说明:

  • id:自定义路由ID,保持唯一
  • uri:目标服务地址,支持普通URI及lb://应用注册服务名称.lb表示负载均衡,使用lb://方式表示从注册中心获取服务地址.
  • predicates:路由条件,根据匹配结果决定是否执行该请求路由,上述代码中,我们把符合Path规则的一切请求,都代理到uri参数指定的地址.

2.2.4测试

启动API网关服务

1.通过网关服务访问product-service

url符合yml文件中配置的/product/**规则,

路由转发到product-service:http://product-service/product/1001

访问时,观察网关日志,可以看到网关服务从Nacos时获取服务列表

2.3Predicate

Predicate是Java 8提供的一个函数式编程接口,它回收一个参数并返回一个布尔值,用于条件过滤,请求参数的校验

 @FunctionalInterface
 public interface Predicate<T> {
      boolean test(T t);
      //...
 }

代码演示:

1.定义一个Predicate

 class StringPredicate implements Predicate<String>{
     @Override
     public boolean test(String str) {
         return str.isEmpty();
     }
 }

2.使用这个Predicate

 public class PredictTest {
     public static void main(String[] args) {
         Predicate<String> predicate = new StringPredicate();
         System.out.println(predicate.test(""));//true
         System.out.println(predicate.test("666"));//false
     }
 }

2.3.1Predicate的其他写法

1.内置函数

 public class PredictTest {
     public static void main(String[] args) {
         Predicate<String> predicate = new Predicate<String>(){
             @Override
             public boolean test(String s) {
                 return s.isEmpty();
             }
         };
         System.out.println(predicate.test(""));
         System.out.println(predicate.test("666"));
     }
 }

2.lambda写法

public class PredictTest {
    public static void main(String[] args) {
        Predicate<String> predicate = s -> s.isEmpty();
        System.out.println(predicate.test(""));
        System.out.println(predicate.test("bite666"));
    }
}

Predicate<String>predicate =s ->s.isEmpty();

也可以写成 Predicate<String>isEmpty =String::isEmpty;

2.3.2Predicate的其他方法

  • isEqual(Object targetRef):比较两个对象是否相等,参数可以为Null
  • and(Predicate other):短路与操作,返回一个组成Predicate
  • or(Predicate other):短路或操作,返回一个组成Predicate
  • test(T t):传入一个Predicate参数,用来做判断
  • negate():返回表示此Predicate逻辑否定的Predicate

2.4Route Predicate Factories

Route Predicate Factories(路由断言工厂,也称为路由谓词工厂,此处谓词表示一个函数),在Spring Cloud Gateway中,Predicate提供了路由规则的匹配机制.

我们在配置文件中写的断言规则只是字符串,这些字符串会被Route Predicate Factory读取并处理,转变为路由判断的条件.

比如前面章节配置的Path=/product/**,就是通过Path属性来匹配URL前缀是/product的 请求.

这个规则是由org.springframework.cloud.gateway.handler.predicate.PathRoutePredicateFactory来实现的.

Spring Cloud Gateway默认提供了很多Route Predicate Factory,这些Predicate会分别匹配HTTP请 求的不同属性,并且多个Predicate可以通过and逻辑进行组合.

2.4.1代码演示

1.添加Predicate规则

在application.yml中添加如下规则

spring:
  application:
    name: gateway
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        namespace: b460e95c-d4b9-42a3-810f-cdf0051ce008
    gateway:
      metrics:
        enabled: true
      routes:
        - id: order-service   #路由规则id, 随便起, 不重复即可
          uri: lb://product-service/ #目标服务地址
          predicates:   #路由条件
            - Path=/product/**
            - After=2025-01-01T00:00:00.000+08:00[Asia/Shanghai]

添加限制规则:请求时间为2025年1月1日后

2.测试

访问:http://127.0.0.1:10030/product/1001

3.修改时间为2024-01-01,再次访问

- After=2024-01-01T00:00:00.000+08:00[Asia/Shanghai]

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: cloud-nacos-gateway-knife4j:swagger聚合文档是使用Spring Cloud和Nacos作为技术栈开发的一种解决方案。 Spring Cloud是一套开发分布式应用的工具集,它基于Spring Boot,用于构建微服务架构的应用程序。它提供了诸如服务注册与发现、服务追踪、负载均衡等功能,可以方便地实现微服务的开发和管理。在这个解决方案中,我们使用了Spring Cloud来构建和管理微服务。 Nacos是一个动态服务发现、配置管理和服务管理平台。它提供了服务注册与发现、配置管理、动态路由等功能,可以方便地实现微服务的注册与发现、配置的动态管理。在这个解决方案中,我们将使用Nacos作为服务注册与发现的中心。 Gateway是Spring Cloud的网关组件,它以微服务的方式构建网关,提供了统一入口和出口,可以对请求进行路由、过滤、聚合等多种操作。在这个解决方案中,我们使用Gateway作为网关组件,统一管理和分发请求。 Knife4j是一个开源的Swagger文档聚合工具,它可以将多个微服务的Swagger文档聚合在一起,提供一个统一的API文档入口。在这个解决方案中,我们使用Knife4j来聚合各个微服务的Swagger文档,方便开发人员查看和调试API接口。 综上所述,cloud-nacos-gateway-knife4j:swagger聚合文档使用了Spring Cloud、Nacos、Gateway和Knife4j等技术,通过Spring Cloud构建和管理微服务,使用Nacos实现服务注册与发现,通过Gateway实现统一的请求分发和路由,再通过Knife4j将各个微服务的Swagger文档聚合在一起,方便开发人员进行API的查看和调试。这个解决方案可以提高开发效率、简化架构,使得微服务的开发和管理更加方便和高效。 ### 回答2: cloud-nacos-gateway-knife4j是基于Spring Cloud、Nacos、Gateway和Knife4j等技术实现的Swagger聚合文档工具。 首先,这个工具使用了Spring Cloud框架,它是一种用于构建分布式系统的解决方案。Spring Cloud提供了一系列插件和组件,使得我们可以轻松地构建、部署和管理分布式应用。这些组件包括服务发现与注册、服务间调用、负载均衡、断路器等等。在cloud-nacos-gateway-knife4j中,我们使用Spring Cloud来实现服务注册与发现的功能,使得不同的微服务可以方便地相互调用。 其次,cloud-nacos-gateway-knife4j还使用了Nacos作为服务的注册中心。Nacos是一个开源的动态服务发现、配置和服务管理平台,它提供了服务注册、服务发现、服务配置、路由配置等功能。在cloud-nacos-gateway-knife4j中,我们使用Nacos作为服务注册中心,来管理微服务的地址和配置信息。 另外,cloud-nacos-gateway-knife4j还使用了Gateway作为API网关。API网关是系统的统一入口,它可以处理一些通用的非业务功能,如身份认证、请求转发、限流等等。在cloud-nacos-gateway-knife4j中,我们使用Gateway作为API网关,实现了请求的转发和一些基本的安全控制功能。 最后,cloud-nacos-gateway-knife4j还使用了Knife4j作为Swagger的UI界面。Swagger是一种用于构建、文档化和调试RESTful接口的工具,它提供了一套非常直观的界面来展示接口信息和测试接口。在cloud-nacos-gateway-knife4j中,我们使用Knife4j来生成并展示聚合文档,使得接口文档更加友好和易用。 总的来说,cloud-nacos-gateway-knife4j是一个基于Spring Cloud、Nacos、Gateway和Knife4j等技术实现的Swagger聚合文档工具。它利用这些技术的优势,帮助开发者更好地管理和维护微服务,并提供了友好的界面来查看和测试接口文档。 ### 回答3: Cloud-Nacos-Gateway-Knife4j 是一个使用 Spring Cloud 和 Nacos 技术实现的聚合文档,其中集成了 Swagger。它可以帮助开发者更便捷地查看和管理项目的 API 文档。 Spring Cloud 是一个开发微服务架构的框架,提供了许多功能,例如服务注册与发现、配置管理、负载均衡等。Nacos 是一个用于服务注册与发现、动态配置管理的平台,可以实现服务的自动发现和配置更新。这两个技术结合起来,可以方便地构建和管理微服务架构。 Cloud-Nacos-Gateway-Knife4j 中的 Gateway 是一个 API 网关,它可以承担路由和负载均衡的作用,将外部请求转发给后端的微服务。Knife4j 是一个为 Swagger 提供增强功能的工具,可以生成美观的 API 文档,并提供了在线测试接口的功能。 在使用 Cloud-Nacos-Gateway-Knife4j 架构时,我们可以通过 Nacos 注册中心管理和发现微服务,以及实现动态的配置更新。Gateway 作为入口,将外部请求转发到相应的微服务。同时,我们可以使用 Knife4j 生成并展示微服务的 API 文档,便于开发者查看和调试接口。 总之,Cloud-Nacos-Gateway-Knife4j 提供了一种基于 Spring Cloud 和 Nacos 的微服务架构解决方案,提供了服务注册发现、配置管理、API 文档和在线测试等功能,为开发者带来了更加便捷和高效的开发体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值