「这是我参与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 Gateway
是Spring 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 | xml复制代码<dependency> |
- 编写配置信息
1 | yml复制代码spring: |
- 启动项目
查看
nacos
中已经注册了我们的网关服务,接下来我们就可以通过网关访问之前已经注册好的两个测试服务了。
- 访问测试服务
erp
服务9002
system
服务9000
- 成功响应
本文转载自: 掘金