0. 什么是网关
定义
- 网关统一服务入口,可方便实现对平台众多服务接口进行管控,对访问服务的身份认证、防报文重放与防数据篡改、功能调用的业务鉴权、响应数据的脱敏(敏:敏感数据)、流量与并发控制,甚至基于API调用的计量或者计费等等。
- 网关 = 路由转发 + 过滤器
为什么需要网关
简短回答:
- 网关可以实现服务的统一管理
- 网关可以解决微服务中通用代码的冗余问题(如权限控制,流量监控,限流等)
- 类似公司的保安;防火墙
网关vs服务注册中心
简单理解:网关是对外;服务注册中心对内。所以各自的负载均衡的客户端也是不同的。
深入探讨:
首先要理解网关并不是必须的组件,只是一种设计模式或者设计理念
客户端直接和后端服务交互的方式会有什么问题呢?
1、客户端需要知道每个服务的地址(如果有网关,分布式部署的话这样可以统一api的ip地址,再由网关去分发,可以通过注册中心获取你需要的服务节点列表,然后给你分配你调用那个节点去调用)
2、每个后端服务都需要实现认证、限流、日志、监控、缓存等功能,重复造轮子大大降低了开发效率,而这些公共业务逻辑完全可以拆分出来。而且会造成的代码复杂度和维护难度上升。
3、假如后端某些服务由之前的http/https调用变成rpc调用,或者某些参数发生改变,则客户端需要做很大调整。
————————————————
版权声明:本文为CSDN博主「人工智」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35789269/article/details/107737607
引入网关可以怎么解决这些问题呢?
1、网关作为边界,分割了内部应用和外部调用。
不同于外部API一般使用HTTP或REST,内部微服务可以从不使用通讯协议中收获益处。这些协议可以是ProtoBuf或AMQP,甚至是诸如SOAP,JSON-RPC或者XML-RPC这样的系统集成协议。API网关可以对这些协议提供统一的外部REST接口,这就允许开发团队挑选一款最适合于内部架构的协议。
2、网关实现了安全层,降低了各子微服务的复杂度
API网关通过提供额外的安全层帮助阻止大规模攻击。这些攻击包括SQL注入,XML解析漏洞和DoS攻击。
微服务中有一些常见的要点,诸如使用API令牌进行授权,访问控制和调用频次限制。这个点都需要每个服务增加额外的时间去实现它们。API网关将这些要点从你的代码中提取出来,允许你的服务只关注于它们需要关注的任务。同时可以作为统一收集微服务日志的地方,方便了问题的定位。
3、微服务方便了服务的管理,提供了外部请求的统一入口,实现了路由转发,同时降低了对外暴露的服务
如果一个业务功能,调用了n个外部微服务,那管理和维护起来简直是噩梦;使用网关,微服务基于统一的域名和上下文去访问,管理起来更加方便。同时网关还可以实现路由转发和负载均衡的功能,但是并不是最佳的选择,因为有其它开源组件比它更nb,那就是nginx。
————————————————
版权声明:本文为CSDN博主「人工智」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35789269/article/details/107737607
有了网关为什么还需要nginx或者ribbon作负载均衡?
可以理解为基于性能问题
有了网关为什么还要需要有服务注册和发现?
让我们来看看一个同时有网关和服务发现注册中心的请求路径是怎样的?
一个请求过来了,根据网关根据路由规则分析出是请求的哪个服务,然后跟注册中心说:这个XX服务有没有?没有?那404!有?服务下有几个实例,都告诉我,我自己找一个或者你告诉我一个能用的。然后把请求往某个服务的某个实例上发送,得到返回值后丢给客户端。 这样就不会出现,某个服务一直被调而一直在等待响应最终造成服务器挂掉的风险。网关保障的是微服务之间的安全和解耦,注册中心是保障微服务的高可用和可靠。但是网关的配置最好更高一点,不然也是一种风险。或者在网关前面挂一个nginx代理,多几套网关实例也行。
————————————————
版权声明:本文为CSDN博主「人工智」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_35789269/article/details/107737607
架构图
![5stU6S](https://cdn.jsdelivr.net/gh/zewei94yomi/ImageLoader@master/uPic/5stU6S.jpg)
Gateway
https://spring.io/projects/spring-cloud-gateway
“This project provides a library for building an API Gateway on top of Spring MVC. Spring Cloud Gateway aims to provide a simple, yet effective way to route to APIs and provide cross cutting concerns to them such as: security, monitoring/metrics, and resiliency.”
这个项目提供了一个在springmvc之上构建API网关的库。springcloudgateway旨在提供一种简单而有效的方法来路由到api,并为api提供横切关注点,比如:安全性、监控/度量和弹性。
基于springboot2.x 和 spring webFlux 和 Reactor 构建响应式异步非阻塞IO模型
- 动态路由(router)
- 请求过滤(filter)
1. Gateway简单使用
a. 开发springboot独立应用
- 开发网关服务GatewayApplication
- 启动类别服务category
- 启动商品服务product
b. 引入网关依赖:
注意:网关中不能使用SpringMVC
的web模型,会有冲突
<dependencies>
<!--不要引入springboot的依赖-->
<!--consul-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>
<!--actuator-->
<dependency>