一、介绍
(1)网关服务
(2)功能:断言、路由、过滤
(3)能避免用户直接访问到业务主机
二、项目搭建
a、编写pom.xml(注意移除web框架,gateway中自带有)
java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>demo20220821</artifactId>
<groupId>com.wsh.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-gateway-gateway9527</artifactId>
<dependencies>
<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>com.wsh.springcloud</groupId>
<artifactId>cloud-api-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
b、编写application.yml
java
server:
port: 9527
spring:
application:
name: cloud-gateway-service
eureka:
client:
# 客户端设置为true
register-with-eureka: true
# 客户端设置为true
fetch-registry: true
service-url:
# defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka1.com:7001/eureka, http://eureka2.com:7002/eureka
instance:
instance-id: gateway9527
prefer-ip-address: true
c、编写启动类
java
package com.wsh.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* @ClassName PaymentMain8002
* @Description: TODO
* @Author wshaha
* @Date 2022/8/23
* @Version V1.0
**/
@EnableEurekaClient
@SpringBootApplication
public class GatewayMain8002 {
public static void main(String[] args) {
SpringApplication.run(GatewayMain8002.class, args);
}
}
d、application.yml增加路由配置
java
server:
port: 9527
spring:
application:
name: cloud-gateway-service
cloud:
gateway:
routes:
- id: r1
uri: http://localhost:8001
predicates:
- Path=/payment/test/**
eureka:
client:
# 客户端设置为true
register-with-eureka: true
# 客户端设置为true
fetch-registry: true
service-url:
# defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka1.com:7001/eureka, http://eureka2.com:7002/eureka
instance:
instance-id: gateway9527
prefer-ip-address: true
e、运行
(4)路由开启支持负载均衡
java
server:
port: 9527
spring:
application:
name: cloud-gateway-service
cloud:
gateway:
discovery:
locator:
enabled: true #开启使用微服务名路由
routes:
- id: r1
uri: lb://CLOUD-PAYMENT-SERVICE
predicates:
- Path=/payment/test/**
eureka:
client:
# 客户端设置为true
register-with-eureka: true
# 客户端设置为true
fetch-registry: true
service-url:
# defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka1.com:7001/eureka, http://eureka2.com:7002/eureka
instance:
instance-id: gateway9527
prefer-ip-address: true
三、断言配置
四、过滤
(1)
(2)自定义
java
package com.wsh.springcloud.config;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/**
* @ClassName FiltersConfig
* @Description: TODO
* @Author wshaha
* @Date 2023/10/14
* @Version V1.0
**/
@Component
public class FiltersConfig implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
MultiValueMap<String, String> queryParams = exchange.getRequest().getQueryParams();
queryParams.entrySet().stream()
.forEach(item -> {
System.out.println(item.getKey() + "-" + item.getValue());
});
return exchange.getResponse().setComplete();//结束
// return chain.filter(exchange); //进入下一个过滤器
}
@Override
public int getOrder() {
return 0;
}
}