一、简介
GateWay:springcloud提供请求过滤转发、负载均衡,的组件。
如果Consumer是集群状态默认进行负载均衡。
可以对请求进行过滤。
二、依赖
1、父项目 pom.xml
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<java.version>1.8</java.version>
<!-- springboot的版本 -->
<spring-boot.version>2.3.2.RELEASE</spring-boot.version>
<!-- springcloud的版本 -->
<spring-cloud.version>Hoxton.SR9</spring-cloud.version>
<!-- alibaba推出springcloud的对应版本 -->
<spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
</properties>
<!-- 项目打包方式 -->
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<!-- spring boot依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- spring-cloud依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- alibaba推出的spring-cloud依赖的父依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2、GateWay网关项目 pom.xml文件
<dependencies>
<!-- springboot core -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- nacos客户端 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.6.RELEASE</version>
</dependency>
<!-- gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!-- 熔断组件依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
</dependencies>
三、配置文件
spring:
cloud:
gateway:
routes: #网关路由配置. 每一组路由包括: id(唯一标识), uri(转发目标服务器路径), predicates(断言,匹配方式), filters(过滤器)
- id: user-consumer
# uri: http://localhost:8180 #指定ip和端口转发
uri: lb://user-consumer #指定服务转发后面的是注册中心的名字
predicates:
- Path=/user/** #指定路径匹配方式
# - Path=/user/**,/token/**
- Method=POST #请求类型的匹配
# - After=2019-01-01T00:00:00+08:00[Asia/Shanghai] #匹配 2019年1月1日0点0分0秒之后的所有请求, -Before 为之前
# - Before=2019-01-01T00:00:00+08:00[Asia/Shanghai] #匹配 2019年1月1日0点0分0秒之前的所有请求, -Before 为之前
# - Between=2019-01-01T00:00:00+08:00[Asia/Shanghai], 2019-07-01T00:00:00+08:00[Asia/Shanghai] #时间范围之内
# - Cookie=userName,apple
# - Cookie=userName,\w+
# - Header=token, [\w-]+ #请求头匹配
# - Host=**.baidu.com #host域名匹配, www.baidu.com,md.baidu.com
# - RemoteAddr=192.168.1.1/24 #ip地址匹配
# - Query=smile #请求参数匹配 ,eg:localhost:8080?smile=x&id=2
filters:
- StripPrefix=1 #转发时, 将指定个数的路径去除
# - PrefixPath=/user #转发时添加指定的前缀
# - AddRequestHeader=user-name,apple #转发时, 在请求头中添加指定的参数
# - AddRequestParameter=color,red #转发时, 添加指定的请求参数
# - AddResponseHeader=x-response-id,1000 #转发时, 在响应头中添加指定的参数
- id: no2
uri:
predicates:
filters:
四、GateWay网关项目启动类
/**
* @Name 周稚林
* @Data 2022-05-17-16:09
**/
@SpringBootApplication
@EnableDiscoveryClient
// GateWay和熔断共用一个注解。所以需要添加该注解
@EnableCircuitBreaker
public class Gatewayapplication {
public static void main(String[] args) {
SpringApplication.run(Gatewayapplication.class,args);
}
}
五、通过网关项目访问Consumer
比如:上面配置文件写的路径这样就可以把我们的请求转发到对应的服务器上了。
http://localhost:8080/user-consumer/hello
http://localhost:8080/user-consumer/order
......
六、自定义全局过滤器
-
为过滤器类实现接口 GlobalFilter,Ordered
-
添加@Component注解
-
getOrder()方法的值越小越先执行
1、完整的内容
/**
* @Name 周稚林
* @Data 2022-05-24-16:15
**/
@Component
public class orderfilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
//执行目标业务
Mono<Void> filter = chain.filter(exchange);
//目标业务执行之后的操作
return filter;
}
@Override
public int getOrder() {
return 0;
}
}
2、直接返回json数据写法
/**
* @Name 周稚林
* @Data 2022-05-24-16:15
**/
@Component
public class orderfilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
//执行目标业务
//不想执行可以重定向走
try {
JSONObject message = new JSONObject();
message.put("status",-1);
message.put("data","鉴定失败");
byte[] bits = message.toJSONString().getBytes(StandardCharsets.UTF_8);
DataBuffer buffer = response.bufferFactory().wrap(bits);
response.setStatusCode(HttpStatus.UNAUTHORIZED);
response.getHeaders().add("Content-Type","text/plain;charset=UTF-8");
return response.writeWith(Mono.just(buffer));
} catch (JSONException e) {
e.printStackTrace();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}