前言
在微服务架构中,不同的微服务可以有不同的网络地址,前端可以通过好几个地址访问不一样的服务,这样可能会出现每个服务都需要进行认证或者出现跨域请求等问题。 为了避免这些问题,微服务网关就在客户端和服务端之间增加了一个API网关,所有的外部请求先通过这个微服务网关,再由网关进行各个微服务的调用。
API网关就是所有微服务的一个统一入口,一句话说就是:
网关 = 路由转发 + 过滤器(编写额外功能)
gateway使用
应用场景
日常开发一个微服务,一般的网络请求是:协议+ip+端口+URL,例如有两个服务列表,需要访问admin服务:

直接访问是:

如果这个时候需要添加一个微服务,而且与admin服务端口和URL都不一样,那前端就需要单独访问这个服务的地址。如果加入API网关,前端就只需要跟网关进行交互,由网关进行各个微服务的调用。
简单路由转发
第一步 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
第二步 添加配置
spring:
cloud:
gateway:
discovery:
locator:
# 是否从注册中心读取服务
enabled: true
routes:
# 服务的ID,唯一即可一般与微服务的service name一致
- id: cloud-admin
# lb表示负载均衡
uri: lb://cloud-admin
predicates:
# 路径匹配,所有admin的请求都转发到cloud-admin
- Path=/test/**
注意:如果配置了locator.enabled = true,则表示从服务注册与发现组件(我这里使用的是nacos)中读取服务,网关会自动为每个注册的服务创建一个路由,就不需要手动配置每个服务的路由规则,如果你需要对某些特定的服务进行特殊处理,仍然可以在 routes 中手动配置这些服务的路由规则。
上面配置好后重启gateway服务,然后访问 “test/admin/student/1” 就可以成功转发到admin服务:

添加过滤器
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class previewFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("执行自定义的全局过滤器");
String authorized= exchange.getRequest().getQueryParams().getFirst("Authorized");
if(authorized== null) {
System.out.println("认证失败");
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
return exchange.getResponse().setComplete(); //请求结束
}
return chain.filter(exchange); //如果存在,继续向下执行
}
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
}
重启后会访问 “test/admin/student/1” 失败:

后端日志:

总结
Spring Cloud Gateway 可以集成各种认证和授权机制,确保只有经过验证的请求才能访问后端服务,如:
- OAuth2 和 JWT:集成 OAuth2 和 JWT 进行用户认证。
- API 密钥:使用 API 密钥进行简单认证。
- SSL/TLS:支持 HTTPS 和双向 SSL/TLS 证书认证。
Spring Cloud Gateway 内置了对 Ribbon 和 LoadBalancerClient 的支持,可以实现智能的负载均衡策略。
1362

被折叠的 条评论
为什么被折叠?



