思路已清晰,开始编码
源码下载
本篇实战中的完整源码可在GitHub下载到,地址和链接信息如下表所示(https://github.com/zq2599/blog_demos):
| 名称 | 链接 | 备注 |
| :-- | :-- | :-- |
| 项目主页 | https://github.com/zq2599/blog_demos | 该项目在GitHub上的主页 |
| git仓库地址(https) | https://github.com/zq2599/blog_demos.git | 该项目源码的仓库地址,https协议 |
| git仓库地址(ssh) | git@github.com:zq2599/blog_demos.git | 该项目源码的仓库地址,ssh协议 |
这个git项目中有多个文件夹,本篇的源码在spring-cloud-tutorials文件夹下,如下图红框所示:
spring-cloud-tutorials是父工程,下属多个子工程,今天的实战的代码是gateway-dynamic-by-nacos,如下图所示:
编码
新增名为gateway-dynamic-by-nacos的工程,其pom.xml内容如下,注意中文注释的说明:
xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance” xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”> spring-cloud-tutorials com.bolingcavalry 1.0-SNAPSHOT 4.0.0 gateway-dynamic-by-nacos com.bolingcavalry common ${project.version} org.springframework.cloud spring-cloud-starter-gateway io.projectreactor reactor-test test org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-actuator org.springframework.cloud spring-cloud-starter-bootstrap org.springframework.cloud spring-cloud-starter-loadbalancer com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-maven-plugin com.bolingcavalry.gateway.GatewayApplication repackage 配置文件bootstrap.yml,上面只有nacos,可见其他配置信息还是来自naocs: spring: application: name: gateway-dynamic-by-nacos cloud: nacos: config: server-addr: 127.0.0.1:8848 file-extension: yml group: DEFAULT_GROUP 负责处理进程内路由配置的类是RouteOperator,如下所示,可见整个配置是字符串类型的,用了Jackson的ObjectMapper进行反序列化(注意,前面的实战中配置文件都是yml格式,但本例中是JSON,稍后在nacos上配置要用JSON格式),然后路由配置的处理主要是RouteDefinitionWriter类型的bean完成的,为了让配置立即生效,还要用applicationEventPublisher发布进程内消息: package com.bolingcavalry.gateway.service; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import lombok.extern.slf4j.Slf4j; import org.springframework.cloud.gateway.event.RefreshRoutesEvent; import org.springframework.cloud.gateway.route.RouteDefinition; import org.springframework.cloud.gateway.route.RouteDefinitionWriter; import org.springframework.context.ApplicationEventPublisher; import org.springframework.util.StringUtils; import reactor.core.publisher.Mono; import java.util.ArrayList; import java.util.List; @Slf4j public class RouteOperator { private ObjectMapper objectMapper; private RouteDefinitionWriter routeDefinitionWriter; private ApplicationEventPublisher applicationEventPublisher; private static final List routeList = new ArrayList<>(); public RouteOperator(ObjectMapper objectMapper, RouteDefinitionWriter routeDefinitionWriter, ApplicationEventPublisher applicationEventPublisher) { this.objectMapper = objectMapper; this.routeDefinitionWriter = routeDefinitionWriter; this.applicationEventPublisher = applicationEventPublisher; } /** 清理集合中的所有路由,并清空集合 */ private void clear() { // 全部调用API清理掉 routeList.stream().forEach(id -> routeDefinitionWriter.delete(Mono.just(id)).subscribe()); // 清空集合 routeList.clear(); } /** 新增路由 @param routeDefinitions */ private void add(List routeDefinitions) { try { routeDefinitions.stream().forEach(routeDefinition -> { routeDefinitionWriter.save(Mono.just(routeDefinition)).subscribe(); routeList.add(routeDefinition.getId()); }); } catch (Exception exception) { exception.printStackTrace(); } } /** 发布进程内通知,更新路由 */ private void publish() { applicationEventPublisher.publishEvent(new RefreshRoutesEvent(routeDefinitionWriter)); } /** 更新所有路由信息 @param configStr */ public void refreshAll(String configStr) { 自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。 深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。 既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化! 由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新 如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java) 最后 小编精心为大家准备了一手资料 以上Java高级架构资料、源码、笔记、视频。Dubbo、Redis、设计模式、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术 【附】架构书籍 BAT面试的20道高频数据库问题解析Java面试宝典Netty实战算法 BATJ面试要点及Java架构师进阶资料 一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长! AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算 . 算法 [外链图片转存中…(img-iBF5mmJ3-1712539491412)] BATJ面试要点及Java架构师进阶资料 [外链图片转存中…(img-FyBm1B6z-1712539491413)] 一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长! AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算 推荐阅读
发表评论