Spring cloud GateWay入门
Spring cloud GateWay
微服务为什么需要API网关?
- 在微服务架构中,通常一个系统会拆分为多个微服务,面对这么多微服务客户端应该如何去调用
- 如果根据每个微服务的地址发起调用,存在如下问题:
- 客户端多次请求不同的微服务,会增加客户端代码和配置的复杂性,维护成本比价高
- 认证复杂,每个微服务可能存在不同的认证方式,客户端去调用,要去适配不同的认证
- 存在跨域的请求,调用链有一定的相对复杂性(防火墙 / 浏览器不友好的协议)
- 难以重构,随着项目的迭代,可能需要重新划分微服务
- 为了解决上面的问题,微服务引入了API网关的概念API网关为微服务架构的系统提供简单、有效且统一的API路由管理,作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公用逻辑,主要功能包含认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。
Spring Cloud GateWay是什么?
- 官方文档:https://docs.spring.io/spring-cloud-gateway/reference/。
- Spring Cloud Gateway是Spring cloud官方推出的第二代网关框架,定位于取代Netflix Zuul。
- Spring Cloud Gateway旨在为微服务架构提供一种简单且有效的API路由的管理方式,并基于Filter的方式提供网关的基本功能,例如说案例认证、监控、限流等等。
- Spring Cloud Gateway是由WebFlux+Netty+Reactor实现的响应式的API网关。它不能在传统的servlet容器中工作,也不能构建成war包。
微服快速接入Spring Cloud GateWay
构建网关服务
-
创建一个新的module模块gateway
-
pom.xml中引入Spring Cloud Gateway网关依赖
<!-- gateway网关 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--nacos-discovery 注册中心依赖--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!-- loadbalancer 负载均衡器依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> </dependency>
微服务快速接入网关服务
- 以订单服务为例,在网关服务的application.yml
server: port: 18888 spring: application: name: tlmall-gateway cloud: nacos: discovery: server-addr: tlmall-nacos-server:8848 gateway: #设置路由:路由id、路由到微服务的uri、断言 routes: - id: order_route #路由ID,全局唯一,建议配置服务名 uri: lb://tlmall-order #lb 整合负载均衡器loadbalancer predicates: - Path=/order/** # 断言,路径相匹配的进行路由
2.库存服务,账户服务同上
3.网关服务的完整的application.yml配置如下:
server:
port: 18888
spring:
application:
name: tlmall-gateway
cloud:
nacos:
discovery:
server-addr: tlmall-nacos-server:8848
gateway:
#设置路由:路由id、路由到微服务的uri、断言
routes:
- id: order_route #路由ID,全局唯一,建议配置服务名
uri: lb://tlmall-order #lb 整合负载均衡器loadbalancer
predicates:
- Path=/order/** # 断言,路径相匹配的进行路由
- id: storage_route #路由ID,全局唯一,建议配置服务名
uri: lb://tlmall-storage #lb 整合负载均衡器loadbalancer
predicates:
- Path=/storage/** # 断言,路径相匹配的进行路由
- id: account_route #路由ID,全局唯一,建议配置服务名
uri: lb://tlmall-account #lb 整合负载均衡器loadbalancer
predicates:
- Path=/account/** # 断言,路径相匹配的进行路由
测试,启动网关服务
- postman中通过网关服务的18888端口下单,看能否成功
- 前端服务order.html中访问地址都替换为gateway:18888,测试下单是否成功