微服务-gateway基本使用

文章目录

一、前言

微服务架构已经成为现代软件开发的主流范式之一。它允许开发团队将复杂的应用程序拆分成小的、自治的服务单元,以便更容易进行开发、部署和维护。然而,随着微服务数量的增加,管理和维护这些服务变得越来越复杂。这时候,微服务网关就成了一个不可或缺的组件,用于提高可维护性、安全性和性能。

二、gateway网关

1、什么是微服务网关?

微服务网关是位于微服务架构和外部客户端之间的中间层。它充当了微服务体系结构的入口点,负责处理所有与客户端之间的通信。微服务网关有多个职责,包括路由请求、负载均衡、认证、授权、日志记录和安全性。它可以被看作是微服务架构的门卫,用于保护和管理微服务集群。

先看大家看一张图,展示一下我们的网关在我们项目中的位置,可以看到,网关处于我们整个项目中的核心位置,我们前端访问后端的所有请求都要通过gateway进行转发。

2、微服务架构下网关的重要性

2.1、没有网关

如果没有网关,在微服务的架构下,我们前端访问后端的所有微服务要通过不同的端口或者ip,以下图示为user、product、shop、order四个微服务部署在了一台虚拟机上,分别占用了不同的端口,如果前端要想访问后端所有的微服务的话,需要通过四个不同的端口进行访问。

2.2、有网关

如果我们使用了网关,同样是四个微服务,我们只需要通过访问gateway就可以访问所有的微服务了,这下是不是一下子就清楚了gateway在微服务架构下的重要性了。

3、gateway的功能

Spring Cloud Gateway 是一个用于构建微服务架构的反向代理和路由工具。

  • 路由(Routing):Spring Cloud Gateway 允许您定义路由规则,将传入的请求映射到不同的微服务实例上。路由规则通常基于请求的 URL 路径、请求头、HTTP 方法等条件进行定义。这使得您可以根据不同的请求,将它们定向到不同的后端微服务,实现动态的请求路由。

  • 请求过滤(Request Filtering):Gateway 提供了请求过滤器,允许您在请求到达后端微服务之前修改请求或执行特定操作。您可以使用这些过滤器来添加请求头、修改请求体、进行认证、请求限流、响应转换等。

  • 负载均衡(Load Balancing):Spring Cloud Gateway 集成了负载均衡功能,可以分发请求到多个后端微服务实例,以确保高可用性和性能。它支持多种负载均衡算法,如轮询、权重等,您可以根据需要进行配置。

  • 断路器(Circuit Breaker):Gateway 具有断路器模式,用于处理后端微服务的故障。当后端微服务不可用时,Gateway 可以快速切换到备用服务或返回友好的错误响应,而不是长时间等待超时。

  • 动态路由(Dynamic Routing):Gateway 支持动态路由,这意味着您可以在运行时添加、修改或删除路由规则,而不需要重新启动服务。这使得应对流量变化更加灵活。

  • 请求重试(Request Retry):Gateway 允许您配置请求重试机制,以应对后端微服务的瞬时故障。您可以定义重试的次数、间隔和条件,确保请求最终成功。

  • 限流(Rate Limiting):通过使用限流过滤器,Gateway 可以限制每个客户端或每个 IP 地址的请求速率。这有助于保护后端微服务免受过多的请求压力。

  • 集成安全性(Integration with Security):Gateway 可以与认证和授权系统集成,以确保只有授权的用户可以访问受保护的微服务。您可以使用 Spring Security 或其他安全框架来实现此功能。

  • 日志记录(Logging):Gateway 具有强大的请求和响应日志记录功能,这对于故障排除和监控非常有用。您可以配置日志级别和输出格式,以满足您的需求。

  • 监控和度量(Monitoring and Metrics):Gateway 可以集成监控和度量系统,例如 Spring Cloud Sleuth 和 Micrometer,以便实时监控流量和性能,并进行分析。

  • WebSocket 支持:Gateway 支持 WebSocket 协议,允许您处理实时的双向通信。

  • 自定义路由规则(Custom Routing Rules):Gateway 提供了丰富的扩展机制,允许您编写自定义的路由规则和过滤器,以满足特定需求。

4、gateway实战

4.1、依赖配置

引入相关依赖:SpringBoot、SpringCloud、SpringCloud gateway

先来看一下我的项目结构:

这里我们在父pom中引入SpringBoot和Spring Cloud的相关依赖

