本文已参与[新人创作礼]活动,一起开启掘金创作之路。
微服务网关
服务网关 = 路由转发 + 过滤器
- 路由转发:接收一切外界请求,转发到后端的微服务上去;
- 过滤器:在服务网关中可以完成一系列的横切功能,例如权限校验、限流以及监控等,这些都可以通过过滤器完成(其实路由转发也是通过过滤器实现的)。
所有的微服务api接口入口都是从网关实现转发。 微服务网关解决问题: 3. 解决统一微服务登录认证问题 减少代码冗余性 4. 解决跨域的问题 5. 保护服务 限流 黑名单和白名单控制 6. 权限控制 7. 统一日志处理
过滤器与网关之间的区别
过滤器适合于单个服务请求过滤 网关适合于过滤整个微服务请求 过滤器属于局部过滤 网关属于全局过滤 总结:网关能解决微服务代码冗余的问题。
Zuul与Gateway有哪些区别
Zuul网关属于netfix公司开源的产品,属于第一代微服务网关 Gateway属于SpringCloud自研发的网关框架,属于第二代微服务网关相比来说SpringCloudGateway性能比Zuul性能要好。
注意:Zuul网关底层基于Servlet实现的,紫色是的Api,不支持长连接。 SpringCloudGateway基于Spring5构建,能够实现响应式非阻塞的Api,支持长连接,能够更好的整合Spring体系的产品,依赖SpringBoot-WebFlux。
| 组件名称 | 所属公司 | 组件简介 |
|---|---|---|
| Zuul | Netflix | 停更进维 基于servlet实现 |
| Zuul2 | Netflix | 正在从新开发 |
| gateway | SpringCloud | SpringCloud自己研发的一套非阻塞的网络异步网关 基于WebFlux实现 |
Nginx与Gateway底层实现网关有哪些区别:
- Nginx底层基于C语言实现:
- Gateway底层基于java语言编写:
在微服务架构中:验证token会话信息 nginx 是验证token信息 ?Token=lesd nginx+lua语言实现 对于我们java语言开发者来说,需要去学lua语言,学习成本非常高: Gateway底层基于我们java语言编写的,对于我们java开发者来说能够更好快速上手解决我们在微服务网关遇到的难题。
导入Gateway依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
gateway 底层基于 webflux实现 springboot-web 底层 springmvc servlet类 加了gateway依赖后,不用加web依赖
application配置
server:
port: 81
####服务网关名称
spring:
application:
name: mayikt-gateway
cloud:
gateway:
discovery:
locator:
####开启以服务id去注册中心上获取转发地址
enabled: true
###路由策略
routes:
###路由id
- id: mayikt
####转发http://www.mayikt.com/
uri: http://www.mayikt.com/
###匹配规则
predicates:
- Path=/mayikt/**
#### 可以忽略跳过一级
filters:
- StripPrefix=1
网关的集群
使用Ivs统一管理nginx的集群:
使用nginx统一管理网关的集群:
nginx:
配置文件nginx.conf
先配置集群地址列表
监听端口号:80
server_name:拦截 gw.mayikt.com
通过负载均衡轮询的方式跳到 mayiktgwadds里面的地址
再到etc下面找到hosts文件 编辑后面加上
测试:
验证请求参数是否有带上token
token为空:
带着token的
把过滤器放到gateway实现,能够减少代码的冗余性。