一、微服务网关
微服务网关是整个微服务api接口的入口,可以实现过滤Api接口。
作用:可以实现用户的验证登录、解决跨域、日志拦截、权限控制、限流熔断、负载均衡、黑名单和白名单机制等。
二、过滤器与网关区别
- 过滤器适应于单个服务实现过滤请求,局部拦截
- 网关拦截整个微服务实现过滤请求,能够解决整个微服务中冗余代码,全局拦截
三、Zuul和GateWay的区别
Zuul网关 | GateWay网关 |
Zuul网关属于NetFix公司开源框架 ,第一代微服务网关 | GateWay属于SpringCloud自己研发的网关框架,第二代微服务网关 |
Zuul网关底层基于Servlet实现。阻塞式api,不支持长连接。依赖SpringBoot-Web | GateWay基于Spring5构建,能够实现响应式非阻塞式api,支持长连接。依赖SpirngBoot-WebFux |
四、构建GateWay
1、pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
2、application.yml
server:
port: 80
####服务网关名称
spring:
application:
name: mayikt-gateway
cloud:
gateway:
discovery:
locator:
####开启以服务id去注册中心上获取转发地址
enabled: true
###路由策略
routes:
###路由id
- id: mayikt
####转发http://www.mayikt.com/
uri: http://www.mayikt.com/
###匹配规则
predicates:
- Path=/mayikt/**
### 127.0.0.1/mayikt 转发到http://www.mayikt.com/
网关的服务端口号一般是:80或者443
3、启动类
五、转发真实微服务接口
1、application.yml
server:
port: 80
####服务网关名称
spring:
application:
name: mayikt-gateway
cloud:
gateway:
discovery:
locator:
####开启以服务id去注册中心上获取转发地址
enabled: true
###路由策略
routes:
###路由id
- id: member
#### 基于lb负载均衡形式转发
uri: lb://mayikt-member
filters:
- StripPrefix=1
###匹配规则
predicates:
- Path=/member/**
nacos:
discovery:
server-addr: 127.0.0.1:8848
2、pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.2.2.RELEASE</version>
</dependency>
</dependencies>
六、Nginx和GateWay区别
微服务网关能够做的事情,Nginx也可以实现。
- 相同点:
都是可以实现对api接口的拦截,负载均衡、反向代理、请求过滤等,可以实现和网关一样的效果。 - 不同点:
(1)在微服务领域中,都是自己语言编写的。
Nginx采用C语言编写的。Gateway是java语言编写的。
毕竟Gateway属于Java语言编写的, 能够更好对微服务实现扩展功能,相比Nginx如果想实现扩展功能需要结合Nginx+Lua语言等。
(2)Nginx实现负载均衡的原理:属于服务器端负载均衡器。Gateway实现负载均衡原理:采用本地负载均衡器的形式。
五、拦截功能
@Component
public class TokenFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String token = exchange.getRequest().getQueryParams().getFirst("token");
if (token == null || token.isEmpty()) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.BAD_REQUEST);
String msg = "token not is null ";
DataBuffer buffer = response.bufferFactory().wrap(msg.getBytes());
return response.writeWith(Mono.just(buffer));
}
// 使用网关过滤
return chain.filter(exchange);
}
}