02-统一网关服务

image-20200729130824878

官网地址:https://spring.io/projects/spring-cloud-gateway

中文文档参考:https://www.jianshu.com/p/6ff196940b67

Spring Cloud Gateway:提供网关服务

网关的核心作用:

  1. 路由匹配
    可以进行服务匹配转发
    cookie、header、path 等
  2. 过滤
    实现请求的过滤处理
    参数的非法校验、令牌校验、限流、非法请求拦截等

网关服务需要部署在外网服务器:对外。

  • 依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    <dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

<!--nacos服务与发现-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>

<dependency>
<groupId>com.autohome</groupId>
<artifactId>CarHome_Common</artifactId>
<version>0.0.1-SNAPSHOT</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
</exclusion>
</exclusions>
</dependency>

<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20200518</version>
</dependency>
</dependencies>
  • 配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
server:
port: 80
spring:
application:
name: gateway #服务名称
cloud:
nacos:
discovery:
server-addr: 47.94.193.104:8848 #注册中心地址
#路由匹配转发
gateway:
discovery: #实现注册中心新所有服务的直接访问,请求网关后面·追加的服务的名称
locator:
enabled: true #允许从注册中心直接访问服务
lower-case-service-id: true #统一改为小写访问
routes:
- id: gatewayapi #随便起名保持唯一
uri: lb://api #标记匹配的服务,如果来自注册中心,那么需要是使用lb:服务的名称
predicates:
- Path=/car/** #请求路径也就是外界需要请求的名称,如果i请求匹配,那么就会转发请求到对应的服务
filters:
- StripPrefix=1 #设置路由p匹配的时候,去除路径的层级
  • 启动类
1
2
3
4
5
6
7
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class,args);
}
}
  • 过滤器 - 根据实际情况修改过滤的内容:cookie、header、path 等
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
@Component
@Slf4j
public class VersionFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("过滤器----->");

ServerHttpRequest request = exchange.getRequest();
ServerHttpResponse response = exchange.getResponse();
//设置状态响应码 和 响应格式
response.setStatusCode(HttpStatus.BAD_REQUEST);
response.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
//response.getHeaders().add("Content-Type", "text/html;charset=UTF-8");

if (request.getQueryParams().containsKey("version")) {
//验证版本号
double v = Double.parseDouble(request.getQueryParams().get("version").get(0));
log.info("过滤器----->版本号:" + v);
if (v == 1.0) {
// 放行
return chain.filter(exchange);
} else {
//当前版本不支持
DataBuffer dataBuffer = response.bufferFactory().wrap(new JSONObject(R.fail("当前版本不支持,请尽快升级")).toString().getBytes());
// 返回响应信息
return response.writeWith(Mono.just(dataBuffer));
}
} else {
// 响应信息
// DataBuffer dataBuffer = response.bufferFactory().wrap(
// new JSONObject(R.fail("当请传递版本号,version")).toString().getBytes());
// return response.writeWith(Mono.just(dataBuffer));
// 放行
return chain.filter(exchange);
}
}

/**
* 过滤器执行顺序 数值越小,优先级越高
*/
@Override
public int getOrder() {
return 1;
}
}

02-统一网关服务
https://janycode.github.io/2020/03/02/14_微服务/04_API网关/02-统一网关服务/
作者
Jerry(姜源)
发布于
2020年3月2日
许可协议