微服务项目中的网关

「这是我参与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 应用
  • 引入依赖
1
2
3
4
5
6
7
8
xml复制代码<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>
  • 编写配置信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
yml复制代码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

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%