微服务新网关Gateway
新建Gateway模块
pom.xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>io.github.resilience4j</groupId>
<artifactId>resilience4j-spring-boot2</artifactId>
<version>0.13.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
特点:
1.Gateway依赖WebFlux,WebFlux和SpringWeb MVC 的包冲突,所以不能引入spring-boot-starter-web,只能打jar包运行。
2.Gateway只能支持Netty容器,所以不能引入tomcat或者Jetty。
使用配置文件配置路由
application.yml
# 配置启动端口
server:
port: 3001
management:
endpoints:
web:
# 暴露端点
exposure:
# 配置暴露的端点
include: gateway
# Spring应用(微服务)名称
spring:
application:
name: gateway
cloud:
gateway:
# 开始配置路径
routes:
# 路径匹配
- id: fund
# 转发URI
uri: http://localhost:7001
# 断言配置
predicates:
# Path断言
- Path=/r4j/**
或者使用java文件配置路由
GatewayConfig.java
package com.spring.cloud.gateway.config;
import org.springframework.cloud.gateway.route.RouteLocator;
import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class GatewayConfig {
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
return builder.routes() //开启路由配置
// 匹配路径
.route(f -> f.path("/user/**") // route方法逻辑是一个断言,后续会论述
// 转发到具体的URI
.uri("http://localhost:6001"))
// 创建
.build();
}
}
访问http://localhost:3001/r4j/user/9 或 http://localhost:3001/user/info/9 都可以访问到user模块
执行原理
关键组件
1.路由(route)由ID,目标URI,断言集合,过滤器组成,当断言判断为true时才会匹配到路由。
2.断言(predicate),用于判断请求头,Cookies或者请求类型,host,uri,参数名,远程地址,是否符合正则以及分配权重。。
3.过滤器(filter),内置了请求头,响应头,跳转,参数处理,响应状态,Hystrix熔断和限速器等21种。
上面路由到固定地址,我们可以基于服务发现路由。,
1.gateway模块注册到Eureka服务器。
2.按照约定,使用"lb://{service-id}"的格式发现服务。service-id 就是微服务名称。
application.yml的配置如下
# Spring应用(微服务)名称
spring:
application:
name: gateway
cloud:
gateway:
routes:
- id: user-service
# 客户端负载均衡路由
uri: lb://user
# 匹配路径
predicates:
- Path=/user/**
#请求URL指向Eureka服务治理中心
eureka:
client:
serviceUrl:
defaultZone : http://localhost:5001/eureka/,http://localhost:5002/eureka/