网关
目前我们把一个单体项目拆分成了多个功能各异的服务,并且每个服务的端口都不一样,那么前端怎么知道该访问哪一个端口呢?如果某个服务需要用户信息,那也要在这个服务里写登录和令牌校验吗?显然是不合理的
解决方法就是------网关
网关:就是网络的关口,负责请求的路由、转发、身份校验
前端请求不能直接访问微服务,而是要请求网关:
- 网关可以做安全控制,也就是登录身份校验,校验通过才放行
- 通过认证后,网关再根据请求判断应该访问哪个微服务,将请求转发过去
工作原理概述:前端发起请求,网关根据请求的路径判断是哪一个服务,然后从注册中心调用这个服务对应的某个实例
因此,网关其实也算是服务消费者
网关路由
快速入门
一共四步:
- 创建新模块
- 引入网关依赖
- 编写启动类
- 配置路由规则
创建新模块
创建一个名字和gateway相关的模块就行
引入网关依赖
XML
<dependencies>
<!--网关-->
<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>
<!--负载均衡-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
这些是必要的,但是可能不全,具体看自己的项目
编写启动类
java
@SpringBootApplication
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
配置路由规则
bash
server:
port: 8080 # 前端访问端口号
spring:
application:
name: gateway # 微服务名称
cloud:
nacos:
server-addr: 192.168.100.128:8848 # 注册中心地址和端口
gateway:
routes:
- id: item-service # 路由规则id,自定义,唯一
uri: lb://item-service # 路由的目标服务,lb代表负载均衡,会从注册中心拉取服务列表
predicates: # 路由断言,判断当前请求是否符合当前规则,符合则路由到目标服务
- Path=/items/**,/search/** # 这里是以请求路径作为判断规则
- id: user-service
uri: lb://user-service
predicates:
- Path=/users/**,/addresses/**
- id: cart-service
uri: lb://cart-service
predicates:
- Path=/carts/**
- id: trade-service
uri: lb://trade-service
predicates:
- Path=/orders/**
路由属性
网关路由对应的Java类型是RouteDefinition,其中常见的属性有:
- id:路由唯一标示
- uri:路由目标地址
- predicates:路由断言,判断请求是否符合当前路由
- filters:路由过滤器,对请求或响应做特殊处理