思路已清晰,开始编码

源码下载

本篇实战中的完整源码可在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、安卓逆向、云计算

推荐阅读

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。