SpringCloudGateway--服务网关
微服务中网关的作用
- 统一入口:为全部微服务提供一个唯一的入口,网关起到外部和内部隔离的作用,保障了后台服务的安全性
- 鉴权校验:识别每个请求的权限,拒绝不符合要求的请求
- 动态路由:动态的将请求路由到不同的后端集群中
- 减少客户端与服务端的耦合:服务可以独立发展,通过网关层来做映射
例如本项目中:
gateway 网关的动态路由(通过注册中心获取路由服务实例)
往往在微服务环境中,一个服务可能是要有多个实例的,这时就要有一种动态的路由机制,实现一种类似于 ribbon 的负载均衡机制,让其路由到某个服务的不同实例上
动态配置路由是通过服务注册名来实现的,路由的配置不再是配置固定的访问端口,可以动态来实现。默认情况下 gateway 会根据注册中心注册的服务列表,以注册中心上服务名为路由创建动态路由进行转发,从而实现动态路由的功能
创建网关模块
服务网关依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
nacos和gateway pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.1.3</version>
<exclusions>
<exclusion>
<artifactId>spring-cloud-commons</artifactId>
<groupId>org.springframework.cloud</groupId>
</exclusion>
<exclusion>
<artifactId>spring-cloud-context</artifactId>
<groupId>org.springframework.cloud</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2021.0.1.0</version>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2021.0.1.0</version>
</dependency>
<!--替代ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.1.3</version>
<exclusions>
<exclusion>
<artifactId>spring-cloud-commons</artifactId>
<groupId>org.springframework.cloud</groupId>
</exclusion>
<exclusion>
<artifactId>spring-cloud-context</artifactId>
<groupId>org.springframework.cloud</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>3.1.3</version>
</dependency>
bootstap.yml
spring:
application:
name: cloud-gateway
cloud:
nacos:
config:
server-addr: 172.31.184.217:8848
file-extension: yml
namespace: 3b5f2ab6-ff67-4497-9233-ae4eb8ea7a89
group: SEATA_GROUP
在nacos中建立网关的路由配置
server:
port: 8084
servlet:
context-path: /
Spring:
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: 172.31.184.217:8848/
config:
# 配置中心地址
server-addr: 172.31.184.217:8848
# 配置文件格式
file-extension: yml
#网关
gateway:
#网关服务注册进eureka,开启根据serviceId创建路由的功能
discovery:
locator:
enabled: true
routes:
- id: product-service
uri: lb://product-service
predicates:
- Path=/product/**
- id: account-service
uri: lb://account-service
predicates:
- Path=/account/**
#我们自定义的路由ID,保持唯一
- id: order-service
#目标,要路由的服务地址
uri: lb://order-service
#路由条件
predicates:
- Path=/order/**
配置详解:
- id: 在所有路由定义中需要唯一,不能重复
- uri: lb://** lb://为固定写法,表示开启负载均衡; ** 即服务在Nacos中注册的名字
- predicates:- Path=/product/** 使用"Path Route Predicate
Factory",规则为/product/** 的请求都还转发至微服务product-service中
上面的配置逻辑为:
① 以http://localhost:8084/product/** 的访问路径会转发到product-service微服务的/**
② 以http://localhost:8084/account/** 的访问路径会转发到account-service微服务的/**
③ 以http://localhost:8084/order/** 的访问路径会转发到order-service微服务的/**
启动所有服务,确认是否转发
order-service的一个接口
直接调用order-service
从网关调用