微服务项目中的网关

「这是我参与11月更文挑战的第28天,活动详情查看:2021最后一次更文挑战」。

前言

在微服务场景下,我们为什么要引入网关 ? 或者说微服务架构下,网关起到了什么作用 ?

面临的问题

微服务架构下我们项目的承载能力提升了,但是相对的维护多个服务协同工作,以及集群的管理也给我们带来了一些新的问题。

  • 客户端调用不同服务时需要知道每个服务的端口号,比如调用 A 服务 http://127.0.0.1:8000/addproduct ,调用 B 服务时 http://127.0.0.1:8001/adduser, 每个服务端口号都不同,这就使我们的前端代码不好维护。
  • 当同一个服务部署了多个节点,前端代码指定了特定端口后,将无法实现负载均衡
  • 客户端与服务端通过具体端口访问,这种强耦合性导致后期我们对某个现有服务进行拆分,必须通知客户端,前端对应的代码也得做出更改。
  • 服务间的通信,客户端调用 A 服务需要认证 调用 B 服务又需要认证 重复开发认证授权相关代码。
  • 对外暴露信息过多,系统安全性降低

微服务网关

基于上述所面临的问题,我们可以引入微服务网关,网关的作用就是对外暴露一个统一端口,来维护后端各个服务的路由信息,对应用户而言,所有的请求都直接发向网关,然后网关处理,路由到对应的服务上,这个时候我们可以做负载均衡,统一授权拦截处理,等等。

Spring Cloud Gateway

Spring Cloud Gateway:

Spring Cloud GatewaySpring Clould 第二代网关,第一代 Netflix zuul已经停止维护了。
基于 Netty(NewlO)Reactor (响应式编程)及 WebFlux (新的 WebMVC 框架)构建

Spring Cloud Gateway 的优点:

  • 性能强劲,执行效率是传统基于 Servlet 同步通信 Zuul 效率的 1.6
  • 功能强大,与 Spring Cloud 体系天然整合,不存在兼容问题,内置转发/限流/监控
  • 设计优雅,使用简单,易于扩展

Spring Cloud Gateway的缺点:

  • 基于 NIO,非 J2EE 体系,学习源码是由一定门槛
  • 不兼容 Servlet,应用不兼容 Tomcat,无法打 War
  • 只支持 Spring Boot 2.x 版本,对于不熟悉 SpringBoot 的小伙伴有学习门槛

Spring Cloud Gateway 快速整合

  • 创建一个基础的 SpringBoot 应用
  • 引入依赖
<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-gateway</artifactId>
</dependency>
复制代码
  • 编写配置信息
spring:
  application:
    name: gateway
  cloud:
    # 让gateway通过nacos实现自动路由转发
    gateway:
      discovery:
        locator:
          enabled: true
    nacos:
      discovery:
        server-addr: localhost:8848
        username: nacos
        password: nacos
server:
  port: 9001
复制代码
  • 启动项目

查看 nacos 中已经注册了我们的网关服务,接下来我们就可以通过网关访问之前已经注册好的两个测试服务了。

image.png

  • 访问测试服务

erp 服务 9002
system 服务 9000

image.png

  • 成功响应

image.png

猜你喜欢

转载自juejin.im/post/7036261969342496781