从零搭建springcloud微服务(八)----Gateway

一、微服务网关的搭建
1.File—>New—>Module
2.选择Spring Initializr,选择对应的JDK,
Choose Initializr Server URL 选择 default。
Next。
3.输入项目组Group:com.plkd。
组件名称Artifact:cloud-provider。
Type:选择Maven Project。
version:0.0.1-SNAPSHOT。
修改自动生成的Package:com.plkd.gateway
修改自动生成的description:微服务网关。
Next。

 4.dependencies选择spring cloud Routing—>Gateway。
Spring Boot选择你需要的版本,我这选择2.2.5。
Next。

 5.Project Name一般不做修改,和组件名称Artifact一样。
Content root、Module file location 均按自动生成,不做修改。
Finish。

6.修改pom文件。调整成如下

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.plkd</groupId>
<artifactId>cloud-dependencies</artifactId>
<version>0.0.1-SNAPSHOT</version>
<relativePath>../cloud-dependencies</relativePath><!-- 默认值为…/pom.xml,查找顺序:relativePath元素中的地址–本地仓库–远程仓库ory -->
</parent>
<groupId>com.plkd</groupId>
<artifactId>cloud-gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>cloud-gateway</name>
<description>微服务网关</description>

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

7.michael-cloud项目增加cloud-gateway模块
<module>cloud-gateway</module>

8.在application.properties中新增配置:
spring.cloud.nacos.discovery.server-addr=121.36.217.132:8848
server.port=8060
spring.application.name=cloud-gateway
spring.cloud.gateway.discovery.locator.enabled=true             
spring.cloud.gateway.discovery.locator.lower-case-service-id=true
 
9.修改CloudGatewayApplication类,增加@EnableDiscoveryClient

 10.启动服务方,消费方和网关后浏览器访问http://localhost:8060/cloud-consumer/order/getUserByOrderId/2

 

说明路由功能启用

二、自定义过滤器

1.新增自定义GlobalFilter:TokenFilter,用于模拟校验token
@Component
public class TokenFilter implements GlobalFilter, Ordered {
private static final Logger log = LoggerFactory.getLogger(TokenFilter.class);

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getQueryParams().getFirst("token");
if (token == null || token.isEmpty()) {
log.info( "token 为空,无法进行访问." );
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}

@Override
public int getOrder() {
return 0;
}
}

2.新增自定义GatewayFilter:RequestTimeFilter,用于记录请求消耗时长
@Component
public class RequestTimeFilter implements GatewayFilter, Ordered {
private static final Logger log = LoggerFactory.getLogger(RequestTimeFilter.class);
private static final String REQUEST_TIME_BEGIN = "requestTimeBegin";
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
exchange.getAttributes().put(REQUEST_TIME_BEGIN, System.currentTimeMillis());
return chain.filter(exchange).then(
Mono.fromRunnable(() -> {
Long startTime = exchange.getAttribute(REQUEST_TIME_BEGIN);
if (startTime != null) {
System.out.println("开始时间:"+ startTime + "ms");
System.out.println("请求路径:"+exchange.getRequest().getURI().getRawPath() + "消耗时间: " + (System.currentTimeMillis() - startTime) + "ms");
log.info("请求路径:"+exchange.getRequest().getURI().getRawPath() + "消耗时间: " + (System.currentTimeMillis() - startTime) + "ms");
}
})
);
}

@Override
public int getOrder() {
return 0;
}
}

3.新增AbstractGatewayFilterFactory的子类:MyGatewayFilterFactory
@Component
public class MyGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {

@Override
public GatewayFilter apply(Object config)
{
return new RequestTimeFilter();
}
}

4.修改配置文件,新增以下部分
#spring.profiles=path_route
#设置路由id
spring.cloud.gateway.routes[0].id = customer_filter_router
#设置路由的uri
spring.cloud.gateway.routes[0].uri = lb://cloud-consumer
#设置路由条件,代理servicerId为customer_filter_router的/order/路径
spring.cloud.gateway.routes[0].predicates[0] = Path=/consumer/**
#用StripPrefix的filter 在转发之前将/consumer去掉
spring.cloud.gateway.routes[0].filters[0] = StripPrefix=1
#过滤器必须和是GatewayFilterFactory类名开头一致
spring.cloud.gateway.routes[0].filters[1] = My

5.启动服务方,消费方和网关后浏览器访问http://localhost:8060/consumer/order/getUserByOrderId/2?token=111

注意:这里如果浏览器访问http://localhost:8060/consumer/order/getUserByOrderId/2,没有带token

order都是0的情况下,先触发全局过滤器TokenFilter。

把TokenFilter的order调整成5,则先触发RequestTimeFilter。

猜你喜欢

转载自www.cnblogs.com/michael-qi/p/12521201.html