xml 复制代码
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.12.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<!--版本管理-->
<properties>
    <java.version>11</java.version>
    <spring-cloud.version>Hoxton.SR12</spring-cloud.version>
    <spring-cloud-alibaba.version>2.2.8.RELEASE</spring-cloud-alibaba.version>
</properties>

<!--依赖管理-->
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

子pom中引入gateway的相关依赖,注意:gateway中不要引入springboot的web模块,因为gateway使用的web服务器是netty不是tomcat,而springboot的web模块中默认配置的web服务器就是tomcat

xml 复制代码
<!--gateway相关依赖-->
<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>
<!--nacos配置管理-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

4.2、添加网关配置

yml 复制代码
server:
  port: 9081
  servlet:
    context-path: /gateway-demo
spring:
  application:
    name: gateway-demo
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        namespace: wangmengjie
    gateway:
      globalcors:
        cors-configurations:
          '[/**]':
            allowedOrigins: "*"
            allowedHeaders: "*"
            allowedMethods: "*"
      default-filters:
        - DedupeResponseHeader=Vary Access-Control-Allow-Origin Access-Control-Allow-Credentials, RETAIN_FIRST
      discovery:
        locator:
          enable: true #让gateway可以发现nacos中的微服务
      routes: #路由,数组[这里可以放置多个路由]
        #评分管理模块网关路由配置
        - id: user-router #当前路由标识-要求唯一,默认是UUID;
          uri: lb://user-demo #请求最终要被转发的地址;
          order: 1 #路由的优先级------数字越小,代表路由的优先级越高
          predicates: #断言:(条件判断------转发请求要满足的条件)
            - Path=/user-service/** #当请求路径满族path指定的规则时,此路由信息才会正常转发;
          filters: #过滤器,是在请求传递过程中对请求做一些手脚;
            - StripPrefix=1 #在请求转发之前去掉一层路径

4.3、添加网关启动类

java 复制代码
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient//开启nacos服务注册
public class GatewayApplication {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class,args);
    }
}

4.4、查看项目是否启动成功

项目启动成功

nacos服务注册成功

4.5、验证路由配置是否正确

通过网关的配置文件我们可以得知,user模块配置的断言为user-service/**,表明当我们访问localhost:9081/user-service/**的时候,请求就会发到我们的网关上面,然后gateway通过uri的配置,user-demo为user模块在nacos上注册的服务名称,

user模块原有的接口地址:http://localhost:9000/user/getAllUser

访问网关的接口地址:http://localhost:9081/user-service/user/getAllUser

在网关的配置文件中filters的配置在进行请求转发之前会去掉第一层路径,也就是通过user-demo获取的user模块服务信息为:localhost:9000,再加上请求转发的路径,所以最终的请求为:localhost:9000/user/getAllUser;

三、总结

对于项目后台的微服务系统, 每一个微服务都不会直接暴露给用户来调用的, 如果用户知道了某一个服务的 ip:端口号:url:访问参数, 就能直接访问你,甚至是恶意访问等,因此需要一个网关作为微服务的统一入口。此篇文章先介绍网关的一些基本集成+使用,对于网关还有许多知识,跨域、过滤器、自定义过滤器、全局过滤器等,之后逐一为大家介绍。

如果本篇博客对您有一定的帮助,大家记得留言+点赞+收藏哦。

相关推荐
丁总学Java13 分钟前
ARM 架构(Advanced RISC Machine)精简指令集计算机(Reduced Instruction Set Computer)
arm开发·架构
运维&陈同学1 小时前
【zookeeper03】消息队列与微服务之zookeeper集群部署
linux·微服务·zookeeper·云原生·消息队列·云计算·java-zookeeper
吴半杯2 小时前
gateway漏洞(CVE-2022-22947)
docker·kubernetes·gateway
ZOMI酱2 小时前
【AI系统】GPU 架构与 CUDA 关系
人工智能·架构
猿java3 小时前
什么是 Hystrix?它的工作原理是什么?
java·微服务·面试
wenyue11217 小时前
Revolutionize Your Kubernetes Experience with Easegress: Kubernetes Gateway API
容器·kubernetes·gateway
木子_lishk8 小时前
gateway 支持同时使用 https 和 http访问
https·gateway
一元咖啡8 小时前
SpringCloud Gateway转发请求到同一个服务的不同端口
spring·spring cloud·gateway