子项目结构图
导入Gateway所需要的jar包
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
注意:网关服务器是不需要”spring-boot-starter-web“包的
编写Application.yaml配置文件
#端口
server:
port: 7783
#服务名
spring:
application:
name: gateway-server
# 注册到Nacos
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 网关配置
gateway:
discovery:
locator:
enabled: false
# 路由配置
routes:
- id: consumer
# 服务提供者的地址
uri: lb://user-consumer
predicates:
# Path:只要访问包含/api/nacos/,会转换到 user-consumer 服务中
# Between:在 bagin 到 end 时间内访问才可通过
# SumTest自定义断言
- Path=/api/nacos/**
- Between=2022-02-28T19:00:00.786182+08:00[Asia/Shanghai],2022-02-28T21:00:00.786182+08:00[Asia/Shanghai]
- SumTest=3,1
filters:
# StripPrefix:过滤第一个节点文件“api”
- StripPrefix=1
- id: consumer2
uri: lb://user-consumer2
predicates:
- Path=/api/nacos2/**
- Between=2022-02-28T19:00:00.786182+08:00[Asia/Shanghai],2022-02-28T21:00:00.786182+08:00[Asia/Shanghai]
- SumTest=3,1
filters:
- StripPrefix=1
....
-
网关参数解析:
gateway.discovery.locator.enabled = true: 可以通过服务名访问 http://127.0.0.1:7783/user-consumer/nacos/getUser/1建议不开启,避免服务名泄露 -
路由参数解析:
routes.id: 见名起意(随意)
routes.uri: 服务器地址 (http://localhost:24101/,lb://user-consumer) 使用服务名就需要配置负载均衡 lb
断言
- routes.predicates: 断言参数解析
(断言就是条件判断)看你满足哪一个条件给你路由到相对应的微服务
- 内置断言
路由
命名规则:BetweenRoutePredicateFactory
Between:断言名字
RoutePredicateFactory:固定写法
- 自定义断言
需要继承AbstractRoutePredicateFactory类
编写自定义类:
@Component
public class SumTestRoutePredicateFactory extends AbstractRoutePredicateFactory<SumTestRoutePredicateFactory.Config> {
public static final String MAX_KEYS = "max";
public static final String MIN_KEYS = "min";
public SumTestRoutePredicateFactory() {
super(Config.class);
}
@Override
public List<String> shortcutFieldOrder() {
return Arrays.asList(MAX_KEYS, MIN_KEYS);
}
@Override
public Predicate<ServerWebExchange> apply(Config config) {
return new GatewayPredicate() {
@Override
public boolean test(ServerWebExchange serverWebExchange) {
String sum = serverWebExchange.getRequest().getQueryParams().getFirst("sum");
System.out.println(config.max);
System.out.println(config.min);
System.out.println(Integer.parseInt(sum));
if(config.max >= Integer.parseInt(sum) && config.min <= Integer.parseInt(sum)){
return true;
}
return false;
}
@Override
public String toString() {
return String.format("Between: %s and %s", config.max,config.min);
}
};
}
@Validated
public static class Config {
@NotNull
private Integer max;
private Integer min;
public Integer getMax() {
return max;
}
public void setMax(Integer max) {
this.max = max;
}
public Integer getMin() {
return min;
}
public void setMin(Integer min) {
this.min = min;
}
}
}
过滤器
- routes.filters: 过滤器参数解析
(过滤器就是过滤某些值)在给你路由到相对应的微服务之前对某些值进行操作,我这里使用了StripPrefix,过滤第一个路径文件”api“,真正调用的地址是不包含api的
命名规则:StripPrefixGatewayFilterFactory****StripPrefix:过滤器名字GatewayFilterFactory:固定写法
编写Application.yaml配置文件
@SpringBootApplication
public class GatewayApplication7783 {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication7783.class,args);
}
}
运行网关成功注册
访问网关路径:http:127.0.0.1:网关端口/api/user/getUser/1?sum=1
sum=1满足我自定义断言的条件添加的