第十五章 网关
前言
本系统中网关最主要的功能就是:路由转发、路径重写、负载均衡、过滤等。Spring Cloud Gateway 官方文档
一、POM 配置
父级 pom.xml 引入相关依赖,具体内容请参考源码,核心的依赖就是 SpringCloud、SpringCloudAlibaba、SpringBoot,
xml
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring.cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring.boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
Gateway 子项目引入的核心包,
xml
<!--注册中心客户端-->
<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>
<!--gateway 网关依赖,内置webflux 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
二、路由配置
路由信息全部都托管到 nacos 里面一个名为 dynamic_routes 的文件。
yml
routes:
# service-auth
- id: service-auth
predicates:
- Path=/auth/**
uri: lb://service-auth
filters:
- StripPrefix=1
# service-upms-api
- id: service-upms-api
predicates:
- Path=/upms/**
uri: lb://service-upms-api
filters:
- StripPrefix=1
# service-demo
- id: service-demo
predicates:
- Path=/demo/**
uri: lb://service-demo
filters:
- StripPrefix=1
- id: test
uri: http://www.baidu.com/
predicates:
- Path=/test
参数解释: id:路由唯一标识,用来区别于其他的 route uri:请求被转发到的微服务,lb 表示负载均衡 predicate:断言的作用是进行条件判断,我们这里用的是 Path Route Predicate Factory,路径匹配成功才会执行路由。 filter: 过滤器,StripPrefix=1 表示去掉前缀
三、路由初始化
路由的配置信息存放在Nacos里面,在系统启动的时候需要从 nacos 里面取出来,然后加载到系统里面;同时还需要监听配置文件的变化,方便实时更新配置文件,源码如下:
java
@Slf4j
@Configuration
@AllArgsConstructor
public class DynamicRouteInit {
private RouteDefinitionWriter routeDefinitionWriter;
private NacosConfigProperties nacosConfigProperties;
@PostConstruct
public void initRoute() {
try {
Properties properties = new Properties();
properties.put(PropertyKeyConst.SERVER_ADDR, nacosConfigProperties.getServerAddr());
properties.put(PropertyKeyConst.USERNAME, nacosConfigProperties.getUsername());
properties.put(PropertyKeyConst.PASSWORD, nacosConfigProperties.getPassword());
ConfigService configService = NacosFactory.createConfigService(properties);
String content = configService.getConfig(CommonConstant.CONFIG_DATA_ID, CommonConstant.CONFIG_GROUP, CommonConstant.CONFIG_TIMEOUT_MS);
log.info("初始化路由网关开始");
updateRoute(content);
log.info("初始化路由网关完成");
/**
* 监听配置
* 如果希望 Nacos 推送配置变更,可以使用 Nacos 动态监听配置接口来实现。
*/
configService.addListener(CommonConstant.CONFIG_DATA_ID, CommonConstant.CONFIG_GROUP, new Listener() {
@Override
public void receiveConfigInfo(String configInfo) {
log.info("更新路由网关开始");
updateRoute(configInfo);
log.info("更新路由网关完成");
}
@Override
public Executor getExecutor() {
return null;
}
});
} catch (NacosException e) {
log.error("加载路由出错:{}", e.getErrMsg());
}
}
public void updateRoute(String content) {
Yaml yaml = new Yaml();
GatewayRouteList gatewayRouteList = yaml.loadAs(content, GatewayRouteList.class);
gatewayRouteList.getRoutes().forEach(route -> {
log.info("加载路由:{},{}", route.getId(), route);
routeDefinitionWriter.save(Mono.just(route)).subscribe();
});
}
}
四、其他配置
新建配置文件 bootstrap.yml,用来配置一些固定不变的参数,其他动态或者有变化可以托管到 nacos 配置中心。
yml
server:
port: 8888
spring:
application:
# 应用名称
name: @artifactId@
# 配置中心
cloud:
nacos:
# 服务发现
discovery:
# 服务发现地址
server-addr: @nacos.addr@
# 组名
group: @group.name@
# 配置中心
config:
# 配置中心地址
server-addr: @nacos.addr@
# 文件扩展名
file-extension: yml
# 组名
group: @group.name@
# 共享文件配置
shared-configs[0]:
# 文件名称
data-id: application.${spring.cloud.nacos.config.file-extension}
refresh: true
log:
# 日志名
appName: service-gateway
其中@***@这种类型的参数是配置到 pom.xml 里面的,可以参考源码
xml
<profiles>
<!--生产环境-->
<profile>
<id>prod</id>
<properties>
<nacos.addr>127.0.0.1:8848</nacos.addr>
<group.name>DEFAULT_GROUP</group.name>
</properties>
</profile>
</profiles>
五、验证
- 启动 Gateway 服务,可以看到路由加载的日志,并且能服务注册中心发现该服务。
- 添加新路由,并发布,可以在控制台看到路由更新日志
yml
- id: test
uri: http://www.baidu.com/
predicates:
- Path=/test
当前版本 tag:2.0.0 代码仓库
六、 体验地址
后台数据库只给了部分权限,报错属于正常!
想学的老铁给点点关注吧!!!
欢迎留言交流!!!
我是阿咕噜,一个从互联网慢慢上岸的程序员,如果喜欢我的文章,记得帮忙点个赞哟,谢谢!