Spring Cloud Gateway是Spring Cloud体系的第二代网关组件,基于Spring 5.0的新特性WebFlux进行开发,底层网络通信框架使用的是Netty,所以其吞吐量高、性能强劲,未来将会取代第一代的网关组件Zuul。Spring Cloud Gateway可以通过服务发现组件自动转发请求,默认集成了Ribbon做负载均衡,以及默认使用Hystrix对网关进行保护,当然也可以选择其他的容错组件,例如Sentinel
优点:
缺点:
需要4步:
这个没什么好说的了,新建一个普通的maven的model 即可
pom文件是基于父子工程来做的,微服务一般都是基于父子工程来做的。
在pom文件中添加 gateway 的依赖
注意: 不要在pom中添加 spring-boot-starter-web 的依赖。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-gatewayartifactId>
dependency>
版本号已经在父项目中规定了:参见:https://blog.csdn.net/weixin_43852058/article/details/110670923
在yml文件中配置 gateway 的 路由规则,可以路由到哪些地址等信息
spring:
cloud:
gateway:
routes:
- id: shop-product # 路由的唯一标识
uri: http://localhost:8081 # 如果断言成功,将要转发去的地址
order: 0 # 优先级,越小优先级越高
predicates: # 断言,满足所有断言,才会进行转发
- Path=/product/** # 注意:这是使用= 不是:
- id: shop-order
uri: http://localhost:8091
order: 0
predicates:
- Path=/order/**
server:
# 指定服务器的端口号
port: 9000
maven项目没有springboot的启动类,需要自己新建,新建的时候注意以下,至少先建立两层包目录,防止出现一些意料之外的问题,养成习惯。
@SpringBootApplication
public class GatewayApp {
public static void main(String[] args) {
SpringApplication.run(GatewayApp.class, args);
}
}
做完上边几步就已经配置完成了,下边在浏览器中输入网关的地址,加上想要访问的服务的路径,就可以访问到想要访问的资源了。
这里应该已经可以感受到网关的作用了,网关就是帮你找到你想要的资源。
在yml中直接写死绑定的uri当然是不好的方法,而且服务间的通信如果多了,使用gateway的时候你就需要记住非常多的地址,端口,使用不太方便,这时候可以配合注册中心一起使用
配合注册中心使用需要两步就可以搞定:
在pom中引入注册中心的依赖,这里以 eureka 为例,nacos同理
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
dependency>
在yml文件中修改配置,配置注册中心,在转发给远程服务的时候,地址需要进行改变。
# 配置 eureka 注册中心
eureka:
client:
register-with-eureka: false # 不在注册中心注册
fetch-registry: true # 需要从注册中心拉取服务
service-url: # 注册中心的地址
defaultZone: http://localhost:7001/eureka/
spring:
cloud:
gateway:
routes:
- id: shop-product # 路由的唯一标识
# 这里的地址需要使用 lb://服务名的方式进行转发
uri: lb://shop-product # 如果断言成功,将要转发去的地址
order: 0 # 优先级,越小优先级越高
predicates: # 断言,满足所有断言,才会进行转发
- Path=/product/** # 注意:这是使用= 不是:
- id: shop-order
uri: lb://shop-order
order: 0
predicates:
- Path=/order/**
application:
name: shop-gateway
注意: 在配置gateway的时候,uri的地址需要使用 lb://服务名
的方式进行配置。
lb
是 LoadBalance 的意思,也就是负载均衡的意思。
使用网关模式的话,网关是带有负载均衡的(Eureka 和 nacos 集成了Ribbon)
在浏览器中输入 http://网关ip:网关端口/资源路径
进行测试,如果显示出目标资源,就是配置成功
有人说,微服务多的话,我这yml里边岂不是要配置很多东西,有点烦人啊,gateway还提供一种简化版的配置,可以在yml中不配置route。但是在访问的时候,对url路径有一定的要求。
具体是什么要求,到后边再说,先看配置吧
在yml中开启自动定位
spring:
application:
name: shop-gateway
cloud:
gateway:
discovery:
# 定位器
locator:
enabled: true
在浏览器中输入:http://网关ip:网关端口/服务名/资源(接口)路径
进行访问
注意: 使用这种方式的时候,请求路径一定要遵循这个规则: http://网关ip:网关端口/服务名/资源(接口)路径
再次注意: 使用Eureka 做完注册中心的时候,注册的服务名称会默认转换为 全大写
,使用的时候一定要注意。