Spring Cloud Alibaba 微服务一 - nacos
Spring Cloud Alibaba 微服务二 - 服务注册与发现
Spring Cloud Alibaba 微服务三 - gateway网关
Spring Cloud Alibaba 微服务四 - sentinel服务限流与降级
Spring Cloud Alibaba 微服务五 - seata分布式事务
什么是网关
微服务网关是整个微服务API请求的入口,可以实现过滤Api接口。
作用:可以实现用户的验证登录、解决跨域、日志拦截、权限控制、限流、熔断、负载均衡、黑名单与白名单机制等。
微服务中的架构模式采用前后端分离,前端调用接口地址都能够被抓包分析到。
在微服务中,我们所有的企业入口必须先经过Api网关,经过Api网关转发到真实的服务器中。
如果此时需要添加验证会话信息:
传统的方式我们可以使用过滤器拦截用户会话信息,这个过程所有的服务器都必须写入该验证会话登录的代码。
过滤器与网关的区别
过滤器适合于单个服务实现过滤请求;
网关拦截整个的微服务实现过滤请求,能够解决整个微服务中冗余代码。
过滤器是局部拦截,网关实现全局拦截。
Zuul与Gateway有哪些区别
Zuul网关属于netfix公司开源的产品,属于第一代微服务网关
Gateway属于SpringCloud自研发的网关框架,属于第二代微服务网关
相比来说SpringCloudGateway性能比Zuul性能要好:
注意:Zuul网关底层基于Servlet实现的,阻塞式的Api,不支持长连接。
SpringCloudGateway基于Spring5构建,能够实现响应式非阻塞式的Api,支持长连接,能够更好的整合Spring体系的产品,依赖SpringBoot-WebFux。
Spring Cloud Gateway的处理流程
客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。
网关搭建
- 引入依赖
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
这里有个问题,不要引入web 模块,但是非gateway 模块的要引入web模块
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
- 启动文件
@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
- 配置文件application.yml
spring:
cloud:
gateway:
discovery:
locator:
lowerCaseServiceId: true
enabled: true
# 配置路由规则
routes:
- id: xsw-auth #我们自定义的路由 ID,保持唯一
## 采用自定义路由 ID(有固定用法,不同的 id 有不同的功能,详见:https://cloud.spring.io/spring-cloud-gateway/2.0.x/single/spring-cloud-gateway.html#gateway-route-filters)
uri: lb://xsw-auth
# Predicate 翻译过来是“谓词”的意思,必须,主要作用是匹配用户的请求,有很多种用法
predicates:
# 路径匹配,以 auth 开头,直接配置是不生效的,看 filters 配置
- Path=/auth/**
filters:
# 前缀过滤,默认配置下,我们的请求路径是 http://localhost:8888/business-oauth2/** 这时会路由到指定的服务
# 此处配置去掉 1 个路径前缀,再配置上面的 Path=/api/**,就能按照 http://localhost:8888/api/** 的方式访问了
- StripPrefix=1
- id: xsw-blog
uri: lb://xsw-blog
predicates:
- Path=/blog/**
filters:
- StripPrefix=1
- boostrap.yml
spring:
application:
name: xsw-gateway
cloud:
nacos:
config:
#启动添加参数 -DNACOS_NAMESPACE=xsw -DNACOS_ADDRESS=127.0.0.1:8848
server-addr: ${NACOS_ADDRESS}
namespace: ${NACOS_NAMESPACE}
file-extension: yml
shared-configs[0]:
data-id: common.yml
refresh: true
github项目地址:https://github.com/XSWgrzh/xsw.