diff --git a/README.md b/README.md index 219651676..cf164c666 100644 --- a/README.md +++ b/README.md @@ -13,18 +13,29 @@ 让我们一起愉快的挖坑,挖深坑,哇哈哈。 +## 打好基础 + +* [《芋道 Spring Boot 快速入门》](http://www.iocoder.cn/Spring-Boot/quick-start/?github) +* [《芋道 Spring Boot 自动配置原理》](http://www.iocoder.cn/Spring-Boot/autoconfigure/?github) 对应 [lab-47](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-47) + +## 开发工具 + +* [《芋道 Spring Boot 热部署入门》](http://www.iocoder.cn/Spring-Boot/hot-swap/?github) 对应 [lab-48](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-48) +* [《芋道 Spring Boot 消除冗余代码 Lombok 入门》](http://www.iocoder.cn/Spring-Boot/Lombok/?github) 对应 [lab-49](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-49) +* 《芋道 Spring Boot 对象转换 MapStruct 入门》计划中... + ## Web 开发 -* [《芋道 Spring Boot SpringMVC 入门》](http://www.iocoder.cn/Spring-Boot/SpringMVC/?github) 对应 [lab-23](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-23) 。 -* [《芋道 Spring Boot WebFlux 入门》](http://www.iocoder.cn/Spring-Boot/WebFlux/?github) 对应 [lab-27](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-27) 。 -* [《芋道 Spring Boot 分布式 Session 入门》](http://www.iocoder.cn/Spring-Boot/Distributed-Session/?github) 对应 [lab-26](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-26) 。 -* [《芋道 Spring Boot API 接口文档 Swagger 入门》](http://www.iocoder.cn/Spring-Boot/Swagger/?github) 对应 [lab-24](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-24) 。 -* [《芋道 Spring Boot 参数校验 Validation 入门》](http://www.iocoder.cn/Spring-Boot/Validation/?github) 对应 [lab-22](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-22) 。 -* [《芋道 Spring Boot WebSocket 入门》](http://www.iocoder.cn/Spring-Boot/WebSocket/?github) 对应 [lab-25](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-25) 。 +* [《芋道 Spring Boot SpringMVC 入门》](http://www.iocoder.cn/Spring-Boot/SpringMVC/?github) 对应 [lab-23](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-23) +* [《芋道 Spring Boot WebFlux 入门》](http://www.iocoder.cn/Spring-Boot/WebFlux/?github) 对应 [lab-27](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-27) +* [《芋道 Spring Boot 分布式 Session 入门》](http://www.iocoder.cn/Spring-Boot/Distributed-Session/?github) 对应 [lab-26](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-26) +* [《芋道 Spring Boot API 接口文档 Swagger 入门》](http://www.iocoder.cn/Spring-Boot/Swagger/?github) 对应 [lab-24](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-24) +* [《芋道 Spring Boot 参数校验 Validation 入门》](http://www.iocoder.cn/Spring-Boot/Validation/?github) 对应 [lab-22](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-22) +* [《芋道 Spring Boot WebSocket 入门》](http://www.iocoder.cn/Spring-Boot/WebSocket/?github) 对应 [lab-25](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-25) ## RPC 开发 -* [《芋道 Spring Boot Dubbo 入门》](http://www.iocoder.cn/Spring-Boot/Dubbo/?github) 对应 [lab-30](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-30) 。 +* [《芋道 Spring Boot Dubbo 入门》](http://www.iocoder.cn/Spring-Boot/Dubbo/?github) 对应 [lab-30](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-30) * 《芋道 Spring Boot Motan 入门》计划中... * 《芋道 Spring Boot WebService 入门》计划中... * 《芋道 Spring Boot SOFARPC 入门》计划中... @@ -33,62 +44,111 @@ ## 数据访问 -* [《芋道 Spring Boot Redis 入门》](http://www.iocoder.cn/Spring-Boot/Redis/?github) 对应 [lab-11](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-11) 。 -* [《芋道 Spring Boot 缓存 Cache 入门》](http://www.iocoder.cn/Spring-Boot/Cache/?github) 对应 [lab-21](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-21) 。 -* [《芋道 Spring Boot 数据库连接池入门》](http://www.iocoder.cn/Spring-Boot/datasource-pool/?github) 对应 [lab-19](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-19) 。 -* [《芋道 Spring Boot MyBatis 入门》](http://www.iocoder.cn/Spring-Boot/MyBatis/?github) 对应 [lab-12](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-12) 。 -* [《芋道 Spring Boot JPA 入门》](http://www.iocoder.cn/Spring-Boot/JPA/?github) 对应 [lab-13](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-13) 。 -* [《芋道 Spring Boot JdbcTemplate 入门》](http://www.iocoder.cn/Spring-Boot/JdbcTemplate/?github) 对应 [lab-14](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-14) 。 -* [《芋道 Spring Boot Elasticsearch 入门》](http://www.iocoder.cn/Spring-Boot/Elasticsearch/?github) 对应 [lab-15](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-15) 。 -* [《芋道 Spring Boot MongoDB 入门》](http://www.iocoder.cn/Spring-Boot/MongoDB/?github) 对应 [lab-16](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-16) 。 -* [《芋道 Spring Boot 多数据源(读写分离)入门》](http://www.iocoder.cn/Spring-Boot/dynamic-datasource/?github) 对应 [lab-17](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-17) 。 -* [《芋道 Spring Boot 分库分表入门》](http://www.iocoder.cn/Spring-Boot/sharding-datasource/?github) 对应 [lab-18](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-18) 。 -* [《芋道 Spring Boot 数据库版本管理入门》](http://www.iocoder.cn/Spring-Boot/database-version-control/?github) 对应 [lab-20](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-20) 。 +* [《芋道 Spring Boot Redis 入门》](http://www.iocoder.cn/Spring-Boot/Redis/?github) 对应 [lab-11](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-11) +* [《芋道 Spring Boot 缓存 Cache 入门》](http://www.iocoder.cn/Spring-Boot/Cache/?github) 对应 [lab-21](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-21) +* [《芋道 Spring Boot 数据库连接池入门》](http://www.iocoder.cn/Spring-Boot/datasource-pool/?github) 对应 [lab-19](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-19) +* [《芋道 Spring Boot MyBatis 入门》](http://www.iocoder.cn/Spring-Boot/MyBatis/?github) 对应 [lab-12](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-12) +* [《芋道 Spring Boot JPA 入门》](http://www.iocoder.cn/Spring-Boot/JPA/?github) 对应 [lab-13](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-13) +* [《芋道 Spring Boot JdbcTemplate 入门》](http://www.iocoder.cn/Spring-Boot/JdbcTemplate/?github) 对应 [lab-14](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-14) +* [《芋道 Spring Boot Elasticsearch 入门》](http://www.iocoder.cn/Spring-Boot/Elasticsearch/?github) 对应 [lab-15](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-15) +* [《芋道 Spring Boot MongoDB 入门》](http://www.iocoder.cn/Spring-Boot/MongoDB/?github) 对应 [lab-16](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-16) +* [《芋道 Spring Boot 多数据源(读写分离)入门》](http://www.iocoder.cn/Spring-Boot/dynamic-datasource/?github) 对应 [lab-17](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-17) +* [《芋道 Spring Boot 分库分表入门》](http://www.iocoder.cn/Spring-Boot/sharding-datasource/?github) 对应 [lab-18](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-18) +* [《芋道 Spring Boot 数据库版本管理入门》](http://www.iocoder.cn/Spring-Boot/database-version-control/?github) 对应 [lab-20](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-20) ## 安全控制 -* [《芋道 Spring Boot 安全框架 Spring Security 入门》](http://www.iocoder.cn/Spring-Boot/Spring-Security/?github) 对应 [lab-01](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01) 。 -* [《芋道 Spring Boot 授权框架 Spring Security OAuth2 入门》](http://www.iocoder.cn/Spring-Security/OAuth2-learning/?github) 对应 [lab-02](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-02) 。 -* [《芋道 Spring Boot 安全框架 Shiro 入门》](http://www.iocoder.cn/Spring-Boot/Shiro/?github) 对应 [lab-33](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-33) 。 +* [《芋道 Spring Boot 安全框架 Spring Security 入门》](http://www.iocoder.cn/Spring-Boot/Spring-Security/?github) 对应 [lab-01](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01) +* [《芋道 Spring Boot 授权框架 Spring Security OAuth2 入门》](http://www.iocoder.cn/Spring-Security/OAuth2-learning/?github) 对应 [lab-02](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-02) +* [《芋道 Spring Boot 安全框架 Shiro 入门》](http://www.iocoder.cn/Spring-Boot/Shiro/?github) 对应 [lab-33](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-33) ## 定时任务与异步任务 -* [《芋道 Spring Boot 定时任务入门》](http://www.iocoder.cn/Spring-Boot/Job/?github) 对应 [lab-28](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-28) 。 -* [《芋道 Spring Boot 异步任务入门》](http://www.iocoder.cn/Spring-Boot/Async-Job/?github) 对应 [lab-29](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-29) 。 +* [《芋道 Spring Boot 定时任务入门》](http://www.iocoder.cn/Spring-Boot/Job/?github) 对应 [lab-28](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-28) +* [《芋道 Spring Boot 异步任务入门》](http://www.iocoder.cn/Spring-Boot/Async-Job/?github) 对应 [lab-29](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-29) ## 消息队列 -* [《芋道 Spring Boot 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Boot/RocketMQ/?github) 对应 [lab-31](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-31) 。 -* [《芋道 Spring Boot 消息队列 Kafka 入门》](http://www.iocoder.cn/Spring-Boot/Kafka/?github) 对应 [lab-03](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-03) 。 -* [《芋道 Spring Boot 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Boot/RabbitMQ/?github) 对应 [lab-04](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-04) 。 -* [《芋道 Spring Boot 消息队列 ActiveMQ 入门》](http://www.iocoder.cn/Spring-Boot/ActiveMQ/?github) 对应 [lab-32](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-32) 。 +* [《芋道 Spring Boot 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Boot/RocketMQ/?github) 对应 [lab-31](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-31) +* [《芋道 Spring Boot 消息队列 Kafka 入门》](http://www.iocoder.cn/Spring-Boot/Kafka/?github) 对应 [lab-03](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-03) +* [《芋道 Spring Boot 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Boot/RabbitMQ/?github) 对应 [lab-04](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-04) +* [《芋道 Spring Boot 消息队列 ActiveMQ 入门》](http://www.iocoder.cn/Spring-Boot/ActiveMQ/?github) 对应 [lab-32](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-32) + +## 配置中心 + +* [《芋道 Spring Boot 配置文件入门》](http://www.iocoder.cn/Spring-Boot/config-file/?github) 对应 [lab-43](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-43) +* [《芋道 Spring Boot 配置中心 Apollo 入门》](http://www.iocoder.cn/Spring-Boot/config-apollo/?github) 对应 [lab-45](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-45) +* [《芋道 Spring Boot 配置中心 Nacos 入门》](http://www.iocoder.cn/Spring-Boot/config-nacos/?github) 对应 [lab-44](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-44) + +## 注册中心 + +* [《芋道 Spring Boot 注册中心 Nacos 入门》](http://www.iocoder.cn/Spring-Boot/registry-nacos/?github) 对应 [lab-44](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-44) + +## 持续交付 + +* [《芋道 Spring Boot 持续交付 Jenkins 入门》](http://www.iocoder.cn/Spring-Boot/Jenkins/?github) 对应 [lab-41](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-41) +* [《芋道 Spring Boot 单元测试 Test 入门》](http://www.iocoder.cn/Spring-Boot/Unit-Test/?github) 对应 [lab-42](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-42) +* 《芋道 Spring Boot 容器 Docker 入门》计划中... + +## 服务容错 + +* [《芋道 Spring Boot 服务容错 Sentinel 入门》](http://www.iocoder.cn/Spring-Boot/Sentinel/?github) 对应 [lab-46](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-46) +* 《芋道 Spring Boot 服务容错 Hystrix 入门》计划中... ## 监控管理 -* [《芋道 Spring Boot 监控端点 Actuator 入门》](http://www.iocoder.cn/Spring-Boot/Actuator/?github) 对应 [lab-34](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-34) 。 -* [《芋道 Spring Boot 监控工具 Admin 入门》](http://www.iocoder.cn/Spring-Boot/Admin/?github) 对应 [lab-35](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-35) 。 -* [《芋道 Spring Boot 监控平台 Prometheus + Grafana 入门》](http://www.iocoder.cn/Spring-Boot/Prometheus-and-Grafana/?github) 对应 [lab-36](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-36) 。 +* [《芋道 Spring Boot 监控端点 Actuator 入门》](http://www.iocoder.cn/Spring-Boot/Actuator/?github) 对应 [lab-34](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-34) +* [《芋道 Spring Boot 监控工具 Admin 入门》](http://www.iocoder.cn/Spring-Boot/Admin/?github) 对应 [lab-35](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-35) +* [《芋道 Spring Boot 监控平台 Prometheus + Grafana 入门》](http://www.iocoder.cn/Spring-Boot/Prometheus-and-Grafana/?github) 对应 [lab-36](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-36) +* 《芋道 Spring Boot 监控平台 CAT 入门》计划中... ## 日志管理 -* [《芋道 Spring Boot 日志集成 Logging 入门》](http://www.iocoder.cn/Spring-Boot/Logging/?github) 对应 [lab-37](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-37) 。 -* [《芋道 Spring Boot 日志平台 ELK + Filebeat 入门》](http://www.iocoder.cn/Spring-Boot/ELK/?github) 对应 [lab-38](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-38) 。 +* [《芋道 Spring Boot 日志集成 Logging 入门》](http://www.iocoder.cn/Spring-Boot/Logging/?github) 对应 [lab-37](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-37) +* [《芋道 Spring Boot 日志平台 ELK + Filebeat 入门》](http://www.iocoder.cn/Spring-Boot/ELK/?github) 对应 [lab-38](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-38) ## 链路追踪 -* [《芋道 Spring Boot 链路追踪 SkyWalking 入门》](http://www.iocoder.cn/Spring-Boot/SkyWalking/?github) 对应 [lab-37](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-37) 。 -* [《芋道 Spring Boot 链路追踪 Zipkin 入门》](http://www.iocoder.cn/Spring-Boot/Zipkin/?github) 对应 [lab-38](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-38) 。 -* [《芋道 Spring Boot 链路追踪 Pinpoint 入门》](http://www.iocoder.cn/Spring-Boot/Pinpoint/?github) 对应 [lab-39](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-38) 。 +* [《芋道 Spring Boot 链路追踪 SkyWalking 入门》](http://www.iocoder.cn/Spring-Boot/SkyWalking/?github) 对应 [lab-39](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-39) +* [《芋道 Spring Boot 链路追踪 Zipkin 入门》](http://www.iocoder.cn/Spring-Boot/Zipkin/?github) 对应 [lab-40](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-40) +* 《芋道 Spring Boot 链路追踪 Pinpoint 入门》计划中... +* 《芋道 Spring Boot 链路追踪 Elastic APM 入门》计划中... ## 性能测试 -* [《性能测试 —— Tomcat、Jetty、Undertow 基准测试》](http://www.iocoder.cn/Performance-Testing/Tomcat-Jetty-Undertow-benchmark/?github) 对应 [lab-05](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-05) 。 -* [《性能测试 —— SpringMVC、Webflux 基准测试》](http://www.iocoder.cn/Performance-Testing/SpringMVC-Webflux-benchmark/?github) 对应 [lab-06](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-06) 。 -* [《性能测试 —— Spring Cloud Gateway、Zuul 基准测试》](http://www.iocoder.cn/Performance-Testing/SpringCloudGateway-Zuul-benchmark/?github) 对应 [lab-07](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-07) 。 +* [《性能测试 —— Tomcat、Jetty、Undertow 基准测试》](http://www.iocoder.cn/Performance-Testing/Tomcat-Jetty-Undertow-benchmark/?github) 对应 [lab-05](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-05) +* [《性能测试 —— SpringMVC、Webflux 基准测试》](http://www.iocoder.cn/Performance-Testing/SpringMVC-Webflux-benchmark/?github) 对应 [lab-06](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-06) +* [《性能测试 —— Spring Cloud Gateway、Zuul 基准测试》](http://www.iocoder.cn/Performance-Testing/SpringCloudGateway-Zuul-benchmark/?github) 对应 [lab-07](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-07) + +# Spring Cloud Alibaba 专栏 + +* [《芋道 Spring Cloud Alibaba 注册中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Discovery/?github) 对应 [labx-01](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-01) +* [《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》](http://www.iocoder.cn/Spring-Cloud-Netflix/Ribbon/?github) 对应 [labx-02](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-02) +* 《芋道 Spring Cloud 声明式调用 OpenFeign 入门》 +* 《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》 +* 《芋道 Spring Cloud Alibaba 配置中心 Nacos 入门》 +* 《芋道 Spring Cloud Alibaba 服务容错 Sentinel 入门》 +* 《芋道 Spring Cloud Netflix 服务容错 Hystrix 入门》 +* 《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》 +* 《芋道 Spring Cloud 服务网关 Spring Cloud Gateway 入门》 +* 《芋道 Spring Cloud Netflix 服务网关 Zuul 入门》 +* 《芋道 Spring Cloud 链路追踪 Sleuth 入门》 +* 《芋道 Spring Cloud 链路追踪 SkyWalking 入门》 +* TODO 监控 + +# Spring Cloud 专栏 + +## 注册中心 + +* [《芋道 Spring Cloud Alibaba 注册中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Discovery/?github) 对应 [labx-01](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-01) + +## 服务调用 -# Spring Cloud 入门 +* 《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》 +* [《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》](http://www.iocoder.cn/Spring-Cloud-Netflix/Ribbon/?github) 对应 [labx-02](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-02) +* 《芋道 Spring Cloud 声明式调用 OpenFeign 入门》 -未来可期,不要着急。 +## 服务容错 --------- @@ -102,7 +162,7 @@ WEB 容器,后续优化掉 # lab-08 -简单测试,Tomcat + Redis 提供最小接口,看看 QPS 。 +简单测试,Tomcat + Redis 提供最小接口,看看 QPS # lab-9 diff --git a/lab-02/authorization-code-server/target/classes/application.properties b/lab-02/authorization-code-server/target/classes/application.properties deleted file mode 100644 index 5c6bfc108..000000000 --- a/lab-02/authorization-code-server/target/classes/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -# Spring Security Setting -security.user.name=yunai -security.user.password=1024 \ No newline at end of file diff --git a/lab-02/implicit-server/target/classes/application.properties b/lab-02/implicit-server/target/classes/application.properties deleted file mode 100644 index 5c6bfc108..000000000 --- a/lab-02/implicit-server/target/classes/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -# Spring Security Setting -security.user.name=yunai -security.user.password=1024 \ No newline at end of file diff --git a/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/target/classes/application.properties b/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/target/classes/application.properties deleted file mode 100644 index a2fecaa3a..000000000 --- a/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/target/classes/application.properties +++ /dev/null @@ -1,9 +0,0 @@ -# Spring Security Setting -security.user.name=yunai -security.user.password=1024 - -##################### MySQL ##################### -jdbc.driverClassName=com.mysql.jdbc.Driver -jdbc.url=jdbc:mysql://127.0.0.1:33061/oauth2 -jdbc.user=root -jdbc.pass=123456 \ No newline at end of file diff --git a/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/target/classes/data.sql b/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/target/classes/data.sql deleted file mode 100644 index 807bf514f..000000000 --- a/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/target/classes/data.sql +++ /dev/null @@ -1,21 +0,0 @@ -INSERT INTO oauth_client_details - (client_id, client_secret, scope, authorized_grant_types, - web_server_redirect_uri, authorities, access_token_validity, - refresh_token_validity, additional_information, autoapprove) -VALUES - ('fooClientIdPassword', 'secret', 'foo,read,write', - 'password,authorization_code,refresh_token', null, null, 36000, 36000, null, true); -INSERT INTO oauth_client_details - (client_id, client_secret, scope, authorized_grant_types, - web_server_redirect_uri, authorities, access_token_validity, - refresh_token_validity, additional_information, autoapprove) -VALUES - ('sampleClientId', 'secret', 'read,write,foo,bar', - 'implicit', null, null, 36000, 36000, null, false); -INSERT INTO oauth_client_details - (client_id, client_secret, scope, authorized_grant_types, - web_server_redirect_uri, authorities, access_token_validity, - refresh_token_validity, additional_information, autoapprove) -VALUES - ('barClientIdPassword', 'secret', 'bar,read,write', - 'password,authorization_code,refresh_token', null, null, 36000, 36000, null, true); \ No newline at end of file diff --git a/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/target/classes/schema.sql b/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/target/classes/schema.sql deleted file mode 100644 index 945d05d16..000000000 --- a/lab-02/resource-owner-password-credentials-server-by-jdbc-token-store/target/classes/schema.sql +++ /dev/null @@ -1,66 +0,0 @@ ---------------- MySQL --------------- -drop table if exists oauth_client_details; -create table oauth_client_details ( - client_id VARCHAR(255) PRIMARY KEY, - resource_ids VARCHAR(255), - client_secret VARCHAR(255), - scope VARCHAR(255), - authorized_grant_types VARCHAR(255), - web_server_redirect_uri VARCHAR(255), - authorities VARCHAR(255), - access_token_validity INTEGER, - refresh_token_validity INTEGER, - additional_information VARCHAR(4096), - autoapprove VARCHAR(255) -); - -create table if not exists oauth_client_token ( - token_id VARCHAR(255), - token LONG VARBINARY, - authentication_id VARCHAR(255) PRIMARY KEY, - user_name VARCHAR(255), - client_id VARCHAR(255) -); - -create table if not exists oauth_access_token ( - token_id VARCHAR(255), - token LONG VARBINARY, - authentication_id VARCHAR(255) PRIMARY KEY, - user_name VARCHAR(255), - client_id VARCHAR(255), - authentication LONG VARBINARY, - refresh_token VARCHAR(255) -); - -create table if not exists oauth_refresh_token ( - token_id VARCHAR(255), - token LONG VARBINARY, - authentication LONG VARBINARY -); - -create table if not exists oauth_code ( - code VARCHAR(255), authentication LONG VARBINARY -); - -create table if not exists oauth_approvals ( - userId VARCHAR(255), - clientId VARCHAR(255), - scope VARCHAR(255), - status VARCHAR(10), - expiresAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP, - lastModifiedAt TIMESTAMP DEFAULT CURRENT_TIMESTAMP -); - -create table if not exists ClientDetails ( - appId VARCHAR(255) PRIMARY KEY, - resourceIds VARCHAR(255), - appSecret VARCHAR(255), - scope VARCHAR(255), - grantTypes VARCHAR(255), - redirectUrl VARCHAR(255), - authorities VARCHAR(255), - access_token_validity INTEGER, - refresh_token_validity INTEGER, - additionalInformation VARCHAR(4096), - autoApproveScopes VARCHAR(255) -); \ No newline at end of file diff --git a/lab-02/resource-owner-password-credentials-server-with-refresh-token/target/classes/application.properties b/lab-02/resource-owner-password-credentials-server-with-refresh-token/target/classes/application.properties deleted file mode 100644 index 5c6bfc108..000000000 --- a/lab-02/resource-owner-password-credentials-server-with-refresh-token/target/classes/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -# Spring Security Setting -security.user.name=yunai -security.user.password=1024 \ No newline at end of file diff --git a/lab-02/resource-owner-password-credentials-server-with-revoke-token/target/classes/application.properties b/lab-02/resource-owner-password-credentials-server-with-revoke-token/target/classes/application.properties deleted file mode 100644 index 5c6bfc108..000000000 --- a/lab-02/resource-owner-password-credentials-server-with-revoke-token/target/classes/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -# Spring Security Setting -security.user.name=yunai -security.user.password=1024 \ No newline at end of file diff --git a/lab-02/resource-owner-password-credentials-server/target/classes/application.properties b/lab-02/resource-owner-password-credentials-server/target/classes/application.properties deleted file mode 100644 index 5c6bfc108..000000000 --- a/lab-02/resource-owner-password-credentials-server/target/classes/application.properties +++ /dev/null @@ -1,3 +0,0 @@ -# Spring Security Setting -security.user.name=yunai -security.user.password=1024 \ No newline at end of file diff --git a/lab-03/lab-03-kafka-demo-batch-consume/target/classes/application.yaml b/lab-03/lab-03-kafka-demo-batch-consume/target/classes/application.yaml deleted file mode 100644 index 4b83d214a..000000000 --- a/lab-03/lab-03-kafka-demo-batch-consume/target/classes/application.yaml +++ /dev/null @@ -1,40 +0,0 @@ -spring: - # Kafka 配置项,对应 KafkaProperties 配置类 - kafka: - bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 - # Kafka Producer 配置项 - producer: - acks: 1 # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。 - retries: 3 # 发送失败时,重试发送的次数 - key-serializer: org.apache.kafka.common.serialization.StringSerializer # 消息的 key 的序列化 - value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化 - batch-size: 16384 # 每次批量发送消息的最大数量 - buffer-memory: 33554432 # 每次批量发送消息的最大内存 - properties: - linger: - ms: 30000 # 批处理延迟时间上限。这里配置为 30 * 1000 ms 过后,不管是否消息数量是否到达 batch-size 或者消息大小到达 buffer-memory 后,都直接发送一次请求。 - # Kafka Consumer 配置项 - consumer: - auto-offset-reset: earliest # 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解 - key-deserializer: org.apache.kafka.common.serialization.StringDeserializer - value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer - fetch-max-wait: 10000 # poll 一次拉取的阻塞的最大时长,单位:毫秒。这里指的是阻塞拉取需要满足至少 fetch-min-size 条消息 - fetch-min-size: 10 # poll 一次消息拉取的最小数量 - max-poll-records: 100 # poll 一次消息拉取的最大数量 - properties: - spring: - json: - trusted: - packages: cn.iocoder.springboot.lab03.kafkademo.message - # Kafka Consumer Listener 监听器配置 - listener: - type: BATCH # 监听器类型,默认为 SINGLE ,只监听单条消息。这里我们配置 BATCH ,监听多条消息,批量消费 - missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错 - -logging: - level: - org: - springframework: - kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别 - apache: - kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别 diff --git a/lab-03/lab-03-kafka-demo-batch/target/classes/application.yaml b/lab-03/lab-03-kafka-demo-batch/target/classes/application.yaml deleted file mode 100644 index 57b23998d..000000000 --- a/lab-03/lab-03-kafka-demo-batch/target/classes/application.yaml +++ /dev/null @@ -1,36 +0,0 @@ -spring: - # Kafka 配置项,对应 KafkaProperties 配置类 - kafka: - bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 - # Kafka Producer 配置项 - producer: - acks: 1 # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。 - retries: 3 # 发送失败时,重试发送的次数 - key-serializer: org.apache.kafka.common.serialization.StringSerializer # 消息的 key 的序列化 - value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化 - batch-size: 16384 # 每次批量发送消息的最大数量 - buffer-memory: 33554432 # 每次批量发送消息的最大内存 - properties: - linger: - ms: 30000 # 批处理延迟时间上限。这里配置为 30 * 1000 ms 过后,不管是否消息数量是否到达 batch-size 或者消息大小到达 buffer-memory 后,都直接发送一次请求。 - # Kafka Consumer 配置项 - consumer: - auto-offset-reset: earliest # 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解 - key-deserializer: org.apache.kafka.common.serialization.StringDeserializer - value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer - properties: - spring: - json: - trusted: - packages: cn.iocoder.springboot.lab03.kafkademo.message - # Kafka Consumer Listener 监听器配置 - listener: - missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错 - -logging: - level: - org: - springframework: - kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别 - apache: - kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别 diff --git a/lab-03/lab-03-kafka-demo-broadcast/target/classes/application.yaml b/lab-03/lab-03-kafka-demo-broadcast/target/classes/application.yaml deleted file mode 100644 index 452a9c177..000000000 --- a/lab-03/lab-03-kafka-demo-broadcast/target/classes/application.yaml +++ /dev/null @@ -1,31 +0,0 @@ -spring: - # Kafka 配置项,对应 KafkaProperties 配置类 - kafka: - bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 - # Kafka Producer 配置项 - producer: - acks: 1 # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。 - retries: 3 # 发送失败时,重试发送的次数 - key-serializer: org.apache.kafka.common.serialization.StringSerializer # 消息的 key 的序列化 - value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化 - # Kafka Consumer 配置项 - consumer: - auto-offset-reset: latest # 设置消费者分组最初的消费进度为 latest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解 - key-deserializer: org.apache.kafka.common.serialization.StringDeserializer - value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer - properties: - spring: - json: - trusted: - packages: cn.iocoder.springboot.lab03.kafkademo.message - # Kafka Consumer Listener 监听器配置 - listener: - missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错 - -logging: - level: - org: - springframework: - kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别 - apache: - kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别 diff --git a/lab-03/lab-03-kafka-demo-transaction/target/classes/application.yaml b/lab-03/lab-03-kafka-demo-transaction/target/classes/application.yaml deleted file mode 100644 index ba78c1ec9..000000000 --- a/lab-03/lab-03-kafka-demo-transaction/target/classes/application.yaml +++ /dev/null @@ -1,34 +0,0 @@ -spring: - # Kafka 配置项,对应 KafkaProperties 配置类 - kafka: - bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 - # Kafka Producer 配置项 - producer: - acks: all # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。 - retries: 3 # 发送失败时,重试发送的次数 - key-serializer: org.apache.kafka.common.serialization.StringSerializer # 消息的 key 的序列化 - value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化 - transaction-id-prefix: demo. # 事务编号前缀 - # Kafka Consumer 配置项 - consumer: - auto-offset-reset: earliest # 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解 - key-deserializer: org.apache.kafka.common.serialization.StringDeserializer - value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer - properties: - spring: - json: - trusted: - packages: cn.iocoder.springboot.lab03.kafkademo.message - isolation: - level: read_committed # 读取已提交的消息 - # Kafka Consumer Listener 监听器配置 - listener: - missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错 - -logging: - level: - org: - springframework: - kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别 - apache: - kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别 diff --git a/lab-03/lab-03-kafka-demo-transaction/target/classes/application_bak.yaml b/lab-03/lab-03-kafka-demo-transaction/target/classes/application_bak.yaml deleted file mode 100644 index 2a07fe27d..000000000 --- a/lab-03/lab-03-kafka-demo-transaction/target/classes/application_bak.yaml +++ /dev/null @@ -1,35 +0,0 @@ -spring: - kafka: - bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 - # Kafka Producer 配置项 - producer: - acks: 1 # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。 - retries: 3 # 发送失败时,重试发送的次数 - batch-size: 16384 # 每次批量发送消息的最大数量 - buffer-memory: 33554432 # 每次批量发送消息的最大内存 - key-serializer: org.apache.kafka.common.serialization.StringSerializer # 消息的 key 的序列化 - value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化 - # Kafka Consumer 配置项 - consumer: - enable-auto-commit: false # true-使用 kafka 默认自带的提交模式。false-使用 Spring-Kafka 的自动提交 offset 机制。建议设置为 false 使用 kafka-spring 的机制,分析见 https://juejin.im/entry/5a6e8dea518825732472710c 。 - auto-commit-interval: 1000 # 在开启 enable-auto-commit 时,自动提交消费进度频率,单位:毫秒。如果 enable-auto-commit 为 false 时候,可以不设置 - auto-offset-reset: earliest # 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解 - key-deserializer: org.apache.kafka.common.serialization.StringDeserializer - value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer - properties: - spring: - json: - trusted: - packages: cn.iocoder.springboot.lab03.kafkademo.message - # Kafka Consumer Listener 监听器配置 - listener: - concurrency: 10 # 每个消费者监听器最大并发数,默认为 1 。可以通过设置 n ,这样对于每个监听器就会使用 n 个线程消费消息,提高整体消费速度。详细可参考博客 https://www.jianshu.com/p/ad0e5424edbd 理解。 - # Producer 配置项 - -logging: - level: - org: - springframework: - kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别 - apache: - kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别 diff --git a/lab-03/lab-03-kafka-demo/target/classes/application_bak.yaml b/lab-03/lab-03-kafka-demo/target/classes/application_bak.yaml deleted file mode 100644 index 40e9f065f..000000000 --- a/lab-03/lab-03-kafka-demo/target/classes/application_bak.yaml +++ /dev/null @@ -1,35 +0,0 @@ -spring: - kafka: - bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 - # Kafka Producer 配置项 - producer: - acks: 1 # 0-不应答。1-leader 应答。all-所有 leader 和 follower 应答。 - retries: 3 # 发送失败时,重试发送的次数 - batch-size: 16384 # 每次批量发送消息的最大数量 - buffer-memory: 33554432 # 每次批量发送消息的最大内存 - key-serializer: org.apache.kafka.common.serialization.StringSerializer # 消息的 key 的序列化 - value-serializer: org.springframework.kafka.support.serializer.JsonSerializer # 消息的 value 的序列化 - # Kafka Consumer 配置项 - consumer: - enable-auto-commit: false # true-使用 kafka 默认自带的提交模式。false-使用 Spring-Kafka 的自动提交 offset 机制。建议设置为 false 使用 kafka-spring 的机制,分析见 https://juejin.im/entry/5a6e8dea518825732472710c 。 - auto-commit-interval: 1000 # 在开启 enable-auto-commit 时,自动提交消费进度频率,单位:毫秒。如果 enable-auto-commit 为 false 时候,可以不设置 - auto-offset-reset: earliest # 设置消费者分组最初的消费进度为 earliest 。可参考博客 https://blog.csdn.net/lishuangzhe7047/article/details/74530417 理解 - key-deserializer: org.apache.kafka.common.serialization.StringDeserializer - value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer - properties: - spring: - json: - trusted: - packages: cn.iocoder.springboot.lab03.kafkademo.message - # Kafka Consumer Listener 监听器配置 - listener: - concurrency: 10 # 每个消费者监听器最大并发数,默认为 1 。可以通过设置 n ,这样对于每个监听器就会使用 n 个线程消费消息,提高整体消费速度。详细可参考博客 https://www.jianshu.com/p/ad0e5424edbd 理解。 - - -logging: - level: - org: - springframework: - kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别 - apache: - kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别 diff --git a/lab-03/pom.xml b/lab-03/pom.xml index 69a8de588..d32bb1f43 100644 --- a/lab-03/pom.xml +++ b/lab-03/pom.xml @@ -12,18 +12,6 @@ lab-03 pom - - - - org.apache.maven.plugins - maven-compiler-plugin - - 8 - 8 - - - - lab-03-kafka-native lab-03-kafka-demo @@ -35,64 +23,4 @@ lab-03-kafka-demo-ack - - - org.springframework.boot - spring-boot-starter-web - - - - org.projectlombok - lombok - true - - - - org.springframework.boot - spring-boot-starter-test - test - - - - org.apache.kafka - kafka-clients - 2.1.0 - - - com.alibaba - fastjson - 1.2.55 - - - org.springframework.integration - spring-integration-kafka - 3.1.0.RELEASE - - - - org.springframework.kafka - spring-kafka - 1.1.1.RELEASE - - - - com.google.code.gson - gson - 2.8.2 - - - - org.projectlombok - lombok - true - - - - org.springframework.boot - spring-boot-starter-test - test - - - - diff --git a/lab-04/lab-04-rabbitmq-demo-ack/target/classes/application.yaml b/lab-04/lab-04-rabbitmq-demo-ack/target/classes/application.yaml deleted file mode 100644 index a38b9e466..000000000 --- a/lab-04/lab-04-rabbitmq-demo-ack/target/classes/application.yaml +++ /dev/null @@ -1,10 +0,0 @@ -spring: - # RabbitMQ 配置项,对应 RabbitProperties 配置类 - rabbitmq: - host: 127.0.0.1 # RabbitMQ 服务的地址 - port: 5672 # RabbitMQ 服务的端口 - username: guest # RabbitMQ 服务的账号 - password: guest # RabbitMQ 服务的密码 - listener: - simple: - acknowledge-mode: manual # 配置 Consumer 手动提交 diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume-02/target/classes/application.yaml b/lab-04/lab-04-rabbitmq-demo-batch-consume-02/target/classes/application.yaml deleted file mode 100644 index 59cf3bfb9..000000000 --- a/lab-04/lab-04-rabbitmq-demo-batch-consume-02/target/classes/application.yaml +++ /dev/null @@ -1,7 +0,0 @@ -spring: - # RabbitMQ 配置项,对应 RabbitProperties 配置类 - rabbitmq: - host: 127.0.0.1 # RabbitMQ 服务的地址 - port: 5672 # RabbitMQ 服务的端口 - username: guest # RabbitMQ 服务的账号 - password: guest # RabbitMQ 服务的密码 diff --git a/lab-04/lab-04-rabbitmq-demo-batch-consume/target/classes/application.yaml b/lab-04/lab-04-rabbitmq-demo-batch-consume/target/classes/application.yaml deleted file mode 100644 index 52b3c35a7..000000000 --- a/lab-04/lab-04-rabbitmq-demo-batch-consume/target/classes/application.yaml +++ /dev/null @@ -1,7 +0,0 @@ -spring: - # RabbitMQ 配置项,对应 RabbitProperties 配置类 - rabbitmq: - host: 127.0.0.1 # RabbitMQ 服务的地址 - port: 5672 # RabbitMQ 服务的端口 - username: guest # RabbitMQ 服务的账号 - password: guest # RabbitMQ 服务的密 diff --git a/lab-04/lab-04-rabbitmq-demo-concurrency/target/classes/application.yaml b/lab-04/lab-04-rabbitmq-demo-concurrency/target/classes/application.yaml deleted file mode 100644 index 51cd27add..000000000 --- a/lab-04/lab-04-rabbitmq-demo-concurrency/target/classes/application.yaml +++ /dev/null @@ -1,14 +0,0 @@ -spring: - # RabbitMQ 配置项,对应 RabbitProperties 配置类 - rabbitmq: - host: 127.0.0.1 # RabbitMQ 服务的地址 - port: 5672 # RabbitMQ 服务的端口 - username: guest # RabbitMQ 服务的账号 - password: guest # RabbitMQ 服务的密码 - listener: - type: simple # 选择的 ListenerContainer 的类型。默认为 direct 类型 - simple: - concurrency: 2 # 每个 @ListenerContainer 的并发消费的线程数 - max-concurrency: 10 # 每个 @ListenerCon 允许的并发消费的线程数 -# direct: -# consumers-per-queue: 2 # 对于每一个 @RabbitListener ,一个 Queue ,对应创建几个 Consumer 。 diff --git a/lab-04/lab-04-rabbitmq-demo-confirm-async/target/classes/application.yaml b/lab-04/lab-04-rabbitmq-demo-confirm-async/target/classes/application.yaml deleted file mode 100644 index 97065c5f3..000000000 --- a/lab-04/lab-04-rabbitmq-demo-confirm-async/target/classes/application.yaml +++ /dev/null @@ -1,9 +0,0 @@ -spring: - # RabbitMQ 配置项,对应 RabbitProperties 配置类 - rabbitmq: - host: 127.0.0.1 # RabbitMQ 服务的地址 - port: 5672 # RabbitMQ 服务的端口 - username: guest # RabbitMQ 服务的账号 - password: guest # RabbitMQ 服务的密码 - publisher-confirm-type: correlated # 设置 Confirm 类型为 CORRELATED 。 - publisher-returns: true # diff --git a/lab-04/lab-04-rabbitmq-demo-delay/target/classes/application.yaml b/lab-04/lab-04-rabbitmq-demo-delay/target/classes/application.yaml deleted file mode 100644 index 59cf3bfb9..000000000 --- a/lab-04/lab-04-rabbitmq-demo-delay/target/classes/application.yaml +++ /dev/null @@ -1,7 +0,0 @@ -spring: - # RabbitMQ 配置项,对应 RabbitProperties 配置类 - rabbitmq: - host: 127.0.0.1 # RabbitMQ 服务的地址 - port: 5672 # RabbitMQ 服务的端口 - username: guest # RabbitMQ 服务的账号 - password: guest # RabbitMQ 服务的密码 diff --git a/lab-04/lab-04-rabbitmq-demo-rpc/target/classes/application.yaml b/lab-04/lab-04-rabbitmq-demo-rpc/target/classes/application.yaml deleted file mode 100644 index 59cf3bfb9..000000000 --- a/lab-04/lab-04-rabbitmq-demo-rpc/target/classes/application.yaml +++ /dev/null @@ -1,7 +0,0 @@ -spring: - # RabbitMQ 配置项,对应 RabbitProperties 配置类 - rabbitmq: - host: 127.0.0.1 # RabbitMQ 服务的地址 - port: 5672 # RabbitMQ 服务的端口 - username: guest # RabbitMQ 服务的账号 - password: guest # RabbitMQ 服务的密码 diff --git a/lab-04/lab-04-rabbitmq-demo-transaction/target/classes/application.yaml b/lab-04/lab-04-rabbitmq-demo-transaction/target/classes/application.yaml deleted file mode 100644 index 59cf3bfb9..000000000 --- a/lab-04/lab-04-rabbitmq-demo-transaction/target/classes/application.yaml +++ /dev/null @@ -1,7 +0,0 @@ -spring: - # RabbitMQ 配置项,对应 RabbitProperties 配置类 - rabbitmq: - host: 127.0.0.1 # RabbitMQ 服务的地址 - port: 5672 # RabbitMQ 服务的端口 - username: guest # RabbitMQ 服务的账号 - password: guest # RabbitMQ 服务的密码 diff --git a/lab-05/lab-05-jetty/target/lab-05-jetty-1.0-SNAPSHOT.jar.original b/lab-05/lab-05-jetty/target/lab-05-jetty-1.0-SNAPSHOT.jar.original deleted file mode 100644 index acd02205b..000000000 Binary files a/lab-05/lab-05-jetty/target/lab-05-jetty-1.0-SNAPSHOT.jar.original and /dev/null differ diff --git a/lab-05/lab-05-jetty/target/maven-archiver/pom.properties b/lab-05/lab-05-jetty/target/maven-archiver/pom.properties deleted file mode 100644 index d6287216e..000000000 --- a/lab-05/lab-05-jetty/target/maven-archiver/pom.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Created by Apache Maven 3.3.9 -version=1.0-SNAPSHOT -groupId=cn.iocoder.springboot.labs -artifactId=lab-05-jetty diff --git a/lab-05/lab-05-jetty/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/lab-05/lab-05-jetty/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-05/lab-05-jetty/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/lab-05/lab-05-jetty/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 74eba13df..000000000 --- a/lab-05/lab-05-jetty/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,2 +0,0 @@ -/Users/yunai/Java/SpringBoot-Labs/lab-05/lab-05-jetty/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/JettyApplication.java -/Users/yunai/Java/SpringBoot-Labs/lab-05/lab-05-jetty/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java diff --git a/lab-05/lab-05-jetty/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/lab-05/lab-05-jetty/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-05/lab-05-tomcat-apr/target/lab-05-tomcat-apr-1.0-SNAPSHOT.jar.original b/lab-05/lab-05-tomcat-apr/target/lab-05-tomcat-apr-1.0-SNAPSHOT.jar.original deleted file mode 100644 index 00eac83e9..000000000 Binary files a/lab-05/lab-05-tomcat-apr/target/lab-05-tomcat-apr-1.0-SNAPSHOT.jar.original and /dev/null differ diff --git a/lab-05/lab-05-tomcat-apr/target/maven-archiver/pom.properties b/lab-05/lab-05-tomcat-apr/target/maven-archiver/pom.properties deleted file mode 100644 index 4304aed6f..000000000 --- a/lab-05/lab-05-tomcat-apr/target/maven-archiver/pom.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Created by Apache Maven 3.3.9 -version=1.0-SNAPSHOT -groupId=cn.iocoder.springboot.labs -artifactId=lab-05-tomcat-apr diff --git a/lab-05/lab-05-tomcat-apr/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/lab-05/lab-05-tomcat-apr/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-05/lab-05-tomcat-apr/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/lab-05/lab-05-tomcat-apr/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 43d9fc47a..000000000 --- a/lab-05/lab-05-tomcat-apr/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,2 +0,0 @@ -/Users/yunai/Java/SpringBoot-Labs/lab-05/lab-05-tomcat-apr/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java -/Users/yunai/Java/SpringBoot-Labs/lab-05/lab-05-tomcat-apr/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/TomcatAprApplication.java diff --git a/lab-05/lab-05-tomcat-apr/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/lab-05/lab-05-tomcat-apr/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-05/lab-05-tomcat/target/lab-05-tomcat-1.0-SNAPSHOT.jar.original b/lab-05/lab-05-tomcat/target/lab-05-tomcat-1.0-SNAPSHOT.jar.original deleted file mode 100644 index 3267398ec..000000000 Binary files a/lab-05/lab-05-tomcat/target/lab-05-tomcat-1.0-SNAPSHOT.jar.original and /dev/null differ diff --git a/lab-05/lab-05-tomcat/target/maven-archiver/pom.properties b/lab-05/lab-05-tomcat/target/maven-archiver/pom.properties deleted file mode 100644 index 45f7db990..000000000 --- a/lab-05/lab-05-tomcat/target/maven-archiver/pom.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Created by Apache Maven 3.3.9 -version=1.0-SNAPSHOT -groupId=cn.iocoder.springboot.labs -artifactId=lab-05-tomcat diff --git a/lab-05/lab-05-tomcat/target/maven-status/maven-compiler-plugin/compile/default-cli/createdFiles.lst b/lab-05/lab-05-tomcat/target/maven-status/maven-compiler-plugin/compile/default-cli/createdFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-05/lab-05-tomcat/target/maven-status/maven-compiler-plugin/compile/default-cli/inputFiles.lst b/lab-05/lab-05-tomcat/target/maven-status/maven-compiler-plugin/compile/default-cli/inputFiles.lst deleted file mode 100644 index 7f04c06f8..000000000 --- a/lab-05/lab-05-tomcat/target/maven-status/maven-compiler-plugin/compile/default-cli/inputFiles.lst +++ /dev/null @@ -1,2 +0,0 @@ -/Users/yunai/Java/SpringBoot-Labs/lab-05/lab-05-tomcat/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/TomcatApplication.java -/Users/yunai/Java/SpringBoot-Labs/lab-05/lab-05-tomcat/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java diff --git a/lab-05/lab-05-tomcat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/lab-05/lab-05-tomcat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-05/lab-05-tomcat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/lab-05/lab-05-tomcat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 7f04c06f8..000000000 --- a/lab-05/lab-05-tomcat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,2 +0,0 @@ -/Users/yunai/Java/SpringBoot-Labs/lab-05/lab-05-tomcat/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/TomcatApplication.java -/Users/yunai/Java/SpringBoot-Labs/lab-05/lab-05-tomcat/src/main/java/cn/iocoder/springboot/labs/lab05/tomcat/Controller.java diff --git a/lab-05/lab-05-tomcat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/lab-05/lab-05-tomcat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-05/lab-05-undertow/target/lab-05-undertow-1.0.0.jar.original b/lab-05/lab-05-undertow/target/lab-05-undertow-1.0.0.jar.original deleted file mode 100644 index e79b42b0a..000000000 Binary files a/lab-05/lab-05-undertow/target/lab-05-undertow-1.0.0.jar.original and /dev/null differ diff --git a/lab-05/lab-05-undertow/target/maven-archiver/pom.properties b/lab-05/lab-05-undertow/target/maven-archiver/pom.properties deleted file mode 100644 index 5f8195895..000000000 --- a/lab-05/lab-05-undertow/target/maven-archiver/pom.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Created by Apache Maven 3.3.9 -version=1.0.0 -groupId=cn.iocoder.springboot.labs -artifactId=lab-05-undertow diff --git a/lab-05/lab-05-undertow/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/lab-05/lab-05-undertow/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-05/lab-05-undertow/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/lab-05/lab-05-undertow/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index c608aea74..000000000 --- a/lab-05/lab-05-undertow/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,2 +0,0 @@ -/Users/yunai/Java/SpringBoot-Labs/lab-05/lab-05-undertow/src/main/java/cn/iocoder/springboot/labs/lab05/undertow/UndertowApplication.java -/Users/yunai/Java/SpringBoot-Labs/lab-05/lab-05-undertow/src/main/java/cn/iocoder/springboot/labs/lab05/undertow/Controller.java diff --git a/lab-05/lab-05-undertow/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/lab-05/lab-05-undertow/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-06/lab-06-springmvc-tomcat/target/lab-06-springmvc-tomcat-1.0-SNAPSHOT.jar.original b/lab-06/lab-06-springmvc-tomcat/target/lab-06-springmvc-tomcat-1.0-SNAPSHOT.jar.original deleted file mode 100644 index 7694b89f1..000000000 Binary files a/lab-06/lab-06-springmvc-tomcat/target/lab-06-springmvc-tomcat-1.0-SNAPSHOT.jar.original and /dev/null differ diff --git a/lab-06/lab-06-springmvc-tomcat/target/maven-archiver/pom.properties b/lab-06/lab-06-springmvc-tomcat/target/maven-archiver/pom.properties deleted file mode 100644 index 2730ed5b4..000000000 --- a/lab-06/lab-06-springmvc-tomcat/target/maven-archiver/pom.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Created by Apache Maven 3.3.9 -version=1.0-SNAPSHOT -groupId=cn.iocoder.springboot.labs -artifactId=lab-06-springmvc-tomcat diff --git a/lab-06/lab-06-springmvc-tomcat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/lab-06/lab-06-springmvc-tomcat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-06/lab-06-springmvc-tomcat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/lab-06/lab-06-springmvc-tomcat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 4c5d17894..000000000 --- a/lab-06/lab-06-springmvc-tomcat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,2 +0,0 @@ -/Users/yunai/Java/SpringBoot-Labs/lab-06/lab-06-springmvc-tomcat/src/main/java/cn/iocoder/springboot/labs/lab06/springmvc/SpringMVCApplication.java -/Users/yunai/Java/SpringBoot-Labs/lab-06/lab-06-springmvc-tomcat/src/main/java/cn/iocoder/springboot/labs/lab06/springmvc/Controller.java diff --git a/lab-06/lab-06-springmvc-tomcat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/lab-06/lab-06-springmvc-tomcat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-06/lab-06-webflux-netty/target/lab-06-webflux-netty-1.0-SNAPSHOT.jar.original b/lab-06/lab-06-webflux-netty/target/lab-06-webflux-netty-1.0-SNAPSHOT.jar.original deleted file mode 100644 index b34de9c60..000000000 Binary files a/lab-06/lab-06-webflux-netty/target/lab-06-webflux-netty-1.0-SNAPSHOT.jar.original and /dev/null differ diff --git a/lab-06/lab-06-webflux-netty/target/maven-archiver/pom.properties b/lab-06/lab-06-webflux-netty/target/maven-archiver/pom.properties deleted file mode 100644 index 427bd89fc..000000000 --- a/lab-06/lab-06-webflux-netty/target/maven-archiver/pom.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Created by Apache Maven 3.3.9 -version=1.0-SNAPSHOT -groupId=cn.iocoder.springboot.labs -artifactId=lab-06-webflux-netty diff --git a/lab-06/lab-06-webflux-netty/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/lab-06/lab-06-webflux-netty/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index 962185f8b..000000000 --- a/lab-06/lab-06-webflux-netty/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1 +0,0 @@ -cn/iocoder/springboot/labs/lab06/webflux/WebfluxNettyApplication.class diff --git a/lab-06/lab-06-webflux-netty/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/lab-06/lab-06-webflux-netty/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 936478f64..000000000 --- a/lab-06/lab-06-webflux-netty/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,2 +0,0 @@ -/Users/yunai/Java/SpringBoot-Labs/lab-06/lab-06-webflux-netty/src/main/java/cn/iocoder/springboot/labs/lab06/webflux/WebfluxNettyApplication.java -/Users/yunai/Java/SpringBoot-Labs/lab-06/lab-06-webflux-netty/src/main/java/cn/iocoder/springboot/labs/lab06/webflux/Controller.java diff --git a/lab-06/lab-06-webflux-netty/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/lab-06/lab-06-webflux-netty/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-06/lab-06-webflux-tomcat/target/lab-06-webflux-tomcat-1.0-SNAPSHOT.jar.original b/lab-06/lab-06-webflux-tomcat/target/lab-06-webflux-tomcat-1.0-SNAPSHOT.jar.original deleted file mode 100644 index 81fffc94a..000000000 Binary files a/lab-06/lab-06-webflux-tomcat/target/lab-06-webflux-tomcat-1.0-SNAPSHOT.jar.original and /dev/null differ diff --git a/lab-06/lab-06-webflux-tomcat/target/maven-archiver/pom.properties b/lab-06/lab-06-webflux-tomcat/target/maven-archiver/pom.properties deleted file mode 100644 index 20f075f1d..000000000 --- a/lab-06/lab-06-webflux-tomcat/target/maven-archiver/pom.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Created by Apache Maven 3.3.9 -version=1.0-SNAPSHOT -groupId=cn.iocoder.springboot.labs -artifactId=lab-06-webflux-tomcat diff --git a/lab-06/lab-06-webflux-tomcat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/lab-06/lab-06-webflux-tomcat/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-06/lab-06-webflux-tomcat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/lab-06/lab-06-webflux-tomcat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index c5ce362a5..000000000 --- a/lab-06/lab-06-webflux-tomcat/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,2 +0,0 @@ -/Users/yunai/Java/SpringBoot-Labs/lab-06/lab-06-webflux-tomcat/src/main/java/cn/iocoder/springboot/labs/lab06/webflux/WebfluxTomcatApplication.java -/Users/yunai/Java/SpringBoot-Labs/lab-06/lab-06-webflux-tomcat/src/main/java/cn/iocoder/springboot/labs/lab06/webflux/Controller.java diff --git a/lab-06/lab-06-webflux-tomcat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/lab-06/lab-06-webflux-tomcat/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-07/lab-07-spring-cloud-gateway/target/lab-07-spring-cloud-gateway-1.0.0.jar.original b/lab-07/lab-07-spring-cloud-gateway/target/lab-07-spring-cloud-gateway-1.0.0.jar.original deleted file mode 100644 index 2f02300a6..000000000 Binary files a/lab-07/lab-07-spring-cloud-gateway/target/lab-07-spring-cloud-gateway-1.0.0.jar.original and /dev/null differ diff --git a/lab-07/lab-07-spring-cloud-gateway/target/lab-07-spring-cloud-gateway-2.1.3.RELEASE.jar.original b/lab-07/lab-07-spring-cloud-gateway/target/lab-07-spring-cloud-gateway-2.1.3.RELEASE.jar.original deleted file mode 100644 index e1c5e2d9e..000000000 Binary files a/lab-07/lab-07-spring-cloud-gateway/target/lab-07-spring-cloud-gateway-2.1.3.RELEASE.jar.original and /dev/null differ diff --git a/lab-07/lab-07-spring-cloud-gateway/target/maven-archiver/pom.properties b/lab-07/lab-07-spring-cloud-gateway/target/maven-archiver/pom.properties deleted file mode 100644 index 83070e399..000000000 --- a/lab-07/lab-07-spring-cloud-gateway/target/maven-archiver/pom.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Created by Apache Maven 3.3.9 -version=1.0.0 -groupId=org.springframework.boot -artifactId=lab-07-spring-cloud-gateway diff --git a/lab-07/lab-07-spring-cloud-gateway/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/lab-07/lab-07-spring-cloud-gateway/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-07/lab-07-spring-cloud-gateway/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/lab-07/lab-07-spring-cloud-gateway/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 9ea05ec06..000000000 --- a/lab-07/lab-07-spring-cloud-gateway/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1 +0,0 @@ -/Users/yunai/Java/SpringBoot-Labs/lab-07/lab-07-spring-cloud-gateway/src/main/java/cn/iocoder/springboot/labs/lab07/springcloudgateway/SpringCloudGatewayApplication.java diff --git a/lab-07/lab-07-spring-cloud-gateway/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/lab-07/lab-07-spring-cloud-gateway/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-07/lab-07-zuul/target/classes/application.yml b/lab-07/lab-07-zuul/target/classes/application.yml deleted file mode 100644 index 850b03834..000000000 --- a/lab-07/lab-07-zuul/target/classes/application.yml +++ /dev/null @@ -1,13 +0,0 @@ -zuul: - routes: - static: - path: /hello.txt - url: http://127.0.0.1:8000/ - stripPrefix: false - api: - path: /** - url: http://127.0.0.1:8080 - include-debug-header: true - -server: - port: 8081 diff --git a/lab-07/lab-07-zuul/target/lab-07-zuul-1.0.0.jar.original b/lab-07/lab-07-zuul/target/lab-07-zuul-1.0.0.jar.original deleted file mode 100644 index c7ba883be..000000000 Binary files a/lab-07/lab-07-zuul/target/lab-07-zuul-1.0.0.jar.original and /dev/null differ diff --git a/lab-07/lab-07-zuul/target/lab-07-zuul-2.1.3.RELEASE.jar.original b/lab-07/lab-07-zuul/target/lab-07-zuul-2.1.3.RELEASE.jar.original deleted file mode 100644 index ac62b9012..000000000 Binary files a/lab-07/lab-07-zuul/target/lab-07-zuul-2.1.3.RELEASE.jar.original and /dev/null differ diff --git a/lab-07/lab-07-zuul/target/maven-archiver/pom.properties b/lab-07/lab-07-zuul/target/maven-archiver/pom.properties deleted file mode 100644 index a3c310fa1..000000000 --- a/lab-07/lab-07-zuul/target/maven-archiver/pom.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Created by Apache Maven 3.3.9 -version=1.0.0 -groupId=org.springframework.boot -artifactId=lab-07-zuul diff --git a/lab-07/lab-07-zuul/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/lab-07/lab-07-zuul/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index e20e2f84a..000000000 --- a/lab-07/lab-07-zuul/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1 +0,0 @@ -cn/iocoder/springboot/labs/lab07/zuul/ZuulApplication.class diff --git a/lab-07/lab-07-zuul/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/lab-07/lab-07-zuul/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index d9aaf645a..000000000 --- a/lab-07/lab-07-zuul/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1 +0,0 @@ -/Users/yunai/Java/SpringBoot-Labs/lab-07/lab-07-zuul/src/main/java/cn/iocoder/springboot/labs/lab07/zuul/ZuulApplication.java diff --git a/lab-07/lab-07-zuul/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/lab-07/lab-07-zuul/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-08/target/classes/application.yaml b/lab-08/target/classes/application.yaml deleted file mode 100644 index d1491f05d..000000000 --- a/lab-08/target/classes/application.yaml +++ /dev/null @@ -1,22 +0,0 @@ -spring: - application: - name: user-application - # jpa - redis: - password: - database: 0 - port: 6379 - host: 127.0.0.1 - timeout: 0 - jedis: - pool: - max-wait: - max-idle: 8 - min-idle: 0 - - -# server -server: - port: 16003 - servlet: - context-path: /user-api/ diff --git a/lab-08/target/lab-08-2.1.4.RELEASE.jar.original b/lab-08/target/lab-08-2.1.4.RELEASE.jar.original deleted file mode 100644 index 8f0d5e6ec..000000000 Binary files a/lab-08/target/lab-08-2.1.4.RELEASE.jar.original and /dev/null differ diff --git a/lab-08/target/maven-archiver/pom.properties b/lab-08/target/maven-archiver/pom.properties deleted file mode 100644 index f66973bce..000000000 --- a/lab-08/target/maven-archiver/pom.properties +++ /dev/null @@ -1,4 +0,0 @@ -#Created by Apache Maven 3.3.9 -version=2.1.4.RELEASE -groupId=org.springframework.boot -artifactId=lab-08 diff --git a/lab-08/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/lab-08/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst deleted file mode 100644 index faafda6fc..000000000 --- a/lab-08/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ /dev/null @@ -1,2 +0,0 @@ -cn/iocoder/springboot/labs/lab08/UserApplication.class -cn/iocoder/springboot/labs/lab08/UserController.class diff --git a/lab-08/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/lab-08/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst deleted file mode 100644 index 2532fb7ef..000000000 --- a/lab-08/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ /dev/null @@ -1,2 +0,0 @@ -/Users/yunai/Java/SpringBoot-Labs/lab-08/src/main/java/cn/iocoder/springboot/labs/lab08/UserController.java -/Users/yunai/Java/SpringBoot-Labs/lab-08/src/main/java/cn/iocoder/springboot/labs/lab08/UserApplication.java diff --git a/lab-08/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/lab-08/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-09/pom.xml b/lab-09/pom.xml index 8b3a4a092..d941cab76 100644 --- a/lab-09/pom.xml +++ b/lab-09/pom.xml @@ -10,18 +10,10 @@ 4.0.0 lab-09 - - - - org.apache.maven.plugins - maven-compiler-plugin - - 8 - 8 - - - - + + 1.8 + 1.8 + diff --git a/lab-10/target/classes/application.properties b/lab-10/target/classes/application.properties deleted file mode 100644 index 0eb258cba..000000000 --- a/lab-10/target/classes/application.properties +++ /dev/null @@ -1,2 +0,0 @@ -management.endpoint.health.show-details=always -server.port=9080 diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/target/classes/lua/compareAndSet.lua b/lab-11/lab-07-spring-data-redis-with-jedis/target/classes/lua/compareAndSet.lua deleted file mode 100644 index 682737c61..000000000 --- a/lab-11/lab-07-spring-data-redis-with-jedis/target/classes/lua/compareAndSet.lua +++ /dev/null @@ -1,5 +0,0 @@ -if redis.call('GET', KEYS[1]) ~= ARGV[1] then - return 0 -end -redis.call('SET', KEYS[1], ARGV[2]) -return 1 diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/target/classes/lua/compareAndSet2.lua b/lab-11/lab-07-spring-data-redis-with-jedis/target/classes/lua/compareAndSet2.lua deleted file mode 100644 index 8b921f487..000000000 --- a/lab-11/lab-07-spring-data-redis-with-jedis/target/classes/lua/compareAndSet2.lua +++ /dev/null @@ -1,5 +0,0 @@ -if redis.call('GET', KEYS[1]) != ARGV[1] then - return {0} -end -redis.call('SET', KEYS[2], ARGV[2]) -return {1} diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/target/classes/lua/test.lua b/lab-11/lab-07-spring-data-redis-with-jedis/target/classes/lua/test.lua deleted file mode 100644 index 35897e5ce..000000000 --- a/lab-11/lab-07-spring-data-redis-with-jedis/target/classes/lua/test.lua +++ /dev/null @@ -1 +0,0 @@ -return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]} diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/application.yml b/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/application.yml deleted file mode 100644 index 742b2ad31..000000000 --- a/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/application.yml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - # 对应 RedisProperties 类 - redis: - host: 127.0.0.1 - port: 6379 -# password: # Redis 服务器密码,默认为空。生产中,一定要设置 Redis 密码! - database: 0 # Redis 数据库号,默认为 0 。 - timeout: 0 # Redis 连接超时时间,单位:毫秒。 - # 对应 RedissonProperties 类 -# redisson: -# config: classpath:redisson.yml # 具体的每个配置项,见 org.redisson.config.Config 类。 diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/lua/compareAndSet.lua b/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/lua/compareAndSet.lua deleted file mode 100644 index 682737c61..000000000 --- a/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/lua/compareAndSet.lua +++ /dev/null @@ -1,5 +0,0 @@ -if redis.call('GET', KEYS[1]) ~= ARGV[1] then - return 0 -end -redis.call('SET', KEYS[1], ARGV[2]) -return 1 diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/lua/compareAndSet2.lua b/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/lua/compareAndSet2.lua deleted file mode 100644 index 8b921f487..000000000 --- a/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/lua/compareAndSet2.lua +++ /dev/null @@ -1,5 +0,0 @@ -if redis.call('GET', KEYS[1]) != ARGV[1] then - return {0} -end -redis.call('SET', KEYS[2], ARGV[2]) -return {1} diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/lua/test.lua b/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/lua/test.lua deleted file mode 100644 index 35897e5ce..000000000 --- a/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/lua/test.lua +++ /dev/null @@ -1 +0,0 @@ -return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]} diff --git a/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/redisson.yml b/lab-11/lab-07-spring-data-redis-with-redisson/target/classes/redisson.yml deleted file mode 100644 index e69de29bb..000000000 diff --git a/lab-12/lab-12-mybatis-annotation/target/classes/application.yaml b/lab-12/lab-12-mybatis-annotation/target/classes/application.yaml deleted file mode 100644 index 63c682adb..000000000 --- a/lab-12/lab-12-mybatis-annotation/target/classes/application.yaml +++ /dev/null @@ -1,13 +0,0 @@ -spring: - # datasource 数据源配置内容 - datasource: - url: jdbc:mysql://47.112.193.81:3306/testb5f4?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: testb5f4 - password: F4df4db0ed86@11 - -# mybatis 配置内容 -mybatis: - config-location: classpath:mybatis-config.xml # 配置 MyBatis 配置文件路径 -# mapper-locations: classpath:mapper/*.xml # 配置 Mapper XML 地址 - type-aliases-package: cn.iocoder.springboot.lab12.mybatis.dataobject # 配置数据库实体包路径 diff --git a/lab-12/lab-12-mybatis-annotation/target/classes/mapper/UserMapper.xml b/lab-12/lab-12-mybatis-annotation/target/classes/mapper/UserMapper.xml deleted file mode 100644 index 258432621..000000000 --- a/lab-12/lab-12-mybatis-annotation/target/classes/mapper/UserMapper.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - id, username, password, create_time - - - - INSERT INTO users ( - username, password, create_time - ) VALUES ( - #{username}, #{password}, #{createTime} - ) - - - - UPDATE users - - - , username = #{username} - - - , password = #{password} - - - WHERE id = #{id} - - - - DELETE FROM users - WHERE id = #{id} - - - - - - - - - diff --git a/lab-12/lab-12-mybatis-annotation/target/classes/mybatis-config.xml b/lab-12/lab-12-mybatis-annotation/target/classes/mybatis-config.xml deleted file mode 100644 index 725aa31a9..000000000 --- a/lab-12/lab-12-mybatis-annotation/target/classes/mybatis-config.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/lab-12/lab-12-mybatis-annotation/target/classes/sql/users.sql b/lab-12/lab-12-mybatis-annotation/target/classes/sql/users.sql deleted file mode 100644 index 02a9b8ebf..000000000 --- a/lab-12/lab-12-mybatis-annotation/target/classes/sql/users.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE `users` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', - `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号', - `password` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `idx_username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/lab-12/lab-12-mybatis-plus/target/classes/application.yaml b/lab-12/lab-12-mybatis-plus/target/classes/application.yaml deleted file mode 100644 index 80d6db895..000000000 --- a/lab-12/lab-12-mybatis-plus/target/classes/application.yaml +++ /dev/null @@ -1,30 +0,0 @@ -spring: - # datasource 数据源配置内容 - datasource: - url: jdbc:mysql://47.112.193.81:3306/testb5f4?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: testb5f4 - password: F4df4db0ed86@11 - -# mybatis-plus 配置内容 -mybatis-plus: - configuration: - map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 - global-config: - db-config: - id-type: auto # ID 主键自增 - logic-delete-value: 1 # 逻辑已删除值(默认为 1) - logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) - mapper-locations: classpath*:mapper/*.xml - type-aliases-package: cn.iocoder.springboot.lab12.mybatis.dataobject - -# logging -logging: - level: - # dao 开启 debug 模式 mybatis 输入 sql - cn: - iocoder: - springboot: - lab12: - mybatis: - mapper: debug diff --git a/lab-12/lab-12-mybatis-plus/target/classes/mapper/UserMapper.xml b/lab-12/lab-12-mybatis-plus/target/classes/mapper/UserMapper.xml deleted file mode 100644 index 91d31116b..000000000 --- a/lab-12/lab-12-mybatis-plus/target/classes/mapper/UserMapper.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - id, username, password, create_time - - - - - diff --git a/lab-12/lab-12-mybatis-plus/target/classes/sql/users.sql b/lab-12/lab-12-mybatis-plus/target/classes/sql/users.sql deleted file mode 100644 index 51658d314..000000000 --- a/lab-12/lab-12-mybatis-plus/target/classes/sql/users.sql +++ /dev/null @@ -1,9 +0,0 @@ -CREATE TABLE `users` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', - `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号', - `password` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `deleted` bit(1) DEFAULT NULL COMMENT '是否删除。0-未删除;1-删除', - PRIMARY KEY (`id`), - UNIQUE KEY `idx_username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/lab-12/lab-12-mybatis-tk/target/classes/application.yaml b/lab-12/lab-12-mybatis-tk/target/classes/application.yaml deleted file mode 100644 index 4d5361fc7..000000000 --- a/lab-12/lab-12-mybatis-tk/target/classes/application.yaml +++ /dev/null @@ -1,37 +0,0 @@ -spring: - # datasource 数据源配置内容 - datasource: - url: jdbc:mysql://47.112.193.81:3306/testb5f4?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: testb5f4 - password: F4df4db0ed86@11 - -# mybatis 配置内容 -mybatis: - config-location: classpath:mybatis-config.xml # 配置 MyBatis 配置文件路径 - mapper-locations: classpath:mapper/*.xml # 配置 Mapper XML 地址 - type-aliases-package: cn.iocoder.springboot.lab12.mybatis.dataobject # 配置数据库实体包路径 - -# mapper 配置内容 -mapper: - mappers: cn.iocoder.springboot.lab12.mybatis.util.BaseMapper # 设置基础 Mapper 接口 - not-empty: true # 在 INSERT 和 UPDATE 操作时,是否会判断字段是否为空。即 - identity: MYSQL - -# PageHelper 配置内容 -# 具体的参数作用,看 https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md -pagehelper: - helperDialect: mysql # 分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 你可以配置helperDialect属性来指定分页插件使用哪种方言。 - reasonable: true # 分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页, pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。 - supportMethodsArguments: true # 支持通过 Mapper 接口参数来传递分页参数,默认值false,分页插件会从查询方法的参数值中,自动根据上面 params 配置的字段中取值,查找到合适的值时就会自动分页。 使用方法可以参考测试代码中的 com.github.pagehelper.test.basic 包下的 ArgumentsMapTest 和 ArgumentsObjTest。 - -# logging -logging: - level: - # dao 开启 debug 模式 mybatis 输入 sql - cn: - iocoder: - springboot: - lab12: - mybatis: - mapper: debug diff --git a/lab-12/lab-12-mybatis-tk/target/classes/mapper/UserMapper.xml b/lab-12/lab-12-mybatis-tk/target/classes/mapper/UserMapper.xml deleted file mode 100644 index 91d31116b..000000000 --- a/lab-12/lab-12-mybatis-tk/target/classes/mapper/UserMapper.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - id, username, password, create_time - - - - - diff --git a/lab-12/lab-12-mybatis-tk/target/classes/mybatis-config.xml b/lab-12/lab-12-mybatis-tk/target/classes/mybatis-config.xml deleted file mode 100644 index 725aa31a9..000000000 --- a/lab-12/lab-12-mybatis-tk/target/classes/mybatis-config.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/lab-12/lab-12-mybatis-tk/target/classes/sql/users.sql b/lab-12/lab-12-mybatis-tk/target/classes/sql/users.sql deleted file mode 100644 index 02a9b8ebf..000000000 --- a/lab-12/lab-12-mybatis-tk/target/classes/sql/users.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE `users` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', - `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号', - `password` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `idx_username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/lab-12/lab-12-mybatis-xml/target/classes/application.yaml b/lab-12/lab-12-mybatis-xml/target/classes/application.yaml deleted file mode 100644 index 6c212cc5d..000000000 --- a/lab-12/lab-12-mybatis-xml/target/classes/application.yaml +++ /dev/null @@ -1,13 +0,0 @@ -spring: - # datasource 数据源配置内容 - datasource: - url: jdbc:mysql://47.112.193.81:3306/testb5f4?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: testb5f4 - password: F4df4db0ed86@11 - -# mybatis 配置内容 -mybatis: - config-location: classpath:mybatis-config.xml # 配置 MyBatis 配置文件路径 - mapper-locations: classpath:mapper/*.xml # 配置 Mapper XML 地址 - type-aliases-package: cn.iocoder.springboot.lab12.mybatis.dataobject # 配置数据库实体包路径 diff --git a/lab-12/lab-12-mybatis-xml/target/classes/mapper/UserMapper.xml b/lab-12/lab-12-mybatis-xml/target/classes/mapper/UserMapper.xml deleted file mode 100644 index 258432621..000000000 --- a/lab-12/lab-12-mybatis-xml/target/classes/mapper/UserMapper.xml +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - id, username, password, create_time - - - - INSERT INTO users ( - username, password, create_time - ) VALUES ( - #{username}, #{password}, #{createTime} - ) - - - - UPDATE users - - - , username = #{username} - - - , password = #{password} - - - WHERE id = #{id} - - - - DELETE FROM users - WHERE id = #{id} - - - - - - - - - diff --git a/lab-12/lab-12-mybatis-xml/target/classes/mybatis-config.xml b/lab-12/lab-12-mybatis-xml/target/classes/mybatis-config.xml deleted file mode 100644 index 725aa31a9..000000000 --- a/lab-12/lab-12-mybatis-xml/target/classes/mybatis-config.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/lab-12/lab-12-mybatis-xml/target/classes/sql/users.sql b/lab-12/lab-12-mybatis-xml/target/classes/sql/users.sql deleted file mode 100644 index 02a9b8ebf..000000000 --- a/lab-12/lab-12-mybatis-xml/target/classes/sql/users.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE `users` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', - `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号', - `password` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `idx_username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/lab-13/lab-13-jpa/target/classes/application.yaml b/lab-13/lab-13-jpa/target/classes/application.yaml deleted file mode 100644 index fd3004678..000000000 --- a/lab-13/lab-13-jpa/target/classes/application.yaml +++ /dev/null @@ -1,13 +0,0 @@ -spring: - # datasource 数据源配置内容 - datasource: - url: jdbc:mysql://47.112.193.81:3306/testb5f4?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: testb5f4 - password: F4df4db0ed86@11 - # JPA 配置内容,对应 JpaProperties 类 - jpa: - show-sql: true # 打印 SQL 。生产环境,建议关闭 - # Hibernate 配置内容,对应 HibernateProperties 类 - hibernate: - ddl-auto: none diff --git a/lab-14/lab-14-jdbctemplate/target/classes/application.yaml b/lab-14/lab-14-jdbctemplate/target/classes/application.yaml deleted file mode 100644 index a76803493..000000000 --- a/lab-14/lab-14-jdbctemplate/target/classes/application.yaml +++ /dev/null @@ -1,7 +0,0 @@ -spring: - # datasource 数据源配置内容 - datasource: - url: jdbc:mysql://47.112.193.81:3306/testb5f4?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: testb5f4 - password: F4df4db0ed86@11 diff --git a/lab-15/lab-15-spring-data-jest/target/classes/application.yaml b/lab-15/lab-15-spring-data-jest/target/classes/application.yaml deleted file mode 100644 index 60fb78cb8..000000000 --- a/lab-15/lab-15-spring-data-jest/target/classes/application.yaml +++ /dev/null @@ -1,5 +0,0 @@ -spring: - data: - # Jest 配置项 - jest: - uri: http://127.0.0.1:9200 diff --git a/lab-16/lab-16-spring-data-mongodb/target/classes/application.yaml b/lab-16/lab-16-spring-data-mongodb/target/classes/application.yaml deleted file mode 100644 index 9d5d76f03..000000000 --- a/lab-16/lab-16-spring-data-mongodb/target/classes/application.yaml +++ /dev/null @@ -1,18 +0,0 @@ -spring: - data: - # MongoDB 配置项,对应 MongoProperties 类 - mongodb: - host: 127.0.0.1 - port: 27017 - database: yourdatabase - username: test01 - password: password01 - # 上述属性,也可以只配置 uri - -logging: - level: - org: - springframework: - data: - mongodb: - core: DEBUG # 打印 mongodb 操作的具体语句。生产环境下,不建议开启。 diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/target/classes/application.yaml b/lab-17/lab-17-dynamic-datasource-baomidou-01/target/classes/application.yaml deleted file mode 100644 index 3519ce0bc..000000000 --- a/lab-17/lab-17-dynamic-datasource-baomidou-01/target/classes/application.yaml +++ /dev/null @@ -1,24 +0,0 @@ -spring: - datasource: - # dynamic-datasource-spring-boot-starter 动态数据源的配置内容 - dynamic: - primary: users # 设置默认的数据源或者数据源组,默认值即为 master - datasource: - # 订单 orders 数据源配置 - orders: - url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - # 用户 users 数据源配置 - users: - url: jdbc:mysql://127.0.0.1:3306/test_users?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - -# mybatis 配置内容 -mybatis: - config-location: classpath:mybatis-config.xml # 配置 MyBatis 配置文件路径 - mapper-locations: classpath:mapper/*.xml # 配置 Mapper XML 地址 - type-aliases-package: cn.iocoder.springboot.lab17.dynamicdatasource.dataobject # 配置数据库实体包路径 diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/target/classes/mapper/OrderMapper.xml b/lab-17/lab-17-dynamic-datasource-baomidou-01/target/classes/mapper/OrderMapper.xml deleted file mode 100644 index 4f436f200..000000000 --- a/lab-17/lab-17-dynamic-datasource-baomidou-01/target/classes/mapper/OrderMapper.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - id, user_id - - - - - diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/target/classes/mapper/UserMapper.xml b/lab-17/lab-17-dynamic-datasource-baomidou-01/target/classes/mapper/UserMapper.xml deleted file mode 100644 index 78e5a4150..000000000 --- a/lab-17/lab-17-dynamic-datasource-baomidou-01/target/classes/mapper/UserMapper.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - id, username - - - - - diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/target/classes/mybatis-config.xml b/lab-17/lab-17-dynamic-datasource-baomidou-01/target/classes/mybatis-config.xml deleted file mode 100644 index 725aa31a9..000000000 --- a/lab-17/lab-17-dynamic-datasource-baomidou-01/target/classes/mybatis-config.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-01/target/classes/sql/db.sql b/lab-17/lab-17-dynamic-datasource-baomidou-01/target/classes/sql/db.sql deleted file mode 100644 index caad40dd8..000000000 --- a/lab-17/lab-17-dynamic-datasource-baomidou-01/target/classes/sql/db.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE `users` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', - `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号', - PRIMARY KEY (`id`), - UNIQUE KEY `idx_username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; - - - -CREATE TABLE `orders` ( - `id` int(11) DEFAULT NULL COMMENT '订单编号', - `user_id` int(16) DEFAULT NULL COMMENT '用户编号' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-02/target/classes/application.yaml b/lab-17/lab-17-dynamic-datasource-baomidou-02/target/classes/application.yaml deleted file mode 100644 index 5fadfa7cf..000000000 --- a/lab-17/lab-17-dynamic-datasource-baomidou-02/target/classes/application.yaml +++ /dev/null @@ -1,30 +0,0 @@ -spring: - datasource: - # dynamic-datasource-spring-boot-starter 动态数据源的配置内容 - dynamic: - primary: master # 设置默认的数据源或者数据源组,默认值即为 master - datasource: - # 订单 orders 主库的数据源配置 - master: - url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - # 订单 orders 从库数据源配置 - slave_1: - url: jdbc:mysql://127.0.0.1:3306/test_orders_01?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - # 订单 orders 从库数据源配置 - slave_2: - url: jdbc:mysql://127.0.0.1:3306/test_orders_02?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - -# mybatis 配置内容 -mybatis: - config-location: classpath:mybatis-config.xml # 配置 MyBatis 配置文件路径 - mapper-locations: classpath:mapper/*.xml # 配置 Mapper XML 地址 - type-aliases-package: cn.iocoder.springboot.lab17.dynamicdatasource.dataobject # 配置数据库实体包路径 diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-02/target/classes/mapper/OrderMapper.xml b/lab-17/lab-17-dynamic-datasource-baomidou-02/target/classes/mapper/OrderMapper.xml deleted file mode 100644 index 211e893d5..000000000 --- a/lab-17/lab-17-dynamic-datasource-baomidou-02/target/classes/mapper/OrderMapper.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - id, user_id - - - - - - INSERT INTO orders ( - user_id - ) VALUES ( - #{userId} - ) - - - diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-02/target/classes/mybatis-config.xml b/lab-17/lab-17-dynamic-datasource-baomidou-02/target/classes/mybatis-config.xml deleted file mode 100644 index 725aa31a9..000000000 --- a/lab-17/lab-17-dynamic-datasource-baomidou-02/target/classes/mybatis-config.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/lab-17/lab-17-dynamic-datasource-baomidou-02/target/classes/sql/db.sql b/lab-17/lab-17-dynamic-datasource-baomidou-02/target/classes/sql/db.sql deleted file mode 100644 index caad40dd8..000000000 --- a/lab-17/lab-17-dynamic-datasource-baomidou-02/target/classes/sql/db.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE `users` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', - `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号', - PRIMARY KEY (`id`), - UNIQUE KEY `idx_username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; - - - -CREATE TABLE `orders` ( - `id` int(11) DEFAULT NULL COMMENT '订单编号', - `user_id` int(16) DEFAULT NULL COMMENT '用户编号' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; diff --git a/lab-17/lab-17-dynamic-datasource-jdbctemplate/target/classes/application.yaml b/lab-17/lab-17-dynamic-datasource-jdbctemplate/target/classes/application.yaml deleted file mode 100644 index 09f46ff48..000000000 --- a/lab-17/lab-17-dynamic-datasource-jdbctemplate/target/classes/application.yaml +++ /dev/null @@ -1,15 +0,0 @@ -spring: - # datasource 数据源配置内容 - datasource: - # 订单数据源配置 - orders: - jdbc-url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - # 用户数据源配置 - users: - jdbc-url: jdbc:mysql://127.0.0.1:3306/test_users?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/target/classes/application.yaml b/lab-17/lab-17-dynamic-datasource-mybatis/target/classes/application.yaml deleted file mode 100644 index 7033b7919..000000000 --- a/lab-17/lab-17-dynamic-datasource-mybatis/target/classes/application.yaml +++ /dev/null @@ -1,20 +0,0 @@ -spring: - # datasource 数据源配置内容 - datasource: - # 订单数据源配置 - orders: - jdbc-url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - # 用户数据源配置 - users: - jdbc-url: jdbc:mysql://127.0.0.1:3306/test_users?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - -# mybatis 配置内容 -#mybatis: -# config-location: classpath:mybatis-config.xml # 配置 MyBatis 配置文件路径 -# type-aliases-package: cn.iocoder.springboot.lab17.dynamicdatasource.dataobject # 配置数据库实体包路径 diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/target/classes/mapper/orders/OrderMapper.xml b/lab-17/lab-17-dynamic-datasource-mybatis/target/classes/mapper/orders/OrderMapper.xml deleted file mode 100644 index f1ea09f90..000000000 --- a/lab-17/lab-17-dynamic-datasource-mybatis/target/classes/mapper/orders/OrderMapper.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - id, user_id - - - - - diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/target/classes/mapper/users/UserMapper.xml b/lab-17/lab-17-dynamic-datasource-mybatis/target/classes/mapper/users/UserMapper.xml deleted file mode 100644 index 9079fad9d..000000000 --- a/lab-17/lab-17-dynamic-datasource-mybatis/target/classes/mapper/users/UserMapper.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - id, username - - - - - diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/target/classes/mybatis-config.xml b/lab-17/lab-17-dynamic-datasource-mybatis/target/classes/mybatis-config.xml deleted file mode 100644 index 725aa31a9..000000000 --- a/lab-17/lab-17-dynamic-datasource-mybatis/target/classes/mybatis-config.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/lab-17/lab-17-dynamic-datasource-mybatis/target/classes/sql/db.sql b/lab-17/lab-17-dynamic-datasource-mybatis/target/classes/sql/db.sql deleted file mode 100644 index caad40dd8..000000000 --- a/lab-17/lab-17-dynamic-datasource-mybatis/target/classes/sql/db.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE `users` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', - `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号', - PRIMARY KEY (`id`), - UNIQUE KEY `idx_username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; - - - -CREATE TABLE `orders` ( - `id` int(11) DEFAULT NULL COMMENT '订单编号', - `user_id` int(16) DEFAULT NULL COMMENT '用户编号' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; diff --git a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/target/classes/application.yaml b/lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/target/classes/application.yaml deleted file mode 100644 index 9cbfc1721..000000000 --- a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/target/classes/application.yaml +++ /dev/null @@ -1,35 +0,0 @@ -spring: - # ShardingSphere 配置项 - shardingsphere: - datasource: - # 所有数据源的名字 - names: ds-orders, ds-users - # 订单 orders 数据源配置 - ds-orders: - type: com.zaxxer.hikari.HikariDataSource # 使用 Hikari 数据库连接池 - driver-class-name: com.mysql.jdbc.Driver - jdbc-url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - username: root - password: - # 订单 users 数据源配置 - ds-users: - type: com.zaxxer.hikari.HikariDataSource # 使用 Hikari 数据库连接池 - driver-class-name: com.mysql.jdbc.Driver - jdbc-url: jdbc:mysql://127.0.0.1:3306/test_users?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - username: root - password: - # 分片规则 - sharding: - tables: - # orders 表配置 - orders: - actualDataNodes: ds-orders.orders # 映射到 ds-orders 数据源的 orders 表 - # users 表配置 - users: - actualDataNodes: ds-users.users # 映射到 ds-users 数据源的 users 表 - -# mybatis 配置内容 -mybatis: - config-location: classpath:mybatis-config.xml # 配置 MyBatis 配置文件路径 - mapper-locations: classpath:mapper/*.xml # 配置 Mapper XML 地址 - type-aliases-package: cn.iocoder.springboot.lab17.dynamicdatasource.dataobject # 配置数据库实体包路径 diff --git a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/target/classes/mapper/OrderMapper.xml b/lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/target/classes/mapper/OrderMapper.xml deleted file mode 100644 index 4f436f200..000000000 --- a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/target/classes/mapper/OrderMapper.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - id, user_id - - - - - diff --git a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/target/classes/mapper/UserMapper.xml b/lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/target/classes/mapper/UserMapper.xml deleted file mode 100644 index 78e5a4150..000000000 --- a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/target/classes/mapper/UserMapper.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - id, username - - - - - diff --git a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/target/classes/mybatis-config.xml b/lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/target/classes/mybatis-config.xml deleted file mode 100644 index 725aa31a9..000000000 --- a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/target/classes/mybatis-config.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/target/classes/sql/db.sql b/lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/target/classes/sql/db.sql deleted file mode 100644 index caad40dd8..000000000 --- a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-01/target/classes/sql/db.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE `users` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', - `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号', - PRIMARY KEY (`id`), - UNIQUE KEY `idx_username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; - - - -CREATE TABLE `orders` ( - `id` int(11) DEFAULT NULL COMMENT '订单编号', - `user_id` int(16) DEFAULT NULL COMMENT '用户编号' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; diff --git a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/target/classes/application.yaml b/lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/target/classes/application.yaml deleted file mode 100644 index 7a9af2c6f..000000000 --- a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/target/classes/application.yaml +++ /dev/null @@ -1,39 +0,0 @@ -spring: - # ShardingSphere 配置项 - shardingsphere: - # 数据源配置 - datasource: - # 所有数据源的名字 - names: ds-master, ds-slave-1, ds-slave-2 - # 订单 orders 主库的数据源配置 - ds-master: - type: com.zaxxer.hikari.HikariDataSource # 使用 Hikari 数据库连接池 - driver-class-name: com.mysql.jdbc.Driver - jdbc-url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - username: root - password: - # 订单 orders 从库数据源配置 - ds-slave-1: - type: com.zaxxer.hikari.HikariDataSource # 使用 Hikari 数据库连接池 - driver-class-name: com.mysql.jdbc.Driver - jdbc-url: jdbc:mysql://127.0.0.1:3306/test_orders_01?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - username: root - password: - # 订单 orders 从库数据源配置 - ds-slave-2: - type: com.zaxxer.hikari.HikariDataSource # 使用 Hikari 数据库连接池 - driver-class-name: com.mysql.jdbc.Driver - jdbc-url: jdbc:mysql://127.0.0.1:3306/test_orders_02?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - username: root - password: - # 读写分离配置,对应 YamlMasterSlaveRuleConfiguration 配置类 - masterslave: - name: ms # 名字,任意,需要保证唯一 - master-data-source-name: ds-master # 主库数据源 - slave-data-source-names: ds-slave-1, ds-slave-2 # 从库数据源 - -# mybatis 配置内容 -mybatis: - config-location: classpath:mybatis-config.xml # 配置 MyBatis 配置文件路径 - mapper-locations: classpath:mapper/*.xml # 配置 Mapper XML 地址 - type-aliases-package: cn.iocoder.springboot.lab17.dynamicdatasource.dataobject # 配置数据库实体包路径 diff --git a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/target/classes/mapper/OrderMapper.xml b/lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/target/classes/mapper/OrderMapper.xml deleted file mode 100644 index 211e893d5..000000000 --- a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/target/classes/mapper/OrderMapper.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - id, user_id - - - - - - INSERT INTO orders ( - user_id - ) VALUES ( - #{userId} - ) - - - diff --git a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/target/classes/mybatis-config.xml b/lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/target/classes/mybatis-config.xml deleted file mode 100644 index 725aa31a9..000000000 --- a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/target/classes/mybatis-config.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/target/classes/sql/db.sql b/lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/target/classes/sql/db.sql deleted file mode 100644 index caad40dd8..000000000 --- a/lab-17/lab-17-dynamic-datasource-sharding-jdbc-02/target/classes/sql/db.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE `users` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', - `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号', - PRIMARY KEY (`id`), - UNIQUE KEY `idx_username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; - - - -CREATE TABLE `orders` ( - `id` int(11) DEFAULT NULL COMMENT '订单编号', - `user_id` int(16) DEFAULT NULL COMMENT '用户编号' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; diff --git a/lab-17/lab-17-dynamic-datasource-springdatajpa/target/classes/application.yaml b/lab-17/lab-17-dynamic-datasource-springdatajpa/target/classes/application.yaml deleted file mode 100644 index c94619986..000000000 --- a/lab-17/lab-17-dynamic-datasource-springdatajpa/target/classes/application.yaml +++ /dev/null @@ -1,21 +0,0 @@ -spring: - # datasource 数据源配置内容 - datasource: - # 订单数据源配置 - orders: - jdbc-url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - # 用户数据源配置 - users: - jdbc-url: jdbc:mysql://127.0.0.1:3306/test_users?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - jpa: - show-sql: true # 打印 SQL 。生产环境,建议关闭 - # Hibernate 配置内容,对应 HibernateProperties 类 - hibernate: - ddl-auto: none - diff --git a/lab-17/lab-17-dynamic-datasource-springdatajpa/target/classes/sql/db.sql b/lab-17/lab-17-dynamic-datasource-springdatajpa/target/classes/sql/db.sql deleted file mode 100644 index caad40dd8..000000000 --- a/lab-17/lab-17-dynamic-datasource-springdatajpa/target/classes/sql/db.sql +++ /dev/null @@ -1,13 +0,0 @@ -CREATE TABLE `users` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', - `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号', - PRIMARY KEY (`id`), - UNIQUE KEY `idx_username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; - - - -CREATE TABLE `orders` ( - `id` int(11) DEFAULT NULL COMMENT '订单编号', - `user_id` int(16) DEFAULT NULL COMMENT '用户编号' -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; diff --git a/lab-18/lab-18-sharding-datasource-01/target/classes/application.yaml b/lab-18/lab-18-sharding-datasource-01/target/classes/application.yaml deleted file mode 100644 index 2ce793948..000000000 --- a/lab-18/lab-18-sharding-datasource-01/target/classes/application.yaml +++ /dev/null @@ -1,52 +0,0 @@ -spring: - # ShardingSphere 配置项 - shardingsphere: - datasource: - # 所有数据源的名字 - names: ds-orders-0, ds-orders-1 - # 订单 orders 数据源配置 00 - ds-orders-0: - type: com.zaxxer.hikari.HikariDataSource # 使用 Hikari 数据库连接池 - driver-class-name: com.mysql.jdbc.Driver - jdbc-url: jdbc:mysql://127.0.0.1:3306/lab18_orders_0?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - username: root - password: - # 订单 orders 数据源配置 01 - ds-orders-1: - type: com.zaxxer.hikari.HikariDataSource # 使用 Hikari 数据库连接池 - driver-class-name: com.mysql.jdbc.Driver - jdbc-url: jdbc:mysql://127.0.0.1:3306/lab18_orders_1?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - username: root - password: - # 分片规则 - sharding: - tables: - # orders 表配置 - orders: -# actualDataNodes: ds-orders-$->{0..1}.orders_$->{0..4} # 映射到 ds-orders 数据源的 orders 表 -# actualDataNodes: ds-orders-0.orders_0, ds-orders-0.orders_2, ds-orders-0.orders_4, ds-orders-0.orders_6, ds-orders-1.orders_1, ds-orders-1.orders_3, ds-orders-1.orders_5, ds-orders-1.orders_7 - actualDataNodes: ds-orders-0.orders_$->{[0,2,4,6]}, ds-orders-1.orders_$->{[1,3,5,7]} # 映射到 ds-orders-0 和 ds-orders-1 数据源的 orders 表们 - key-generator: # 主键生成策略 - column: id - type: SNOWFLAKE - database-strategy: - inline: - algorithm-expression: ds-orders-$->{user_id % 2} - sharding-column: user_id - table-strategy: - inline: - algorithm-expression: orders_$->{user_id % 8} - sharding-column: user_id - # order_config 表配置 - order_config: - actualDataNodes: ds-orders-0.order_config # 仅映射到 ds-orders-0 数据源的 order_config 表 - # 拓展属性配置 - props: - sql: - show: true # 打印 SQL - -# mybatis 配置内容 -mybatis: - config-location: classpath:mybatis-config.xml # 配置 MyBatis 配置文件路径 - mapper-locations: classpath:mapper/*.xml # 配置 Mapper XML 地址 - type-aliases-package: cn.iocoder.springboot.lab18.shardingdatasource.dataobject # 配置数据库实体包路径 diff --git a/lab-18/lab-18-sharding-datasource-01/target/classes/mapper/OrderConfigMapper.xml b/lab-18/lab-18-sharding-datasource-01/target/classes/mapper/OrderConfigMapper.xml deleted file mode 100644 index 9a8e9ee36..000000000 --- a/lab-18/lab-18-sharding-datasource-01/target/classes/mapper/OrderConfigMapper.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - id, pay_timeout - - - - - diff --git a/lab-18/lab-18-sharding-datasource-01/target/classes/mapper/OrderMapper.xml b/lab-18/lab-18-sharding-datasource-01/target/classes/mapper/OrderMapper.xml deleted file mode 100644 index f4fc92bda..000000000 --- a/lab-18/lab-18-sharding-datasource-01/target/classes/mapper/OrderMapper.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - id, user_id - - - - - - - - INSERT INTO orders ( - user_id - ) VALUES ( - #{userId} - ) - - - diff --git a/lab-18/lab-18-sharding-datasource-01/target/classes/mybatis-config.xml b/lab-18/lab-18-sharding-datasource-01/target/classes/mybatis-config.xml deleted file mode 100644 index 725aa31a9..000000000 --- a/lab-18/lab-18-sharding-datasource-01/target/classes/mybatis-config.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/lab-18/lab-18-sharding-datasource-01/target/classes/sql/lab18_orders_0.sql b/lab-18/lab-18-sharding-datasource-01/target/classes/sql/lab18_orders_0.sql deleted file mode 100644 index 925e53b15..000000000 --- a/lab-18/lab-18-sharding-datasource-01/target/classes/sql/lab18_orders_0.sql +++ /dev/null @@ -1,56 +0,0 @@ -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - --- ---------------------------- --- Table structure for orders_0 --- ---------------------------- -DROP TABLE IF EXISTS `orders_0`; -CREATE TABLE `orders_0` ( - `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号', - `user_id` int(16) DEFAULT NULL COMMENT '用户编号', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; - --- ---------------------------- --- Table structure for orders_2 --- ---------------------------- -DROP TABLE IF EXISTS `orders_2`; -CREATE TABLE `orders_2` ( - `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号', - `user_id` int(16) DEFAULT NULL COMMENT '用户编号', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; - --- ---------------------------- --- Table structure for orders_4 --- ---------------------------- -DROP TABLE IF EXISTS `orders_4`; -CREATE TABLE `orders_4` ( - `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号', - `user_id` int(16) DEFAULT NULL COMMENT '用户编号', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; - --- ---------------------------- --- Table structure for orders_6 --- ---------------------------- -DROP TABLE IF EXISTS `orders_6`; -CREATE TABLE `orders_6` ( - `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号', - `user_id` int(16) DEFAULT NULL COMMENT '用户编号', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; - - --- ---------------------------- --- Table structure for order_config --- ---------------------------- -DROP TABLE IF EXISTS `order_config`; -CREATE TABLE `order_config` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '编号', - `pay_timeout` int(11) DEFAULT NULL COMMENT '支付超时时间;单位:分钟', - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4; - -SET FOREIGN_KEY_CHECKS = 1; - diff --git a/lab-18/lab-18-sharding-datasource-01/target/classes/sql/lab18_orders_1.sql b/lab-18/lab-18-sharding-datasource-01/target/classes/sql/lab18_orders_1.sql deleted file mode 100644 index 10d77a68d..000000000 --- a/lab-18/lab-18-sharding-datasource-01/target/classes/sql/lab18_orders_1.sql +++ /dev/null @@ -1,44 +0,0 @@ -SET NAMES utf8mb4; -SET FOREIGN_KEY_CHECKS = 0; - --- ---------------------------- --- Table structure for orders_1 --- ---------------------------- -DROP TABLE IF EXISTS `orders_1`; -CREATE TABLE `orders_1` ( - `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号', - `user_id` int(16) DEFAULT NULL COMMENT '用户编号', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=400675304294580226 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; - --- ---------------------------- --- Table structure for orders_3 --- ---------------------------- -DROP TABLE IF EXISTS `orders_3`; -CREATE TABLE `orders_3` ( - `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号', - `user_id` int(16) DEFAULT NULL COMMENT '用户编号', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; - --- ---------------------------- --- Table structure for orders_5 --- ---------------------------- -DROP TABLE IF EXISTS `orders_5`; -CREATE TABLE `orders_5` ( - `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号', - `user_id` int(16) DEFAULT NULL COMMENT '用户编号', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; - --- ---------------------------- --- Table structure for orders_7 --- ---------------------------- -DROP TABLE IF EXISTS `orders_7`; -CREATE TABLE `orders_7` ( - `id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '订单编号', - `user_id` int(16) DEFAULT NULL COMMENT '用户编号', - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='订单表'; - -SET FOREIGN_KEY_CHECKS = 1; diff --git a/lab-18/lab-18-sharding-datasource-02/target/classes/application.yaml b/lab-18/lab-18-sharding-datasource-02/target/classes/application.yaml deleted file mode 100644 index f70792b40..000000000 --- a/lab-18/lab-18-sharding-datasource-02/target/classes/application.yaml +++ /dev/null @@ -1,49 +0,0 @@ -spring: - # ShardingSphere 配置项 - shardingsphere: - # 数据源配置 - datasource: - # 所有数据源的名字 - names: ds-master, ds-slave-1, ds-slave-2 - # 订单 orders 主库的数据源配置 - ds-master: - type: com.zaxxer.hikari.HikariDataSource # 使用 Hikari 数据库连接池 - driver-class-name: com.mysql.jdbc.Driver - jdbc-url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - username: root - password: - # 订单 orders 从库数据源配置 - ds-slave-1: - type: com.zaxxer.hikari.HikariDataSource # 使用 Hikari 数据库连接池 - driver-class-name: com.mysql.jdbc.Driver - jdbc-url: jdbc:mysql://127.0.0.1:3306/test_orders_01?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - username: root - password: - # 订单 orders 从库数据源配置 - ds-slave-2: - type: com.zaxxer.hikari.HikariDataSource # 使用 Hikari 数据库连接池 - driver-class-name: com.mysql.jdbc.Driver - jdbc-url: jdbc:mysql://127.0.0.1:3306/test_orders_02?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - username: root - password: - # 读写分离配置,对应 YamlMasterSlaveRuleConfiguration 配置类 - masterslave: - name: ms # 名字,任意,需要保证唯一 - master-data-source-name: ds-master # 主库数据源 - slave-data-source-names: ds-slave-1, ds-slave-2 # 从库数据源 - # 拓展属性配置 - props: - sql: - show: true # 打印 SQL - -# mybatis-plus 配置内容 -mybatis-plus: - configuration: - map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 - global-config: - db-config: - id-type: none # 虽然 MyBatis Plus 也提供 ID 生成策略,但是还是使用 Sharding-JDBC 的 - logic-delete-value: 1 # 逻辑已删除值(默认为 1) - logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) - mapper-locations: classpath*:mapper/*.xml - type-aliases-package: cn.iocoder.springboot.lab18.shardingdatasource.dataobject diff --git a/lab-19/lab-19-datasource-pool-druid-multiple/target/classes/application.yaml b/lab-19/lab-19-datasource-pool-druid-multiple/target/classes/application.yaml deleted file mode 100644 index df840d94e..000000000 --- a/lab-19/lab-19-datasource-pool-druid-multiple/target/classes/application.yaml +++ /dev/null @@ -1,35 +0,0 @@ -spring: - # datasource 数据源配置内容 - datasource: - # 订单数据源配置 - orders: - url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - type: com.alibaba.druid.pool.DruidDataSource # 设置类型为 DruidDataSource - # Druid 自定义配置,对应 DruidDataSource 中的 setting 方法的属性 - min-idle: 0 # 池中维护的最小空闲连接数,默认为 0 个。 - max-active: 20 # 池中最大连接数,包括闲置和使用中的连接,默认为 8 个。 - # 用户数据源配置 - users: - url: jdbc:mysql://127.0.0.1:3306/test_users?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - type: com.alibaba.druid.pool.DruidDataSource # 设置类型为 DruidDataSource - # Druid 自定义配置,对应 DruidDataSource 中的 setting 方法的属性 - min-idle: 0 # 池中维护的最小空闲连接数,默认为 0 个。 - max-active: 20 # 池中最大连接数,包括闲置和使用中的连接,默认为 8 个。 - # Druid 自定已配置 - druid: - # 过滤器配置 - filter: - stat: # 配置 StatFilter ,对应文档 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter - log-slow-sql: true # 开启慢查询记录 - slow-sql-millis: 5000 # 慢 SQL 的标准,单位:毫秒 - # StatViewServlet 配置 - stat-view-servlet: # 配置 StatViewServlet ,对应文档 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE - enabled: true # 是否开启 StatViewServlet - login-username: yudaoyuanma # 账号 - login-password: javaniubi # 密码 diff --git a/lab-19/lab-19-datasource-pool-druid-single/target/classes/application.yaml b/lab-19/lab-19-datasource-pool-druid-single/target/classes/application.yaml deleted file mode 100644 index 9c4420b83..000000000 --- a/lab-19/lab-19-datasource-pool-druid-single/target/classes/application.yaml +++ /dev/null @@ -1,20 +0,0 @@ -spring: - # datasource 数据源配置内容,对应 DataSourceProperties 配置属性类 - datasource: - url: jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root # 数据库账号 - password: # 数据库密码 - type: com.alibaba.druid.pool.DruidDataSource # 设置类型为 DruidDataSource - # Druid 自定义配置,对应 DruidDataSource 中的 setting 方法的属性 - druid: - min-idle: 0 # 池中维护的最小空闲连接数,默认为 0 个。 - max-active: 20 # 池中最大连接数,包括闲置和使用中的连接,默认为 8 个。 - filter: - stat: # 配置 StatFilter ,对应文档 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter - log-slow-sql: true # 开启慢查询记录 - slow-sql-millis: 5000 # 慢 SQL 的标准,单位:毫秒 - stat-view-servlet: # 配置 StatViewServlet ,对应文档 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE - enabled: true # 是否开启 StatViewServlet - login-username: yudaoyuanma # 账号 - login-password: javaniubi # 密码 diff --git a/lab-19/lab-19-datasource-pool-hikaricp-multiple/target/classes/application.yaml b/lab-19/lab-19-datasource-pool-hikaricp-multiple/target/classes/application.yaml deleted file mode 100644 index ff511b495..000000000 --- a/lab-19/lab-19-datasource-pool-hikaricp-multiple/target/classes/application.yaml +++ /dev/null @@ -1,23 +0,0 @@ -spring: - # datasource 数据源配置内容 - datasource: - # 订单数据源配置 - orders: - url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - # HikariCP 自定义配置,对应 HikariConfig 配置属性类 - hikari: - minimum-idle: 20 # 池中维护的最小空闲连接数,默认为 10 个。 - maximum-pool-size: 20 # 池中最大连接数,包括闲置和使用中的连接,默认为 10 个。 - # 用户数据源配置 - users: - url: jdbc:mysql://127.0.0.1:3306/test_users?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - # HikariCP 自定义配置,对应 HikariConfig 配置属性类 - hikari: - minimum-idle: 15 # 池中维护的最小空闲连接数,默认为 10 个。 - maximum-pool-size: 15 # 池中最大连接数,包括闲置和使用中的连接,默认为 10 个。 diff --git a/lab-19/lab-19-datasource-pool-hikaricp-single/target/classes/application.yaml b/lab-19/lab-19-datasource-pool-hikaricp-single/target/classes/application.yaml deleted file mode 100644 index f253a51c9..000000000 --- a/lab-19/lab-19-datasource-pool-hikaricp-single/target/classes/application.yaml +++ /dev/null @@ -1,11 +0,0 @@ -spring: - # datasource 数据源配置内容,对应 DataSourceProperties 配置属性类 - datasource: - url: jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root # 数据库账号 - password: # 数据库密码 - # HikariCP 自定义配置,对应 HikariConfig 配置属性类 - hikari: - minimum-idle: 20 # 池中维护的最小空闲连接数,默认为 10 个。 - maximum-pool-size: 20 # 池中最大连接数,包括闲置和使用中的连接,默认为 10 个。 diff --git a/lab-20/lab-20-database-version-control-flyway/target/classes/application.yaml b/lab-20/lab-20-database-version-control-flyway/target/classes/application.yaml deleted file mode 100644 index ff3168393..000000000 --- a/lab-20/lab-20-database-version-control-flyway/target/classes/application.yaml +++ /dev/null @@ -1,18 +0,0 @@ -spring: - # datasource 数据源配置内容,对应 DataSourceProperties 配置属性类 - datasource: - url: jdbc:mysql://127.0.0.1:3306/lab-20-flyway?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root # 数据库账号 - password: # 数据库密码 - # flyway 配置内容,对应 FlywayAutoConfiguration.FlywayConfiguration 配置项 - flyway: - enabled: true # 开启 Flyway 功能 - cleanDisabled: true # 禁用 Flyway 所有的 drop 相关的逻辑,避免出现跑路的情况。 - locations: # 迁移脚本目录 - - classpath:db/migration # 配置 SQL-based 的 SQL 脚本在该目录下 - - classpath:cn.iocoder.springboot.lab20.databaseversioncontrol.migration # 配置 Java-based 的 Java 文件在该目录下 - check-location: false # 是否校验迁移脚本目录下。如果配置为 true ,代表需要校验。此时,如果目录下没有迁移脚本,会抛出 IllegalStateException 异常 - url: jdbc:mysql://127.0.0.1:3306/lab-20-flyway?useSSL=false&useUnicode=true&characterEncoding=UTF-8 # 数据库地址 - user: root # 数据库账号 - password: # 数据库密码 diff --git a/lab-20/lab-20-database-version-control-flyway/target/classes/db/migration/V1.0__INIT_DB.sql b/lab-20/lab-20-database-version-control-flyway/target/classes/db/migration/V1.0__INIT_DB.sql deleted file mode 100644 index 10a494abb..000000000 --- a/lab-20/lab-20-database-version-control-flyway/target/classes/db/migration/V1.0__INIT_DB.sql +++ /dev/null @@ -1,12 +0,0 @@ --- 创建用户表 -CREATE TABLE `users` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', - `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号', - `password` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `idx_username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; - --- 插入一条数据 -INSERT INTO `users`(username, password, create_time) VALUES('yudaoyuanma', 'password', now()); diff --git a/lab-20/lab-20-database-version-control-liquibase/target/classes/application.yaml b/lab-20/lab-20-database-version-control-liquibase/target/classes/application.yaml deleted file mode 100644 index eb76689bb..000000000 --- a/lab-20/lab-20-database-version-control-liquibase/target/classes/application.yaml +++ /dev/null @@ -1,14 +0,0 @@ -spring: - # datasource 数据源配置内容,对应 DataSourceProperties 配置属性类 - datasource: - url: jdbc:mysql://127.0.0.1:3306/lab-20-liquibase?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root # 数据库账号 - password: # 数据库密码 - # Liquibase 配置内容,对应 LiquibaseProperties 配置项 - liquibase: - enabled: true # 开启 Liquibase 功能。默认为 true 。 - change-log: classpath:/db/changelog/db.changelog-master.yaml # Liquibase 配置文件地址 - url: jdbc:mysql://127.0.0.1:3306/lab-20-liquibase?useSSL=false&useUnicode=true&characterEncoding=UTF-8 # 数据库地址 - user: root # 数据库账号 - password: # 数据库密码 diff --git a/lab-20/lab-20-database-version-control-liquibase/target/classes/db/changelog/db.changelog-master-bak.yaml b/lab-20/lab-20-database-version-control-liquibase/target/classes/db/changelog/db.changelog-master-bak.yaml deleted file mode 100644 index 7935ec2fa..000000000 --- a/lab-20/lab-20-database-version-control-liquibase/target/classes/db/changelog/db.changelog-master-bak.yaml +++ /dev/null @@ -1 +0,0 @@ -databaseChangeLog: diff --git a/lab-20/lab-20-database-version-control-liquibase/target/classes/db/changelog/db.changelog-master.yaml b/lab-20/lab-20-database-version-control-liquibase/target/classes/db/changelog/db.changelog-master.yaml deleted file mode 100644 index 64e9f4bcb..000000000 --- a/lab-20/lab-20-database-version-control-liquibase/target/classes/db/changelog/db.changelog-master.yaml +++ /dev/null @@ -1,62 +0,0 @@ -databaseChangeLog: - - changeSet: # 对应一个 ChangeSet 对象 - id: 0 # ChangeSet 编号 - author: yunai # 作者 - comments: 空 # 备注 - - changeSet: # 对应一个 ChangeSet 对象 - id: 1 # ChangeSet 编号 - author: yunai # 作者 - comments: 初始化 users 表 # 备注 - changes: # 对应 Change 数组。Change 是一个接口,每种操作对应一种 Change 实现类 - - createTable: # 创建表,对应 CreateTableChange 对象。 - tableName: users # 表名 - remarkds: 用户表 # 表注释 - columns: # 对应 ColumnConfig 数组 - - column: - name: id # 字段名 - type: int # 字段类型 - autoIncrement: true # 自增 - constraints: # 限制条件,对应一个 ConstraintsConfig 对象 - primaryKey: true # 主键 - nullable: false # 不允许空 - - column: - name: username - type: varchar(64) - constraints: - nullable: false - - column: - name: password - type: varchar(32) - constraints: - nullable: false - - column: - name: create_time - type: datetime - constraints: - nullable: false - - insert: # 插入记录,对应 InsertDataChange 对象。 - tableName: users # 表名 - columns: # 对应 ColumnConfig 数组 - - column: - name: username # 字段名 - value: yudaoyuanma # 值 - - column: - name: password - value: password - - column: - name: create_time - value: now() - - changeSet: # 对应一个 ChangeSet 对象 - id: 2 # ChangeSet 编号 - author: yunai # 作者 - comments: 初始化 users2 表 # 备注 - changes: # 对应 Change 数组。Change 是一个接口,每种操作对应一种 Change 实现类 - - sqlFile: # 使用 SQL 文件,对应 SQLFileChange 对象 - encoding: utf8 - path: classpath:db/changelog/sqlfile/CHAGE_SET_2_INIT_DB.sql - - changeSet: # 对应一个 ChangeSet 对象 - id: 3 # ChangeSet 编号 - author: yunai # 作者 - comments: 修复 `users` 的用户名 # 备注 - changes: # 对应 Change 数组。Change 是一个接口,每种操作对应一种 Change 实现类 - - customChange: {class: cn.iocoder.springboot.lab20.databaseversioncontrol.migration.CHANGE_SET_3_FixUsername} # 对应 CustomTaskChange diff --git a/lab-20/lab-20-database-version-control-liquibase/target/classes/db/changelog/sqlfile/CHAGE_SET_2_INIT_DB.sql b/lab-20/lab-20-database-version-control-liquibase/target/classes/db/changelog/sqlfile/CHAGE_SET_2_INIT_DB.sql deleted file mode 100644 index 327cdcf19..000000000 --- a/lab-20/lab-20-database-version-control-liquibase/target/classes/db/changelog/sqlfile/CHAGE_SET_2_INIT_DB.sql +++ /dev/null @@ -1,12 +0,0 @@ --- 创建用户表 -CREATE TABLE `users2` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', - `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号', - `password` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `idx_username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; - --- 插入一条数据 -INSERT INTO `users2`(username, password, create_time) VALUES('yudaoyuanma', 'password', now()); diff --git a/lab-20/pom.xml b/lab-20/pom.xml index 5d21b3b76..cc130994b 100644 --- a/lab-20/pom.xml +++ b/lab-20/pom.xml @@ -12,7 +12,6 @@ lab-20 pom - lab-20-database-version-control lab-20-database-version-control-flyway lab-20-database-version-control-liquibase diff --git a/lab-21/lab-21-cache-demo/target/classes/application.yaml b/lab-21/lab-21-cache-demo/target/classes/application.yaml deleted file mode 100644 index 1ed615a79..000000000 --- a/lab-21/lab-21-cache-demo/target/classes/application.yaml +++ /dev/null @@ -1,30 +0,0 @@ -spring: - # datasource 数据源配置内容 - datasource: - url: jdbc:mysql://127.0.0.1:3306/lab-21-cache-demo?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - -# mybatis-plus 配置内容 -mybatis-plus: - configuration: - map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 - global-config: - db-config: - id-type: auto # ID 主键自增 - logic-delete-value: 1 # 逻辑已删除值(默认为 1) - logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) - mapper-locations: classpath*:mapper/*.xml - type-aliases-package: cn.iocoder.springboot.lab21.cache.dataobject - -# logging -logging: - level: - # dao 开启 debug 模式 mybatis 输入 sql - cn: - iocoder: - springboot: - lab21: - cache: - mapper: debug diff --git a/lab-21/lab-21-cache-demo/target/classes/sql/users.sql b/lab-21/lab-21-cache-demo/target/classes/sql/users.sql deleted file mode 100644 index 51658d314..000000000 --- a/lab-21/lab-21-cache-demo/target/classes/sql/users.sql +++ /dev/null @@ -1,9 +0,0 @@ -CREATE TABLE `users` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', - `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号', - `password` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `deleted` bit(1) DEFAULT NULL COMMENT '是否删除。0-未删除;1-删除', - PRIMARY KEY (`id`), - UNIQUE KEY `idx_username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/lab-21/lab-21-cache-ehcache/target/classes/application.yaml b/lab-21/lab-21-cache-ehcache/target/classes/application.yaml deleted file mode 100644 index daba8f9ee..000000000 --- a/lab-21/lab-21-cache-ehcache/target/classes/application.yaml +++ /dev/null @@ -1,33 +0,0 @@ -spring: - # datasource 数据源配置内容 - datasource: - url: jdbc:mysql://127.0.0.1:3306/lab-21-cache-demo?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - # cache 缓存配置内容 - cache: - type: ehcache - -# mybatis-plus 配置内容 -mybatis-plus: - configuration: - map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 - global-config: - db-config: - id-type: auto # ID 主键自增 - logic-delete-value: 1 # 逻辑已删除值(默认为 1) - logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) - mapper-locations: classpath*:mapper/*.xml - type-aliases-package: cn.iocoder.springboot.lab21.cache.dataobject - -# logging -logging: - level: - # dao 开启 debug 模式 mybatis 输入 sql - cn: - iocoder: - springboot: - lab21: - cache: - mapper: debug diff --git a/lab-21/lab-21-cache-ehcache/target/classes/ehcache.xml b/lab-21/lab-21-cache-ehcache/target/classes/ehcache.xml deleted file mode 100644 index 8c182cc46..000000000 --- a/lab-21/lab-21-cache-ehcache/target/classes/ehcache.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - diff --git a/lab-21/lab-21-cache-ehcache/target/classes/sql/users.sql b/lab-21/lab-21-cache-ehcache/target/classes/sql/users.sql deleted file mode 100644 index cd71c4a8c..000000000 --- a/lab-21/lab-21-cache-ehcache/target/classes/sql/users.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE `users` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', - `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号', - `password` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `deleted` bit(1) DEFAULT NULL COMMENT '是否删除。0-未删除;1-删除', - PRIMARY KEY (`id`), - UNIQUE KEY `idx_username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; - -INSERT INTO `users`(`id`, `username`, `password`, `create_time`, `deleted`) VALUES (1, 'yudaoyuanma', 'buzhidao', now(), 0); diff --git a/lab-21/lab-21-cache-redis/target/classes/application.yaml b/lab-21/lab-21-cache-redis/target/classes/application.yaml deleted file mode 100644 index 6d983d2b2..000000000 --- a/lab-21/lab-21-cache-redis/target/classes/application.yaml +++ /dev/null @@ -1,47 +0,0 @@ -spring: - # datasource 数据源配置内容 - datasource: - url: jdbc:mysql://127.0.0.1:3306/lab-21-cache-demo?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - # 对应 RedisProperties 类 - redis: - host: 127.0.0.1 - port: 6379 - password: # Redis 服务器密码,默认为空。生产中,一定要设置 Redis 密码! - database: 0 # Redis 数据库号,默认为 0 。 - timeout: 0 # Redis 连接超时时间,单位:毫秒。 - # 对应 RedisProperties.Jedis 内部类 - jedis: - pool: - max-active: 8 # 连接池最大连接数,默认为 8 。使用负数表示没有限制。 - max-idle: 8 # 默认连接数最小空闲的连接数,默认为 8 。使用负数表示没有限制。 - min-idle: 0 # 默认连接池最小空闲的连接数,默认为 0 。允许设置 0 和 正数。 - max-wait: -1 # 连接池最大阻塞等待时间,单位:毫秒。默认为 -1 ,表示不限制。 - # cache 缓存配置内容 - cache: - type: redis - -# mybatis-plus 配置内容 -mybatis-plus: - configuration: - map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 - global-config: - db-config: - id-type: auto # ID 主键自增 - logic-delete-value: 1 # 逻辑已删除值(默认为 1) - logic-not-delete-value: 0 # 逻辑未删除值(默认为 0) - mapper-locations: classpath*:mapper/*.xml - type-aliases-package: cn.iocoder.springboot.lab21.cache.dataobject - -# logging -logging: - level: - # dao 开启 debug 模式 mybatis 输入 sql - cn: - iocoder: - springboot: - lab21: - cache: - mapper: debug diff --git a/lab-21/lab-21-cache-redis/target/classes/sql/users.sql b/lab-21/lab-21-cache-redis/target/classes/sql/users.sql deleted file mode 100644 index cd71c4a8c..000000000 --- a/lab-21/lab-21-cache-redis/target/classes/sql/users.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE TABLE `users` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', - `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号', - `password` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - `deleted` bit(1) DEFAULT NULL COMMENT '是否删除。0-未删除;1-删除', - PRIMARY KEY (`id`), - UNIQUE KEY `idx_username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; - -INSERT INTO `users`(`id`, `username`, `password`, `create_time`, `deleted`) VALUES (1, 'yudaoyuanma', 'buzhidao', now(), 0); diff --git a/lab-22/lab-22-validation-01/target/classes/application.yaml b/lab-22/lab-22-validation-01/target/classes/application.yaml deleted file mode 100644 index 310231bbf..000000000 --- a/lab-22/lab-22-validation-01/target/classes/application.yaml +++ /dev/null @@ -1,5 +0,0 @@ -spring: - # i18 message 配置,对应 MessageSourceProperties 配置类 - messages: - basename: i18n/messages # 文件路径基础名 - encoding: UTF-8 # 使用 UTF-8 编码 diff --git a/lab-22/lab-22-validation-01/target/classes/i18n/messages.properties b/lab-22/lab-22-validation-01/target/classes/i18n/messages.properties deleted file mode 100644 index f47c87f2e..000000000 --- a/lab-22/lab-22-validation-01/target/classes/i18n/messages.properties +++ /dev/null @@ -1 +0,0 @@ -UserUpdateDTO.id.NotNull=用户编号不能为空 diff --git a/lab-22/lab-22-validation-01/target/classes/i18n/messages_en.properties b/lab-22/lab-22-validation-01/target/classes/i18n/messages_en.properties deleted file mode 100644 index 6bcd6c283..000000000 --- a/lab-22/lab-22-validation-01/target/classes/i18n/messages_en.properties +++ /dev/null @@ -1 +0,0 @@ -UserUpdateDTO.id.NotNull=userId cannot be empty diff --git a/lab-22/lab-22-validation-01/target/classes/i18n/messages_ja.properties b/lab-22/lab-22-validation-01/target/classes/i18n/messages_ja.properties deleted file mode 100644 index ddc6c9fa4..000000000 --- a/lab-22/lab-22-validation-01/target/classes/i18n/messages_ja.properties +++ /dev/null @@ -1 +0,0 @@ -UserUpdateDTO.id.NotNull=ユーザー番号は空にできません diff --git a/lab-26/lab-26-distributed-session-01/target/classes/application.yaml b/lab-26/lab-26-distributed-session-01/target/classes/application.yaml deleted file mode 100644 index 6f683b2ab..000000000 --- a/lab-26/lab-26-distributed-session-01/target/classes/application.yaml +++ /dev/null @@ -1,15 +0,0 @@ -spring: - # 对应 RedisProperties 类 - redis: - host: 127.0.0.1 - port: 6379 - password: # Redis 服务器密码,默认为空。生产中,一定要设置 Redis 密码! - database: 0 # Redis 数据库号,默认为 0 。 - timeout: 0 # Redis 连接超时时间,单位:毫秒。 - # 对应 RedisProperties.Jedis 内部类 - jedis: - pool: - max-active: 8 # 连接池最大连接数,默认为 8 。使用负数表示没有限制。 - max-idle: 8 # 默认连接数最大空闲的连接数,默认为 8 。使用负数表示没有限制。 - min-idle: 0 # 默认连接池最小空闲的连接数,默认为 0 。允许设置 0 和 正数。 - max-wait: -1 # 连接池最大阻塞等待时间,单位:毫秒。默认为 -1 ,表示不限制。 diff --git a/lab-26/lab-26-distributed-session-02/target/classes/application.yaml b/lab-26/lab-26-distributed-session-02/target/classes/application.yaml deleted file mode 100644 index 9d5d76f03..000000000 --- a/lab-26/lab-26-distributed-session-02/target/classes/application.yaml +++ /dev/null @@ -1,18 +0,0 @@ -spring: - data: - # MongoDB 配置项,对应 MongoProperties 类 - mongodb: - host: 127.0.0.1 - port: 27017 - database: yourdatabase - username: test01 - password: password01 - # 上述属性,也可以只配置 uri - -logging: - level: - org: - springframework: - data: - mongodb: - core: DEBUG # 打印 mongodb 操作的具体语句。生产环境下,不建议开启。 diff --git a/lab-26/lab-26-distributed-session-springsecurity/target/classes/application.yaml b/lab-26/lab-26-distributed-session-springsecurity/target/classes/application.yaml deleted file mode 100644 index 52aa5ea35..000000000 --- a/lab-26/lab-26-distributed-session-springsecurity/target/classes/application.yaml +++ /dev/null @@ -1,20 +0,0 @@ -spring: - # 对应 RedisProperties 类 - redis: - host: 127.0.0.1 - port: 6379 - password: # Redis 服务器密码,默认为空。生产中,一定要设置 Redis 密码! - database: 0 # Redis 数据库号,默认为 0 。 - timeout: 0 # Redis 连接超时时间,单位:毫秒。 - # 对应 RedisProperties.Jedis 内部类 - jedis: - pool: - max-active: 8 # 连接池最大连接数,默认为 8 。使用负数表示没有限制。 - max-idle: 8 # 默认连接数最大空闲的连接数,默认为 8 。使用负数表示没有限制。 - min-idle: 0 # 默认连接池最小空闲的连接数,默认为 0 。允许设置 0 和 正数。 - max-wait: -1 # 连接池最大阻塞等待时间,单位:毫秒。默认为 -1 ,表示不限制。 - # 对应 SecurityProperties 类 - security: - user: # 配置内存中,可登陆的用户名和密码 - name: yudaoyuanma - password: nicai diff --git a/lab-27/lab-27-webflux-elasticsearch/target/classes/application.yaml b/lab-27/lab-27-webflux-elasticsearch/target/classes/application.yaml deleted file mode 100644 index 75b3ecc8a..000000000 --- a/lab-27/lab-27-webflux-elasticsearch/target/classes/application.yaml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - data: - # Elasticsearch 配置项 - elasticsearch: - client: - # 对应 ReactiveRestClientProperties 配置类 - reactive: - endpoints: 127.0.0.1:9200 # ES Restful API 地址 diff --git a/lab-27/lab-27-webflux-mongodb/target/classes/application.yaml b/lab-27/lab-27-webflux-mongodb/target/classes/application.yaml deleted file mode 100644 index 9d5d76f03..000000000 --- a/lab-27/lab-27-webflux-mongodb/target/classes/application.yaml +++ /dev/null @@ -1,18 +0,0 @@ -spring: - data: - # MongoDB 配置项,对应 MongoProperties 类 - mongodb: - host: 127.0.0.1 - port: 27017 - database: yourdatabase - username: test01 - password: password01 - # 上述属性,也可以只配置 uri - -logging: - level: - org: - springframework: - data: - mongodb: - core: DEBUG # 打印 mongodb 操作的具体语句。生产环境下,不建议开启。 diff --git a/lab-27/lab-27-webflux-r2dbc/target/classes/application.yaml b/lab-27/lab-27-webflux-r2dbc/target/classes/application.yaml deleted file mode 100644 index 11684d15a..000000000 --- a/lab-27/lab-27-webflux-r2dbc/target/classes/application.yaml +++ /dev/null @@ -1,13 +0,0 @@ -spring: - # R2DBC 配置,对应 R2dbcProperties 配置类 - r2dbc: - url: mysql://47.112.193.81:3306/lab-27-webflux-r2dbc - username: lab-27-webflux-r2dbc - password: 0ed86@11-r2Dbc123 -# jasync: -# r2dbc: -# host: 47.112.193.81 -# port: 3306 -# database: lab-27-webflux-r2dbc -# username: lab-27-webflux-r2dbc -# password: 0ed86@11-r2Dbc123 diff --git a/lab-27/lab-27-webflux-r2dbc/target/classes/sql/users.sql b/lab-27/lab-27-webflux-r2dbc/target/classes/sql/users.sql deleted file mode 100644 index 02a9b8ebf..000000000 --- a/lab-27/lab-27-webflux-r2dbc/target/classes/sql/users.sql +++ /dev/null @@ -1,8 +0,0 @@ -CREATE TABLE `users` ( - `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户编号', - `username` varchar(64) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '账号', - `password` varchar(32) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '密码', - `create_time` datetime DEFAULT NULL COMMENT '创建时间', - PRIMARY KEY (`id`), - UNIQUE KEY `idx_username` (`username`) -) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin; diff --git a/lab-27/lab-27-webflux-redis/target/classes/application.yaml b/lab-27/lab-27-webflux-redis/target/classes/application.yaml deleted file mode 100644 index e2c37c567..000000000 --- a/lab-27/lab-27-webflux-redis/target/classes/application.yaml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - # 对应 RedisProperties 类 - redis: - host: 127.0.0.1 - port: 6379 - password: # Redis 服务器密码,默认为空。生产中,一定要设置 Redis 密码! - database: 0 # Redis 数据库号,默认为 0 。 - timeout: 0 # Redis 连接超时时间,单位:毫秒。 diff --git a/lab-28/lab-28-task-demo/target/classes/application.yaml b/lab-28/lab-28-task-demo/target/classes/application.yaml deleted file mode 100644 index e15b90564..000000000 --- a/lab-28/lab-28-task-demo/target/classes/application.yaml +++ /dev/null @@ -1,10 +0,0 @@ -spring: - task: - # Spring Task 调度任务的配置,对应 TaskSchedulingProperties 配置类 - scheduling: - thread-name-prefix: pikaqiu-demo- # 线程池的线程名的前缀。默认为 scheduling- ,建议根据自己应用来设置 - pool: - size: 10 # 线程池大小。默认为 1 ,根据自己应用来设置 - shutdown: - await-termination: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true - await-termination-period: 60 # 等待任务完成的最大时长,单位为秒。默认为 0 ,根据自己应用来设置 diff --git a/lab-28/lab-28-task-quartz-jdbc/target/classes/application.yaml b/lab-28/lab-28-task-quartz-jdbc/target/classes/application.yaml deleted file mode 100644 index 02ce2539c..000000000 --- a/lab-28/lab-28-task-quartz-jdbc/target/classes/application.yaml +++ /dev/null @@ -1,41 +0,0 @@ -spring: - datasource: - user: - url: jdbc:mysql://127.0.0.1:3306/lab-28-quartz-jdbc-user?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - quartz: - url: jdbc:mysql://127.0.0.1:3306/lab-28-quartz-jdbc-quartz?useSSL=false&useUnicode=true&characterEncoding=UTF-8 - driver-class-name: com.mysql.jdbc.Driver - username: root - password: - - # Quartz 的配置,对应 QuartzProperties 配置类 - quartz: - scheduler-name: clusteredScheduler # Scheduler 名字。默认为 schedulerName - job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。 - auto-startup: true # Quartz 是否自动启动 - startup-delay: 0 # 延迟 N 秒启动 - wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true - overwrite-existing-jobs: false # 是否覆盖已有 Job 的配置 - properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档 - org: - quartz: - # JobStore 相关配置 - jobStore: - # 数据源名称 - dataSource: quartzDataSource # 使用的数据源 - class: org.quartz.impl.jdbcjobstore.JobStoreTX # JobStore 实现类 - driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate - tablePrefix: QRTZ_ # Quartz 表前缀 - isClustered: true # 是集群模式 - clusterCheckinInterval: 1000 - useProperties: false - # 线程池相关配置 - threadPool: - threadCount: 25 # 线程池大小。默认为 10 。 - threadPriority: 5 # 线程优先级 - class: org.quartz.simpl.SimpleThreadPool # 线程池类型 - jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置 - initialize-schema: never # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。 diff --git a/lab-28/lab-28-task-quartz-memory/target/classes/application.yaml b/lab-28/lab-28-task-quartz-memory/target/classes/application.yaml deleted file mode 100644 index 0bdcb866d..000000000 --- a/lab-28/lab-28-task-quartz-memory/target/classes/application.yaml +++ /dev/null @@ -1,16 +0,0 @@ -spring: - # Quartz 的配置,对应 QuartzProperties 配置类 - quartz: - job-store-type: memory # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。 - auto-startup: true # Quartz 是否自动启动 - startup-delay: 0 # 延迟 N 秒启动 - wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true - overwrite-existing-jobs: false # 是否覆盖已有 Job 的配置 - properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档 - org: - quartz: - threadPool: - threadCount: 25 # 线程池大小。默认为 10 。 - threadPriority: 5 # 线程优先级 - class: org.quartz.simpl.SimpleThreadPool # 线程池类型 -# jdbc: # 这里暂时不说明,使用 JDBC 的 JobStore 的时候,才需要配置 diff --git a/lab-28/lab-28-task-xxl-job/src/main/java/cn/iocoder/springboot/lab28/task/config/XxlJobConfiguration.java b/lab-28/lab-28-task-xxl-job/src/main/java/cn/iocoder/springboot/lab28/task/config/XxlJobConfiguration.java index 83c32daa0..db4c0e686 100644 --- a/lab-28/lab-28-task-xxl-job/src/main/java/cn/iocoder/springboot/lab28/task/config/XxlJobConfiguration.java +++ b/lab-28/lab-28-task-xxl-job/src/main/java/cn/iocoder/springboot/lab28/task/config/XxlJobConfiguration.java @@ -23,7 +23,7 @@ public class XxlJobConfiguration { @Value("${xxl.job.executor.logretentiondays}") private int logRetentionDays; - @Bean(initMethod = "start", destroyMethod = "destroy") + @Bean public XxlJobSpringExecutor xxlJobExecutor() { // 创建 XxlJobSpringExecutor 执行器 XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); diff --git a/lab-28/lab-28-task-xxl-job/target/classes/application.yaml b/lab-28/lab-28-task-xxl-job/target/classes/application.yaml deleted file mode 100644 index d066ec3dc..000000000 --- a/lab-28/lab-28-task-xxl-job/target/classes/application.yaml +++ /dev/null @@ -1,15 +0,0 @@ -server: - port: 9090 #指定一个端口,避免和 XXL-JOB 调度中心的端口冲突。仅仅测试之用 - -# xxl-job -xxl: - job: - admin: - addresses: http://127.0.0.1:8080/xxl-job-admin # 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调";为空则关闭自动注册; - executor: - appname: lab-28-executor # 执行器 AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册 - ip: # 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和 "调度中心请求并触发任务"; - port: 6666 # ### 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口; - logpath: /Users/yunai/logs/xxl-job/lab-28-executor # 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径; - logretentiondays: 30 # 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能; - accessToken: yudaoyuanma # 执行器通讯TOKEN [选填]:非空时启用; diff --git a/lab-29/lab-29-async-demo/target/classes/application.yaml b/lab-29/lab-29-async-demo/target/classes/application.yaml deleted file mode 100644 index 8f32bdaed..000000000 --- a/lab-29/lab-29-async-demo/target/classes/application.yaml +++ /dev/null @@ -1,14 +0,0 @@ -spring: - task: - # Spring 执行器配置,对应 TaskExecutionProperties 配置类。对于 Spring 异步任务,会使用该执行器。 - execution: - thread-name-prefix: task- # 线程池的线程名的前缀。默认为 task- ,建议根据自己应用来设置 - pool: # 线程池相关 - core-size: 8 # 核心线程数,线程池创建时候初始化的线程数。默认为 8 。 - max-size: 20 # 最大线程数,线程池最大的线程数,只有在缓冲队列满了之后,才会申请超过核心线程数的线程。默认为 Integer.MAX_VALUE - keep-alive: 60s # 允许线程的空闲时间,当超过了核心线程之外的线程,在空闲时间到达之后会被销毁。默认为 60 秒 - queue-capacity: 200 # 缓冲队列大小,用来缓冲执行任务的队列的大小。默认为 Integer.MAX_VALUE 。 - allow-core-thread-timeout: true # 是否允许核心线程超时,即开启线程池的动态增长和缩小。默认为 true 。 - shutdown: - await-termination: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true - await-termination-period: 60 # 等待任务完成的最大时长,单位为秒。默认为 0 ,根据自己应用来设置 diff --git a/lab-29/lab-29-async-two/target/classes/application.yaml b/lab-29/lab-29-async-two/target/classes/application.yaml deleted file mode 100644 index 6b110cb57..000000000 --- a/lab-29/lab-29-async-two/target/classes/application.yaml +++ /dev/null @@ -1,26 +0,0 @@ -spring: - task: - # Spring 执行器配置,对应 TaskExecutionProperties 配置类。对于 Spring 异步任务,会使用该执行器。 - execution-one: - thread-name-prefix: task-one- # 线程池的线程名的前缀。默认为 task- ,建议根据自己应用来设置 - pool: # 线程池相关 - core-size: 8 # 核心线程数,线程池创建时候初始化的线程数。默认为 8 。 - max-size: 20 # 最大线程数,线程池最大的线程数,只有在缓冲队列满了之后,才会申请超过核心线程数的线程。默认为 Integer.MAX_VALUE - keep-alive: 60s # 允许线程的空闲时间,当超过了核心线程之外的线程,在空闲时间到达之后会被销毁。默认为 60 秒 - queue-capacity: 200 # 缓冲队列大小,用来缓冲执行任务的队列的大小。默认为 Integer.MAX_VALUE 。 - allow-core-thread-timeout: true # 是否允许核心线程超时,即开启线程池的动态增长和缩小。默认为 true 。 - shutdown: - await-termination: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true - await-termination-period: 60 # 等待任务完成的最大时长,单位为秒。默认为 0 ,根据自己应用来设置 - # Spring 执行器配置,对应 TaskExecutionProperties 配置类。对于 Spring 异步任务,会使用该执行器。 - execution-two: - thread-name-prefix: task-two- # 线程池的线程名的前缀。默认为 task- ,建议根据自己应用来设置 - pool: # 线程池相关 - core-size: 8 # 核心线程数,线程池创建时候初始化的线程数。默认为 8 。 - max-size: 20 # 最大线程数,线程池最大的线程数,只有在缓冲队列满了之后,才会申请超过核心线程数的线程。默认为 Integer.MAX_VALUE - keep-alive: 60s # 允许线程的空闲时间,当超过了核心线程之外的线程,在空闲时间到达之后会被销毁。默认为 60 秒 - queue-capacity: 200 # 缓冲队列大小,用来缓冲执行任务的队列的大小。默认为 Integer.MAX_VALUE 。 - allow-core-thread-timeout: true # 是否允许核心线程超时,即开启线程池的动态增长和缩小。默认为 true 。 - shutdown: - await-termination: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true - await-termination-period: 60 # 等待任务完成的最大时长,单位为秒。默认为 0 ,根据自己应用来设置 diff --git a/lab-30/lab-30-dubbo-annotations-demo/user-rpc-service-consumer-02/target/classes/application.yaml b/lab-30/lab-30-dubbo-annotations-demo/user-rpc-service-consumer-02/target/classes/application.yaml deleted file mode 100644 index 8596d2028..000000000 --- a/lab-30/lab-30-dubbo-annotations-demo/user-rpc-service-consumer-02/target/classes/application.yaml +++ /dev/null @@ -1,13 +0,0 @@ -# dubbo 配置项,对应 DubboConfigurationProperties 配置类 -dubbo: - # Dubbo 应用配置 - application: - name: user-service-consumer # 应用名 - # Dubbo 注册中心配置 - registry: - address: zookeeper://127.0.0.1:2181 # 注册中心地址。个鞥多注册中心,可见 http://dubbo.apache.org/zh-cn/docs/user/references/registry/introduction.html 文档。 - # Dubbo 消费者配置 - consumer: - timeout: 1000 # 【重要】远程服务调用超时时间,单位:毫秒。默认为 1000 毫秒,胖友可以根据自己业务修改 - UserRpcService: - version: 1.0.0 diff --git a/lab-30/lab-30-dubbo-annotations-demo/user-rpc-service-provider-02/target/classes/application.yaml b/lab-30/lab-30-dubbo-annotations-demo/user-rpc-service-provider-02/target/classes/application.yaml deleted file mode 100644 index aa61f2aa0..000000000 --- a/lab-30/lab-30-dubbo-annotations-demo/user-rpc-service-provider-02/target/classes/application.yaml +++ /dev/null @@ -1,20 +0,0 @@ -# dubbo 配置项,对应 DubboConfigurationProperties 配置类 -dubbo: - # Dubbo 应用配置 - application: - name: user-service-provider # 应用名 - # Dubbo 注册中心配 - registry: - address: zookeeper://127.0.0.1:2181 # 注册中心地址。个鞥多注册中心,可见 http://dubbo.apache.org/zh-cn/docs/user/references/registry/introduction.html 文档。 - # Dubbo 服务提供者协议配置 - protocol: - port: -1 # 协议端口。使用 -1 表示随机端口。 - name: dubbo # 使用 `dubbo://` 协议。更多协议,可见 http://dubbo.apache.org/zh-cn/docs/user/references/protocol/introduction.html 文档 - # Dubbo 服务提供者配置 - provider: - timeout: 1000 # 【重要】远程服务调用超时时间,单位:毫秒。默认为 1000 毫秒,胖友可以根据自己业务修改 - UserRpcService: - version: 1.0. - # 配置扫描 Dubbo 自定义的 @Service 注解,暴露成 Dubbo 服务提供者 - scan: - base-packages: cn.iocoder.springboot.lab30.rpc.service diff --git a/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-consumer/target/classes/application.yaml b/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-consumer/target/classes/application.yaml deleted file mode 100644 index 8596d2028..000000000 --- a/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-consumer/target/classes/application.yaml +++ /dev/null @@ -1,13 +0,0 @@ -# dubbo 配置项,对应 DubboConfigurationProperties 配置类 -dubbo: - # Dubbo 应用配置 - application: - name: user-service-consumer # 应用名 - # Dubbo 注册中心配置 - registry: - address: zookeeper://127.0.0.1:2181 # 注册中心地址。个鞥多注册中心,可见 http://dubbo.apache.org/zh-cn/docs/user/references/registry/introduction.html 文档。 - # Dubbo 消费者配置 - consumer: - timeout: 1000 # 【重要】远程服务调用超时时间,单位:毫秒。默认为 1000 毫秒,胖友可以根据自己业务修改 - UserRpcService: - version: 1.0.0 diff --git a/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-consumer/target/classes/dubbo.xml b/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-consumer/target/classes/dubbo.xml deleted file mode 100644 index 48db766c5..000000000 --- a/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-consumer/target/classes/dubbo.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - diff --git a/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-provider/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter b/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-provider/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.Filter similarity index 100% rename from lab-30/lab-30-dubbo-xml-demo/user-rpc-service-provider/src/main/resources/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter rename to lab-30/lab-30-dubbo-xml-demo/user-rpc-service-provider/src/main/resources/META-INF/dubbo/org.apache.dubbo.rpc.Filter diff --git a/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-provider/target/classes/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter b/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-provider/target/classes/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter deleted file mode 100644 index 0f49025f3..000000000 --- a/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-provider/target/classes/META-INF/dubbo/com.alibaba.dubbo.rpc.Filter +++ /dev/null @@ -1 +0,0 @@ -dubboExceptionFilter=cn.iocoder.springboot.lab30.rpc.filter.DubboExceptionFilter diff --git a/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-provider/target/classes/application.yaml b/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-provider/target/classes/application.yaml deleted file mode 100644 index e9b4d9aaa..000000000 --- a/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-provider/target/classes/application.yaml +++ /dev/null @@ -1,18 +0,0 @@ -# dubbo 配置项,对应 DubboConfigurationProperties 配置类 -dubbo: - # Dubbo 应用配置 - application: - name: user-service-provider # 应用名 - # Dubbo 注册中心配 - registry: - address: zookeeper://127.0.0.1:2181 # 注册中心地址。个鞥多注册中心,可见 http://dubbo.apache.org/zh-cn/docs/user/references/registry/introduction.html 文档。 - # Dubbo 服务提供者协议配置 - protocol: - port: -1 # 协议端口。使用 -1 表示随机端口。 - name: dubbo # 使用 `dubbo://` 协议。更多协议,可见 http://dubbo.apache.org/zh-cn/docs/user/references/protocol/introduction.html 文档 - # Dubbo 服务提供者配置 - provider: - timeout: 1000 # 【重要】远程服务调用超时时间,单位:毫秒。默认为 1000 毫秒,胖友可以根据自己业务修改 - filter: -exception # 去掉 ExceptionFilter - UserRpcService: - version: 1.0.0 diff --git a/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-provider/target/classes/dubbo.xml b/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-provider/target/classes/dubbo.xml deleted file mode 100644 index 66ffb45cf..000000000 --- a/lab-30/lab-30-dubbo-xml-demo/user-rpc-service-provider/target/classes/dubbo.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - diff --git a/lab-31/lab-31-rocketmq-demo/target/classes/application.yaml b/lab-31/lab-31-rocketmq-demo/target/classes/application.yaml deleted file mode 100644 index fc8163046..000000000 --- a/lab-31/lab-31-rocketmq-demo/target/classes/application.yaml +++ /dev/null @@ -1,21 +0,0 @@ -# rocketmq 配置项,对应 RocketMQProperties 配置类 -rocketmq: - name-server: 127.0.0.1:9876 # RocketMQ Namesrv - # Producer 配置项 - producer: - group: demo-producer-group # 生产者分组 - send-message-timeout: 3000 # 发送消息超时时间,单位:毫秒。默认为 3000 。 - compress-message-body-threshold: 4096 # 消息压缩阀值,当消息体的大小超过该阀值后,进行消息压缩。默认为 4 * 1024B - max-message-size: 4194304 # 消息体的最大允许大小。。默认为 4 * 1024 * 1024B - retry-times-when-send-failed: 2 # 同步发送消息时,失败重试次数。默认为 2 次。 - retry-times-when-send-async-failed: 2 # 异步发送消息时,失败重试次数。默认为 2 次。 - retry-next-server: false # 发送消息给 Broker 时,如果发送失败,是否重试另外一台 Broker 。默认为 false - access-key: # Access Key ,可阅读 https://github.com/apache/rocketmq/blob/master/docs/cn/acl/user_guide.md 文档 - secret-key: # Secret Key - enable-msg-trace: true # 是否开启消息轨迹功能。默认为 true 开启。可阅读 https://github.com/apache/rocketmq/blob/master/docs/cn/msg_trace/user_guide.md 文档 - customized-trace-topic: RMQ_SYS_TRACE_TOPIC # 自定义消息轨迹的 Topic 。默认为 RMQ_SYS_TRACE_TOPIC 。 - # Consumer 配置项 - consumer: - listeners: # 配置某个消费分组,是否监听指定 Topic 。结构为 Map<消费者分组, > 。默认情况下,不配置表示监听。 - test-consumer-group: - topic1: false # 关闭 test-consumer-group 对 topic1 的监听消费 diff --git a/lab-31/lab-31-rocketmq-ons/target/classes/application.yaml b/lab-31/lab-31-rocketmq-ons/target/classes/application.yaml deleted file mode 100644 index 4aec75c38..000000000 --- a/lab-31/lab-31-rocketmq-ons/target/classes/application.yaml +++ /dev/null @@ -1,9 +0,0 @@ -# rocketmq 配置项,对应 RocketMQProperties 配置类 -rocketmq: - name-server: http://onsaddr.mq-internet-access.mq-internet.aliyuncs.com:80 # 阿里云 RocketMQ Namesrv - access-channel: CLOUD # 设置使用阿里云 - # Producer 配置项 - producer: - group: GID_PRODUCER_GROUP_YUNAI_TEST # 生产者分组 - access-key: # 设置阿里云的 RocketMQ 的 access key !!!这里涉及到隐私,所以这里艿艿没有提供 - secret-key: # 设置阿里云的 RocketMQ 的 secret key !!!这里涉及到隐私,所以这里艿艿没有提供 diff --git a/lab-32/lab-32-activemq-demo-concurrency/src/main/resources/application.yaml b/lab-32/lab-32-activemq-demo-concurrency/src/main/resources/application.yaml index 8179b5891..73ca3eeac 100644 --- a/lab-32/lab-32-activemq-demo-concurrency/src/main/resources/application.yaml +++ b/lab-32/lab-32-activemq-demo-concurrency/src/main/resources/application.yaml @@ -1,7 +1,7 @@ spring: # ActiveMQ 配置项,对应 ActiveMQProperties 配置类 activemq: - broker-url: tcp://127.0.0.1:61616 # RabbitMQ Broker 的地址 + broker-url: tcp://127.0.0.1:61616 # ActiveMQ Broker 的地址 user: admin # 账号 password: admin # 密码 packages: diff --git a/lab-32/lab-32-activemq-demo-concurrency/target/classes/application.yaml b/lab-32/lab-32-activemq-demo-concurrency/target/classes/application.yaml deleted file mode 100644 index 8179b5891..000000000 --- a/lab-32/lab-32-activemq-demo-concurrency/target/classes/application.yaml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - # ActiveMQ 配置项,对应 ActiveMQProperties 配置类 - activemq: - broker-url: tcp://127.0.0.1:61616 # RabbitMQ Broker 的地址 - user: admin # 账号 - password: admin # 密码 - packages: - trust-all: true # 可信任的反序列化包 diff --git a/lab-32/lab-32-activemq-demo-consume-retry/src/main/resources/application.yaml b/lab-32/lab-32-activemq-demo-consume-retry/src/main/resources/application.yaml index 8179b5891..73ca3eeac 100644 --- a/lab-32/lab-32-activemq-demo-consume-retry/src/main/resources/application.yaml +++ b/lab-32/lab-32-activemq-demo-consume-retry/src/main/resources/application.yaml @@ -1,7 +1,7 @@ spring: # ActiveMQ 配置项,对应 ActiveMQProperties 配置类 activemq: - broker-url: tcp://127.0.0.1:61616 # RabbitMQ Broker 的地址 + broker-url: tcp://127.0.0.1:61616 # ActiveMQ Broker 的地址 user: admin # 账号 password: admin # 密码 packages: diff --git a/lab-32/lab-32-activemq-demo-consume-retry/target/classes/application.yaml b/lab-32/lab-32-activemq-demo-consume-retry/target/classes/application.yaml deleted file mode 100644 index 8179b5891..000000000 --- a/lab-32/lab-32-activemq-demo-consume-retry/target/classes/application.yaml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - # ActiveMQ 配置项,对应 ActiveMQProperties 配置类 - activemq: - broker-url: tcp://127.0.0.1:61616 # RabbitMQ Broker 的地址 - user: admin # 账号 - password: admin # 密码 - packages: - trust-all: true # 可信任的反序列化包 diff --git a/lab-32/lab-32-activemq-demo-delay/src/main/resources/application.yaml b/lab-32/lab-32-activemq-demo-delay/src/main/resources/application.yaml index 8179b5891..73ca3eeac 100644 --- a/lab-32/lab-32-activemq-demo-delay/src/main/resources/application.yaml +++ b/lab-32/lab-32-activemq-demo-delay/src/main/resources/application.yaml @@ -1,7 +1,7 @@ spring: # ActiveMQ 配置项,对应 ActiveMQProperties 配置类 activemq: - broker-url: tcp://127.0.0.1:61616 # RabbitMQ Broker 的地址 + broker-url: tcp://127.0.0.1:61616 # ActiveMQ Broker 的地址 user: admin # 账号 password: admin # 密码 packages: diff --git a/lab-32/lab-32-activemq-demo-message-model/src/main/resources/application.yaml b/lab-32/lab-32-activemq-demo-message-model/src/main/resources/application.yaml index c8815e091..51c90028d 100644 --- a/lab-32/lab-32-activemq-demo-message-model/src/main/resources/application.yaml +++ b/lab-32/lab-32-activemq-demo-message-model/src/main/resources/application.yaml @@ -1,7 +1,7 @@ spring: # ActiveMQ 配置项,对应 ActiveMQProperties 配置类 activemq: - broker-url: tcp://127.0.0.1:61616 # RabbitMQ Broker 的地址 + broker-url: tcp://127.0.0.1:61616 # ActiveMQ Broker 的地址 user: admin # 账号 password: admin # 密码 packages: diff --git a/lab-32/lab-32-activemq-demo-orderly/src/main/resources/application.yaml b/lab-32/lab-32-activemq-demo-orderly/src/main/resources/application.yaml index 8179b5891..73ca3eeac 100644 --- a/lab-32/lab-32-activemq-demo-orderly/src/main/resources/application.yaml +++ b/lab-32/lab-32-activemq-demo-orderly/src/main/resources/application.yaml @@ -1,7 +1,7 @@ spring: # ActiveMQ 配置项,对应 ActiveMQProperties 配置类 activemq: - broker-url: tcp://127.0.0.1:61616 # RabbitMQ Broker 的地址 + broker-url: tcp://127.0.0.1:61616 # ActiveMQ Broker 的地址 user: admin # 账号 password: admin # 密码 packages: diff --git a/lab-32/lab-32-activemq-demo/src/main/resources/application.yaml b/lab-32/lab-32-activemq-demo/src/main/resources/application.yaml index 8179b5891..73ca3eeac 100644 --- a/lab-32/lab-32-activemq-demo/src/main/resources/application.yaml +++ b/lab-32/lab-32-activemq-demo/src/main/resources/application.yaml @@ -1,7 +1,7 @@ spring: # ActiveMQ 配置项,对应 ActiveMQProperties 配置类 activemq: - broker-url: tcp://127.0.0.1:61616 # RabbitMQ Broker 的地址 + broker-url: tcp://127.0.0.1:61616 # ActiveMQ Broker 的地址 user: admin # 账号 password: admin # 密码 packages: diff --git a/lab-32/lab-32-activemq-native/src/main/java/cn/iocoder/springboot/lab32/activemqdemo/ActiveMQProducer.java b/lab-32/lab-32-activemq-native/src/main/java/cn/iocoder/springboot/lab32/activemqdemo/ActiveMQProducer.java index 061eb4a08..b38065d3d 100644 --- a/lab-32/lab-32-activemq-native/src/main/java/cn/iocoder/springboot/lab32/activemqdemo/ActiveMQProducer.java +++ b/lab-32/lab-32-activemq-native/src/main/java/cn/iocoder/springboot/lab32/activemqdemo/ActiveMQProducer.java @@ -10,7 +10,7 @@ public class ActiveMQProducer { private static final String USERNAME = "admin"; private static final String PASSWORD = "admin"; - private static final String QUEUE_NAME = "queue_demo"; // 只有 QUEUE_NAME 需要共享给 RabbitMQConsumer + private static final String QUEUE_NAME = "queue_demo"; // 只有 QUEUE_NAME 需要共享给 ActiveMQConsumer public static void main(String[] args) throws JMSException { // 创建连接 diff --git a/lab-34/lab-34-actuator-demo-auditevents/target/classes/application.yaml b/lab-34/lab-34-actuator-demo-auditevents/target/classes/application.yaml deleted file mode 100644 index 8ad179926..000000000 --- a/lab-34/lab-34-actuator-demo-auditevents/target/classes/application.yaml +++ /dev/null @@ -1,21 +0,0 @@ -management: - endpoint: - # AuditEventsEndpoint 端点配置项 - auditevents: - enabled: true # 是否开启。默认为 true 开启 - - endpoints: - # Actuator HTTP 配置项,对应 WebEndpointProperties 配置类 - web: - base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator - exposure: - include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 - exclude: # 在 include 的基础上,需要排除的端点。通过设置 * ,可以排除所有端点。 - -spring: - # Spring Security 配置项,对应 SecurityProperties 配置类 - security: - # 配置默认的 InMemoryUserDetailsManager 的用户账号与密码。 - user: - name: user # 账号 - password: user # 密码 diff --git a/lab-34/lab-34-actuator-demo-health/target/classes/application.yaml b/lab-34/lab-34-actuator-demo-health/target/classes/application.yaml deleted file mode 100644 index 46398f552..000000000 --- a/lab-34/lab-34-actuator-demo-health/target/classes/application.yaml +++ /dev/null @@ -1,24 +0,0 @@ -management: - endpoint: - # Health 端点配置项,对应 HealthProperties 配置类 - health: - enabled: true # 是否开启。默认为 true 开启。 - show-details: ALWAYS # 何时显示完整的健康信息。默认为 NEVER 都不展示。可选 WHEN_AUTHORIZED 当经过授权的用户;可选 ALWAYS 总是展示。 - status: - http-mapping: # 设置不同健康状态对应的响应状态码 - DOWN: 403 - order: DOWN, OUT_OF_SERVICE, UP, UNKNOWN # 状态排序。 - health: - # DiskSpaceHealthIndicator 配置项,对应 DiskSpaceHealthIndicatorProperties - diskspace: - enabled: true # 是否开启。默认为 true 开启。 - path: . # 目录。默认为 . 当前目录。 - threshold: # 剩余空间的阀值。默认为 10M 。 - endpoints: - # Actuator HTTP 配置项,对应 WebEndpointProperties 配置类 - web: - base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator - exposure: - include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 - exclude: # 在 include 的基础上,需要排除的端点。通过设置 * ,可以排除所有端点。 - diff --git a/lab-34/lab-34-actuator-demo-httptrace/target/classes/application.yaml b/lab-34/lab-34-actuator-demo-httptrace/target/classes/application.yaml deleted file mode 100644 index 3f81c4b4a..000000000 --- a/lab-34/lab-34-actuator-demo-httptrace/target/classes/application.yaml +++ /dev/null @@ -1,19 +0,0 @@ -management: - endpoint: - # HttpTrace 端点配置项 - httptrace: - enabled: true # 是否开启。默认为 true 开启 - # HttpTrace 的具体配置项,对应 HttpTraceProperties 配置类 - trace: - http: - enabled: true # 是否开启。默认为 true 开启。 - include: # 包含的 trace 项的数组。默认不包含 COOKIE_HEADERS、AUTHORIZATION_HEADER 项。 - - endpoints: - # Actuator HTTP 配置项,对应 WebEndpointProperties 配置类 - web: - base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator - exposure: - include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 - exclude: # 在 include 的基础上,需要排除的端点。通过设置 * ,可以排除所有端点。 - diff --git a/lab-34/lab-34-actuator-demo-info/target/classes/application.yaml b/lab-34/lab-34-actuator-demo-info/target/classes/application.yaml deleted file mode 100644 index 727db108c..000000000 --- a/lab-34/lab-34-actuator-demo-info/target/classes/application.yaml +++ /dev/null @@ -1,33 +0,0 @@ -management: - endpoint: - # Info 端点配置项 - info: - enabled: true # 是否开启。默认为 true 开启。 - info: - # EnvironmentInfoContributor 的配置项 - env: - enabled: true - # BuildInfoContributor 的配置属性 - build: - enabled: true - # GitInfoContributor 的配置属性 - git: - enabled: true - mode: SIMPLE # Git 信息展示模式。SIMPLE 默认,只展示精简的 Git 版本信息;FULL 模式,展示完整的 Git 版本信息。 - - endpoints: - # Actuator HTTP 配置项,对应 WebEndpointProperties 配置类 - web: - base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator - exposure: - include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 - exclude: # 在 include 的基础上,需要排除的端点。通过设置 * ,可以排除所有端点。 - -# info 配置项 -info: - app: - java: - source: 1.8.0_144 - target: 1.8.0_144 - encoding: UTF-8 - version: 2.2.2.RELEASE diff --git a/lab-34/lab-34-actuator-demo-metrics/target/classes/application.yaml b/lab-34/lab-34-actuator-demo-metrics/target/classes/application.yaml deleted file mode 100644 index 22bd7ae6c..000000000 --- a/lab-34/lab-34-actuator-demo-metrics/target/classes/application.yaml +++ /dev/null @@ -1,26 +0,0 @@ -#spring: -# application: -# name: demo-application - -management: - endpoint: - # Metrics 端点配置项 - metrics: - enabled: true # 是否开启。默认为 true 开启。 - # Metrics 的具体配置项,对应 MetricsProperties 配置类 - metrics: - # 设置指定前缀的指标是否开启 - enable: - xxx: false - # 通用 tag - tags: - application: demo-application - - endpoints: - # Actuator HTTP 配置项,对应 WebEndpointProperties 配置类 - web: - base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator - exposure: - include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 - exclude: # 在 include 的基础上,需要排除的端点。通过设置 * ,可以排除所有端点。 - diff --git a/lab-34/lab-34-actuator-demo-security/target/classes/application.yaml b/lab-34/lab-34-actuator-demo-security/target/classes/application.yaml deleted file mode 100644 index d95ac7ead..000000000 --- a/lab-34/lab-34-actuator-demo-security/target/classes/application.yaml +++ /dev/null @@ -1,22 +0,0 @@ -management: - endpoints: - # Actuator HTTP 配置项,对应 WebEndpointProperties 配置类 - web: - base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator - exposure: - include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 - exclude: # 在 include 的基础上,需要排除的端点。通过设置 * ,可以排除所有端点。 -# server: -# port: 8081 -# endpoint: -# shutdown: -# enabled: true - -spring: - # Spring Security 配置项,对应 SecurityProperties 配置类 - security: - # 配置默认的 InMemoryUserDetailsManager 的用户账号与密码。 - user: - name: user # 账号 - password: user # 密码 - roles: ADMIN # 拥有角色 diff --git a/lab-34/lab-34-actuator-test/pom.xml b/lab-34/lab-34-actuator-test/pom.xml new file mode 100644 index 000000000..84f2b53fd --- /dev/null +++ b/lab-34/lab-34-actuator-test/pom.xml @@ -0,0 +1,29 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-34-acturator-test + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + diff --git a/lab-34/lab-34-actuator-test/src/main/java/cn/iocoder/springboot/lab34/actuatordemo/Application.java b/lab-34/lab-34-actuator-test/src/main/java/cn/iocoder/springboot/lab34/actuatordemo/Application.java new file mode 100644 index 000000000..70532da9c --- /dev/null +++ b/lab-34/lab-34-actuator-test/src/main/java/cn/iocoder/springboot/lab34/actuatordemo/Application.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab34.actuatordemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/lab-34/lab-34-actuator-test/src/main/java/cn/iocoder/springboot/lab34/actuatordemo/controller/TestController.java b/lab-34/lab-34-actuator-test/src/main/java/cn/iocoder/springboot/lab34/actuatordemo/controller/TestController.java new file mode 100644 index 000000000..6ce3a5957 --- /dev/null +++ b/lab-34/lab-34-actuator-test/src/main/java/cn/iocoder/springboot/lab34/actuatordemo/controller/TestController.java @@ -0,0 +1,10 @@ +package cn.iocoder.springboot.lab34.actuatordemo.controller; + +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class TestController { + + + +} diff --git a/lab-34/lab-34-actuator-demo-custom-endpoint/target/classes/application.yaml b/lab-34/lab-34-actuator-test/src/main/resources/application.yaml similarity index 95% rename from lab-34/lab-34-actuator-demo-custom-endpoint/target/classes/application.yaml rename to lab-34/lab-34-actuator-test/src/main/resources/application.yaml index 311325eb2..34cda3686 100644 --- a/lab-34/lab-34-actuator-demo-custom-endpoint/target/classes/application.yaml +++ b/lab-34/lab-34-actuator-test/src/main/resources/application.yaml @@ -6,6 +6,8 @@ management: exposure: include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 exclude: # 在 include 的基础上,需要排除的端点。通过设置 * ,可以排除所有端点。 +# server: +# port: 8081 # endpoint: # shutdown: # enabled: true diff --git a/lab-34/pom.xml b/lab-34/pom.xml index 616096b35..434bb2482 100644 --- a/lab-34/pom.xml +++ b/lab-34/pom.xml @@ -20,7 +20,8 @@ lab-34-actuator-demo-auditevents lab-34-actuator-demo-custom-endpoint lab-34-actuator-demo-security - + lab-34-actuator-test + diff --git a/lab-35/lab-35-admin-01-demo-application/target/classes/application.yaml b/lab-35/lab-35-admin-01-demo-application/target/classes/application.yaml deleted file mode 100644 index 733f7c223..000000000 --- a/lab-35/lab-35-admin-01-demo-application/target/classes/application.yaml +++ /dev/null @@ -1,17 +0,0 @@ -management: - endpoints: - # Actuator HTTP 配置项,对应 WebEndpointProperties 配置类 - web: - exposure: - include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 - -spring: - application: - name: demo-application # 应用名 - boot: - admin: - client: - url: http://127.0.0.1:8080 # Spring Boot Admin Server 地址 - -server: - port: 18080 # 设置自定义 Server 端口,避免和 Spring Boot Admin Server 端口冲突。 diff --git a/lab-35/lab-35-admin-02-demo-application/target/classes/application.yaml b/lab-35/lab-35-admin-02-demo-application/target/classes/application.yaml deleted file mode 100644 index ea30f48b9..000000000 --- a/lab-35/lab-35-admin-02-demo-application/target/classes/application.yaml +++ /dev/null @@ -1,15 +0,0 @@ -management: - endpoints: - # Actuator HTTP 配置项,对应 WebEndpointProperties 配置类 - web: - exposure: - include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 - -spring: - application: - name: demo-application # 应用名 - -eureka: - client: - service-url: - defaultZone: http://127.0.0.1:8761/eureka diff --git a/lab-35/lab-35-admin-03-adminserver/target/classes/META-INF/lab-35-admin-01-adminserver.kotlin_module b/lab-35/lab-35-admin-03-adminserver/target/classes/META-INF/lab-35-admin-01-adminserver.kotlin_module deleted file mode 100644 index 2983af706..000000000 Binary files a/lab-35/lab-35-admin-03-adminserver/target/classes/META-INF/lab-35-admin-01-adminserver.kotlin_module and /dev/null differ diff --git a/lab-35/lab-35-admin-03-demo-application/target/classes/META-INF/lab-35-admin-01-demo-application.kotlin_module b/lab-35/lab-35-admin-03-demo-application/target/classes/META-INF/lab-35-admin-01-demo-application.kotlin_module deleted file mode 100644 index 2983af706..000000000 Binary files a/lab-35/lab-35-admin-03-demo-application/target/classes/META-INF/lab-35-admin-01-demo-application.kotlin_module and /dev/null differ diff --git a/lab-35/lab-35-admin-03-demo-application/target/classes/application.yaml b/lab-35/lab-35-admin-03-demo-application/target/classes/application.yaml deleted file mode 100644 index f8ba49806..000000000 --- a/lab-35/lab-35-admin-03-demo-application/target/classes/application.yaml +++ /dev/null @@ -1,31 +0,0 @@ -management: - endpoints: - # Actuator HTTP 配置项,对应 WebEndpointProperties 配置类 - web: - exposure: - include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 - -spring: - application: - name: demo-application # 应用名 - - # Spring Security 配置项,对应 SecurityProperties 配置类 - security: - # 配置默认的 InMemoryUserDetailsManager 的用户账号与密码。 - user: - name: test # 账号 - password: test # 密码 - - boot: - admin: - client: - url: http://127.0.0.1:8080 # Spring Boot Admin Server 地址 - username: user # Spring Boot Admin Server 的认证账号 - password: user # Spring Boot Admin Server 的认证密码 - instance: - metadata: - user.name: ${spring.security.user.name} # Actuator 端点的认证账号 - user.password: ${spring.security.user.password} # Actuator 端点的认证密码 - -server: - port: 18080 # 设置自定义 Server 端口,避免和 Spring Boot Admin Server 端口冲突。 diff --git a/lab-35/lab-35-admin-04-adminserver/target/classes/META-INF/lab-35-admin-02-adminserver.kotlin_module b/lab-35/lab-35-admin-04-adminserver/target/classes/META-INF/lab-35-admin-02-adminserver.kotlin_module deleted file mode 100644 index 2983af706..000000000 Binary files a/lab-35/lab-35-admin-04-adminserver/target/classes/META-INF/lab-35-admin-02-adminserver.kotlin_module and /dev/null differ diff --git a/lab-35/lab-35-admin-04-adminserver/target/classes/application.yaml b/lab-35/lab-35-admin-04-adminserver/target/classes/application.yaml deleted file mode 100644 index 42f4fdcfd..000000000 --- a/lab-35/lab-35-admin-04-adminserver/target/classes/application.yaml +++ /dev/null @@ -1,13 +0,0 @@ -spring: - mail: - host: smtp.126.com - username: wwbmlhh@126.com - password: wwb3743 - default-encoding: UTF-8 - - boot: - admin: - notify: - mail: - from: wwbmlhh@126.com - to: 7685413@qq.com diff --git a/lab-35/lab-35-admin-05-adminserver/target/classes/META-INF/lab-35-admin-01-adminserver.kotlin_module b/lab-35/lab-35-admin-05-adminserver/target/classes/META-INF/lab-35-admin-01-adminserver.kotlin_module deleted file mode 100644 index 2983af706..000000000 Binary files a/lab-35/lab-35-admin-05-adminserver/target/classes/META-INF/lab-35-admin-01-adminserver.kotlin_module and /dev/null differ diff --git a/lab-37/lab-37-logging-actuator/target/classes/application.yaml b/lab-37/lab-37-logging-actuator/target/classes/application.yaml deleted file mode 100644 index f8d2403a5..000000000 --- a/lab-37/lab-37-logging-actuator/target/classes/application.yaml +++ /dev/null @@ -1,27 +0,0 @@ -spring: - application: - name: demo-application # 应用名 - -logging: - # 日志文件配置 - file: -# path: /Users/yunai/logs/ # 日志文件路径。 - name: /Users/yunai/logs/${spring.application.name}.log # 日志文件名。 - max-history: 7 # 日志文件要保留的归档的最大天数。默认为 7 天。 - max-size: 10MB # 日志文件的最大大小。默认为 10MB 。 - - # 日志级别 - level: - cn: - iocoder: - springboot: - lab37: - loggingdemo: - controller: DEBUG - -management: - endpoints: - # Actuator HTTP 配置项,对应 WebEndpointProperties 配置类 - web: - exposure: - include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 diff --git a/lab-37/lab-37-logging-aop/target/classes/application.yaml b/lab-37/lab-37-logging-aop/target/classes/application.yaml deleted file mode 100644 index 562d15e23..000000000 --- a/lab-37/lab-37-logging-aop/target/classes/application.yaml +++ /dev/null @@ -1,20 +0,0 @@ -spring: - application: - name: demo-application # 应用名 - -logging: - # 日志文件配置 - file: -# path: /Users/yunai/logs/ # 日志文件路径。 - name: /Users/yunai/logs/${spring.application.name}.log # 日志文件名。 - max-history: 7 # 日志文件要保留的归档的最大天数。默认为 7 天。 - max-size: 10MB # 日志文件的最大大小。默认为 10MB 。 - - # 日志级别 - level: - cn: - iocoder: - springboot: - lab37: - loggingdemo: - controller: DEBUG diff --git a/lab-37/lab-37-logging-debug/target/classes/application.yaml b/lab-37/lab-37-logging-debug/target/classes/application.yaml deleted file mode 100644 index 4a7ca4122..000000000 --- a/lab-37/lab-37-logging-debug/target/classes/application.yaml +++ /dev/null @@ -1,14 +0,0 @@ -spring: - application: - name: demo-application # 应用名 - -logging: - # 日志文件配置 - file: -# path: /Users/yunai/logs/ # 日志文件路径。 - name: /Users/yunai/logs/${spring.application.name}.log # 日志文件名。 - max-history: 7 # 日志文件要保留的归档的最大天数。默认为 7 天。 - max-size: 10MB # 日志文件的最大大小。默认为 10MB 。 - -# 调试模式 -debug: true diff --git a/lab-37/lab-37-logging-log4j2/target/classes/application.yaml b/lab-37/lab-37-logging-log4j2/target/classes/application.yaml deleted file mode 100644 index 205adf213..000000000 --- a/lab-37/lab-37-logging-log4j2/target/classes/application.yaml +++ /dev/null @@ -1,3 +0,0 @@ -spring: - application: - name: demo-application # 应用名 diff --git a/lab-37/lab-37-logging-logback/target/classes/application.yaml b/lab-37/lab-37-logging-logback/target/classes/application.yaml deleted file mode 100644 index 5cd6f1a6a..000000000 --- a/lab-37/lab-37-logging-logback/target/classes/application.yaml +++ /dev/null @@ -1,4 +0,0 @@ -spring: - application: - name: demo-application # 应用名 - diff --git a/lab-38/lab-38-elk-demo/target/classes/application.yaml b/lab-38/lab-38-elk-demo/target/classes/application.yaml deleted file mode 100644 index 9697b8c54..000000000 --- a/lab-38/lab-38-elk-demo/target/classes/application.yaml +++ /dev/null @@ -1,8 +0,0 @@ -spring: - application: - name: demo-application # 应用名 - -logging: - # 日志文件配置 - file: - name: /Users/yunai/logs/${spring.application.name}.log # 日志文件名。 diff --git a/lab-38/pom.xml b/lab-38/pom.xml index 3e6f908e0..e8a773172 100644 --- a/lab-38/pom.xml +++ b/lab-38/pom.xml @@ -10,6 +10,7 @@ 4.0.0 lab-38 + pom lab-38-elk-demo diff --git a/lab-39/lab-39-activemq/pom.xml b/lab-39/lab-39-activemq/pom.xml new file mode 100644 index 000000000..51c57810b --- /dev/null +++ b/lab-39/lab-39-activemq/pom.xml @@ -0,0 +1,29 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.1.RELEASE + + + 4.0.0 + + lab-39-activemq + + + + + org.springframework.boot + spring-boot-starter-activemq + + + + + org.springframework.boot + spring-boot-starter-web + + + + diff --git a/lab-39/lab-39-activemq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/ActiveMQApplication.java b/lab-39/lab-39-activemq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/ActiveMQApplication.java new file mode 100644 index 000000000..148fdfa99 --- /dev/null +++ b/lab-39/lab-39-activemq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/ActiveMQApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ActiveMQApplication { + + public static void main(String[] args) { + SpringApplication.run(ActiveMQApplication.class, args); + } + +} diff --git a/lab-39/lab-39-activemq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/consumer/DemoConsumer.java b/lab-39/lab-39-activemq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/consumer/DemoConsumer.java new file mode 100644 index 000000000..648f7bec0 --- /dev/null +++ b/lab-39/lab-39-activemq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/consumer/DemoConsumer.java @@ -0,0 +1,19 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.consumer; + +import cn.iocoder.springboot.lab39.skywalkingdemo.message.DemoMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jms.annotation.JmsListener; +import org.springframework.stereotype.Component; + +@Component +public class DemoConsumer { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @JmsListener(destination = DemoMessage.QUEUE) + public void onMessage(DemoMessage message) { + logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message); + } + +} diff --git a/lab-39/lab-39-activemq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java b/lab-39/lab-39-activemq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java new file mode 100644 index 000000000..5bc9d9555 --- /dev/null +++ b/lab-39/lab-39-activemq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java @@ -0,0 +1,26 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.controller; + +import cn.iocoder.springboot.lab39.skywalkingdemo.producer.DemoProducer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Autowired + private DemoProducer producer; + + @GetMapping("/activemq") + public String echo() { + this.sendMessage(1); + return "activemq"; + } + + public void sendMessage(Integer id) { + producer.syncSend(id); + } + +} diff --git a/lab-39/lab-39-activemq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/message/DemoMessage.java b/lab-39/lab-39-activemq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/message/DemoMessage.java new file mode 100644 index 000000000..041f777a6 --- /dev/null +++ b/lab-39/lab-39-activemq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/message/DemoMessage.java @@ -0,0 +1,30 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.message; + +import java.io.Serializable; + +public class DemoMessage implements Serializable { + + public static final String QUEUE = "QUEUE_DEMO_"; + + /** + * 编号 + */ + private Integer id; + + public DemoMessage setId(Integer id) { + this.id = id; + return this; + } + + public Integer getId() { + return id; + } + + @Override + public String toString() { + return "DemoMessage{" + + "id=" + id + + '}'; + } + +} diff --git a/lab-39/lab-39-activemq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/producer/DemoProducer.java b/lab-39/lab-39-activemq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/producer/DemoProducer.java new file mode 100644 index 000000000..8a39554da --- /dev/null +++ b/lab-39/lab-39-activemq/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/producer/DemoProducer.java @@ -0,0 +1,22 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.producer; + +import cn.iocoder.springboot.lab39.skywalkingdemo.message.DemoMessage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jms.core.JmsMessagingTemplate; +import org.springframework.stereotype.Component; + +@Component +public class DemoProducer { + + @Autowired + private JmsMessagingTemplate jmsTemplate; + + public void syncSend(Integer id) { + // 创建 DemoMessage 消息 + DemoMessage message = new DemoMessage(); + message.setId(id); + // 同步发送消息 + jmsTemplate.convertAndSend(DemoMessage.QUEUE, message); + } + +} diff --git a/lab-32/lab-32-activemq-demo-delay/target/classes/application.yaml b/lab-39/lab-39-activemq/src/main/resources/application.yaml similarity index 70% rename from lab-32/lab-32-activemq-demo-delay/target/classes/application.yaml rename to lab-39/lab-39-activemq/src/main/resources/application.yaml index 8179b5891..2cba3b795 100644 --- a/lab-32/lab-32-activemq-demo-delay/target/classes/application.yaml +++ b/lab-39/lab-39-activemq/src/main/resources/application.yaml @@ -1,7 +1,10 @@ +server: + port: 8079 + spring: # ActiveMQ 配置项,对应 ActiveMQProperties 配置类 activemq: - broker-url: tcp://127.0.0.1:61616 # RabbitMQ Broker 的地址 + broker-url: tcp://127.0.0.1:61616 # Activemq Broker 的地址 user: admin # 账号 password: admin # 密码 packages: diff --git a/lab-39/lab-39-async/pom.xml b/lab-39/lab-39-async/pom.xml new file mode 100644 index 000000000..2e71a62cf --- /dev/null +++ b/lab-39/lab-39-async/pom.xml @@ -0,0 +1,23 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-39-async + + + + + org.springframework.boot + spring-boot-starter-web + + + + diff --git a/lab-39/lab-39-async/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/AsyncApplication.java b/lab-39/lab-39-async/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/AsyncApplication.java new file mode 100644 index 000000000..72a096130 --- /dev/null +++ b/lab-39/lab-39-async/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/AsyncApplication.java @@ -0,0 +1,15 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; + +@SpringBootApplication +@EnableAsync(proxyTargetClass = true) // 开启 @Async 的支持 +public class AsyncApplication { + + public static void main(String[] args) { + SpringApplication.run(AsyncApplication.class, args); + } + +} diff --git a/lab-39/lab-39-async/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java b/lab-39/lab-39-async/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java new file mode 100644 index 000000000..15fcee60e --- /dev/null +++ b/lab-39/lab-39-async/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java @@ -0,0 +1,22 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.controller; + +import cn.iocoder.springboot.lab39.skywalkingdemo.service.DemoService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Autowired + private DemoService demoService; + + @GetMapping("/async") + public String echo() { + demoService.async(); + return "async"; + } + +} diff --git a/lab-39/lab-39-async/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/service/DemoService.java b/lab-39/lab-39-async/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/service/DemoService.java new file mode 100644 index 000000000..f95971511 --- /dev/null +++ b/lab-39/lab-39-async/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/service/DemoService.java @@ -0,0 +1,14 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.service; + +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +@Service +public class DemoService { + + @Async + public void async() { + System.out.println("异步任务的执行"); + } + +} diff --git a/lab-39/lab-39-springmvc/target/classes/application.yml b/lab-39/lab-39-async/src/main/resources/application.yml similarity index 100% rename from lab-39/lab-39-springmvc/target/classes/application.yml rename to lab-39/lab-39-async/src/main/resources/application.yml diff --git a/lab-39/lab-39-kafka/pom.xml b/lab-39/lab-39-kafka/pom.xml new file mode 100644 index 000000000..f4c571202 --- /dev/null +++ b/lab-39/lab-39-kafka/pom.xml @@ -0,0 +1,31 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.1.11.RELEASE + + + 4.0.0 + + lab-39-kafka + + + + + + org.springframework.kafka + spring-kafka + 2.2.11.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + + diff --git a/lab-39/lab-39-kafka/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/KafkaApplication.java b/lab-39/lab-39-kafka/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/KafkaApplication.java new file mode 100644 index 000000000..692e130ed --- /dev/null +++ b/lab-39/lab-39-kafka/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/KafkaApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class KafkaApplication { + + public static void main(String[] args) { + SpringApplication.run(KafkaApplication.class, args); + } + +} diff --git a/lab-39/lab-39-kafka/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/consumer/DemoConsumer.java b/lab-39/lab-39-kafka/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/consumer/DemoConsumer.java new file mode 100644 index 000000000..7c77a87bc --- /dev/null +++ b/lab-39/lab-39-kafka/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/consumer/DemoConsumer.java @@ -0,0 +1,20 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.consumer; + +import cn.iocoder.springboot.lab39.skywalkingdemo.message.DemoMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.stereotype.Component; + +@Component +public class DemoConsumer { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @KafkaListener(topics = DemoMessage.TOPIC, + groupId = "demo-consumer-group-" + DemoMessage.TOPIC) + public void onMessage(DemoMessage message) { + logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message); + } + +} diff --git a/lab-39/lab-39-kafka/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java b/lab-39/lab-39-kafka/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java new file mode 100644 index 000000000..39afd3c29 --- /dev/null +++ b/lab-39/lab-39-kafka/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java @@ -0,0 +1,28 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.controller; + +import cn.iocoder.springboot.lab39.skywalkingdemo.producer.DemoProducer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.concurrent.ExecutionException; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Autowired + private DemoProducer producer; + + @GetMapping("/kafka") + public String echo() throws ExecutionException, InterruptedException { + this.sendMessage(1); + return "kafka"; + } + + public void sendMessage(Integer id) throws ExecutionException, InterruptedException { + producer.syncSend(id); + } + +} diff --git a/lab-39/lab-39-kafka/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/message/DemoMessage.java b/lab-39/lab-39-kafka/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/message/DemoMessage.java new file mode 100644 index 000000000..51f5065cc --- /dev/null +++ b/lab-39/lab-39-kafka/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/message/DemoMessage.java @@ -0,0 +1,31 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.message; + +/** + * 示例 Message 消息 + */ +public class DemoMessage { + + public static final String TOPIC = "DEMO"; + + /** + * 编号 + */ + private Integer id; + + public DemoMessage setId(Integer id) { + this.id = id; + return this; + } + + public Integer getId() { + return id; + } + + @Override + public String toString() { + return "DemoMessage{" + + "id=" + id + + '}'; + } + +} diff --git a/lab-39/lab-39-kafka/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/producer/DemoProducer.java b/lab-39/lab-39-kafka/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/producer/DemoProducer.java new file mode 100644 index 000000000..072b42433 --- /dev/null +++ b/lab-39/lab-39-kafka/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/producer/DemoProducer.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.producer; + +import cn.iocoder.springboot.lab39.skywalkingdemo.message.DemoMessage; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.support.SendResult; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.concurrent.ExecutionException; + +@Component +public class DemoProducer { + + @Resource + private KafkaTemplate kafkaTemplate; + + public SendResult syncSend(Integer id) throws ExecutionException, InterruptedException { + // 创建 DemoMessage 消息 + DemoMessage message = new DemoMessage(); + message.setId(id); + // 同步发送消息 + return kafkaTemplate.send(DemoMessage.TOPIC, message).get(); + } + +} diff --git a/lab-03/lab-03-kafka-demo-concurrency/target/classes/application.yaml b/lab-39/lab-39-kafka/src/main/resources/application.yaml similarity index 79% rename from lab-03/lab-03-kafka-demo-concurrency/target/classes/application.yaml rename to lab-39/lab-39-kafka/src/main/resources/application.yaml index 00daf849d..3abbadd4b 100644 --- a/lab-03/lab-03-kafka-demo-concurrency/target/classes/application.yaml +++ b/lab-39/lab-39-kafka/src/main/resources/application.yaml @@ -1,3 +1,6 @@ +server: + port: 8079 + spring: # Kafka 配置项,对应 KafkaProperties 配置类 kafka: @@ -17,15 +20,7 @@ spring: spring: json: trusted: - packages: cn.iocoder.springboot.lab03.kafkademo.message + packages: cn.iocoder.springboot.lab39.skywalkingdemo.message # 消息 POJO 可信目录,解决 JSON 无法反序列化的问题 # Kafka Consumer Listener 监听器配置 listener: missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错 - -logging: - level: - org: - springframework: - kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别 - apache: - kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别 diff --git a/lab-39/lab-39-logback/pom.xml b/lab-39/lab-39-logback/pom.xml new file mode 100644 index 000000000..d09e763b7 --- /dev/null +++ b/lab-39/lab-39-logback/pom.xml @@ -0,0 +1,30 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-39-logback + + + + + org.apache.skywalking + apm-toolkit-logback-1.x + 6.6.0 + + + + + org.springframework.boot + spring-boot-starter-web + + + + diff --git a/lab-39/lab-39-logback/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/LogbackApplication.java b/lab-39/lab-39-logback/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/LogbackApplication.java new file mode 100644 index 000000000..06a08ed3a --- /dev/null +++ b/lab-39/lab-39-logback/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/LogbackApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class LogbackApplication { + + public static void main(String[] args) { + SpringApplication.run(LogbackApplication.class, args); + } + +} diff --git a/lab-39/lab-39-logback/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java b/lab-39/lab-39-logback/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java new file mode 100644 index 000000000..bcd166a9e --- /dev/null +++ b/lab-39/lab-39-logback/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java @@ -0,0 +1,21 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @GetMapping("/logback") + public String echo() { + logger.info("测试日志"); + return "logback"; + } + +} diff --git a/lab-39/lab-39-logback/src/main/resources/application.yml b/lab-39/lab-39-logback/src/main/resources/application.yml new file mode 100644 index 000000000..b4df82471 --- /dev/null +++ b/lab-39/lab-39-logback/src/main/resources/application.yml @@ -0,0 +1,6 @@ +server: + port: 8079 + +spring: + application: + name: demo-application-logback diff --git a/lab-39/lab-39-logback/src/main/resources/logback-spring.xml b/lab-39/lab-39-logback/src/main/resources/logback-spring.xml new file mode 100644 index 000000000..ea96023ea --- /dev/null +++ b/lab-39/lab-39-logback/src/main/resources/logback-spring.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + ${CONSOLE_LOG_PATTERN} + + + + + + + + + ​ + + + ${LOG_FILE} + + + ${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz + 7 + 10MB + + + + + ${FILE_LOG_PATTERN} + + + + + + + + + + + diff --git a/lab-39/lab-39-opentracing/pom.xml b/lab-39/lab-39-opentracing/pom.xml new file mode 100644 index 000000000..a37c33cae --- /dev/null +++ b/lab-39/lab-39-opentracing/pom.xml @@ -0,0 +1,30 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-39-opentracing + + + + + org.apache.skywalking + apm-toolkit-opentracing + 6.6.0 + + + + + org.springframework.boot + spring-boot-starter-web + + + + diff --git a/lab-39/lab-39-opentracing/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/OpentracingApplication.java b/lab-39/lab-39-opentracing/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/OpentracingApplication.java new file mode 100644 index 000000000..235692817 --- /dev/null +++ b/lab-39/lab-39-opentracing/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/OpentracingApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class OpentracingApplication { + + public static void main(String[] args) { + SpringApplication.run(OpentracingApplication.class, args); + } + +} diff --git a/lab-39/lab-39-opentracing/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java b/lab-39/lab-39-opentracing/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java new file mode 100644 index 000000000..da6b1598e --- /dev/null +++ b/lab-39/lab-39-opentracing/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java @@ -0,0 +1,23 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.controller; + +import io.opentracing.Tracer; +import org.apache.skywalking.apm.toolkit.opentracing.SkywalkingTracer; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @GetMapping("/opentracing") + public String echo() { + // 创建一个 Span + Tracer tracer = new SkywalkingTracer(); + tracer.buildSpan("custom_operation").withTag("mp", "芋道源码").startManual().finish(); + + // 返回 + return "opentracing"; + } + +} diff --git a/lab-39/lab-39-opentracing/src/main/resources/application.yml b/lab-39/lab-39-opentracing/src/main/resources/application.yml new file mode 100644 index 000000000..396333f02 --- /dev/null +++ b/lab-39/lab-39-opentracing/src/main/resources/application.yml @@ -0,0 +1,2 @@ +server: + port: 8079 diff --git a/lab-39/lab-39-rabbitmq-demo/pom.xml b/lab-39/lab-39-rabbitmq-demo/pom.xml new file mode 100644 index 000000000..814b8bf5a --- /dev/null +++ b/lab-39/lab-39-rabbitmq-demo/pom.xml @@ -0,0 +1,29 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.1.RELEASE + + + 4.0.0 + + lab-39-rabbitmq-demo + + + + + org.springframework.boot + spring-boot-starter-amqp + + + + + org.springframework.boot + spring-boot-starter-web + + + + diff --git a/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/RabbitMQApplication.java b/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/RabbitMQApplication.java new file mode 100644 index 000000000..0555ea130 --- /dev/null +++ b/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/RabbitMQApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class RabbitMQApplication { + + public static void main(String[] args) { + SpringApplication.run(RabbitMQApplication.class, args); + } + +} diff --git a/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/config/RabbitConfig.java b/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/config/RabbitConfig.java new file mode 100644 index 000000000..195af5c14 --- /dev/null +++ b/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/config/RabbitConfig.java @@ -0,0 +1,40 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.config; + +import cn.iocoder.springboot.lab39.skywalkingdemo.message.DemoMessage; +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.DirectExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitConfig { + + // 创建 Queue + @Bean + public Queue demoQueue() { + return new Queue(DemoMessage.QUEUE, // Queue 名字 + true, // durable: 是否持久化 + false, // exclusive: 是否排它 + false); // autoDelete: 是否自动删除 + } + + // 创建 Direct Exchange + @Bean + public DirectExchange demoExchange() { + return new DirectExchange(DemoMessage.EXCHANGE, + true, // durable: 是否持久化 + false); // exclusive: 是否排它 + } + + // 创建 Binding + // Exchange:DemoMessage.EXCHANGE + // Routing key:DemoMessage.ROUTING_KEY + // Queue:DemoMessage.QUEUE + @Bean + public Binding demoBinding() { + return BindingBuilder.bind(demoQueue()).to(demoExchange()).with(DemoMessage.ROUTING_KEY); + } + +} diff --git a/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/consumer/DemoConsumer.java b/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/consumer/DemoConsumer.java new file mode 100644 index 000000000..a16ee7217 --- /dev/null +++ b/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/consumer/DemoConsumer.java @@ -0,0 +1,21 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.consumer; + +import cn.iocoder.springboot.lab39.skywalkingdemo.message.DemoMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +@Component +@RabbitListener(queues = DemoMessage.QUEUE) +public class DemoConsumer { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @RabbitHandler + public void onMessage(DemoMessage message) { + logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message); + } + +} diff --git a/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java b/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java new file mode 100644 index 000000000..cc341bd7a --- /dev/null +++ b/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java @@ -0,0 +1,26 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.controller; + +import cn.iocoder.springboot.lab39.skywalkingdemo.producer.DemoProducer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Autowired + private DemoProducer producer; + + @GetMapping("/rabbitmq") + public String echo() { + this.sendMessage(1); + return "rabbitmq"; + } + + public void sendMessage(Integer id) { + producer.syncSend(id); + } + +} diff --git a/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/message/DemoMessage.java b/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/message/DemoMessage.java new file mode 100644 index 000000000..8714ad9ed --- /dev/null +++ b/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/message/DemoMessage.java @@ -0,0 +1,34 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.message; + +import java.io.Serializable; + +public class DemoMessage implements Serializable { + + public static final String QUEUE = "QUEUE_DEMO_"; + + public static final String EXCHANGE = "EXCHANGE_DEMO_"; + + public static final String ROUTING_KEY = "ROUTING_KEY_"; + + /** + * 编号 + */ + private Integer id; + + public DemoMessage setId(Integer id) { + this.id = id; + return this; + } + + public Integer getId() { + return id; + } + + @Override + public String toString() { + return "DemoMessage{" + + "id=" + id + + '}'; + } + +} diff --git a/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/producer/DemoProducer.java b/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/producer/DemoProducer.java new file mode 100644 index 000000000..35d206cfd --- /dev/null +++ b/lab-39/lab-39-rabbitmq-demo/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/producer/DemoProducer.java @@ -0,0 +1,22 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.producer; + +import cn.iocoder.springboot.lab39.skywalkingdemo.message.DemoMessage; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class DemoProducer { + + @Autowired + private RabbitTemplate rabbitTemplate; + + public void syncSend(Integer id) { + // 创建 DemoMessage 消息 + DemoMessage message = new DemoMessage(); + message.setId(id); + // 同步发送消息 + rabbitTemplate.convertAndSend(DemoMessage.EXCHANGE, DemoMessage.ROUTING_KEY, message); + } + +} diff --git a/lab-04/lab-04-rabbitmq-demo-error-handler/target/classes/application.yaml b/lab-39/lab-39-rabbitmq-demo/src/main/resources/application.yaml similarity index 92% rename from lab-04/lab-04-rabbitmq-demo-error-handler/target/classes/application.yaml rename to lab-39/lab-39-rabbitmq-demo/src/main/resources/application.yaml index 59cf3bfb9..208ac6321 100644 --- a/lab-04/lab-04-rabbitmq-demo-error-handler/target/classes/application.yaml +++ b/lab-39/lab-39-rabbitmq-demo/src/main/resources/application.yaml @@ -1,3 +1,6 @@ +server: + port: 8079 + spring: # RabbitMQ 配置项,对应 RabbitProperties 配置类 rabbitmq: diff --git a/lab-39/lab-39-rocketmq/target/classes/application.yaml b/lab-39/lab-39-rocketmq/target/classes/application.yaml deleted file mode 100644 index a0314e9e1..000000000 --- a/lab-39/lab-39-rocketmq/target/classes/application.yaml +++ /dev/null @@ -1,10 +0,0 @@ -server: - port: 8079 - -# rocketmq 配置项,对应 RocketMQProperties 配置类 -rocketmq: - name-server: 127.0.0.1:9876 # RocketMQ Namesrv - # Producer 配置项 - producer: - group: demo-producer-group # 生产者分组 - send-message-timeout: 3000 # 发送消息超时时间,单位:毫秒。默认为 3000 。 diff --git a/lab-39/lab-39-springmvc/pom.xml b/lab-39/lab-39-springmvc/pom.xml index 8241d0b84..a8d0909bd 100644 --- a/lab-39/lab-39-springmvc/pom.xml +++ b/lab-39/lab-39-springmvc/pom.xml @@ -9,7 +9,6 @@ 4.0.0 - jar lab-39-springmvc diff --git a/lab-39/lab-39-trace-annotations/pom.xml b/lab-39/lab-39-trace-annotations/pom.xml new file mode 100644 index 000000000..31ffb0078 --- /dev/null +++ b/lab-39/lab-39-trace-annotations/pom.xml @@ -0,0 +1,30 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-39-trace-annotations + + + + + org.apache.skywalking + apm-toolkit-trace + 6.6.0 + + + + + org.springframework.boot + spring-boot-starter-web + + + + diff --git a/lab-39/lab-39-trace-annotations/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/TraceAnnotationsApplication.java b/lab-39/lab-39-trace-annotations/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/TraceAnnotationsApplication.java new file mode 100644 index 000000000..7a07bc970 --- /dev/null +++ b/lab-39/lab-39-trace-annotations/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/TraceAnnotationsApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class TraceAnnotationsApplication { + + public static void main(String[] args) { + SpringApplication.run(TraceAnnotationsApplication.class, args); + } + +} diff --git a/lab-39/lab-39-trace-annotations/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java b/lab-39/lab-39-trace-annotations/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java new file mode 100644 index 000000000..5beb03098 --- /dev/null +++ b/lab-39/lab-39-trace-annotations/src/main/java/cn/iocoder/springboot/lab39/skywalkingdemo/controller/DemoController.java @@ -0,0 +1,23 @@ +package cn.iocoder.springboot.lab39.skywalkingdemo.controller; + +import org.apache.skywalking.apm.toolkit.trace.ActiveSpan; +import org.apache.skywalking.apm.toolkit.trace.Trace; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @GetMapping("/trace_annotations") + @Trace(operationName = "trace_annotations") + public String echo() { + // 自定义 SkyWalking Span + ActiveSpan.tag("mp", "芋道源码"); + + // 返回 + return "trace_annotations"; + } + +} diff --git a/lab-39/lab-39-trace-annotations/src/main/resources/application.yml b/lab-39/lab-39-trace-annotations/src/main/resources/application.yml new file mode 100644 index 000000000..396333f02 --- /dev/null +++ b/lab-39/lab-39-trace-annotations/src/main/resources/application.yml @@ -0,0 +1,2 @@ +server: + port: 8079 diff --git a/lab-39/pom.xml b/lab-39/pom.xml index 25477c12a..2ee5e63e9 100644 --- a/lab-39/pom.xml +++ b/lab-39/pom.xml @@ -20,6 +20,13 @@ lab-39-elasticsearch lab-39-elasticsearch-jest lab-39-rocketmq + lab-39-kafka + lab-39-rabbitmq-demo + lab-39-activemq + lab-39-logback + lab-39-trace-annotations + lab-39-opentracing + lab-39-async diff --git a/lab-40/lab-40-activemq/pom.xml b/lab-40/lab-40-activemq/pom.xml new file mode 100644 index 000000000..30119c575 --- /dev/null +++ b/lab-40/lab-40-activemq/pom.xml @@ -0,0 +1,66 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.1.RELEASE + + + 4.0.0 + + lab-40-activemq + + + + + org.springframework.boot + spring-boot-starter-activemq + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + io.zipkin.brave + brave + + + io.zipkin.reporter2 + zipkin-sender-okhttp3 + + + + + + io.zipkin.brave + brave-instrumentation-spring-webmvc + + + + io.zipkin.brave + brave-instrumentation-jms + + + + + + + + + io.zipkin.brave + brave-bom + 5.9.1 + pom + import + + + + + diff --git a/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/ActiveMQApplication.java b/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/ActiveMQApplication.java new file mode 100644 index 000000000..8fcc36d2f --- /dev/null +++ b/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/ActiveMQApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab40.zipkindemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ActiveMQApplication { + + public static void main(String[] args) { + SpringApplication.run(ActiveMQApplication.class, args); + } + +} diff --git a/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java b/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java new file mode 100644 index 000000000..8a854aeac --- /dev/null +++ b/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.spring.webmvc.SpanCustomizingAsyncHandlerInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Import(SpanCustomizingAsyncHandlerInterceptor.class) // 创建拦截器 SpanCustomizingAsyncHandlerInterceptor Bean +public class SpringMvcConfiguration implements WebMvcConfigurer { + + @Autowired + public SpanCustomizingAsyncHandlerInterceptor webMvcTracingCustomizer; + + /** + * Decorates server spans with application-defined web tags + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { // 记录 SpringMVC 相关信息到 Span 中 + registry.addInterceptor(webMvcTracingCustomizer); + } + +} diff --git a/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java b/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java new file mode 100644 index 000000000..925b57d85 --- /dev/null +++ b/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java @@ -0,0 +1,112 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.CurrentSpanCustomizer; +import brave.SpanCustomizer; +import brave.Tracing; +import brave.http.HttpTracing; +import brave.jms.JmsTracing; +import brave.servlet.TracingFilter; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import zipkin2.Span; +import zipkin2.reporter.AsyncReporter; +import zipkin2.reporter.Sender; +import zipkin2.reporter.okhttp3.OkHttpSender; + +import javax.jms.ConnectionFactory; +import javax.servlet.Filter; + +@Configuration +public class ZipkinConfiguration { + + // ==================== 通用配置 ==================== + + /** + * Configuration for how to send spans to Zipkin + */ + @Bean + public Sender sender() { // Sender 采用 HTTP 通信方式 + return OkHttpSender.create("http://127.0.0.1:9411/api/v2/spans"); + } + + /** + * Configuration for how to buffer spans into messages for Zipkin + */ + @Bean + public AsyncReporter spanReporter() { // 异步 Reporter + return AsyncReporter.create(sender()); + } + + /** + * Controls aspects of tracing such as the service name that shows up in the UI + */ + @Bean + public Tracing tracing(@Value("${spring.application.name}") String serviceName) { + return Tracing.newBuilder() + .localServiceName(serviceName) // 应用名 + .spanReporter(this.spanReporter()).build(); + } + + /** + * Allows someone to add tags to a span if a trace is in progress + */ + @Bean + public SpanCustomizer spanCustomizer(Tracing tracing) { + return CurrentSpanCustomizer.create(tracing); + } + + // ==================== HTTP 相关 ==================== + + /** + * Decides how to name and tag spans. By default they are named the same as the http method + */ + @Bean + public HttpTracing httpTracing(Tracing tracing) { + return HttpTracing.create(tracing); + } + + /** + * Creates server spans for http requests + */ + @Bean + public Filter tracingFilter(HttpTracing httpTracing) { // 拦截请求,记录 HTTP 请求的链路信息 + return TracingFilter.create(httpTracing); + } + + // ==================== SpringMVC 相关 ==================== + // @see SpringMvcConfiguration 类上的,@Import(SpanCustomizingAsyncHandlerInterceptor.class) 。因为 SpanCustomizingAsyncHandlerInterceptor 未提供 public 构造方法 + + // ==================== RabbitMQ 相关 ==================== + + @Bean + public JmsTracing jmsTracing(Tracing tracing) { + return JmsTracing.newBuilder(tracing) + .remoteServiceName("demo-mq-activemq") // 远程 ActiveMQ 服务名,可自定义 + .build(); + } + + @Bean + public BeanPostProcessor activeMQBeanPostProcessor(JmsTracing jmsTracing) { + return new BeanPostProcessor() { + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + return bean; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + // 如果是 ConnectionFactory ,针对 ActiveMQ Producer 和 Consumer + if (bean instanceof ConnectionFactory) { + return jmsTracing.connectionFactory((ConnectionFactory) bean); + } + return bean; + } + + }; + } + +} diff --git a/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/consumer/DemoConsumer.java b/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/consumer/DemoConsumer.java new file mode 100644 index 000000000..e9c5e66ab --- /dev/null +++ b/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/consumer/DemoConsumer.java @@ -0,0 +1,19 @@ +package cn.iocoder.springboot.lab40.zipkindemo.consumer; + +import cn.iocoder.springboot.lab40.zipkindemo.message.DemoMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jms.annotation.JmsListener; +import org.springframework.stereotype.Component; + +@Component +public class DemoConsumer { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @JmsListener(destination = DemoMessage.QUEUE) + public void onMessage(DemoMessage message) { + logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message); + } + +} diff --git a/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java b/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java new file mode 100644 index 000000000..7fa8c8d49 --- /dev/null +++ b/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java @@ -0,0 +1,26 @@ +package cn.iocoder.springboot.lab40.zipkindemo.controller; + +import cn.iocoder.springboot.lab40.zipkindemo.producer.DemoProducer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Autowired + private DemoProducer producer; + + @GetMapping("/activemq") + public String echo() { + this.sendMessage(1); + return "activemq"; + } + + public void sendMessage(Integer id) { + producer.syncSend(id); + } + +} diff --git a/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/message/DemoMessage.java b/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/message/DemoMessage.java new file mode 100644 index 000000000..47ffc39ff --- /dev/null +++ b/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/message/DemoMessage.java @@ -0,0 +1,30 @@ +package cn.iocoder.springboot.lab40.zipkindemo.message; + +import java.io.Serializable; + +public class DemoMessage implements Serializable { + + public static final String QUEUE = "QUEUE_DEMO_"; + + /** + * 编号 + */ + private Integer id; + + public DemoMessage setId(Integer id) { + this.id = id; + return this; + } + + public Integer getId() { + return id; + } + + @Override + public String toString() { + return "DemoMessage{" + + "id=" + id + + '}'; + } + +} diff --git a/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/producer/DemoProducer.java b/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/producer/DemoProducer.java new file mode 100644 index 000000000..30c3e4035 --- /dev/null +++ b/lab-40/lab-40-activemq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/producer/DemoProducer.java @@ -0,0 +1,22 @@ +package cn.iocoder.springboot.lab40.zipkindemo.producer; + +import cn.iocoder.springboot.lab40.zipkindemo.message.DemoMessage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jms.core.JmsMessagingTemplate; +import org.springframework.stereotype.Component; + +@Component +public class DemoProducer { + + @Autowired + private JmsMessagingTemplate jmsTemplate; + + public void syncSend(Integer id) { + // 创建 DemoMessage 消息 + DemoMessage message = new DemoMessage(); + message.setId(id); + // 同步发送消息 + jmsTemplate.convertAndSend(DemoMessage.QUEUE, message); + } + +} diff --git a/lab-32/lab-32-activemq-demo-orderly/target/classes/application.yaml b/lab-40/lab-40-activemq/src/main/resources/application.yaml similarity index 63% rename from lab-32/lab-32-activemq-demo-orderly/target/classes/application.yaml rename to lab-40/lab-40-activemq/src/main/resources/application.yaml index 8179b5891..375a4a1ce 100644 --- a/lab-32/lab-32-activemq-demo-orderly/target/classes/application.yaml +++ b/lab-40/lab-40-activemq/src/main/resources/application.yaml @@ -1,7 +1,10 @@ spring: + application: + name: demo-application-activemq + # ActiveMQ 配置项,对应 ActiveMQProperties 配置类 activemq: - broker-url: tcp://127.0.0.1:61616 # RabbitMQ Broker 的地址 + broker-url: tcp://127.0.0.1:61616 # Activemq Broker 的地址 user: admin # 账号 password: admin # 密码 packages: diff --git a/lab-40/lab-40-demo/pom.xml b/lab-40/lab-40-demo/pom.xml new file mode 100644 index 000000000..d12d4da06 --- /dev/null +++ b/lab-40/lab-40-demo/pom.xml @@ -0,0 +1,86 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-40-demo + jar + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.apache.httpcomponents + httpclient + + + + + + io.zipkin.brave + brave + + + io.zipkin.reporter2 + zipkin-sender-okhttp3 + + + + + + io.zipkin.brave + brave-instrumentation-spring-webmvc + + + + + io.zipkin.brave + brave-instrumentation-httpclient + + + + + io.zipkin.brave + brave-context-slf4j + + + + + + + + + io.zipkin.brave + brave-bom + 5.9.1 + pom + import + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + true + + + + + + diff --git a/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/Application.java b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/Application.java new file mode 100644 index 000000000..e2a5f21ff --- /dev/null +++ b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/Application.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab40.zipkindemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/Application2.java b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/Application2.java new file mode 100644 index 000000000..725a60bdf --- /dev/null +++ b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/Application2.java @@ -0,0 +1,14 @@ +package cn.iocoder.springboot.lab40.zipkindemo; + +import org.springframework.boot.SpringApplication; + +//@SpringBootApplication +public class Application2 { + + public static void main(String[] args) { + System.setProperty("spring.application.name", "demo-application-02"); + System.setProperty("server.port", "8079"); + SpringApplication.run(Application2.class, args); + } + +} diff --git a/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java new file mode 100644 index 000000000..b56fd2d01 --- /dev/null +++ b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.spring.webmvc.SpanCustomizingAsyncHandlerInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Import(SpanCustomizingAsyncHandlerInterceptor.class) +public class SpringMvcConfiguration implements WebMvcConfigurer { + + @Autowired + public SpanCustomizingAsyncHandlerInterceptor webMvcTracingCustomizer; + + /** + * Decorates server spans with application-defined web tags + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(webMvcTracingCustomizer); + } + +} diff --git a/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java new file mode 100644 index 000000000..2a5f3e95a --- /dev/null +++ b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java @@ -0,0 +1,102 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.CurrentSpanCustomizer; +import brave.SpanCustomizer; +import brave.Tracing; +import brave.http.HttpTracing; +import brave.httpclient.TracingHttpClientBuilder; +import brave.servlet.TracingFilter; +import org.apache.http.impl.client.CloseableHttpClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateCustomizer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; +import zipkin2.Span; +import zipkin2.reporter.AsyncReporter; +import zipkin2.reporter.Sender; +import zipkin2.reporter.okhttp3.OkHttpSender; + +import javax.servlet.Filter; + +@Configuration +public class ZipkinConfiguration { + + // ==================== 通用配置 ==================== + + /** + * Configuration for how to send spans to Zipkin + */ + @Bean + public Sender sender() { + return OkHttpSender.create("http://127.0.0.1:9411/api/v2/spans"); + } + + /** + * Configuration for how to buffer spans into messages for Zipkin + */ + @Bean + public AsyncReporter spanReporter() { + return AsyncReporter.create(sender()); + } + + /** + * Controls aspects of tracing such as the service name that shows up in the UI + */ + @Bean + public Tracing tracing(@Value("${spring.application.name}") String serviceName) { + return Tracing.newBuilder() + .localServiceName(serviceName) +// .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() +// .addScopeDecorator(MDCScopeDecorator.create()) // puts trace IDs into logs +// .build() +// ) + .spanReporter(spanReporter()).build(); + } + + /** + * Allows someone to add tags to a span if a trace is in progress + */ + @Bean + public SpanCustomizer spanCustomizer(Tracing tracing) { + return CurrentSpanCustomizer.create(tracing); + } + + // ==================== HTTP 相关 ==================== + + /** + * Decides how to name and tag spans. By default they are named the same as the http method + */ + @Bean + public HttpTracing httpTracing(Tracing tracing) { + return HttpTracing.create(tracing); + } + + /** + * Creates server spans for http requests + */ + @Bean + public Filter tracingFilter(HttpTracing httpTracing) { + return TracingFilter.create(httpTracing); + } + + // ==================== SpringMVC 相关 ==================== + // @see SpringMvcConfiguration 类上的,@Import(SpanCustomizingAsyncHandlerInterceptor.class) + + // ==================== HttpClient 相关 ==================== + + @Bean + public RestTemplateCustomizer useTracedHttpClient(HttpTracing httpTracing) { + // 创建 CloseableHttpClient 对象,内置 HttpTracing 进行 HTTP 链路追踪。 + final CloseableHttpClient httpClient = TracingHttpClientBuilder.create(httpTracing).build(); + // 创建 RestTemplateCustomizer 对象 + return new RestTemplateCustomizer() { + @Override + public void customize(RestTemplate restTemplate) { + restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory(httpClient)); + } + }; + } + +} diff --git a/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java new file mode 100644 index 000000000..4fd4d0c5f --- /dev/null +++ b/lab-40/lab-40-demo/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java @@ -0,0 +1,32 @@ +package cn.iocoder.springboot.lab40.zipkindemo.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + private final RestTemplate restTemplate; + + DemoController(@Autowired RestTemplateBuilder restTemplateBuilder) { + this.restTemplate = restTemplateBuilder.build(); + } + + @GetMapping("/echo") + public String echo() { + return "echo"; + } + + @GetMapping("/http") + public String http() { +// restTemplate.getForObject("https://www.baidu.com", String.class); + restTemplate.getForObject("http://127.0.0.1:8079/demo/echo", String.class); + return "echo"; + } + +} diff --git a/lab-40/lab-40-demo/src/main/resources/application.yaml b/lab-40/lab-40-demo/src/main/resources/application.yaml new file mode 100644 index 000000000..d6e31da97 --- /dev/null +++ b/lab-40/lab-40-demo/src/main/resources/application.yaml @@ -0,0 +1,3 @@ +spring: + application: + name: demo-application diff --git a/lab-40/lab-40-elasticsearch/pom.xml b/lab-40/lab-40-elasticsearch/pom.xml new file mode 100644 index 000000000..b9133bca2 --- /dev/null +++ b/lab-40/lab-40-elasticsearch/pom.xml @@ -0,0 +1,75 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.1.RELEASE + + + 4.0.0 + + lab-40-elasticsearch + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-data-elasticsearch + + + + + + io.zipkin.brave + brave + + + io.zipkin.reporter2 + zipkin-sender-okhttp3 + + + + + + io.zipkin.brave + brave-instrumentation-spring-webmvc + + + + + io.opentracing.brave + brave-opentracing + 0.35.0 + + + + + io.opentracing.contrib + opentracing-elasticsearch6-client + 0.1.6 + + + + + + + + + io.zipkin.brave + brave-bom + 5.9.1 + pom + import + + + + + diff --git a/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/ElasticsearchApplication.java b/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/ElasticsearchApplication.java new file mode 100644 index 000000000..cad36f966 --- /dev/null +++ b/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/ElasticsearchApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab40.zipkindemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ElasticsearchApplication { + + public static void main(String[] args) { + SpringApplication.run(ElasticsearchApplication.class, args); + } + +} diff --git a/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java b/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java new file mode 100644 index 000000000..b56fd2d01 --- /dev/null +++ b/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.spring.webmvc.SpanCustomizingAsyncHandlerInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Import(SpanCustomizingAsyncHandlerInterceptor.class) +public class SpringMvcConfiguration implements WebMvcConfigurer { + + @Autowired + public SpanCustomizingAsyncHandlerInterceptor webMvcTracingCustomizer; + + /** + * Decorates server spans with application-defined web tags + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(webMvcTracingCustomizer); + } + +} diff --git a/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java b/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java new file mode 100644 index 000000000..a29b2be65 --- /dev/null +++ b/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java @@ -0,0 +1,110 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.CurrentSpanCustomizer; +import brave.SpanCustomizer; +import brave.Tracing; +import brave.http.HttpTracing; +import brave.opentracing.BraveTracer; +import brave.servlet.TracingFilter; +import cn.iocoder.springboot.lab40.zipkindemo.spring.TracingTransportClientFactoryBean; +import io.opentracing.Tracer; +import org.elasticsearch.client.transport.TransportClient; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import zipkin2.Span; +import zipkin2.reporter.AsyncReporter; +import zipkin2.reporter.Sender; +import zipkin2.reporter.okhttp3.OkHttpSender; + +import javax.servlet.Filter; +import java.util.Properties; + +@Configuration +public class ZipkinConfiguration { + + // ==================== 通用配置 ==================== + + /** + * Configuration for how to send spans to Zipkin + */ + @Bean + public Sender sender() { + return OkHttpSender.create("http://127.0.0.1:9411/api/v2/spans"); + } + + /** + * Configuration for how to buffer spans into messages for Zipkin + */ + @Bean + public AsyncReporter spanReporter() { + return AsyncReporter.create(sender()); + } + + /** + * Controls aspects of tracing such as the service name that shows up in the UI + */ + @Bean + public Tracing tracing(@Value("${spring.application.name}") String serviceName) { + return Tracing.newBuilder() + .localServiceName(serviceName) + .spanReporter(spanReporter()).build(); + } + + @Bean + public Tracer openTracer(Tracing tracing) { + return BraveTracer.create(tracing); + } + + /** + * Allows someone to add tags to a span if a trace is in progress + */ + @Bean + public SpanCustomizer spanCustomizer(Tracing tracing) { + return CurrentSpanCustomizer.create(tracing); + } + + // ==================== HTTP 相关 ==================== + + /** + * Decides how to name and tag spans. By default they are named the same as the http method + */ + @Bean + public HttpTracing httpTracing(Tracing tracing) { + return HttpTracing.create(tracing); + } + + /** + * Creates server spans for http requests + */ + @Bean + public Filter tracingFilter(HttpTracing httpTracing) { + return TracingFilter.create(httpTracing); + } + + // ==================== SpringMVC 相关 ==================== + // @see SpringMvcConfiguration 类上的,@Import(SpanCustomizingAsyncHandlerInterceptor.class) + + // ==================== Elasticsearch 相关 ==================== + + @Bean + public TransportClient elasticsearchClient(Tracer tracer, ElasticsearchProperties elasticsearchProperties) throws Exception { + // 创建 TracingTransportClientFactoryBean 对象 + TracingTransportClientFactoryBean factory = new TracingTransportClientFactoryBean(tracer); + // 设置其属性 + factory.setClusterNodes(elasticsearchProperties.getClusterNodes()); + factory.setProperties(this.createElasticsearch(elasticsearchProperties)); + // 创建 TransportClient 对象,并返回 + factory.afterPropertiesSet(); + return factory.getObject(); + } + + private Properties createElasticsearch(ElasticsearchProperties elasticsearchProperties) { + Properties properties = new Properties(); + properties.put("cluster.name", elasticsearchProperties.getClusterName()); + properties.putAll(elasticsearchProperties.getProperties()); + return properties; + } + +} diff --git a/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java b/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java new file mode 100644 index 000000000..9e581a9ba --- /dev/null +++ b/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java @@ -0,0 +1,27 @@ +package cn.iocoder.springboot.lab40.zipkindemo.controller; + +import cn.iocoder.springboot.lab40.zipkindemo.dataobject.ESUserDO; +import cn.iocoder.springboot.lab40.zipkindemo.repository.ESUserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") + public class DemoController { + + @Autowired + private ESUserRepository userRepository; + + @GetMapping("/elasticsearch") + public String mysql() { + this.findById(1); + return "elasticsearch"; + } + + public ESUserDO findById(Integer id) { + return userRepository.findById(id).orElse(null); + } + +} diff --git a/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/dataobject/ESUserDO.java b/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/dataobject/ESUserDO.java new file mode 100644 index 000000000..66d915969 --- /dev/null +++ b/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/dataobject/ESUserDO.java @@ -0,0 +1,41 @@ +package cn.iocoder.springboot.lab40.zipkindemo.dataobject; + +import org.springframework.data.annotation.Id; +import org.springframework.data.elasticsearch.annotations.Document; + +import java.util.Date; + +@Document(indexName = "user", // 索引名 + type = "user", // 类型。未来的版本即将废弃 + shards = 1, // 默认索引分区数 + replicas = 0, // 每个分区的备份数 + refreshInterval = "-1" // 刷新间隔 +) +public class ESUserDO { + + @Id + private Integer id; + /** + * 账号 + */ + private String username; + /** + * 密码 + */ + private String password; + /** + * 创建时间 + */ + private Date createTime; + + @Override + public String toString() { + return "UserDO{" + + "id=" + id + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", createTime=" + createTime + + '}'; + } + +} diff --git a/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/repository/ESUserRepository.java b/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/repository/ESUserRepository.java new file mode 100644 index 000000000..4add2c4ce --- /dev/null +++ b/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/repository/ESUserRepository.java @@ -0,0 +1,8 @@ +package cn.iocoder.springboot.lab40.zipkindemo.repository; + +import cn.iocoder.springboot.lab40.zipkindemo.dataobject.ESUserDO; +import org.springframework.data.elasticsearch.repository.ElasticsearchRepository; + +public interface ESUserRepository extends ElasticsearchRepository { + +} diff --git a/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/spring/ClusterNodes.java b/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/spring/ClusterNodes.java new file mode 100644 index 000000000..0643d7487 --- /dev/null +++ b/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/spring/ClusterNodes.java @@ -0,0 +1,81 @@ +package cn.iocoder.springboot.lab40.zipkindemo.spring; + +import org.elasticsearch.common.transport.TransportAddress; +import org.springframework.data.util.Streamable; +import org.springframework.util.Assert; +import org.springframework.util.StringUtils; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.Arrays; +import java.util.Iterator; +import java.util.List; +import java.util.stream.Collectors; + +class ClusterNodes implements Streamable { + + public static ClusterNodes DEFAULT = ClusterNodes.of("127.0.0.1:9300"); + + private static final String COLON = ":"; + private static final String COMMA = ","; + + private final List clusterNodes; + + /** + * Creates a new {@link ClusterNodes} by parsing the given source. + * + * @param source must not be {@literal null} or empty. + */ + private ClusterNodes(String source) { + + Assert.hasText(source, "Cluster nodes source must not be null or empty!"); + + String[] nodes = StringUtils.delimitedListToStringArray(source, COMMA); + + this.clusterNodes = Arrays.stream(nodes).map(node -> { + + String[] segments = StringUtils.delimitedListToStringArray(node, COLON); + + Assert.isTrue(segments.length == 2, + () -> String.format("Invalid cluster node %s in %s! Must be in the format host:port!", node, source)); + + String host = segments[0].trim(); + String port = segments[1].trim(); + + Assert.hasText(host, () -> String.format("No host name given cluster node %s!", node)); + Assert.hasText(port, () -> String.format("No port given in cluster node %s!", node)); + + return new TransportAddress(toInetAddress(host), Integer.valueOf(port)); + + }).collect(Collectors.toList()); + } + + /** + * Creates a new {@link ClusterNodes} by parsing the given source. The expected format is a comma separated list of + * host-port-combinations separated by a colon: {@code host:port,host:port,…}. + * + * @param source must not be {@literal null} or empty. + * @return + */ + public static ClusterNodes of(String source) { + return new ClusterNodes(source); + } + + /* + * (non-Javadoc) + * @see java.lang.Iterable#iterator() + */ + @Override + public Iterator iterator() { + return clusterNodes.iterator(); + } + + private static InetAddress toInetAddress(String host) { + + try { + return InetAddress.getByName(host); + } catch (UnknownHostException o_O) { + throw new IllegalArgumentException(o_O); + } + } +} diff --git a/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/spring/TracingTransportClientFactoryBean.java b/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/spring/TracingTransportClientFactoryBean.java new file mode 100644 index 000000000..6076b98d0 --- /dev/null +++ b/lab-40/lab-40-elasticsearch/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/spring/TracingTransportClientFactoryBean.java @@ -0,0 +1,138 @@ +package cn.iocoder.springboot.lab40.zipkindemo.spring; + +import io.opentracing.Tracer; +import io.opentracing.contrib.elasticsearch6.TracingPreBuiltTransportClient; +import org.elasticsearch.client.transport.TransportClient; +import org.elasticsearch.common.settings.Settings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.DisposableBean; +import org.springframework.beans.factory.FactoryBean; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.data.elasticsearch.client.TransportClientFactoryBean; + +import java.util.Properties; + +/** + * 参考 {@link TransportClientFactoryBean} 来实现。 + */ +public class TracingTransportClientFactoryBean implements FactoryBean, InitializingBean, DisposableBean { + + private static final Logger logger = LoggerFactory.getLogger(TransportClientFactoryBean.class); + private ClusterNodes clusterNodes = ClusterNodes.of("127.0.0.1:9300"); + private String clusterName = "elasticsearch"; + private Boolean clientTransportSniff = true; + private Boolean clientIgnoreClusterName = Boolean.FALSE; + private String clientPingTimeout = "5s"; + private String clientNodesSamplerInterval = "5s"; + private TransportClient client; + private Properties properties; + + private Tracer tracer; + + public TracingTransportClientFactoryBean(Tracer tracer) { + this.tracer = tracer; + } + + @Override + public void destroy() throws Exception { + try { + logger.info("Closing elasticSearch client"); + if (client != null) { + client.close(); + } + } catch (final Exception e) { + logger.error("Error closing ElasticSearch client: ", e); + } + } + + @Override + public TransportClient getObject() throws Exception { + return client; + } + + @Override + public Class getObjectType() { + return TransportClient.class; + } + + @Override + public boolean isSingleton() { + return true; + } + + @Override + public void afterPropertiesSet() throws Exception { + buildClient(); + } + + protected void buildClient() throws Exception { + // 创建可追踪的 TracingPreBuiltTransportClient + client = new TracingPreBuiltTransportClient(tracer, settings()); + + clusterNodes.stream() // + .peek(it -> logger.info("Adding transport node : " + it.toString())) // + .forEach(client::addTransportAddress); + + client.connectedNodes(); + } + + private Settings settings() { + if (properties != null) { + Settings.Builder builder = Settings.builder(); + + properties.forEach((key, value) -> { + builder.put(key.toString(), value.toString()); + }); + + return builder.build(); + } + return Settings.builder() + .put("cluster.name", clusterName) + .put("client.transport.sniff", clientTransportSniff) + .put("client.transport.ignore_cluster_name", clientIgnoreClusterName) + .put("client.transport.ping_timeout", clientPingTimeout) + .put("client.transport.nodes_sampler_interval", clientNodesSamplerInterval) + .build(); + } + + public void setClusterNodes(String clusterNodes) { + this.clusterNodes = ClusterNodes.of(clusterNodes); + } + + public void setClusterName(String clusterName) { + this.clusterName = clusterName; + } + + public void setClientTransportSniff(Boolean clientTransportSniff) { + this.clientTransportSniff = clientTransportSniff; + } + + public String getClientNodesSamplerInterval() { + return clientNodesSamplerInterval; + } + + public void setClientNodesSamplerInterval(String clientNodesSamplerInterval) { + this.clientNodesSamplerInterval = clientNodesSamplerInterval; + } + + public String getClientPingTimeout() { + return clientPingTimeout; + } + + public void setClientPingTimeout(String clientPingTimeout) { + this.clientPingTimeout = clientPingTimeout; + } + + public Boolean getClientIgnoreClusterName() { + return clientIgnoreClusterName; + } + + public void setClientIgnoreClusterName(Boolean clientIgnoreClusterName) { + this.clientIgnoreClusterName = clientIgnoreClusterName; + } + + public void setProperties(Properties properties) { + this.properties = properties; + } +} diff --git a/lab-15/lab-15-spring-data-elasticsearch/target/classes/application.yaml b/lab-40/lab-40-elasticsearch/src/main/resources/application.yml similarity index 73% rename from lab-15/lab-15-spring-data-elasticsearch/target/classes/application.yaml rename to lab-40/lab-40-elasticsearch/src/main/resources/application.yml index 1f8f9db3b..b4b5c397e 100644 --- a/lab-15/lab-15-spring-data-elasticsearch/target/classes/application.yaml +++ b/lab-40/lab-40-elasticsearch/src/main/resources/application.yml @@ -1,4 +1,7 @@ spring: + application: + name: demo-application-elasticsearch + data: # Elasticsearch 配置项 elasticsearch: diff --git a/lab-40/lab-40-kafka/pom.xml b/lab-40/lab-40-kafka/pom.xml new file mode 100644 index 000000000..6050f8d9f --- /dev/null +++ b/lab-40/lab-40-kafka/pom.xml @@ -0,0 +1,68 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.1.11.RELEASE + + + 4.0.0 + + lab-40-kafka + + + + + + org.springframework.kafka + spring-kafka + 2.2.11.RELEASE + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + io.zipkin.brave + brave + + + io.zipkin.reporter2 + zipkin-sender-okhttp3 + + + + + + io.zipkin.brave + brave-instrumentation-spring-webmvc + + + + io.zipkin.brave + brave-instrumentation-kafka-clients + + + + + + + + + io.zipkin.brave + brave-bom + 5.9.1 + pom + import + + + + + diff --git a/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/KafkaApplication.java b/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/KafkaApplication.java new file mode 100644 index 000000000..2d36c600f --- /dev/null +++ b/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/KafkaApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab40.zipkindemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class KafkaApplication { + + public static void main(String[] args) { + SpringApplication.run(KafkaApplication.class, args); + } + +} diff --git a/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java b/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java new file mode 100644 index 000000000..8a854aeac --- /dev/null +++ b/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.spring.webmvc.SpanCustomizingAsyncHandlerInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Import(SpanCustomizingAsyncHandlerInterceptor.class) // 创建拦截器 SpanCustomizingAsyncHandlerInterceptor Bean +public class SpringMvcConfiguration implements WebMvcConfigurer { + + @Autowired + public SpanCustomizingAsyncHandlerInterceptor webMvcTracingCustomizer; + + /** + * Decorates server spans with application-defined web tags + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { // 记录 SpringMVC 相关信息到 Span 中 + registry.addInterceptor(webMvcTracingCustomizer); + } + +} diff --git a/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java b/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java new file mode 100644 index 000000000..ee3efff41 --- /dev/null +++ b/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java @@ -0,0 +1,141 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.CurrentSpanCustomizer; +import brave.SpanCustomizer; +import brave.Tracing; +import brave.http.HttpTracing; +import brave.kafka.clients.KafkaTracing; +import brave.servlet.TracingFilter; +import org.apache.kafka.clients.consumer.Consumer; +import org.apache.kafka.clients.producer.Producer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.kafka.KafkaProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.kafka.core.ConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaConsumerFactory; +import org.springframework.kafka.core.DefaultKafkaProducerFactory; +import org.springframework.kafka.core.ProducerFactory; +import zipkin2.Span; +import zipkin2.reporter.AsyncReporter; +import zipkin2.reporter.Sender; +import zipkin2.reporter.okhttp3.OkHttpSender; + +import javax.servlet.Filter; +import java.util.Properties; + +@Configuration +public class ZipkinConfiguration { + + // ==================== 通用配置 ==================== + + /** + * Configuration for how to send spans to Zipkin + */ + @Bean + public Sender sender() { // Sender 采用 HTTP 通信方式 + return OkHttpSender.create("http://127.0.0.1:9411/api/v2/spans"); + } + + /** + * Configuration for how to buffer spans into messages for Zipkin + */ + @Bean + public AsyncReporter spanReporter() { // 异步 Reporter + return AsyncReporter.create(sender()); + } + + /** + * Controls aspects of tracing such as the service name that shows up in the UI + */ + @Bean + public Tracing tracing(@Value("${spring.application.name}") String serviceName) { + return Tracing.newBuilder() + .localServiceName(serviceName) // 应用名 + .spanReporter(this.spanReporter()).build(); + } + + /** + * Allows someone to add tags to a span if a trace is in progress + */ + @Bean + public SpanCustomizer spanCustomizer(Tracing tracing) { + return CurrentSpanCustomizer.create(tracing); + } + + // ==================== HTTP 相关 ==================== + + /** + * Decides how to name and tag spans. By default they are named the same as the http method + */ + @Bean + public HttpTracing httpTracing(Tracing tracing) { + return HttpTracing.create(tracing); + } + + /** + * Creates server spans for http requests + */ + @Bean + public Filter tracingFilter(HttpTracing httpTracing) { // 拦截请求,记录 HTTP 请求的链路信息 + return TracingFilter.create(httpTracing); + } + + // ==================== SpringMVC 相关 ==================== + // @see SpringMvcConfiguration 类上的,@Import(SpanCustomizingAsyncHandlerInterceptor.class) 。因为 SpanCustomizingAsyncHandlerInterceptor 未提供 public 构造方法 + + // ==================== Kafka 相关 ==================== + + @Bean + public KafkaTracing kafkaTracing(Tracing tracing) { + return KafkaTracing.newBuilder(tracing) + .remoteServiceName("demo-mq-kafka") // 远程 Kafka 服务名,可自定义 + .build(); + } + + @Bean + public ProducerFactory kafkaProducerFactory(KafkaProperties properties, KafkaTracing kafkaTracing) { + // 创建 DefaultKafkaProducerFactory 对象 + DefaultKafkaProducerFactory factory = new DefaultKafkaProducerFactory(properties.buildProducerProperties()) { + + @Override + public Producer createProducer() { + // 创建默认的 Producer + Producer producer = super.createProducer(); + // 创建可链路追踪的 Producer + return kafkaTracing.producer(producer); + } + + }; + + // 设置事务前缀 + String transactionIdPrefix = properties.getProducer().getTransactionIdPrefix(); + if (transactionIdPrefix != null) { + factory.setTransactionIdPrefix(transactionIdPrefix); + } + + return factory; + } + + @Bean + public ConsumerFactory kafkaConsumerFactory(KafkaProperties properties, KafkaTracing kafkaTracing) { + // 创建 DefaultKafkaConsumerFactory 对象 + return new DefaultKafkaConsumerFactory(properties.buildConsumerProperties()) { + + @Override + public Consumer createConsumer(String groupId, String clientIdPrefix, String clientIdSuffix) { + return this.createConsumer(groupId, clientIdPrefix, clientIdSuffix, null); + } + + @Override + public Consumer createConsumer(String groupId, String clientIdPrefix, final String clientIdSuffixArg, Properties properties) { + // 创建默认的 Consumer + Consumer consumer = super.createConsumer(groupId, clientIdPrefix, clientIdSuffixArg, properties); + // 创建可链路追踪的 Consumer + return kafkaTracing.consumer(consumer); + } + + }; + } + +} diff --git a/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/consumer/DemoConsumer.java b/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/consumer/DemoConsumer.java new file mode 100644 index 000000000..2bc8f13b6 --- /dev/null +++ b/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/consumer/DemoConsumer.java @@ -0,0 +1,20 @@ +package cn.iocoder.springboot.lab40.zipkindemo.consumer; + +import cn.iocoder.springboot.lab40.zipkindemo.message.DemoMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.kafka.annotation.KafkaListener; +import org.springframework.stereotype.Component; + +@Component +public class DemoConsumer { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @KafkaListener(topics = DemoMessage.TOPIC, + groupId = "demo-consumer-group-" + DemoMessage.TOPIC) + public void onMessage(DemoMessage message) { + logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message); + } + +} diff --git a/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java b/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java new file mode 100644 index 000000000..2ccfd2a03 --- /dev/null +++ b/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java @@ -0,0 +1,28 @@ +package cn.iocoder.springboot.lab40.zipkindemo.controller; + +import cn.iocoder.springboot.lab40.zipkindemo.producer.DemoProducer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.concurrent.ExecutionException; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Autowired + private DemoProducer producer; + + @GetMapping("/kafka") + public String echo() throws ExecutionException, InterruptedException { + this.sendMessage(1); + return "kafka"; + } + + public void sendMessage(Integer id) throws ExecutionException, InterruptedException { + producer.syncSend(id); + } + +} diff --git a/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/message/DemoMessage.java b/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/message/DemoMessage.java new file mode 100644 index 000000000..cfa294fb2 --- /dev/null +++ b/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/message/DemoMessage.java @@ -0,0 +1,31 @@ +package cn.iocoder.springboot.lab40.zipkindemo.message; + +/** + * 示例 Message 消息 + */ +public class DemoMessage { + + public static final String TOPIC = "DEMO"; + + /** + * 编号 + */ + private Integer id; + + public DemoMessage setId(Integer id) { + this.id = id; + return this; + } + + public Integer getId() { + return id; + } + + @Override + public String toString() { + return "DemoMessage{" + + "id=" + id + + '}'; + } + +} diff --git a/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/producer/DemoProducer.java b/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/producer/DemoProducer.java new file mode 100644 index 000000000..e70439ed9 --- /dev/null +++ b/lab-40/lab-40-kafka/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/producer/DemoProducer.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab40.zipkindemo.producer; + +import cn.iocoder.springboot.lab40.zipkindemo.message.DemoMessage; +import org.springframework.kafka.core.KafkaTemplate; +import org.springframework.kafka.support.SendResult; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.concurrent.ExecutionException; + +@Component +public class DemoProducer { + + @Resource + private KafkaTemplate kafkaTemplate; + + public SendResult syncSend(Integer id) throws ExecutionException, InterruptedException { + // 创建 DemoMessage 消息 + DemoMessage message = new DemoMessage(); + message.setId(id); + // 同步发送消息 + return kafkaTemplate.send(DemoMessage.TOPIC, message).get(); + } + +} diff --git a/lab-03/lab-03-kafka-demo/target/classes/application.yaml b/lab-40/lab-40-kafka/src/main/resources/application.yaml similarity index 79% rename from lab-03/lab-03-kafka-demo/target/classes/application.yaml rename to lab-40/lab-40-kafka/src/main/resources/application.yaml index 00daf849d..af6fcae40 100644 --- a/lab-03/lab-03-kafka-demo/target/classes/application.yaml +++ b/lab-40/lab-40-kafka/src/main/resources/application.yaml @@ -1,4 +1,7 @@ spring: + application: + name: demo-application-kafka + # Kafka 配置项,对应 KafkaProperties 配置类 kafka: bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔 @@ -17,15 +20,7 @@ spring: spring: json: trusted: - packages: cn.iocoder.springboot.lab03.kafkademo.message + packages: cn.iocoder.springboot.lab40.zipkindemo.message # 消息 POJO 可信目录,解决 JSON 无法反序列化的问题 # Kafka Consumer Listener 监听器配置 listener: missing-topics-fatal: false # 消费监听接口监听的主题不存在时,默认会报错。所以通过设置为 false ,解决报错 - -logging: - level: - org: - springframework: - kafka: ERROR # spring-kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别 - apache: - kafka: ERROR # kafka INFO 日志太多了,所以我们限制只打印 ERROR 级别 diff --git a/lab-40/lab-40-logback/pom.xml b/lab-40/lab-40-logback/pom.xml new file mode 100644 index 000000000..2e4d6dc92 --- /dev/null +++ b/lab-40/lab-40-logback/pom.xml @@ -0,0 +1,61 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-40-logback + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + io.zipkin.brave + brave + + + io.zipkin.reporter2 + zipkin-sender-okhttp3 + + + + + + io.zipkin.brave + brave-instrumentation-spring-webmvc + + + + + io.zipkin.brave + brave-context-slf4j + + + + + + + + + io.zipkin.brave + brave-bom + 5.9.1 + pom + import + + + + + diff --git a/lab-40/lab-40-logback/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/LogbackApplication.java b/lab-40/lab-40-logback/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/LogbackApplication.java new file mode 100644 index 000000000..eca243d7b --- /dev/null +++ b/lab-40/lab-40-logback/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/LogbackApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab40.zipkindemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class LogbackApplication { + + public static void main(String[] args) { + SpringApplication.run(LogbackApplication.class, args); + } + +} diff --git a/lab-40/lab-40-logback/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java b/lab-40/lab-40-logback/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java new file mode 100644 index 000000000..b56fd2d01 --- /dev/null +++ b/lab-40/lab-40-logback/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.spring.webmvc.SpanCustomizingAsyncHandlerInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Import(SpanCustomizingAsyncHandlerInterceptor.class) +public class SpringMvcConfiguration implements WebMvcConfigurer { + + @Autowired + public SpanCustomizingAsyncHandlerInterceptor webMvcTracingCustomizer; + + /** + * Decorates server spans with application-defined web tags + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(webMvcTracingCustomizer); + } + +} diff --git a/lab-40/lab-40-logback/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java b/lab-40/lab-40-logback/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java new file mode 100644 index 000000000..7adf03662 --- /dev/null +++ b/lab-40/lab-40-logback/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java @@ -0,0 +1,84 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.CurrentSpanCustomizer; +import brave.SpanCustomizer; +import brave.Tracing; +import brave.context.slf4j.MDCScopeDecorator; +import brave.http.HttpTracing; +import brave.propagation.ThreadLocalCurrentTraceContext; +import brave.servlet.TracingFilter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import zipkin2.Span; +import zipkin2.reporter.AsyncReporter; +import zipkin2.reporter.Sender; +import zipkin2.reporter.okhttp3.OkHttpSender; + +import javax.servlet.Filter; + +@Configuration +public class ZipkinConfiguration { + + // ==================== 通用配置 ==================== + + /** + * Configuration for how to send spans to Zipkin + */ + @Bean + public Sender sender() { + return OkHttpSender.create("http://127.0.0.1:9411/api/v2/spans"); + } + + /** + * Configuration for how to buffer spans into messages for Zipkin + */ + @Bean + public AsyncReporter spanReporter() { + return AsyncReporter.create(sender()); + } + + /** + * Controls aspects of tracing such as the service name that shows up in the UI + */ + @Bean + public Tracing tracing(@Value("${spring.application.name}") String serviceName) { + return Tracing.newBuilder() + .localServiceName(serviceName) + .currentTraceContext(ThreadLocalCurrentTraceContext.newBuilder() + .addScopeDecorator(MDCScopeDecorator.create()) // puts trace IDs into logs + .build() + ) + .spanReporter(spanReporter()).build(); + } + + /** + * Allows someone to add tags to a span if a trace is in progress + */ + @Bean + public SpanCustomizer spanCustomizer(Tracing tracing) { + return CurrentSpanCustomizer.create(tracing); + } + + // ==================== HTTP 相关 ==================== + + /** + * Decides how to name and tag spans. By default they are named the same as the http method + */ + @Bean + public HttpTracing httpTracing(Tracing tracing) { + return HttpTracing.create(tracing); + } + + /** + * Creates server spans for http requests + */ + @Bean + public Filter tracingFilter(HttpTracing httpTracing) { + return TracingFilter.create(httpTracing); + } + + // ==================== SpringMVC 相关 ==================== + // @see SpringMvcConfiguration 类上的,@Import(SpanCustomizingAsyncHandlerInterceptor.class) + +} diff --git a/lab-40/lab-40-logback/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java b/lab-40/lab-40-logback/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java new file mode 100644 index 000000000..6ef5f5d34 --- /dev/null +++ b/lab-40/lab-40-logback/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java @@ -0,0 +1,21 @@ +package cn.iocoder.springboot.lab40.zipkindemo.controller; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @GetMapping("/logback") + public String echo() { + logger.info("测试日志"); + return "logback"; + } + +} diff --git a/lab-40/lab-40-logback/src/main/resources/application.yaml b/lab-40/lab-40-logback/src/main/resources/application.yaml new file mode 100644 index 000000000..28a35b7ef --- /dev/null +++ b/lab-40/lab-40-logback/src/main/resources/application.yaml @@ -0,0 +1,8 @@ +spring: + application: + name: demo-application-springmvc + +logging: + pattern: + console: "%clr(%d{${LOG_DATEFORMAT_PATTERN:yyyy-MM-dd HH:mm:ss.SSS}}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %X{traceId}/%X{spanId} %clr(---){faint} %clr([%15.15t]){faint} %clr(%-40.40logger{39}){cyan} %clr(:){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}" + file: "%d{${LOG_DATEFORMAT_PATTERN:yyyy-MM-dd HH:mm:ss.SSS}} ${LOG_LEVEL_PATTERN:-%5p} ${PID:- } %X{traceId}/%X{spanId} --- [%t] %-40.40logger{39} : %m%n${LOG_EXCEPTION_CONVERSION_WORD:%wEx}" diff --git a/lab-40/lab-40-mongodb/pom.xml b/lab-40/lab-40-mongodb/pom.xml new file mode 100644 index 000000000..606109ebc --- /dev/null +++ b/lab-40/lab-40-mongodb/pom.xml @@ -0,0 +1,74 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-40-mongodb + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-data-mongodb + + + + + + io.zipkin.brave + brave + + + io.zipkin.reporter2 + zipkin-sender-okhttp3 + + + + + + io.zipkin.brave + brave-instrumentation-spring-webmvc + + + + + io.opentracing.brave + brave-opentracing + 0.35.0 + + + + + io.opentracing.contrib + opentracing-mongo-driver + 0.1.5 + + + + + + + + io.zipkin.brave + brave-bom + 5.9.1 + pom + import + + + + + diff --git a/lab-40/lab-40-mongodb/src/main/java/cn/iocoder/springboot/lab40/zipkin/MongoDBApplication.java b/lab-40/lab-40-mongodb/src/main/java/cn/iocoder/springboot/lab40/zipkin/MongoDBApplication.java new file mode 100644 index 000000000..42f1b0fbd --- /dev/null +++ b/lab-40/lab-40-mongodb/src/main/java/cn/iocoder/springboot/lab40/zipkin/MongoDBApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab40.zipkin; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class MongoDBApplication { + + public static void main(String[] args) { + SpringApplication.run(MongoDBApplication.class, args); + } + +} diff --git a/lab-40/lab-40-mongodb/src/main/java/cn/iocoder/springboot/lab40/zipkin/config/SpringMvcConfiguration.java b/lab-40/lab-40-mongodb/src/main/java/cn/iocoder/springboot/lab40/zipkin/config/SpringMvcConfiguration.java new file mode 100644 index 000000000..b9df30026 --- /dev/null +++ b/lab-40/lab-40-mongodb/src/main/java/cn/iocoder/springboot/lab40/zipkin/config/SpringMvcConfiguration.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab40.zipkin.config; + +import brave.spring.webmvc.SpanCustomizingAsyncHandlerInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Import(SpanCustomizingAsyncHandlerInterceptor.class) +public class SpringMvcConfiguration implements WebMvcConfigurer { + + @Autowired + public SpanCustomizingAsyncHandlerInterceptor webMvcTracingCustomizer; + + /** + * Decorates server spans with application-defined web tags + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(webMvcTracingCustomizer); + } + +} diff --git a/lab-40/lab-40-mongodb/src/main/java/cn/iocoder/springboot/lab40/zipkin/config/ZipkinConfiguration.java b/lab-40/lab-40-mongodb/src/main/java/cn/iocoder/springboot/lab40/zipkin/config/ZipkinConfiguration.java new file mode 100644 index 000000000..86cdf1c1c --- /dev/null +++ b/lab-40/lab-40-mongodb/src/main/java/cn/iocoder/springboot/lab40/zipkin/config/ZipkinConfiguration.java @@ -0,0 +1,97 @@ +package cn.iocoder.springboot.lab40.zipkin.config; + +import brave.CurrentSpanCustomizer; +import brave.SpanCustomizer; +import brave.Tracing; +import brave.http.HttpTracing; +import brave.opentracing.BraveTracer; +import brave.servlet.TracingFilter; +import com.mongodb.MongoClientOptions; +import io.opentracing.Tracer; +import io.opentracing.contrib.mongo.common.TracingCommandListener; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import zipkin2.Span; +import zipkin2.reporter.AsyncReporter; +import zipkin2.reporter.Sender; +import zipkin2.reporter.okhttp3.OkHttpSender; + +import javax.servlet.Filter; + +@Configuration +public class ZipkinConfiguration { + + // ==================== 通用配置 ==================== + + /** + * Configuration for how to send spans to Zipkin + */ + @Bean + public Sender sender() { + return OkHttpSender.create("http://127.0.0.1:9411/api/v2/spans"); + } + + /** + * Configuration for how to buffer spans into messages for Zipkin + */ + @Bean + public AsyncReporter spanReporter() { + return AsyncReporter.create(sender()); + } + + /** + * Controls aspects of tracing such as the service name that shows up in the UI + */ + @Bean + public Tracing tracing(@Value("${spring.application.name}") String serviceName) { + return Tracing.newBuilder() + .localServiceName(serviceName) + .spanReporter(spanReporter()).build(); + } + + @Bean + public Tracer openTracer(Tracing tracing) { + return BraveTracer.create(tracing); + } + + /** + * Allows someone to add tags to a span if a trace is in progress + */ + @Bean + public SpanCustomizer spanCustomizer(Tracing tracing) { + return CurrentSpanCustomizer.create(tracing); + } + + // ==================== HTTP 相关 ==================== + + /** + * Decides how to name and tag spans. By default they are named the same as the http method + */ + @Bean + public HttpTracing httpTracing(Tracing tracing) { + return HttpTracing.create(tracing); + } + + /** + * Creates server spans for http requests + */ + @Bean + public Filter tracingFilter(HttpTracing httpTracing) { + return TracingFilter.create(httpTracing); + } + + // ==================== SpringMVC 相关 ==================== + // @see SpringMvcConfiguration 类上的,@Import(SpanCustomizingAsyncHandlerInterceptor.class) + + // ==================== MongoDB 相关 ==================== + + @Bean + public MongoClientOptions mongoClientOptions(Tracer tracer) { + // 创建 TracingCommandListener 对象 + TracingCommandListener listener = new TracingCommandListener.Builder(tracer).build(); + // 创建 MongoClientOptions 对象,并设置监听器 + return MongoClientOptions.builder().addCommandListener(listener).build(); + } + +} diff --git a/lab-40/lab-40-mongodb/src/main/java/cn/iocoder/springboot/lab40/zipkin/controller/DemoController.java b/lab-40/lab-40-mongodb/src/main/java/cn/iocoder/springboot/lab40/zipkin/controller/DemoController.java new file mode 100644 index 000000000..98155a7b6 --- /dev/null +++ b/lab-40/lab-40-mongodb/src/main/java/cn/iocoder/springboot/lab40/zipkin/controller/DemoController.java @@ -0,0 +1,29 @@ +package cn.iocoder.springboot.lab40.zipkin.controller; + +import cn.iocoder.springboot.lab40.zipkin.dataobject.UserDO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.data.mongodb.core.query.Criteria; +import org.springframework.data.mongodb.core.query.Query; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Autowired + private MongoTemplate mongoTemplate; + + @GetMapping("/mongodb") + public String mysql() { + this.findById(1); + return "mongodb"; + } + + public UserDO findById(Integer id) { + return mongoTemplate.findOne(new Query(Criteria.where("_id").is(id)), UserDO.class); + } + +} diff --git a/lab-40/lab-40-mongodb/src/main/java/cn/iocoder/springboot/lab40/zipkin/dataobject/UserDO.java b/lab-40/lab-40-mongodb/src/main/java/cn/iocoder/springboot/lab40/zipkin/dataobject/UserDO.java new file mode 100644 index 000000000..5166f0188 --- /dev/null +++ b/lab-40/lab-40-mongodb/src/main/java/cn/iocoder/springboot/lab40/zipkin/dataobject/UserDO.java @@ -0,0 +1,39 @@ +package cn.iocoder.springboot.lab40.zipkin.dataobject; + +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.util.Date; + +/** + * 用户 DO + */ +@Document(collection = "User") +public class UserDO { + + @Id + private Integer id; + /** + * 账号 + */ + private String username; + /** + * 密码 + */ + private String password; + /** + * 创建时间 + */ + private Date createTime; + + @Override + public String toString() { + return "UserDO{" + + "id=" + id + + ", username='" + username + '\'' + + ", password='" + password + '\'' + + ", createTime=" + createTime + + '}'; + } + +} diff --git a/lab-39/lab-39-mongodb/target/classes/application.yml b/lab-40/lab-40-mongodb/src/main/resources/application.yml similarity index 83% rename from lab-39/lab-39-mongodb/target/classes/application.yml rename to lab-40/lab-40-mongodb/src/main/resources/application.yml index 1d21e8879..7ea58cb9b 100644 --- a/lab-39/lab-39-mongodb/target/classes/application.yml +++ b/lab-40/lab-40-mongodb/src/main/resources/application.yml @@ -1,7 +1,7 @@ -server: - port: 8079 - spring: + application: + name: dmeo-application-mongodb + data: # MongoDB 配置项,对应 MongoProperties 类 mongodb: diff --git a/lab-40/lab-40-mysql/pom.xml b/lab-40/lab-40-mysql/pom.xml new file mode 100644 index 000000000..3f521710e --- /dev/null +++ b/lab-40/lab-40-mysql/pom.xml @@ -0,0 +1,72 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-40-mysql + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + mysql + mysql-connector-java + 5.1.46 + + + + + + io.zipkin.brave + brave + + + io.zipkin.reporter2 + zipkin-sender-okhttp3 + + + + + + io.zipkin.brave + brave-instrumentation-spring-webmvc + + + + + io.zipkin.brave + brave-instrumentation-mysql + + + + + + + + + io.zipkin.brave + brave-bom + 5.9.1 + pom + import + + + + + diff --git a/lab-40/lab-40-mysql/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/MySQLApplication.java b/lab-40/lab-40-mysql/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/MySQLApplication.java new file mode 100644 index 000000000..7310ea5d2 --- /dev/null +++ b/lab-40/lab-40-mysql/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/MySQLApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab40.zipkindemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class MySQLApplication { + + public static void main(String[] args) { + SpringApplication.run(MySQLApplication.class, args); + } + +} diff --git a/lab-40/lab-40-mysql/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java b/lab-40/lab-40-mysql/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java new file mode 100644 index 000000000..b56fd2d01 --- /dev/null +++ b/lab-40/lab-40-mysql/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.spring.webmvc.SpanCustomizingAsyncHandlerInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Import(SpanCustomizingAsyncHandlerInterceptor.class) +public class SpringMvcConfiguration implements WebMvcConfigurer { + + @Autowired + public SpanCustomizingAsyncHandlerInterceptor webMvcTracingCustomizer; + + /** + * Decorates server spans with application-defined web tags + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(webMvcTracingCustomizer); + } + +} diff --git a/lab-40/lab-40-mysql/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java b/lab-40/lab-40-mysql/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java new file mode 100644 index 000000000..ba4ea09ca --- /dev/null +++ b/lab-40/lab-40-mysql/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java @@ -0,0 +1,78 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.CurrentSpanCustomizer; +import brave.SpanCustomizer; +import brave.Tracing; +import brave.http.HttpTracing; +import brave.servlet.TracingFilter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import zipkin2.Span; +import zipkin2.reporter.AsyncReporter; +import zipkin2.reporter.Sender; +import zipkin2.reporter.okhttp3.OkHttpSender; + +import javax.servlet.Filter; + +@Configuration +public class ZipkinConfiguration { + + // ==================== 通用配置 ==================== + + /** + * Configuration for how to send spans to Zipkin + */ + @Bean + public Sender sender() { + return OkHttpSender.create("http://127.0.0.1:9411/api/v2/spans"); + } + + /** + * Configuration for how to buffer spans into messages for Zipkin + */ + @Bean + public AsyncReporter spanReporter() { + return AsyncReporter.create(sender()); + } + + /** + * Controls aspects of tracing such as the service name that shows up in the UI + */ + @Bean + public Tracing tracing(@Value("${spring.application.name}") String serviceName) { + return Tracing.newBuilder() + .localServiceName(serviceName) + .spanReporter(spanReporter()).build(); + } + + /** + * Allows someone to add tags to a span if a trace is in progress + */ + @Bean + public SpanCustomizer spanCustomizer(Tracing tracing) { + return CurrentSpanCustomizer.create(tracing); + } + + // ==================== HTTP 相关 ==================== + + /** + * Decides how to name and tag spans. By default they are named the same as the http method + */ + @Bean + public HttpTracing httpTracing(Tracing tracing) { + return HttpTracing.create(tracing); + } + + /** + * Creates server spans for http requests + */ + @Bean + public Filter tracingFilter(HttpTracing httpTracing) { + return TracingFilter.create(httpTracing); + } + + // ==================== SpringMVC 相关 ==================== + // @see SpringMvcConfiguration 类上的,@Import(SpanCustomizingAsyncHandlerInterceptor.class) + +} diff --git a/lab-40/lab-40-mysql/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java b/lab-40/lab-40-mysql/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java new file mode 100644 index 000000000..aa22ccda7 --- /dev/null +++ b/lab-40/lab-40-mysql/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java @@ -0,0 +1,29 @@ +package cn.iocoder.springboot.lab40.zipkindemo.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Autowired + private JdbcTemplate template; + + @GetMapping("/mysql") + public String echo() { + this.selectById(1); + return "mysql"; + } + + public Object selectById(Integer id) { + return template.queryForObject("SELECT id, username, password FROM t_user WHERE id = ?", + new BeanPropertyRowMapper<>(Object.class), // 结果转换成对应的对象。Object 理论来说是 UserDO.class ,这里偷懒了。 + id); + } + +} diff --git a/lab-40/lab-40-mysql/src/main/resources/application.yaml b/lab-40/lab-40-mysql/src/main/resources/application.yaml new file mode 100644 index 000000000..87d7243fa --- /dev/null +++ b/lab-40/lab-40-mysql/src/main/resources/application.yaml @@ -0,0 +1,10 @@ +spring: + application: + name: demo-application-mysql + + # datasource 数据源配置内容 + datasource: + url: jdbc:mysql://127.0.0.1:3306/lab-39-mysql?useSSL=false&useUnicode=true&characterEncoding=UTF-8&statementInterceptors=brave.mysql.TracingStatementInterceptor&zipkinServiceName=demo-db-mysql + driver-class-name: com.mysql.jdbc.Driver + username: root + password: diff --git a/lab-40/lab-40-opentracing/pom.xml b/lab-40/lab-40-opentracing/pom.xml new file mode 100644 index 000000000..69aa80808 --- /dev/null +++ b/lab-40/lab-40-opentracing/pom.xml @@ -0,0 +1,61 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-40-opentracing + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + io.zipkin.brave + brave + + + io.zipkin.reporter2 + zipkin-sender-okhttp3 + + + + + + io.zipkin.brave + brave-instrumentation-spring-webmvc + + + + + io.opentracing.brave + brave-opentracing + 0.35.0 + + + + + + + + io.zipkin.brave + brave-bom + 5.9.1 + pom + import + + + + + diff --git a/lab-40/lab-40-opentracing/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/OpentracingApplication.java b/lab-40/lab-40-opentracing/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/OpentracingApplication.java new file mode 100644 index 000000000..9dd339019 --- /dev/null +++ b/lab-40/lab-40-opentracing/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/OpentracingApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab40.zipkindemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class OpentracingApplication { + + public static void main(String[] args) { + SpringApplication.run(OpentracingApplication.class, args); + } + +} diff --git a/lab-40/lab-40-opentracing/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java b/lab-40/lab-40-opentracing/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java new file mode 100644 index 000000000..b56fd2d01 --- /dev/null +++ b/lab-40/lab-40-opentracing/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.spring.webmvc.SpanCustomizingAsyncHandlerInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Import(SpanCustomizingAsyncHandlerInterceptor.class) +public class SpringMvcConfiguration implements WebMvcConfigurer { + + @Autowired + public SpanCustomizingAsyncHandlerInterceptor webMvcTracingCustomizer; + + /** + * Decorates server spans with application-defined web tags + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(webMvcTracingCustomizer); + } + +} diff --git a/lab-40/lab-40-opentracing/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java b/lab-40/lab-40-opentracing/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java new file mode 100644 index 000000000..39c97bbbd --- /dev/null +++ b/lab-40/lab-40-opentracing/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java @@ -0,0 +1,85 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.CurrentSpanCustomizer; +import brave.SpanCustomizer; +import brave.Tracing; +import brave.http.HttpTracing; +import brave.opentracing.BraveTracer; +import brave.servlet.TracingFilter; +import io.opentracing.Tracer; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import zipkin2.Span; +import zipkin2.reporter.AsyncReporter; +import zipkin2.reporter.Sender; +import zipkin2.reporter.okhttp3.OkHttpSender; + +import javax.servlet.Filter; + +@Configuration +public class ZipkinConfiguration { + + // ==================== 通用配置 ==================== + + /** + * Configuration for how to send spans to Zipkin + */ + @Bean + public Sender sender() { + return OkHttpSender.create("http://127.0.0.1:9411/api/v2/spans"); + } + + /** + * Configuration for how to buffer spans into messages for Zipkin + */ + @Bean + public AsyncReporter spanReporter() { + return AsyncReporter.create(sender()); + } + + /** + * Controls aspects of tracing such as the service name that shows up in the UI + */ + @Bean + public Tracing tracing(@Value("${spring.application.name}") String serviceName) { + return Tracing.newBuilder() + .localServiceName(serviceName) + .spanReporter(spanReporter()).build(); + } + + @Bean + public Tracer openTracer(Tracing tracing) { + return BraveTracer.create(tracing); + } + + /** + * Allows someone to add tags to a span if a trace is in progress + */ + @Bean + public SpanCustomizer spanCustomizer(Tracing tracing) { + return CurrentSpanCustomizer.create(tracing); + } + + // ==================== HTTP 相关 ==================== + + /** + * Decides how to name and tag spans. By default they are named the same as the http method + */ + @Bean + public HttpTracing httpTracing(Tracing tracing) { + return HttpTracing.create(tracing); + } + + /** + * Creates server spans for http requests + */ + @Bean + public Filter tracingFilter(HttpTracing httpTracing) { + return TracingFilter.create(httpTracing); + } + + // ==================== SpringMVC 相关 ==================== + // @see SpringMvcConfiguration 类上的,@Import(SpanCustomizingAsyncHandlerInterceptor.class) + +} diff --git a/lab-40/lab-40-opentracing/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java b/lab-40/lab-40-opentracing/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java new file mode 100644 index 000000000..3523819fa --- /dev/null +++ b/lab-40/lab-40-opentracing/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab40.zipkindemo.controller; + +import io.opentracing.Tracer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Autowired + private Tracer tracer; + + @GetMapping("/opentracing") + public String echo() { + // 创建一个 Span + tracer.buildSpan("custom_operation").withTag("mp", "芋道源码").start().finish(); + + // 返回 + return "opentracing"; + } + +} diff --git a/lab-40/lab-40-opentracing/src/main/resources/application.yml b/lab-40/lab-40-opentracing/src/main/resources/application.yml new file mode 100644 index 000000000..d3e3997a6 --- /dev/null +++ b/lab-40/lab-40-opentracing/src/main/resources/application.yml @@ -0,0 +1,3 @@ +spring: + application: + name: demo-application-opentracing diff --git a/lab-40/lab-40-rabbitmq/pom.xml b/lab-40/lab-40-rabbitmq/pom.xml new file mode 100644 index 000000000..0744a693a --- /dev/null +++ b/lab-40/lab-40-rabbitmq/pom.xml @@ -0,0 +1,66 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.1.RELEASE + + + 4.0.0 + + lab-40-rabbitmq + + + + + org.springframework.boot + spring-boot-starter-amqp + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + io.zipkin.brave + brave + + + io.zipkin.reporter2 + zipkin-sender-okhttp3 + + + + + + io.zipkin.brave + brave-instrumentation-spring-webmvc + + + + io.zipkin.brave + brave-instrumentation-spring-rabbit + + + + + + + + + io.zipkin.brave + brave-bom + 5.9.1 + pom + import + + + + + diff --git a/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/RabbitMQApplication.java b/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/RabbitMQApplication.java new file mode 100644 index 000000000..76735d4c2 --- /dev/null +++ b/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/RabbitMQApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab40.zipkindemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class RabbitMQApplication { + + public static void main(String[] args) { + SpringApplication.run(RabbitMQApplication.class, args); + } + +} diff --git a/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/RabbitConfig.java b/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/RabbitConfig.java new file mode 100644 index 000000000..bf4f731ca --- /dev/null +++ b/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/RabbitConfig.java @@ -0,0 +1,40 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import cn.iocoder.springboot.lab40.zipkindemo.message.DemoMessage; +import org.springframework.amqp.core.Binding; +import org.springframework.amqp.core.BindingBuilder; +import org.springframework.amqp.core.DirectExchange; +import org.springframework.amqp.core.Queue; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RabbitConfig { + + // 创建 Queue + @Bean + public Queue demoQueue() { + return new Queue(DemoMessage.QUEUE, // Queue 名字 + true, // durable: 是否持久化 + false, // exclusive: 是否排它 + false); // autoDelete: 是否自动删除 + } + + // 创建 Direct Exchange + @Bean + public DirectExchange demoExchange() { + return new DirectExchange(DemoMessage.EXCHANGE, + true, // durable: 是否持久化 + false); // exclusive: 是否排它 + } + + // 创建 Binding + // Exchange:DemoMessage.EXCHANGE + // Routing key:DemoMessage.ROUTING_KEY + // Queue:DemoMessage.QUEUE + @Bean + public Binding demoBinding() { + return BindingBuilder.bind(demoQueue()).to(demoExchange()).with(DemoMessage.ROUTING_KEY); + } + +} diff --git a/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java b/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java new file mode 100644 index 000000000..8a854aeac --- /dev/null +++ b/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.spring.webmvc.SpanCustomizingAsyncHandlerInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Import(SpanCustomizingAsyncHandlerInterceptor.class) // 创建拦截器 SpanCustomizingAsyncHandlerInterceptor Bean +public class SpringMvcConfiguration implements WebMvcConfigurer { + + @Autowired + public SpanCustomizingAsyncHandlerInterceptor webMvcTracingCustomizer; + + /** + * Decorates server spans with application-defined web tags + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { // 记录 SpringMVC 相关信息到 Span 中 + registry.addInterceptor(webMvcTracingCustomizer); + } + +} diff --git a/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java b/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java new file mode 100644 index 000000000..2ab56c995 --- /dev/null +++ b/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java @@ -0,0 +1,117 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.CurrentSpanCustomizer; +import brave.SpanCustomizer; +import brave.Tracing; +import brave.http.HttpTracing; +import brave.servlet.TracingFilter; +import brave.spring.rabbit.SpringRabbitTracing; +import org.springframework.amqp.rabbit.config.SimpleRabbitListenerContainerFactory; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.BeansException; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.beans.factory.config.BeanPostProcessor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import zipkin2.Span; +import zipkin2.reporter.AsyncReporter; +import zipkin2.reporter.Sender; +import zipkin2.reporter.okhttp3.OkHttpSender; + +import javax.servlet.Filter; + +@Configuration +public class ZipkinConfiguration { + + // ==================== 通用配置 ==================== + + /** + * Configuration for how to send spans to Zipkin + */ + @Bean + public Sender sender() { // Sender 采用 HTTP 通信方式 + return OkHttpSender.create("http://127.0.0.1:9411/api/v2/spans"); + } + + /** + * Configuration for how to buffer spans into messages for Zipkin + */ + @Bean + public AsyncReporter spanReporter() { // 异步 Reporter + return AsyncReporter.create(sender()); + } + + /** + * Controls aspects of tracing such as the service name that shows up in the UI + */ + @Bean + public Tracing tracing(@Value("${spring.application.name}") String serviceName) { + return Tracing.newBuilder() + .localServiceName(serviceName) // 应用名 + .spanReporter(this.spanReporter()).build(); + } + + /** + * Allows someone to add tags to a span if a trace is in progress + */ + @Bean + public SpanCustomizer spanCustomizer(Tracing tracing) { + return CurrentSpanCustomizer.create(tracing); + } + + // ==================== HTTP 相关 ==================== + + /** + * Decides how to name and tag spans. By default they are named the same as the http method + */ + @Bean + public HttpTracing httpTracing(Tracing tracing) { + return HttpTracing.create(tracing); + } + + /** + * Creates server spans for http requests + */ + @Bean + public Filter tracingFilter(HttpTracing httpTracing) { // 拦截请求,记录 HTTP 请求的链路信息 + return TracingFilter.create(httpTracing); + } + + // ==================== SpringMVC 相关 ==================== + // @see SpringMvcConfiguration 类上的,@Import(SpanCustomizingAsyncHandlerInterceptor.class) 。因为 SpanCustomizingAsyncHandlerInterceptor 未提供 public 构造方法 + + // ==================== RabbitMQ 相关 ==================== + + @Bean + public SpringRabbitTracing springRabbitTracing(Tracing tracing) { + return SpringRabbitTracing.newBuilder(tracing) + .remoteServiceName("demo-mq-rabbit") // 远程 RabbitMQ 服务名,可自定义 + .build(); + } + + @Bean + public BeanPostProcessor rabbitmqBeanPostProcessor(SpringRabbitTracing springRabbitTracing) { + return new BeanPostProcessor() { + + @Override + public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { + return bean; + } + + @Override + public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { + // 如果是 RabbitTemplate ,针对 RabbitMQ Producer + if (bean instanceof RabbitTemplate) { + return springRabbitTracing.decorateRabbitTemplate((RabbitTemplate) bean); + } + // 如果是 SimpleRabbitListenerContainerFactory ,针对 RabbitMQ Consumer + if (bean instanceof SimpleRabbitListenerContainerFactory) { + return springRabbitTracing.decorateSimpleRabbitListenerContainerFactory((SimpleRabbitListenerContainerFactory) bean); + } + return bean; + } + + }; + } + +} diff --git a/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/consumer/DemoConsumer.java b/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/consumer/DemoConsumer.java new file mode 100644 index 000000000..94f69a48d --- /dev/null +++ b/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/consumer/DemoConsumer.java @@ -0,0 +1,21 @@ +package cn.iocoder.springboot.lab40.zipkindemo.consumer; + +import cn.iocoder.springboot.lab40.zipkindemo.message.DemoMessage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.amqp.rabbit.annotation.RabbitHandler; +import org.springframework.amqp.rabbit.annotation.RabbitListener; +import org.springframework.stereotype.Component; + +@Component +@RabbitListener(queues = DemoMessage.QUEUE) +public class DemoConsumer { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @RabbitHandler + public void onMessage(DemoMessage message) { + logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message); + } + +} diff --git a/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java b/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java new file mode 100644 index 000000000..a52b568e6 --- /dev/null +++ b/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java @@ -0,0 +1,26 @@ +package cn.iocoder.springboot.lab40.zipkindemo.controller; + +import cn.iocoder.springboot.lab40.zipkindemo.producer.DemoProducer; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Autowired + private DemoProducer producer; + + @GetMapping("/rabbitmq") + public String echo() { + this.sendMessage(1); + return "rabbitmq"; + } + + public void sendMessage(Integer id) { + producer.syncSend(id); + } + +} diff --git a/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/message/DemoMessage.java b/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/message/DemoMessage.java new file mode 100644 index 000000000..e4e85b4f7 --- /dev/null +++ b/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/message/DemoMessage.java @@ -0,0 +1,34 @@ +package cn.iocoder.springboot.lab40.zipkindemo.message; + +import java.io.Serializable; + +public class DemoMessage implements Serializable { + + public static final String QUEUE = "QUEUE_DEMO_"; + + public static final String EXCHANGE = "EXCHANGE_DEMO_"; + + public static final String ROUTING_KEY = "ROUTING_KEY_"; + + /** + * 编号 + */ + private Integer id; + + public DemoMessage setId(Integer id) { + this.id = id; + return this; + } + + public Integer getId() { + return id; + } + + @Override + public String toString() { + return "DemoMessage{" + + "id=" + id + + '}'; + } + +} diff --git a/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/producer/DemoProducer.java b/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/producer/DemoProducer.java new file mode 100644 index 000000000..6c1e52891 --- /dev/null +++ b/lab-40/lab-40-rabbitmq/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/producer/DemoProducer.java @@ -0,0 +1,22 @@ +package cn.iocoder.springboot.lab40.zipkindemo.producer; + +import cn.iocoder.springboot.lab40.zipkindemo.message.DemoMessage; +import org.springframework.amqp.rabbit.core.RabbitTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class DemoProducer { + + @Autowired + private RabbitTemplate rabbitTemplate; + + public void syncSend(Integer id) { + // 创建 DemoMessage 消息 + DemoMessage message = new DemoMessage(); + message.setId(id); + // 同步发送消息 + rabbitTemplate.convertAndSend(DemoMessage.EXCHANGE, DemoMessage.ROUTING_KEY, message); + } + +} diff --git a/lab-04/lab-04-rabbitmq-demo-orderly/target/classes/application.yaml b/lab-40/lab-40-rabbitmq/src/main/resources/application.yaml similarity index 83% rename from lab-04/lab-04-rabbitmq-demo-orderly/target/classes/application.yaml rename to lab-40/lab-40-rabbitmq/src/main/resources/application.yaml index 59cf3bfb9..e7a92f1bf 100644 --- a/lab-04/lab-04-rabbitmq-demo-orderly/target/classes/application.yaml +++ b/lab-40/lab-40-rabbitmq/src/main/resources/application.yaml @@ -1,4 +1,7 @@ spring: + application: + name: demo-application-rabbitmq + # RabbitMQ 配置项,对应 RabbitProperties 配置类 rabbitmq: host: 127.0.0.1 # RabbitMQ 服务的地址 diff --git a/lab-40/lab-40-redis/pom.xml b/lab-40/lab-40-redis/pom.xml new file mode 100644 index 000000000..5c846dbe8 --- /dev/null +++ b/lab-40/lab-40-redis/pom.xml @@ -0,0 +1,93 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-40-redis + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + + io.lettuce + lettuce-core + + + + + + + redis.clients + jedis + + + + + + io.zipkin.brave + brave + + + io.zipkin.reporter2 + zipkin-sender-okhttp3 + + + + + + io.zipkin.brave + brave-instrumentation-spring-webmvc + + + + + io.opentracing.brave + brave-opentracing + 0.35.0 + + + + + io.opentracing.contrib + opentracing-redis-jedis3 + 0.1.14 + + + io.opentracing.contrib + opentracing-redis-spring-data + 0.1.14 + + + + + + + + + io.zipkin.brave + brave-bom + 5.9.1 + pom + import + + + + + diff --git a/lab-40/lab-40-redis/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/RedisApplication.java b/lab-40/lab-40-redis/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/RedisApplication.java new file mode 100644 index 000000000..0659aab94 --- /dev/null +++ b/lab-40/lab-40-redis/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/RedisApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab40.zipkindemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class RedisApplication { + + public static void main(String[] args) { + SpringApplication.run(RedisApplication.class, args); + } + +} diff --git a/lab-40/lab-40-redis/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java b/lab-40/lab-40-redis/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java new file mode 100644 index 000000000..b56fd2d01 --- /dev/null +++ b/lab-40/lab-40-redis/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.spring.webmvc.SpanCustomizingAsyncHandlerInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Import(SpanCustomizingAsyncHandlerInterceptor.class) +public class SpringMvcConfiguration implements WebMvcConfigurer { + + @Autowired + public SpanCustomizingAsyncHandlerInterceptor webMvcTracingCustomizer; + + /** + * Decorates server spans with application-defined web tags + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(webMvcTracingCustomizer); + } + +} diff --git a/lab-40/lab-40-redis/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java b/lab-40/lab-40-redis/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java new file mode 100644 index 000000000..24fb52c64 --- /dev/null +++ b/lab-40/lab-40-redis/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java @@ -0,0 +1,104 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.CurrentSpanCustomizer; +import brave.SpanCustomizer; +import brave.Tracing; +import brave.http.HttpTracing; +import brave.opentracing.BraveTracer; +import brave.servlet.TracingFilter; +import io.opentracing.Tracer; +import io.opentracing.contrib.redis.common.TracingConfiguration; +import io.opentracing.contrib.redis.spring.data.connection.TracingRedisConnectionFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.connection.jedis.JedisConnectionFactory; +import zipkin2.Span; +import zipkin2.reporter.AsyncReporter; +import zipkin2.reporter.Sender; +import zipkin2.reporter.okhttp3.OkHttpSender; + +import javax.servlet.Filter; + +@Configuration +public class ZipkinConfiguration { + + // ==================== 通用配置 ==================== + + /** + * Configuration for how to send spans to Zipkin + */ + @Bean + public Sender sender() { + return OkHttpSender.create("http://127.0.0.1:9411/api/v2/spans"); + } + + /** + * Configuration for how to buffer spans into messages for Zipkin + */ + @Bean + public AsyncReporter spanReporter() { + return AsyncReporter.create(sender()); + } + + /** + * Controls aspects of tracing such as the service name that shows up in the UI + */ + @Bean + public Tracing tracing(@Value("${spring.application.name}") String serviceName) { + return Tracing.newBuilder() + .localServiceName(serviceName) + .spanReporter(spanReporter()).build(); + } + + @Bean + public Tracer openTracer(Tracing tracing) { + return BraveTracer.create(tracing); + } + + /** + * Allows someone to add tags to a span if a trace is in progress + */ + @Bean + public SpanCustomizer spanCustomizer(Tracing tracing) { + return CurrentSpanCustomizer.create(tracing); + } + + // ==================== HTTP 相关 ==================== + + /** + * Decides how to name and tag spans. By default they are named the same as the http method + */ + @Bean + public HttpTracing httpTracing(Tracing tracing) { + return HttpTracing.create(tracing); + } + + /** + * Creates server spans for http requests + */ + @Bean + public Filter tracingFilter(HttpTracing httpTracing) { + return TracingFilter.create(httpTracing); + } + + // ==================== SpringMVC 相关 ==================== + // @see SpringMvcConfiguration 类上的,@Import(SpanCustomizingAsyncHandlerInterceptor.class) + + // ==================== Redis 相关 ==================== + @Bean + public RedisConnectionFactory redisConnectionFactory(Tracer tracer, RedisProperties redisProperties) { + // 创建 JedisConnectionFactory 对象 + RedisConnectionFactory connectionFactory = new JedisConnectionFactory(); + // 创建 TracingConfiguration 对象 + TracingConfiguration tracingConfiguration = new TracingConfiguration.Builder(tracer) + // 设置拓展 Tag ,设置 Redis 服务器地址。因为默认情况下,不会在操作 Redis 链路的 Span 上记录 Redis 服务器的地址,所以这里需要设置。 + .extensionTag("Server Address", redisProperties.getHost() + ":" + redisProperties.getPort()) + .build(); + // 创建 TracingRedisConnectionFactory 对象 + return new TracingRedisConnectionFactory(connectionFactory, tracingConfiguration); + } + +} diff --git a/lab-40/lab-40-redis/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java b/lab-40/lab-40-redis/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java new file mode 100644 index 000000000..fe11fb732 --- /dev/null +++ b/lab-40/lab-40-redis/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java @@ -0,0 +1,26 @@ +package cn.iocoder.springboot.lab40.zipkindemo.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Autowired + private StringRedisTemplate redisTemplate; + + @GetMapping("/redis") + public String redis() { + this.get("demo"); + return "redis"; + } + + public void get(String key) { + redisTemplate.opsForValue().get(key); + } + +} diff --git a/lab-11/lab-07-spring-data-redis-with-jedis/target/classes/application.yml b/lab-40/lab-40-redis/src/main/resources/application.yaml similarity index 94% rename from lab-11/lab-07-spring-data-redis-with-jedis/target/classes/application.yml rename to lab-40/lab-40-redis/src/main/resources/application.yaml index d49b5e00a..a83378736 100644 --- a/lab-11/lab-07-spring-data-redis-with-jedis/target/classes/application.yml +++ b/lab-40/lab-40-redis/src/main/resources/application.yaml @@ -1,4 +1,7 @@ spring: + application: + name: demo-application-redis + # 对应 RedisProperties 类 redis: host: 127.0.0.1 diff --git a/lab-40/lab-40-springmvc/pom.xml b/lab-40/lab-40-springmvc/pom.xml new file mode 100644 index 000000000..f2d6c4714 --- /dev/null +++ b/lab-40/lab-40-springmvc/pom.xml @@ -0,0 +1,55 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-40-springmvc + + + + + org.springframework.boot + spring-boot-starter-web + + + + + + io.zipkin.brave + brave + + + io.zipkin.reporter2 + zipkin-sender-okhttp3 + + + + + + io.zipkin.brave + brave-instrumentation-spring-webmvc + + + + + + + + + io.zipkin.brave + brave-bom + 5.9.1 + pom + import + + + + + diff --git a/lab-40/lab-40-springmvc/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/SpringMVCApplication.java b/lab-40/lab-40-springmvc/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/SpringMVCApplication.java new file mode 100644 index 000000000..9d195d2fd --- /dev/null +++ b/lab-40/lab-40-springmvc/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/SpringMVCApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab40.zipkindemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class SpringMVCApplication { + + public static void main(String[] args) { + SpringApplication.run(SpringMVCApplication.class, args); + } + +} diff --git a/lab-40/lab-40-springmvc/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java b/lab-40/lab-40-springmvc/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java new file mode 100644 index 000000000..8a854aeac --- /dev/null +++ b/lab-40/lab-40-springmvc/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/SpringMvcConfiguration.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.spring.webmvc.SpanCustomizingAsyncHandlerInterceptor; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +@Import(SpanCustomizingAsyncHandlerInterceptor.class) // 创建拦截器 SpanCustomizingAsyncHandlerInterceptor Bean +public class SpringMvcConfiguration implements WebMvcConfigurer { + + @Autowired + public SpanCustomizingAsyncHandlerInterceptor webMvcTracingCustomizer; + + /** + * Decorates server spans with application-defined web tags + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { // 记录 SpringMVC 相关信息到 Span 中 + registry.addInterceptor(webMvcTracingCustomizer); + } + +} diff --git a/lab-40/lab-40-springmvc/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java b/lab-40/lab-40-springmvc/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java new file mode 100644 index 000000000..c30779808 --- /dev/null +++ b/lab-40/lab-40-springmvc/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/config/ZipkinConfiguration.java @@ -0,0 +1,78 @@ +package cn.iocoder.springboot.lab40.zipkindemo.config; + +import brave.CurrentSpanCustomizer; +import brave.SpanCustomizer; +import brave.Tracing; +import brave.http.HttpTracing; +import brave.servlet.TracingFilter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import zipkin2.Span; +import zipkin2.reporter.AsyncReporter; +import zipkin2.reporter.Sender; +import zipkin2.reporter.okhttp3.OkHttpSender; + +import javax.servlet.Filter; + +@Configuration +public class ZipkinConfiguration { + + // ==================== 通用配置 ==================== + + /** + * Configuration for how to send spans to Zipkin + */ + @Bean + public Sender sender() { // Sender 采用 HTTP 通信方式 + return OkHttpSender.create("http://127.0.0.1:9411/api/v2/spans"); + } + + /** + * Configuration for how to buffer spans into messages for Zipkin + */ + @Bean + public AsyncReporter spanReporter() { // 异步 Reporter + return AsyncReporter.create(sender()); + } + + /** + * Controls aspects of tracing such as the service name that shows up in the UI + */ + @Bean + public Tracing tracing(@Value("${spring.application.name}") String serviceName) { + return Tracing.newBuilder() + .localServiceName(serviceName) // 应用名 + .spanReporter(this.spanReporter()).build(); + } + + /** + * Allows someone to add tags to a span if a trace is in progress + */ + @Bean + public SpanCustomizer spanCustomizer(Tracing tracing) { + return CurrentSpanCustomizer.create(tracing); + } + + // ==================== HTTP 相关 ==================== + + /** + * Decides how to name and tag spans. By default they are named the same as the http method + */ + @Bean + public HttpTracing httpTracing(Tracing tracing) { + return HttpTracing.create(tracing); + } + + /** + * Creates server spans for http requests + */ + @Bean + public Filter tracingFilter(HttpTracing httpTracing) { // 拦截请求,记录 HTTP 请求的链路信息 + return TracingFilter.create(httpTracing); + } + + // ==================== SpringMVC 相关 ==================== + // @see SpringMvcConfiguration 类上的,@Import(SpanCustomizingAsyncHandlerInterceptor.class) 。因为 SpanCustomizingAsyncHandlerInterceptor 未提供 public 构造方法 + +} diff --git a/lab-40/lab-40-springmvc/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java b/lab-40/lab-40-springmvc/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java new file mode 100644 index 000000000..8a05d588f --- /dev/null +++ b/lab-40/lab-40-springmvc/src/main/java/cn/iocoder/springboot/lab40/zipkindemo/controller/DemoController.java @@ -0,0 +1,16 @@ +package cn.iocoder.springboot.lab40.zipkindemo.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @GetMapping("/springmvc") + public String echo() { + return "springmvc"; + } + +} diff --git a/lab-40/lab-40-springmvc/src/main/resources/application.yaml b/lab-40/lab-40-springmvc/src/main/resources/application.yaml new file mode 100644 index 000000000..f43d7aa24 --- /dev/null +++ b/lab-40/lab-40-springmvc/src/main/resources/application.yaml @@ -0,0 +1,3 @@ +spring: + application: + name: demo-application-springmvc diff --git a/lab-40/pom.xml b/lab-40/pom.xml new file mode 100644 index 000000000..66f0a911d --- /dev/null +++ b/lab-40/pom.xml @@ -0,0 +1,30 @@ + + + + labs-parent + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + lab-40 + pom + + lab-40-demo + lab-40-springmvc + lab-40-mysql + lab-40-redis + lab-40-mongodb + lab-40-elasticsearch + + lab-40-kafka + lab-40-rabbitmq + lab-40-activemq + lab-40-logback + lab-40-opentracing + + + + diff --git a/lab-41/deploy.sh b/lab-41/deploy.sh new file mode 100644 index 000000000..9b6feeb51 --- /dev/null +++ b/lab-41/deploy.sh @@ -0,0 +1,160 @@ +#!/bin/bash +set -e + +# 基础 +# export JAVA_HOME=/work/programs/jdk/jdk1.8.0_181 +# export PATH=PATH=$PATH:$JAVA_HOME/bin +# export CLASSPATH=$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar + +DATE=$(date +%Y%m%d%H%M) +# 基础路径 +BASE_PATH=/work/projects/lab-41-demo01 +# 编译后 jar 的地址。部署时,Jenkins 会上传 jar 包到该目录下 +SOURCE_PATH=$BASE_PATH/build +# 服务名称。同时约定部署服务的 jar 包名字也为它。 +SERVER_NAME=lab-41-demo01 +# 环境 +PROFILES_ACTIVE=prod +# 健康检查 URL +HEALTH_CHECK_URL=http://127.0.0.1:8078/actuator/health/ + +# heapError 存放路径 +HEAP_ERROR_PATH=$BASE_PATH/heapError +# JVM 参数 +JAVA_OPS="-Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$HEAP_ERROR_PATH" +# JavaAgent 参数。可用于配置 SkyWalking 等链路追踪 +JAVA_AGENT= + +# 备份 +function backup() { + # 如果不存在,则无需备份 + if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then + echo "[backup] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过备份" + # 如果存在,则备份到 backup 目录下,使用时间作为后缀 + else + echo "[backup] 开始备份 $SERVER_NAME ..." + cp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jar + echo "[backup] 备份 $SERVER_NAME 完成" + fi +} + +# 最新构建代码 移动到项目环境 +function transfer() { + echo "[transfer] 开始转移 $SERVER_NAME.jar" + + # 删除原 jar 包 + if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; then + echo "[transfer] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过删除" + else + echo "[transfer] 移除 $BASE_PATH/$SERVER_NAME.jar 完成" + rm $BASE_PATH/$SERVER_NAME.jar + fi + + # 复制新 jar 包 + echo "[transfer] 从 $SOURCE_PATH 中获取 $SERVER_NAME.jar 并迁移至 $BASE_PATH ...." + cp $SOURCE_PATH/$SERVER_NAME.jar $BASE_PATH + + echo "[transfer] 转移 $SERVER_NAME.jar 完成" +} + +# 停止 +function stop() { + echo "[stop] 开始停止 $BASE_PATH/$SERVER_NAME" + PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}') + # 如果 Java 服务启动中,则进行关闭 + if [ -n "$PID" ]; then + # 正常关闭 + echo "[stop] $BASE_PATH/$SERVER_NAME 运行中,开始 kill [$PID]" + kill -15 $PID + # 等待最大 60 秒,直到关闭完成。 + for ((i = 0; i < 60; i++)) + do + sleep 1 + PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}') + if [ -n "$PID" ]; then + echo -e ".\c" + else + echo '[stop] 停止 $BASE_PATH/$SERVER_NAME 成功' + break + fi + done + + # 如果正常关闭失败,那么进行强制 kill -9 进行关闭 + if [ -n "$PID" ]; then + echo "[stop] $BASE_PATH/$SERVER_NAME 失败,强制 kill -9 $PID" + kill -9 $PID + fi + # 如果 Java 服务未启动,则无需关闭 + else + echo "[stop] $BASE_PATH/$SERVER_NAME 未启动,无需停止" + fi +} + +# 启动 +function start() { + # 开启启动前,打印启动参数 + echo "[start] 开始启动 $BASE_PATH/$SERVER_NAME" + echo "[start] JAVA_OPS: $JAVA_OPS" + echo "[start] JAVA_AGENT: $JAVA_AGENT" + echo "[start] PROFILES: $PROFILES_ACTIVE" + + # 开始启动 + BUILD_ID=dontKillMe nohup java -server $JAVA_OPS $JAVA_AGENT -jar $BASE_PATH/$SERVER_NAME.jar --spring.profiles.active=$PROFILES_ACTIVE & + echo "[start] 启动 $BASE_PATH/$SERVER_NAME 完成" +} + +# 健康检查 +function healthCheck() { + # 如果配置健康检查,则进行健康检查 + if [ -n "$HEALTH_CHECK_URL" ]; then + # 健康检查最大 60 秒,直到健康检查通过 + echo "[healthCheck] 开始通过 $HEALTH_CHECK_URL 地址,进行健康检查"; + for ((i = 0; i < 60; i++)) + do + # 请求健康检查地址,只获取状态码。 + result=`curl -I -m 10 -o /dev/null -s -w %{http_code} $HEALTH_CHECK_URL || echo "000"` + # 如果状态码为 200,则说明健康检查通过 + if [ "$result" == "200" ]; then + echo "[healthCheck] 健康检查通过"; + break + # 如果状态码非 200,则说明未通过。sleep 1 秒后,继续重试 + else + echo -e ".\c" + sleep 1 + fi + done + + # 健康检查未通过,则异常退出 shell 脚本,不继续部署。 + if [ ! "$result" == "200" ]; then + echo "[healthCheck] 健康检查不通过,可能部署失败。查看日志,自行判断是否启动成功"; + tail -n 10 nohup.out + exit 1; + # 健康检查通过,打印最后 10 行日志,可能部署的人想看下日志。 + else + tail -n 10 nohup.out + fi + # 如果未配置健康检查,则 slepp 60 秒,人工看日志是否部署成功。 + else + echo "[healthCheck] HEALTH_CHECK_URL 未配置,开始 sleep 60 秒"; + sleep 60 + echo "[healthCheck] sleep 60 秒完成,查看日志,自行判断是否启动成功"; + tail -n 50 nohup.out + fi +} + +# 部署 +function deploy() { + cd $BASE_PATH + # 备份原 jar + backup + # 停止 Java 服务 + stop + # 部署新 jar + transfer + # 启动 Java 服务 + start + # 健康检查 + healthCheck +} + +deploy diff --git a/lab-41/lab-41-demo01/pom.xml b/lab-41/lab-41-demo01/pom.xml new file mode 100644 index 000000000..876bea621 --- /dev/null +++ b/lab-41/lab-41-demo01/pom.xml @@ -0,0 +1,42 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-41-demo01 + jar + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + + ${project.artifactId} + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/lab-41/lab-41-demo01/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/Application.java b/lab-41/lab-41-demo01/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/Application.java new file mode 100644 index 000000000..e0bc644e5 --- /dev/null +++ b/lab-41/lab-41-demo01/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/Application.java @@ -0,0 +1,36 @@ +package cn.iocoder.springboot.lab40.jenkinsdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ApplicationEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextClosedEvent; +import org.springframework.stereotype.Component; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + @Component + public class Listener implements ApplicationListener { + + @Override + public void onApplicationEvent(ApplicationEvent event) { + if (event instanceof ContextClosedEvent) { + this.sleep(10); + } + } + + private void sleep(int seconds) { + try { + Thread.sleep(seconds * 1000L); + } catch (InterruptedException ignore) { + } + } + + } + +} diff --git a/lab-41/lab-41-demo01/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/controller/DemoController.java b/lab-41/lab-41-demo01/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/controller/DemoController.java new file mode 100644 index 000000000..d10b18d0f --- /dev/null +++ b/lab-41/lab-41-demo01/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/controller/DemoController.java @@ -0,0 +1,16 @@ +package cn.iocoder.springboot.lab40.jenkinsdemo.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @GetMapping("/echo") + public String echo() { + return "echo"; + } + +} diff --git a/lab-41/lab-41-demo01/src/main/resources/application-dev.yaml b/lab-41/lab-41-demo01/src/main/resources/application-dev.yaml new file mode 100644 index 000000000..5475f936b --- /dev/null +++ b/lab-41/lab-41-demo01/src/main/resources/application-dev.yaml @@ -0,0 +1,11 @@ +server: + port: 8079 + +management: + server: + port: 8078 # 自定义端口,避免 Nginx 暴露出去 + + endpoint: + web: + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 diff --git a/lab-41/lab-41-demo01/src/main/resources/application-local.yaml b/lab-41/lab-41-demo01/src/main/resources/application-local.yaml new file mode 100644 index 000000000..5475f936b --- /dev/null +++ b/lab-41/lab-41-demo01/src/main/resources/application-local.yaml @@ -0,0 +1,11 @@ +server: + port: 8079 + +management: + server: + port: 8078 # 自定义端口,避免 Nginx 暴露出去 + + endpoint: + web: + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 diff --git a/lab-41/lab-41-demo01/src/main/resources/application-pre.yaml b/lab-41/lab-41-demo01/src/main/resources/application-pre.yaml new file mode 100644 index 000000000..5475f936b --- /dev/null +++ b/lab-41/lab-41-demo01/src/main/resources/application-pre.yaml @@ -0,0 +1,11 @@ +server: + port: 8079 + +management: + server: + port: 8078 # 自定义端口,避免 Nginx 暴露出去 + + endpoint: + web: + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 diff --git a/lab-41/lab-41-demo01/src/main/resources/application-prod.yaml b/lab-41/lab-41-demo01/src/main/resources/application-prod.yaml new file mode 100644 index 000000000..5475f936b --- /dev/null +++ b/lab-41/lab-41-demo01/src/main/resources/application-prod.yaml @@ -0,0 +1,11 @@ +server: + port: 8079 + +management: + server: + port: 8078 # 自定义端口,避免 Nginx 暴露出去 + + endpoint: + web: + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 diff --git a/lab-41/lab-41-demo01/src/main/resources/application-uat.yaml b/lab-41/lab-41-demo01/src/main/resources/application-uat.yaml new file mode 100644 index 000000000..5475f936b --- /dev/null +++ b/lab-41/lab-41-demo01/src/main/resources/application-uat.yaml @@ -0,0 +1,11 @@ +server: + port: 8079 + +management: + server: + port: 8078 # 自定义端口,避免 Nginx 暴露出去 + + endpoint: + web: + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 diff --git a/lab-41/lab-41-demo02/pom.xml b/lab-41/lab-41-demo02/pom.xml new file mode 100644 index 000000000..38b9b82ea --- /dev/null +++ b/lab-41/lab-41-demo02/pom.xml @@ -0,0 +1,43 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-41-demo02 + 1.0.0 + jar + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + + ${project.artifactId} + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/Demo02Application.java b/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/Demo02Application.java new file mode 100644 index 000000000..e4c9f197f --- /dev/null +++ b/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/Demo02Application.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab40.jenkinsdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Demo02Application { + + public static void main(String[] args) { + SpringApplication.run(Demo02Application.class, args); + } + +} diff --git a/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/actuate/ServerHealthIndicator.java b/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/actuate/ServerHealthIndicator.java new file mode 100644 index 000000000..5d118be45 --- /dev/null +++ b/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/actuate/ServerHealthIndicator.java @@ -0,0 +1,69 @@ +package cn.iocoder.springboot.lab40.jenkinsdemo.actuate; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.actuate.health.AbstractHealthIndicator; +import org.springframework.boot.actuate.health.Health; +import org.springframework.boot.context.event.ApplicationFailedEvent; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.ApplicationEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.context.event.ContextClosedEvent; +import org.springframework.stereotype.Component; + +@Component +public class ServerHealthIndicator extends AbstractHealthIndicator implements ApplicationListener { + + private Logger logger = LoggerFactory.getLogger(getClass()); + + /** + * 是否在服务中 + */ + private volatile boolean inService = false; + + @Override + protected void doHealthCheck(Health.Builder builder) { + if (inService) { + builder.up(); + } else { + builder.down(); + } + } + + @Override + public void onApplicationEvent(ApplicationEvent event) { + if (event instanceof ApplicationReadyEvent) { + this.handleApplicationReadyEvent((ApplicationReadyEvent) event); + } else if (event instanceof ApplicationFailedEvent) { + this.handleApplicationFailedEvent((ApplicationFailedEvent) event); + } else if (event instanceof ContextClosedEvent) { + this.handleContextClosedEvent((ContextClosedEvent) event); + } + } + + @SuppressWarnings("unused") + private void handleApplicationReadyEvent(ApplicationReadyEvent event) { + this.inService = true; + } + + @SuppressWarnings("unused") + private void handleApplicationFailedEvent(ApplicationFailedEvent event) { + this.inService = false; + } + + @SuppressWarnings("unused") + private void handleContextClosedEvent(ContextClosedEvent event) { + // 标记不提供服务 + this.inService = false; + + // sleep 等待负载均衡完成健康检查 + for (int i = 0; i < 20; i++) { // TODO 20 需要配置 + logger.info("[handleContextClosedEvent][优雅关闭,第 {} sleep 等待负载均衡完成健康检查]", i); + try { + Thread.sleep(1000L); + } catch (InterruptedException ignore) { + } + } + } + +} diff --git a/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/controller/DemoController.java b/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/controller/DemoController.java new file mode 100644 index 000000000..d10b18d0f --- /dev/null +++ b/lab-41/lab-41-demo02/src/main/java/cn/iocoder/springboot/lab40/jenkinsdemo/controller/DemoController.java @@ -0,0 +1,16 @@ +package cn.iocoder.springboot.lab40.jenkinsdemo.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @GetMapping("/echo") + public String echo() { + return "echo"; + } + +} diff --git a/lab-41/lab-41-demo02/src/main/resources/application-dev.yaml b/lab-41/lab-41-demo02/src/main/resources/application-dev.yaml new file mode 100644 index 000000000..0b709d081 --- /dev/null +++ b/lab-41/lab-41-demo02/src/main/resources/application-dev.yaml @@ -0,0 +1,15 @@ +server: + port: 8079 + +management: + server: + port: 8078 # 自定义端口,避免 Nginx 暴露出去 + + endpoint: + health: + show-details: always # 配置展示明细,这样自定义的 ServerHealthIndicator 才可以被访问 + + web: + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 + diff --git a/lab-41/lab-41-demo02/src/main/resources/application-local.yaml b/lab-41/lab-41-demo02/src/main/resources/application-local.yaml new file mode 100644 index 000000000..0b709d081 --- /dev/null +++ b/lab-41/lab-41-demo02/src/main/resources/application-local.yaml @@ -0,0 +1,15 @@ +server: + port: 8079 + +management: + server: + port: 8078 # 自定义端口,避免 Nginx 暴露出去 + + endpoint: + health: + show-details: always # 配置展示明细,这样自定义的 ServerHealthIndicator 才可以被访问 + + web: + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 + diff --git a/lab-41/lab-41-demo02/src/main/resources/application-pre.yaml b/lab-41/lab-41-demo02/src/main/resources/application-pre.yaml new file mode 100644 index 000000000..0b709d081 --- /dev/null +++ b/lab-41/lab-41-demo02/src/main/resources/application-pre.yaml @@ -0,0 +1,15 @@ +server: + port: 8079 + +management: + server: + port: 8078 # 自定义端口,避免 Nginx 暴露出去 + + endpoint: + health: + show-details: always # 配置展示明细,这样自定义的 ServerHealthIndicator 才可以被访问 + + web: + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 + diff --git a/lab-41/lab-41-demo02/src/main/resources/application-prod.yaml b/lab-41/lab-41-demo02/src/main/resources/application-prod.yaml new file mode 100644 index 000000000..0b709d081 --- /dev/null +++ b/lab-41/lab-41-demo02/src/main/resources/application-prod.yaml @@ -0,0 +1,15 @@ +server: + port: 8079 + +management: + server: + port: 8078 # 自定义端口,避免 Nginx 暴露出去 + + endpoint: + health: + show-details: always # 配置展示明细,这样自定义的 ServerHealthIndicator 才可以被访问 + + web: + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 + diff --git a/lab-41/lab-41-demo02/src/main/resources/application-uat.yaml b/lab-41/lab-41-demo02/src/main/resources/application-uat.yaml new file mode 100644 index 000000000..0b709d081 --- /dev/null +++ b/lab-41/lab-41-demo02/src/main/resources/application-uat.yaml @@ -0,0 +1,15 @@ +server: + port: 8079 + +management: + server: + port: 8078 # 自定义端口,避免 Nginx 暴露出去 + + endpoint: + health: + show-details: always # 配置展示明细,这样自定义的 ServerHealthIndicator 才可以被访问 + + web: + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 + diff --git a/lab-41/pom.xml b/lab-41/pom.xml new file mode 100644 index 000000000..2dbcc59ad --- /dev/null +++ b/lab-41/pom.xml @@ -0,0 +1,20 @@ + + + + labs-parent + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + lab-41 + pom + + lab-41-demo01 + lab-41-demo02 + + + + diff --git a/lab-42/lab-42-demo01/pom.xml b/lab-42/lab-42-demo01/pom.xml new file mode 100644 index 000000000..c6f20b9a9 --- /dev/null +++ b/lab-42/lab-42-demo01/pom.xml @@ -0,0 +1,46 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-42-demo01 + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + mysql + mysql-connector-java + 5.1.46 + + + + + org.springframework.boot + spring-boot-starter-test + test + + + com.h2database + h2 + test + + + + diff --git a/lab-42/lab-42-demo01/src/main/java/cn/iocoder/springboot/lab23/testdemo/Application.java b/lab-42/lab-42-demo01/src/main/java/cn/iocoder/springboot/lab23/testdemo/Application.java new file mode 100644 index 000000000..b96d4d52a --- /dev/null +++ b/lab-42/lab-42-demo01/src/main/java/cn/iocoder/springboot/lab23/testdemo/Application.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab23.testdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/lab-42/lab-42-demo01/src/main/java/cn/iocoder/springboot/lab23/testdemo/controller/UserController.java b/lab-42/lab-42-demo01/src/main/java/cn/iocoder/springboot/lab23/testdemo/controller/UserController.java new file mode 100644 index 000000000..db349d20c --- /dev/null +++ b/lab-42/lab-42-demo01/src/main/java/cn/iocoder/springboot/lab23/testdemo/controller/UserController.java @@ -0,0 +1,33 @@ +package cn.iocoder.springboot.lab23.testdemo.controller; + +import cn.iocoder.springboot.lab23.testdemo.dataobject.UserDO; +import cn.iocoder.springboot.lab23.testdemo.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +/** + * 用户 Controller + */ +@RestController +@RequestMapping("/user") +public class UserController { + + @Autowired + private UserService userService; + + /** + * 获得指定用户编号的用户 + * + * @param id 用户编号 + * @return 用户 + */ + @GetMapping("/get") // URL 修改成 /get + public UserDO get(@RequestParam("id") Integer id) { + // 查询并返回用户 + return userService.get(id); + } + +} diff --git a/lab-42/lab-42-demo01/src/main/java/cn/iocoder/springboot/lab23/testdemo/dao/UserDao.java b/lab-42/lab-42-demo01/src/main/java/cn/iocoder/springboot/lab23/testdemo/dao/UserDao.java new file mode 100644 index 000000000..7134114d1 --- /dev/null +++ b/lab-42/lab-42-demo01/src/main/java/cn/iocoder/springboot/lab23/testdemo/dao/UserDao.java @@ -0,0 +1,21 @@ +package cn.iocoder.springboot.lab23.testdemo.dao; + +import cn.iocoder.springboot.lab23.testdemo.dataobject.UserDO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.BeanPropertyRowMapper; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.stereotype.Repository; + +@Repository +public class UserDao { + + @Autowired + private JdbcTemplate template; + + public UserDO selectById(Integer id) { + return template.queryForObject("SELECT id, username, password FROM t_user WHERE id = ?", + new BeanPropertyRowMapper<>(UserDO.class), // 结果转换成对应的对象 + id); + } + +} diff --git a/lab-42/lab-42-demo01/src/main/java/cn/iocoder/springboot/lab23/testdemo/dataobject/UserDO.java b/lab-42/lab-42-demo01/src/main/java/cn/iocoder/springboot/lab23/testdemo/dataobject/UserDO.java new file mode 100644 index 000000000..d22dbf842 --- /dev/null +++ b/lab-42/lab-42-demo01/src/main/java/cn/iocoder/springboot/lab23/testdemo/dataobject/UserDO.java @@ -0,0 +1,50 @@ +package cn.iocoder.springboot.lab23.testdemo.dataobject; + +/** + * 用户 DO + */ +public class UserDO { + + /** + * 用户编号 + */ + private Integer id; + /** + * 账号 + */ + private String username; + /** + * 密码(明文) + * + * ps:生产环境下,千万不要明文噢 + */ + private String password; + + public Integer getId() { + return id; + } + + public UserDO setId(Integer id) { + this.id = id; + return this; + } + + public String getUsername() { + return username; + } + + public UserDO setUsername(String username) { + this.username = username; + return this; + } + + public String getPassword() { + return password; + } + + public UserDO setPassword(String password) { + this.password = password; + return this; + } + +} diff --git a/lab-42/lab-42-demo01/src/main/java/cn/iocoder/springboot/lab23/testdemo/service/UserService.java b/lab-42/lab-42-demo01/src/main/java/cn/iocoder/springboot/lab23/testdemo/service/UserService.java new file mode 100644 index 000000000..df933852e --- /dev/null +++ b/lab-42/lab-42-demo01/src/main/java/cn/iocoder/springboot/lab23/testdemo/service/UserService.java @@ -0,0 +1,18 @@ +package cn.iocoder.springboot.lab23.testdemo.service; + +import cn.iocoder.springboot.lab23.testdemo.dao.UserDao; +import cn.iocoder.springboot.lab23.testdemo.dataobject.UserDO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class UserService { + + @Autowired + private UserDao userDao; + + public UserDO get(Integer id) { + return userDao.selectById(id); + } + +} diff --git a/lab-39/lab-39-mysql/target/classes/application.yml b/lab-42/lab-42-demo01/src/main/resources/application.yaml similarity index 91% rename from lab-39/lab-39-mysql/target/classes/application.yml rename to lab-42/lab-42-demo01/src/main/resources/application.yaml index 7796fae27..0af15034a 100644 --- a/lab-39/lab-39-mysql/target/classes/application.yml +++ b/lab-42/lab-42-demo01/src/main/resources/application.yaml @@ -1,6 +1,3 @@ -server: - port: 8079 - spring: # datasource 数据源配置内容 datasource: diff --git a/lab-42/lab-42-demo01/src/test/java/cn/iocoder/springboot/lab23/testdemo/controller/UserControllerTest.java b/lab-42/lab-42-demo01/src/test/java/cn/iocoder/springboot/lab23/testdemo/controller/UserControllerTest.java new file mode 100644 index 000000000..f9eb0fc05 --- /dev/null +++ b/lab-42/lab-42-demo01/src/test/java/cn/iocoder/springboot/lab23/testdemo/controller/UserControllerTest.java @@ -0,0 +1,58 @@ +package cn.iocoder.springboot.lab23.testdemo.controller; + +import cn.iocoder.springboot.lab23.testdemo.dataobject.UserDO; +import cn.iocoder.springboot.lab23.testdemo.service.UserService; +import org.hamcrest.core.IsEqual; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; +import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; +import org.springframework.test.web.servlet.result.MockMvcResultMatchers; + +/** + * UserController 单元测试 + */ +@RunWith(SpringRunner.class) +@SpringBootTest +@AutoConfigureMockMvc +public class UserControllerTest { + + @Autowired + private MockMvc mvc; + + @MockBean + private UserService userService; + + @Test + public void testGet() throws Exception { + // Mock UserService 的 get 方法 + Mockito.when(userService.get(1)).thenReturn( + new UserDO().setId(1).setUsername("username:1").setPassword("password:1")); + + // 查询用户 + ResultActions resultActions = mvc.perform(MockMvcRequestBuilders.get("/user/get?id=1")); + + // 校验响应状态码 + resultActions.andExpect(MockMvcResultMatchers.status().isOk()); // 响应状态码 200 + + // 校验响应内容方式一:直接全部匹配 + resultActions.andExpect(MockMvcResultMatchers.content().json("{\n" + + " \"id\": 1,\n" + + " \"username\": \"username:1\",\n" + + " \"password\": \"password:1\"\n" + + "}", true)); // 响应结果 + + // 校验响应内容方式二:逐个字段匹配 + resultActions.andExpect(MockMvcResultMatchers.jsonPath("id", IsEqual.equalTo(1))); + resultActions.andExpect(MockMvcResultMatchers.jsonPath("username", IsEqual.equalTo("username:1"))); + resultActions.andExpect(MockMvcResultMatchers.jsonPath("password", IsEqual.equalTo("password:1"))); + } + +} diff --git a/lab-42/lab-42-demo01/src/test/java/cn/iocoder/springboot/lab23/testdemo/dao/UserDaoTest.java b/lab-42/lab-42-demo01/src/test/java/cn/iocoder/springboot/lab23/testdemo/dao/UserDaoTest.java new file mode 100644 index 000000000..081da10e6 --- /dev/null +++ b/lab-42/lab-42-demo01/src/test/java/cn/iocoder/springboot/lab23/testdemo/dao/UserDaoTest.java @@ -0,0 +1,33 @@ +package cn.iocoder.springboot.lab23.testdemo.dao; + +import cn.iocoder.springboot.lab23.testdemo.dataobject.UserDO; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.jdbc.Sql; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class UserDaoTest { + + @Autowired + private UserDao userDao; + + @Test + @Sql(scripts = "/sql/create_tables.sql", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(statements = "INSERT INTO `t_user`(`id`, `username`, `password`) VALUES (1, 'username:1', 'password:1');", executionPhase = Sql.ExecutionPhase.BEFORE_TEST_METHOD) + @Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) + public void testSelectById() { + // 查询用户 + UserDO user = userDao.selectById(1); + + // 校验结果 + Assert.assertEquals("编号不匹配", 1, (int) user.getId()); + Assert.assertEquals("用户名不匹配", "username:1", user.getUsername()); + Assert.assertEquals("密码不匹配", "password:1", user.getPassword()); + } + +} diff --git a/lab-42/lab-42-demo01/src/test/java/cn/iocoder/springboot/lab23/testdemo/package-info.java b/lab-42/lab-42-demo01/src/test/java/cn/iocoder/springboot/lab23/testdemo/package-info.java new file mode 100644 index 000000000..ae8ba9d6c --- /dev/null +++ b/lab-42/lab-42-demo01/src/test/java/cn/iocoder/springboot/lab23/testdemo/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.springboot.lab23.testdemo; diff --git a/lab-42/lab-42-demo01/src/test/java/cn/iocoder/springboot/lab23/testdemo/service/UserServiceTest.java b/lab-42/lab-42-demo01/src/test/java/cn/iocoder/springboot/lab23/testdemo/service/UserServiceTest.java new file mode 100644 index 000000000..25b9d120a --- /dev/null +++ b/lab-42/lab-42-demo01/src/test/java/cn/iocoder/springboot/lab23/testdemo/service/UserServiceTest.java @@ -0,0 +1,39 @@ +package cn.iocoder.springboot.lab23.testdemo.service; + +import cn.iocoder.springboot.lab23.testdemo.dao.UserDao; +import cn.iocoder.springboot.lab23.testdemo.dataobject.UserDO; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class UserServiceTest { + + @MockBean + private UserDao userDao; + + @Autowired + private UserService userService; + + @Test + public void testGet() { + // Mock UserDao 的 selectById 方法 + Mockito.when(userDao.selectById(1)).thenReturn( + new UserDO().setId(1).setUsername("username:1").setPassword("password:1")); + + // 查询用户 + UserDO user = userService.get(1); + + // 校验结果 + Assert.assertEquals("编号不匹配", 1, (int) user.getId()); + Assert.assertEquals("用户名不匹配", "username:1", user.getUsername()); + Assert.assertEquals("密码不匹配", "password:1", user.getPassword()); + } + +} diff --git a/lab-42/lab-42-demo01/src/test/resources/application.yaml b/lab-42/lab-42-demo01/src/test/resources/application.yaml new file mode 100644 index 000000000..382674c46 --- /dev/null +++ b/lab-42/lab-42-demo01/src/test/resources/application.yaml @@ -0,0 +1,7 @@ +spring: + # datasource 数据源配置内容 + datasource: + url: jdbc:h2:mem:testdb + driver-class-name: org.h2.Driver + username: sa + password: diff --git a/lab-42/lab-42-demo01/src/test/resources/sql/clean.sql b/lab-42/lab-42-demo01/src/test/resources/sql/clean.sql new file mode 100644 index 000000000..be125207d --- /dev/null +++ b/lab-42/lab-42-demo01/src/test/resources/sql/clean.sql @@ -0,0 +1 @@ +DROP TABLE `t_user` diff --git a/lab-42/lab-42-demo01/src/test/resources/sql/create_tables.sql b/lab-42/lab-42-demo01/src/test/resources/sql/create_tables.sql new file mode 100644 index 000000000..82c92d7e2 --- /dev/null +++ b/lab-42/lab-42-demo01/src/test/resources/sql/create_tables.sql @@ -0,0 +1,5 @@ +CREATE TABLE `t_user` ( + `id` INT AUTO_INCREMENT PRIMARY KEY COMMENT '用户编号', + `username` VARCHAR(64) NOT NULL COMMENT '账号', + `password` VARCHAR(64) NOT NULL COMMENT '密码' +); diff --git a/lab-42/pom.xml b/lab-42/pom.xml new file mode 100644 index 000000000..3518bd6b5 --- /dev/null +++ b/lab-42/pom.xml @@ -0,0 +1,19 @@ + + + + labs-parent + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + lab-42 + pom + + lab-42-demo01 + + + + diff --git a/lab-43/lab-43-demo-configname/pom.xml b/lab-43/lab-43-demo-configname/pom.xml new file mode 100644 index 000000000..ed36d88a5 --- /dev/null +++ b/lab-43/lab-43-demo-configname/pom.xml @@ -0,0 +1,23 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-43-demo-configname + + + + + org.springframework.boot + spring-boot-starter + + + + diff --git a/lab-43/lab-43-demo-configname/src/main/java/cn/iocoder/springboot/lab43/propertydemo/Application.java b/lab-43/lab-43-demo-configname/src/main/java/cn/iocoder/springboot/lab43/propertydemo/Application.java new file mode 100644 index 000000000..4404b91b9 --- /dev/null +++ b/lab-43/lab-43-demo-configname/src/main/java/cn/iocoder/springboot/lab43/propertydemo/Application.java @@ -0,0 +1,48 @@ +package cn.iocoder.springboot.lab43.propertydemo; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.context.config.ConfigFileApplicationListener; +import org.springframework.stereotype.Component; + +@SpringBootApplication +public class Application { + + /** + * 设置需要读取的配置文件的名字。 + * 基于 {@link org.springframework.boot.context.config.ConfigFileApplicationListener#CONFIG_NAME_PROPERTY} 实现。 + */ + private static final String CONFIG_NAME_VALUE = "application,rpc"; + + public static void main(String[] args) { + // 设置环境变量 + System.setProperty(ConfigFileApplicationListener.CONFIG_NAME_PROPERTY, CONFIG_NAME_VALUE); + + // 启动 Spring Boot 应用 + SpringApplication.run(Application.class, args); + } + + @Component + public class ValueCommandLineRunner implements CommandLineRunner { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Value("${application-test}") + private String applicationTest; + + @Value("${rpc-test}") + private String rpcTest; + + @Override + public void run(String... args) { + logger.info("applicationTest:" + applicationTest); + logger.info("rpcTest:" + rpcTest); + } + + } + +} diff --git a/lab-43/lab-43-demo-configname/src/main/resources/application.yaml b/lab-43/lab-43-demo-configname/src/main/resources/application.yaml new file mode 100644 index 000000000..7d82dc53a --- /dev/null +++ b/lab-43/lab-43-demo-configname/src/main/resources/application.yaml @@ -0,0 +1 @@ +application-test: hahaha diff --git a/lab-43/lab-43-demo-configname/src/main/resources/rpc.yaml b/lab-43/lab-43-demo-configname/src/main/resources/rpc.yaml new file mode 100644 index 000000000..068e7cb36 --- /dev/null +++ b/lab-43/lab-43-demo-configname/src/main/resources/rpc.yaml @@ -0,0 +1 @@ +rpc-test: yeah diff --git a/lab-43/lab-43-demo-jasypt/pom.xml b/lab-43/lab-43-demo-jasypt/pom.xml new file mode 100644 index 000000000..01e667cce --- /dev/null +++ b/lab-43/lab-43-demo-jasypt/pom.xml @@ -0,0 +1,37 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-43-demo-jasypt + + + + + org.springframework.boot + spring-boot-starter + + + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + 3.0.2 + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + diff --git a/lab-43/lab-43-demo-jasypt/src/main/java/cn/iocoder/springboot/lab43/propertydemo/Application.java b/lab-43/lab-43-demo-jasypt/src/main/java/cn/iocoder/springboot/lab43/propertydemo/Application.java new file mode 100644 index 000000000..01a7f359c --- /dev/null +++ b/lab-43/lab-43-demo-jasypt/src/main/java/cn/iocoder/springboot/lab43/propertydemo/Application.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab43.propertydemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/lab-43/lab-43-demo-jasypt/src/main/resources/application.yaml b/lab-43/lab-43-demo-jasypt/src/main/resources/application.yaml new file mode 100644 index 000000000..960f9d97c --- /dev/null +++ b/lab-43/lab-43-demo-jasypt/src/main/resources/application.yaml @@ -0,0 +1,11 @@ +spring: + application: +# name: ENC(xQZuD8KnkqzIGep0FFH0DYJ3Re9TrKTdvu2fxIlWNpwFcdNGhkpCag==) +# name: ENC(KoaHnIhRGiCdWh0T2lby899Cov6MyiAXrW5PadJ3XFY=) + name: demo-application + +jasypt: + # jasypt 配置项,对应 JasyptEncryptorConfigurationProperties 配置类 + encryptor: + algorithm: PBEWithMD5AndDES # 加密算法 + password: ${JASYPT_PASSWORD} # 加密秘钥 diff --git a/lab-43/lab-43-demo-jasypt/src/test/java/cn/iocoder/springboot/lab43/propertydemo/JasyptTest.java b/lab-43/lab-43-demo-jasypt/src/test/java/cn/iocoder/springboot/lab43/propertydemo/JasyptTest.java new file mode 100644 index 000000000..b1d62e8f3 --- /dev/null +++ b/lab-43/lab-43-demo-jasypt/src/test/java/cn/iocoder/springboot/lab43/propertydemo/JasyptTest.java @@ -0,0 +1,35 @@ +package cn.iocoder.springboot.lab43.propertydemo; + +import org.jasypt.encryption.StringEncryptor; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class JasyptTest { + + @Autowired + private StringEncryptor encryptor; + + @Test + public void encode() { + String applicationName = "demo-application"; + System.out.println(encryptor.encrypt(applicationName)); + } + + @Value("${spring.application.name}") + private String applicationName; + + @Test + public void print() { + System.out.println(applicationName); + } + + @Value("${jasypt.encryptor.password}") + private String password; + +} diff --git a/lab-43/lab-43-demo-profiles/pom.xml b/lab-43/lab-43-demo-profiles/pom.xml new file mode 100644 index 000000000..8bc0ba2e0 --- /dev/null +++ b/lab-43/lab-43-demo-profiles/pom.xml @@ -0,0 +1,23 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-43-demo-profiles + + + + + org.springframework.boot + spring-boot-starter-web + + + + diff --git a/lab-43/lab-43-demo-profiles/src/main/java/cn/iocoder/springboot/lab43/propertydemo/ProfilesApplication.java b/lab-43/lab-43-demo-profiles/src/main/java/cn/iocoder/springboot/lab43/propertydemo/ProfilesApplication.java new file mode 100644 index 000000000..cfd70c568 --- /dev/null +++ b/lab-43/lab-43-demo-profiles/src/main/java/cn/iocoder/springboot/lab43/propertydemo/ProfilesApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab43.propertydemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ProfilesApplication { + + public static void main(String[] args) { + SpringApplication.run(ProfilesApplication.class, args); + } + +} diff --git a/lab-07/lab-07-spring-cloud-gateway/target/classes/application.yml b/lab-43/lab-43-demo-profiles/src/main/resources/application-dev.yaml similarity index 100% rename from lab-07/lab-07-spring-cloud-gateway/target/classes/application.yml rename to lab-43/lab-43-demo-profiles/src/main/resources/application-dev.yaml diff --git a/lab-43/lab-43-demo-profiles/src/main/resources/application-local.yaml b/lab-43/lab-43-demo-profiles/src/main/resources/application-local.yaml new file mode 100644 index 000000000..a7afc92b7 --- /dev/null +++ b/lab-43/lab-43-demo-profiles/src/main/resources/application-local.yaml @@ -0,0 +1,2 @@ +server: + port: 8080 diff --git a/lab-43/lab-43-demo-profiles/src/main/resources/application-pre.yaml b/lab-43/lab-43-demo-profiles/src/main/resources/application-pre.yaml new file mode 100644 index 000000000..b67e63ea2 --- /dev/null +++ b/lab-43/lab-43-demo-profiles/src/main/resources/application-pre.yaml @@ -0,0 +1,2 @@ +server: + port: 8083 diff --git a/lab-43/lab-43-demo-profiles/src/main/resources/application-prod.yaml b/lab-43/lab-43-demo-profiles/src/main/resources/application-prod.yaml new file mode 100644 index 000000000..2a591c16e --- /dev/null +++ b/lab-43/lab-43-demo-profiles/src/main/resources/application-prod.yaml @@ -0,0 +1,2 @@ +server: + port: 8084 diff --git a/lab-43/lab-43-demo-profiles/src/main/resources/application-uat.yaml b/lab-43/lab-43-demo-profiles/src/main/resources/application-uat.yaml new file mode 100644 index 000000000..4a2daf555 --- /dev/null +++ b/lab-43/lab-43-demo-profiles/src/main/resources/application-uat.yaml @@ -0,0 +1,2 @@ +server: + port: 8082 diff --git a/lab-43/lab-43-demo-profiles/src/main/resources/application.yaml b/lab-43/lab-43-demo-profiles/src/main/resources/application.yaml new file mode 100644 index 000000000..ff6f7616f --- /dev/null +++ b/lab-43/lab-43-demo-profiles/src/main/resources/application.yaml @@ -0,0 +1,6 @@ +server: + port: 7070 + +spring: + application: + name: demo-application diff --git a/lab-43/lab-43-demo/pom.xml b/lab-43/lab-43-demo/pom.xml new file mode 100644 index 000000000..171b1997f --- /dev/null +++ b/lab-43/lab-43-demo/pom.xml @@ -0,0 +1,30 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-43-demo + + + + + org.springframework.boot + spring-boot-starter + + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + diff --git a/lab-43/lab-43-demo/src/main/java/cn/iocoder/springboot/lab43/propertydemo/Application.java b/lab-43/lab-43-demo/src/main/java/cn/iocoder/springboot/lab43/propertydemo/Application.java new file mode 100644 index 000000000..090e03f12 --- /dev/null +++ b/lab-43/lab-43-demo/src/main/java/cn/iocoder/springboot/lab43/propertydemo/Application.java @@ -0,0 +1,57 @@ +package cn.iocoder.springboot.lab43.propertydemo; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.stereotype.Component; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + @Component + public class OrderPropertiesCommandLineRunner implements CommandLineRunner { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private OrderProperties orderProperties; + + @Override + public void run(String... args) { + logger.info("payTimeoutSeconds:" + orderProperties.getPayTimeoutSeconds()); + logger.info("createFrequencySeconds:" + orderProperties.getCreateFrequencySeconds()); + } + + } + + @Component + public class ValueCommandLineRunner implements CommandLineRunner { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Value("${order.pay-timeout-seconds}") + private Integer payTimeoutSeconds; + + @Value("${order.create-frequency-seconds}") + private Integer createFrequencySeconds; + +// @Value("${order.desc}") +// private String desc; + + @Override + public void run(String... args) { + logger.info("payTimeoutSeconds:" + payTimeoutSeconds); + logger.info("createFrequencySeconds:" + createFrequencySeconds); + } + + } + +} diff --git a/lab-43/lab-43-demo/src/main/java/cn/iocoder/springboot/lab43/propertydemo/OrderProperties.java b/lab-43/lab-43-demo/src/main/java/cn/iocoder/springboot/lab43/propertydemo/OrderProperties.java new file mode 100644 index 000000000..d9b805bc9 --- /dev/null +++ b/lab-43/lab-43-demo/src/main/java/cn/iocoder/springboot/lab43/propertydemo/OrderProperties.java @@ -0,0 +1,52 @@ +package cn.iocoder.springboot.lab43.propertydemo; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "order") +public class OrderProperties { + + /** + * 订单支付超时时长,单位:秒。 + */ + private Integer payTimeoutSeconds; + + /** + * 订单创建频率,单位:秒 + */ + private Integer createFrequencySeconds; + +// /** +// * 配置描述 +// */ +// private String desc; + + public Integer getPayTimeoutSeconds() { + return payTimeoutSeconds; + } + + public OrderProperties setPayTimeoutSeconds(Integer payTimeoutSeconds) { + this.payTimeoutSeconds = payTimeoutSeconds; + return this; + } + + public Integer getCreateFrequencySeconds() { + return createFrequencySeconds; + } + + public OrderProperties setCreateFrequencySeconds(Integer createFrequencySeconds) { + this.createFrequencySeconds = createFrequencySeconds; + return this; + } + +// public String getDesc() { +// return desc; +// } +// +// public OrderProperties setDesc(String desc) { +// this.desc = desc; +// return this; +// } + +} diff --git a/lab-43/lab-43-demo/src/main/resources/application.yaml b/lab-43/lab-43-demo/src/main/resources/application.yaml new file mode 100644 index 000000000..cd80e56ce --- /dev/null +++ b/lab-43/lab-43-demo/src/main/resources/application.yaml @@ -0,0 +1,4 @@ +order: + pay-timeout-seconds: 120 # 订单支付超时时长,单位:秒。 + create-frequency-seconds: 10 # 订单创建频率,单位:秒 +# desc: "订单支付超时时长为 ${order.pay-timeout-seconds} 秒,订单创建频率为 ${order.create-frequency-seconds} 秒" diff --git a/lab-43/pom.xml b/lab-43/pom.xml new file mode 100644 index 000000000..45477b437 --- /dev/null +++ b/lab-43/pom.xml @@ -0,0 +1,22 @@ + + + + labs-parent + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + lab-43 + pom + + lab-43-demo + lab-43-demo-profiles + lab-43-demo-jasypt + lab-43-demo-configname + + + + diff --git a/lab-44/lab-44-nacos-config-demo-actuator/pom.xml b/lab-44/lab-44-nacos-config-demo-actuator/pom.xml new file mode 100644 index 000000000..baab31608 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-actuator/pom.xml @@ -0,0 +1,43 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-44-nacos-config-demo-actuator + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.boot + nacos-config-spring-boot-starter + 0.2.4 + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + com.alibaba.boot + nacos-config-spring-boot-actuator + 0.2.4 + + + + + diff --git a/lab-44/lab-44-nacos-config-demo-actuator/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java b/lab-44/lab-44-nacos-config-demo-actuator/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java new file mode 100644 index 000000000..a7ed543b0 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-actuator/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java @@ -0,0 +1,14 @@ +package cn.iocoder.springboot.lab44.nacosdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +// @NacosPropertySource(dataId = "example", type = ConfigType.YAML) +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/lab-44/lab-44-nacos-config-demo-actuator/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/DemoController.java b/lab-44/lab-44-nacos-config-demo-actuator/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/DemoController.java new file mode 100644 index 000000000..64d2a2f54 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-actuator/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/DemoController.java @@ -0,0 +1,40 @@ +package cn.iocoder.springboot.lab44.nacosdemo.controller; + +import cn.iocoder.springboot.lab44.nacosdemo.properties.TestProperties; +import com.alibaba.nacos.api.config.annotation.NacosValue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + +// @Value("${test}") + @NacosValue(value = "${test}", autoRefreshed = true) + private String test; + + @GetMapping("/test") + public String test() { + return test; + } + + @Autowired + private TestProperties testProperties; + + @GetMapping("/test_properties") + public TestProperties testProperties() { + return testProperties; + } + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @GetMapping("/logger") + public void logger() { + logger.debug("[logger][测试一下]"); + } + +} diff --git a/lab-44/lab-44-nacos-config-demo-actuator/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/listener/LoggingSystemConfigListener.java b/lab-44/lab-44-nacos-config-demo-actuator/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/listener/LoggingSystemConfigListener.java new file mode 100644 index 000000000..618dec5c9 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-actuator/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/listener/LoggingSystemConfigListener.java @@ -0,0 +1,42 @@ +package cn.iocoder.springboot.lab44.nacosdemo.listener; + +import com.alibaba.nacos.api.config.ConfigType; +import com.alibaba.nacos.api.config.annotation.NacosConfigListener; +import com.alibaba.nacos.spring.util.parse.DefaultYamlConfigParse; +import org.springframework.boot.logging.LogLevel; +import org.springframework.boot.logging.LoggingSystem; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Properties; + +@Component +public class LoggingSystemConfigListener { + + /** + * 日志配置项的前缀 + */ + private static final String LOGGER_TAG = "logging.level."; + + @Resource + private LoggingSystem loggingSystem; + + @NacosConfigListener(dataId = "${nacos.config.data-id}", type = ConfigType.YAML, timeout = 5000) + public void onChange(String newLog) throws Exception { + // 使用 DefaultYamlConfigParse 工具类,解析配置 + Properties properties = new DefaultYamlConfigParse().parse(newLog); + // 遍历配置集的每个配置项,判断是否是 logging.level 配置项 + for (Object t : properties.keySet()) { + String key = String.valueOf(t); + // 如果是 logging.level 配置项,则设置其对应的日志级别 + if (key.startsWith(LOGGER_TAG)) { + // 获得日志级别 + String strLevel = properties.getProperty(key, "info"); + LogLevel level = LogLevel.valueOf(strLevel.toUpperCase()); + // 设置日志级别到 LoggingSystem 中 + loggingSystem.setLogLevel(key.replace(LOGGER_TAG, ""), level); + } + } + } + +} diff --git a/lab-44/lab-44-nacos-config-demo-actuator/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/properties/TestProperties.java b/lab-44/lab-44-nacos-config-demo-actuator/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/properties/TestProperties.java new file mode 100644 index 000000000..ff7dc8398 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-actuator/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/properties/TestProperties.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab44.nacosdemo.properties; + +import com.alibaba.nacos.api.config.ConfigType; +import com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@NacosConfigurationProperties(prefix = "", dataId = "${nacos.config.data-id}", type = ConfigType.YAML, autoRefreshed = true) +public class TestProperties { + + /** + * 测试属性 + */ + private String test; + + public String getTest() { + return test; + } + + public TestProperties setTest(String test) { + this.test = test; + return this; + } + +} diff --git a/lab-44/lab-44-nacos-config-demo-actuator/src/main/resources/application.yaml b/lab-44/lab-44-nacos-config-demo-actuator/src/main/resources/application.yaml new file mode 100644 index 000000000..c3c37b8e1 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-actuator/src/main/resources/application.yaml @@ -0,0 +1,23 @@ +nacos: + # Nacos 配置中心的配置项,对应 NacosConfigProperties 配置类 + config: + server-addr: 127.0.0.1:18848 # Nacos 服务器地址 + bootstrap: + enable: true # 是否开启 Nacos 配置预加载功能。默认为 false。 + log-enable: true # 是否开启 Nacos 支持日志级别的加载时机。默认为 false。 + data-id: example-auto-refresh # 使用的 Nacos 配置集的 dataId。 + type: YAML # 使用的 Nacos 配置集的配置格式。默认为 PROPERTIES。 + group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP。 + namespace: # 使用的 Nacos 的命名空间,默认为 null。 + auto-refresh: true # 是否自动刷新,默认为 false。 + +management: + endpoint: + # Health 端点配置项,对应 HealthProperties 配置类 + health: + show-details: ALWAYS # 何时显示完整的健康信息。默认为 NEVER 都不展示。可选 WHEN_AUTHORIZED 当经过授权的用户;可选 ALWAYS 总是展示。 + endpoints: + # Actuator HTTP 配置项,对应 WebEndpointProperties 配置类 + web: + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 diff --git a/lab-44/lab-44-nacos-config-demo-auto-refresh/pom.xml b/lab-44/lab-44-nacos-config-demo-auto-refresh/pom.xml new file mode 100644 index 000000000..4a41786e7 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-auto-refresh/pom.xml @@ -0,0 +1,30 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-44-nacos-config-demo-auto-refresh + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.boot + nacos-config-spring-boot-starter + 0.2.4 + + + + diff --git a/lab-44/lab-44-nacos-config-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java b/lab-44/lab-44-nacos-config-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java new file mode 100644 index 000000000..a7ed543b0 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java @@ -0,0 +1,14 @@ +package cn.iocoder.springboot.lab44.nacosdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +// @NacosPropertySource(dataId = "example", type = ConfigType.YAML) +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/lab-44/lab-44-nacos-config-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/DemoController.java b/lab-44/lab-44-nacos-config-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/DemoController.java new file mode 100644 index 000000000..64d2a2f54 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/DemoController.java @@ -0,0 +1,40 @@ +package cn.iocoder.springboot.lab44.nacosdemo.controller; + +import cn.iocoder.springboot.lab44.nacosdemo.properties.TestProperties; +import com.alibaba.nacos.api.config.annotation.NacosValue; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + +// @Value("${test}") + @NacosValue(value = "${test}", autoRefreshed = true) + private String test; + + @GetMapping("/test") + public String test() { + return test; + } + + @Autowired + private TestProperties testProperties; + + @GetMapping("/test_properties") + public TestProperties testProperties() { + return testProperties; + } + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @GetMapping("/logger") + public void logger() { + logger.debug("[logger][测试一下]"); + } + +} diff --git a/lab-44/lab-44-nacos-config-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/listener/LoggingSystemConfigListener.java b/lab-44/lab-44-nacos-config-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/listener/LoggingSystemConfigListener.java new file mode 100644 index 000000000..618dec5c9 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/listener/LoggingSystemConfigListener.java @@ -0,0 +1,42 @@ +package cn.iocoder.springboot.lab44.nacosdemo.listener; + +import com.alibaba.nacos.api.config.ConfigType; +import com.alibaba.nacos.api.config.annotation.NacosConfigListener; +import com.alibaba.nacos.spring.util.parse.DefaultYamlConfigParse; +import org.springframework.boot.logging.LogLevel; +import org.springframework.boot.logging.LoggingSystem; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Properties; + +@Component +public class LoggingSystemConfigListener { + + /** + * 日志配置项的前缀 + */ + private static final String LOGGER_TAG = "logging.level."; + + @Resource + private LoggingSystem loggingSystem; + + @NacosConfigListener(dataId = "${nacos.config.data-id}", type = ConfigType.YAML, timeout = 5000) + public void onChange(String newLog) throws Exception { + // 使用 DefaultYamlConfigParse 工具类,解析配置 + Properties properties = new DefaultYamlConfigParse().parse(newLog); + // 遍历配置集的每个配置项,判断是否是 logging.level 配置项 + for (Object t : properties.keySet()) { + String key = String.valueOf(t); + // 如果是 logging.level 配置项,则设置其对应的日志级别 + if (key.startsWith(LOGGER_TAG)) { + // 获得日志级别 + String strLevel = properties.getProperty(key, "info"); + LogLevel level = LogLevel.valueOf(strLevel.toUpperCase()); + // 设置日志级别到 LoggingSystem 中 + loggingSystem.setLogLevel(key.replace(LOGGER_TAG, ""), level); + } + } + } + +} diff --git a/lab-44/lab-44-nacos-config-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/properties/TestProperties.java b/lab-44/lab-44-nacos-config-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/properties/TestProperties.java new file mode 100644 index 000000000..ff7dc8398 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/properties/TestProperties.java @@ -0,0 +1,25 @@ +package cn.iocoder.springboot.lab44.nacosdemo.properties; + +import com.alibaba.nacos.api.config.ConfigType; +import com.alibaba.nacos.api.config.annotation.NacosConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@NacosConfigurationProperties(prefix = "", dataId = "${nacos.config.data-id}", type = ConfigType.YAML, autoRefreshed = true) +public class TestProperties { + + /** + * 测试属性 + */ + private String test; + + public String getTest() { + return test; + } + + public TestProperties setTest(String test) { + this.test = test; + return this; + } + +} diff --git a/lab-44/lab-44-nacos-config-demo-auto-refresh/src/main/resources/application.yaml b/lab-44/lab-44-nacos-config-demo-auto-refresh/src/main/resources/application.yaml new file mode 100644 index 000000000..27ac8b8b6 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-auto-refresh/src/main/resources/application.yaml @@ -0,0 +1,12 @@ +nacos: + # Nacos 配置中心的配置项,对应 NacosConfigProperties 配置类 + config: + server-addr: 127.0.0.1:18848 # Nacos 服务器地址 + bootstrap: + enable: true # 是否开启 Nacos 配置预加载功能。默认为 false。 + log-enable: true # 是否开启 Nacos 支持日志级别的加载时机。默认为 false。 + data-id: example-auto-refresh # 使用的 Nacos 配置集的 dataId。 + type: YAML # 使用的 Nacos 配置集的配置格式。默认为 PROPERTIES。 + group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP。 + namespace: # 使用的 Nacos 的命名空间,默认为 null。 + auto-refresh: true # 是否自动刷新,默认为 false。 diff --git a/lab-44/lab-44-nacos-config-demo-jasypt/pom.xml b/lab-44/lab-44-nacos-config-demo-jasypt/pom.xml new file mode 100644 index 000000000..e722f823b --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-jasypt/pom.xml @@ -0,0 +1,45 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-44-nacos-config-demo-jasypt + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.boot + nacos-config-spring-boot-starter + 0.2.4 + + + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + 3.0.2 + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + diff --git a/lab-44/lab-44-nacos-config-demo-jasypt/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java b/lab-44/lab-44-nacos-config-demo-jasypt/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java new file mode 100644 index 000000000..0f9ee09af --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-jasypt/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab44.nacosdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/lab-44/lab-44-nacos-config-demo-jasypt/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/DemoController.java b/lab-44/lab-44-nacos-config-demo-jasypt/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/DemoController.java new file mode 100644 index 000000000..f5a6cb936 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-jasypt/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/DemoController.java @@ -0,0 +1,21 @@ +package cn.iocoder.springboot.lab44.nacosdemo.controller; + +import com.alibaba.nacos.api.config.annotation.NacosValue; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + +// @Value("${spring.application.name}") + @NacosValue(value = "${spring.application.name}", autoRefreshed = true) + private String applicationName; + + @GetMapping("/test") + public String test() { + return applicationName; + } + +} diff --git a/lab-44/lab-44-nacos-config-demo-jasypt/src/main/resources/application.yaml b/lab-44/lab-44-nacos-config-demo-jasypt/src/main/resources/application.yaml new file mode 100644 index 000000000..622e0cf0e --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-jasypt/src/main/resources/application.yaml @@ -0,0 +1,12 @@ +nacos: + # Nacos 配置中心的配置项,对应 NacosConfigProperties 配置类 + config: + server-addr: 127.0.0.1:18848 # Nacos 服务器地址 + bootstrap: + enable: true # 是否开启 Nacos 配置预加载功能。默认为 false。 + log-enable: true # 是否开启 Nacos 支持日志级别的加载时机。默认为 false。 + data-id: example-jasypt # 使用的 Nacos 配置集的 dataId。 + type: YAML # 使用的 Nacos 配置集的配置格式。默认为 PROPERTIES。 + group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP。 + namespace: # 使用的 Nacos 的命名空间,默认为 null。 + auto-refresh: true # 是否自动刷新,默认为 false。 diff --git a/lab-44/lab-44-nacos-config-demo-jasypt/src/test/java/cn/iocoder/springboot/lab44/nacosdemo/JasyptTest.java b/lab-44/lab-44-nacos-config-demo-jasypt/src/test/java/cn/iocoder/springboot/lab44/nacosdemo/JasyptTest.java new file mode 100644 index 000000000..446e68438 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-jasypt/src/test/java/cn/iocoder/springboot/lab44/nacosdemo/JasyptTest.java @@ -0,0 +1,41 @@ +package cn.iocoder.springboot.lab44.nacosdemo; + +import org.jasypt.encryption.StringEncryptor; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class JasyptTest { + + @Autowired + private StringEncryptor encryptor; + + @Test + public void encode() { + // 第一个加密 + String applicationName = "demo-application"; + System.out.println(encryptor.encrypt(applicationName)); + +// // 第二个加密 +// applicationName = "demo-app"; +// System.out.println(encryptor.encrypt(applicationName)); + } + + @Value("${spring.application.name}") +// @NacosValue("${spring.application.name}") + private String applicationName; + + @Test + public void print() { + System.out.println(applicationName); + } + + @Value("${jasypt.encryptor.password}") + private String password; + +} diff --git a/lab-44/lab-44-nacos-config-demo-multi/pom.xml b/lab-44/lab-44-nacos-config-demo-multi/pom.xml new file mode 100644 index 000000000..5693229f1 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-multi/pom.xml @@ -0,0 +1,30 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-44-nacos-config-demo-multi + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.boot + nacos-config-spring-boot-starter + 0.2.4 + + + + diff --git a/lab-44/lab-44-nacos-config-demo-multi/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java b/lab-44/lab-44-nacos-config-demo-multi/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java new file mode 100644 index 000000000..7bad18483 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-multi/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java @@ -0,0 +1,21 @@ +package cn.iocoder.springboot.lab44.nacosdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.env.Environment; + +@SpringBootApplication +// @NacosPropertySource(dataId = "example", type = ConfigType.YAML) +public class Application { + + public static void main(String[] args) { + // 启动 Spring Boot 应用 + ConfigurableApplicationContext context = SpringApplication.run(Application.class, args); + + // 查看 Environment + Environment environment = context.getEnvironment(); + System.out.println(environment); + } + +} diff --git a/lab-44/lab-44-nacos-config-demo-multi/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/DemoController.java b/lab-44/lab-44-nacos-config-demo-multi/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/DemoController.java new file mode 100644 index 000000000..8201e879a --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-multi/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/DemoController.java @@ -0,0 +1,21 @@ +package cn.iocoder.springboot.lab44.nacosdemo.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Autowired + private Environment environment; + + @GetMapping("/test") + public void test() { + System.out.println(environment); + } + +} diff --git a/lab-44/lab-44-nacos-config-demo-multi/src/main/resources/application.yaml b/lab-44/lab-44-nacos-config-demo-multi/src/main/resources/application.yaml new file mode 100644 index 000000000..3b2e9e3d1 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-multi/src/main/resources/application.yaml @@ -0,0 +1,22 @@ +nacos: + # Nacos 配置中心的配置项,对应 NacosConfigProperties 配置类 + config: + server-addr: 127.0.0.1:18848 # Nacos 服务器地址 + bootstrap: + enable: true # 是否开启 Nacos 配置预加载功能。默认为 false。 + log-enable: true # 是否开启 Nacos 支持日志级别的加载时机。默认为 false。 + data-id: example-multi-01 # 使用的 Nacos 配置集的 dataId。 +# data-ids: example-multi-02 + type: YAML # 使用的 Nacos 配置集的配置格式。默认为 PROPERTIES。 + group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP。 + namespace: # 使用的 Nacos 的命名空间,默认为 null。 + auto-refresh: true # 是否自动刷新,默认为 false。 + ext-config: + - server-addr: 127.0.0.1:18848 # Nacos 服务器地址 +# data-id: example-multi-11 # 使用的 Nacos 配置集的 dataId。 + data-ids: example-multi-11, example-multi-12 + type: YAML # 使用的 Nacos 配置集的配置格式。默认为 PROPERTIES。 + group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP。 + namespace: # 使用的 Nacos 的命名空间,默认为 null。 + auto-refresh: true # 是否自动刷新,默认为 false。 +# - # 这里,可以继续添加。 diff --git a/lab-44/lab-44-nacos-config-demo-profiles/pom.xml b/lab-44/lab-44-nacos-config-demo-profiles/pom.xml new file mode 100644 index 000000000..1c7603127 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-profiles/pom.xml @@ -0,0 +1,30 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-44-nacos-config-demo-profiles + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.boot + nacos-config-spring-boot-starter + 0.2.4 + + + + diff --git a/lab-44/lab-44-nacos-config-demo-profiles/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/ProfilesApplication.java b/lab-44/lab-44-nacos-config-demo-profiles/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/ProfilesApplication.java new file mode 100644 index 000000000..18a00201a --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-profiles/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/ProfilesApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab44.nacosdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ProfilesApplication { + + public static void main(String[] args) { + SpringApplication.run(ProfilesApplication.class, args); + } + +} diff --git a/lab-44/lab-44-nacos-config-demo-profiles/src/main/resources/application-dev.yaml b/lab-44/lab-44-nacos-config-demo-profiles/src/main/resources/application-dev.yaml new file mode 100644 index 000000000..b9ad54bb1 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-profiles/src/main/resources/application-dev.yaml @@ -0,0 +1,11 @@ +nacos: + # Nacos 配置中心的配置项,对应 NacosConfigProperties 配置类 + config: + server-addr: 127.0.0.1:18848 # Nacos 服务器地址 + bootstrap: + enable: true # 是否开启 Nacos 配置预加载功能。默认为 false。 + log-enable: true # 是否开启 Nacos 支持日志级别的加载时机。默认为 false。 + data-id: example # 使用的 Nacos 配置集的 dataId。 + type: YAML # 使用的 Nacos 配置集的配置格式。默认为 PROPERTIES。 + group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP。 + namespace: 14226a0d-799f-424d-8905-162f6a8bf409 # 使用的 Nacos 的命名空间,默认为 null。 diff --git a/lab-44/lab-44-nacos-config-demo-profiles/src/main/resources/application-prod.yaml b/lab-44/lab-44-nacos-config-demo-profiles/src/main/resources/application-prod.yaml new file mode 100644 index 000000000..5f1f2e83c --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-profiles/src/main/resources/application-prod.yaml @@ -0,0 +1,11 @@ +nacos: + # Nacos 配置中心的配置项,对应 NacosConfigProperties 配置类 + config: + server-addr: 127.0.0.1:18848 # Nacos 服务器地址 + bootstrap: + enable: true # 是否开启 Nacos 配置预加载功能。默认为 false。 + log-enable: true # 是否开启 Nacos 支持日志级别的加载时机。默认为 false。 + data-id: example # 使用的 Nacos 配置集的 dataId。 + type: YAML # 使用的 Nacos 配置集的配置格式。默认为 PROPERTIES。 + group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP。 + namespace: f1686f3b-a984-4cdf-8298-7caee3455d14 # 使用的 Nacos 的命名空间,默认为 null。 diff --git a/lab-44/lab-44-nacos-config-demo-profiles/src/main/resources/application.yaml b/lab-44/lab-44-nacos-config-demo-profiles/src/main/resources/application.yaml new file mode 100644 index 000000000..001e788a5 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo-profiles/src/main/resources/application.yaml @@ -0,0 +1,6 @@ +#server: +# port: 7070 + +spring: + application: + name: demo-application diff --git a/lab-44/lab-44-nacos-config-demo/pom.xml b/lab-44/lab-44-nacos-config-demo/pom.xml new file mode 100644 index 000000000..b121a6533 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo/pom.xml @@ -0,0 +1,30 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-44-nacos-config-demo + + + + + org.springframework.boot + spring-boot-starter + + + + + com.alibaba.boot + nacos-config-spring-boot-starter + 0.2.4 + + + + diff --git a/lab-44/lab-44-nacos-config-demo/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java b/lab-44/lab-44-nacos-config-demo/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java new file mode 100644 index 000000000..2da10ee43 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java @@ -0,0 +1,56 @@ +package cn.iocoder.springboot.lab44.nacosdemo; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.stereotype.Component; + +@SpringBootApplication +// @NacosPropertySource(dataId = "example", type = ConfigType.YAML) +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + @Component + public class OrderPropertiesCommandLineRunner implements CommandLineRunner { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private OrderProperties orderProperties; + + @Override + public void run(String... args) { + logger.info("payTimeoutSeconds:" + orderProperties.getPayTimeoutSeconds()); + logger.info("createFrequencySeconds:" + orderProperties.getCreateFrequencySeconds()); + } + + } + + @Component + public class ValueCommandLineRunner implements CommandLineRunner { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + +// @NacosValue(value = "${order.pay-timeout-seconds}") + @Value(value = "${order.pay-timeout-seconds}") + private Integer payTimeoutSeconds; + +// @NacosValue(value = "${order.create-frequency-seconds}") + @Value(value = "${order.create-frequency-seconds}") + private Integer createFrequencySeconds; + + @Override + public void run(String... args) { + logger.info("payTimeoutSeconds:" + payTimeoutSeconds); + logger.info("createFrequencySeconds:" + createFrequencySeconds); + } + } + +} diff --git a/lab-44/lab-44-nacos-config-demo/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/OrderProperties.java b/lab-44/lab-44-nacos-config-demo/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/OrderProperties.java new file mode 100644 index 000000000..764e8c567 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/OrderProperties.java @@ -0,0 +1,53 @@ +package cn.iocoder.springboot.lab44.nacosdemo; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +//@NacosConfigurationProperties(prefix = "order", dataId = "${nacos.config.data-id}", type = ConfigType.YAML) +@ConfigurationProperties(prefix = "order") +public class OrderProperties { + + /** + * 订单支付超时时长,单位:秒。 + */ + private Integer payTimeoutSeconds; + + /** + * 订单创建频率,单位:秒 + */ + private Integer createFrequencySeconds; + +// /** +// * 配置描述 +// */ +// private String desc; + + public Integer getPayTimeoutSeconds() { + return payTimeoutSeconds; + } + + public OrderProperties setPayTimeoutSeconds(Integer payTimeoutSeconds) { + this.payTimeoutSeconds = payTimeoutSeconds; + return this; + } + + public Integer getCreateFrequencySeconds() { + return createFrequencySeconds; + } + + public OrderProperties setCreateFrequencySeconds(Integer createFrequencySeconds) { + this.createFrequencySeconds = createFrequencySeconds; + return this; + } + +// public String getDesc() { +// return desc; +// } +// +// public OrderProperties setDesc(String desc) { +// this.desc = desc; +// return this; +// } + +} diff --git a/lab-44/lab-44-nacos-config-demo/src/main/resources/application.yaml b/lab-44/lab-44-nacos-config-demo/src/main/resources/application.yaml new file mode 100644 index 000000000..8a8e635e7 --- /dev/null +++ b/lab-44/lab-44-nacos-config-demo/src/main/resources/application.yaml @@ -0,0 +1,11 @@ +nacos: + # Nacos 配置中心的配置项,对应 NacosConfigProperties 配置类 + config: + server-addr: 127.0.0.1:18848 # Nacos 服务器地址 + bootstrap: + enable: true # 是否开启 Nacos 配置预加载功能。默认为 false。 + log-enable: true # 是否开启 Nacos 支持日志级别的加载时机。默认为 false。 + data-id: example # 使用的 Nacos 配置集的 dataId。 + type: YAML # 使用的 Nacos 配置集的配置格式。默认为 PROPERTIES。 + group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP。 + namespace: # 使用的 Nacos 的命名空间,默认为 null。 diff --git a/lab-44/lab-44-nacos-discovery-demo/pom.xml b/lab-44/lab-44-nacos-discovery-demo/pom.xml new file mode 100644 index 000000000..a56524a19 --- /dev/null +++ b/lab-44/lab-44-nacos-discovery-demo/pom.xml @@ -0,0 +1,30 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-44-nacos-discovery-demo + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.boot + nacos-discovery-spring-boot-starter + 0.2.4 + + + + diff --git a/lab-44/lab-44-nacos-discovery-demo/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java b/lab-44/lab-44-nacos-discovery-demo/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java new file mode 100644 index 000000000..0f9ee09af --- /dev/null +++ b/lab-44/lab-44-nacos-discovery-demo/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/Application.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab44.nacosdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/lab-44/lab-44-nacos-discovery-demo/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/ConsumerController.java b/lab-44/lab-44-nacos-discovery-demo/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/ConsumerController.java new file mode 100644 index 000000000..79dbdf910 --- /dev/null +++ b/lab-44/lab-44-nacos-discovery-demo/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/ConsumerController.java @@ -0,0 +1,40 @@ +package cn.iocoder.springboot.lab44.nacosdemo.controller; + +import com.alibaba.nacos.api.annotation.NacosInjected; +import com.alibaba.nacos.api.exception.NacosException; +import com.alibaba.nacos.api.naming.NamingService; +import com.alibaba.nacos.api.naming.pojo.Instance; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +import java.util.List; + +@RestController +@RequestMapping("/consumer") +public class ConsumerController { + + @NacosInjected + private NamingService namingService; + + private RestTemplate restTemplate = new RestTemplate(); + + @GetMapping("/demo") + public String consumer() throws IllegalStateException, NacosException { + // 获得实例 + Instance instance = null; + if (false) { + List instances = namingService.getAllInstances("demo-application"); + // 获得首个实例,进行调用 + instance = instances.stream().findFirst() + .orElseThrow(() -> new IllegalStateException("未找到对应的 Instance")); + } else { + instance = namingService.selectOneHealthyInstance("demo-application"); + } + // 执行请求 + return restTemplate.getForObject("http://" + instance.toInetAddr() + "/provider/demo", + String.class); + } + +} diff --git a/lab-44/lab-44-nacos-discovery-demo/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/ProviderController.java b/lab-44/lab-44-nacos-discovery-demo/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/ProviderController.java new file mode 100644 index 000000000..448965f91 --- /dev/null +++ b/lab-44/lab-44-nacos-discovery-demo/src/main/java/cn/iocoder/springboot/lab44/nacosdemo/controller/ProviderController.java @@ -0,0 +1,16 @@ +package cn.iocoder.springboot.lab44.nacosdemo.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/provider") +public class ProviderController { + + @GetMapping("/demo") + public String provider() { + return "echo"; + } + +} diff --git a/lab-44/lab-44-nacos-discovery-demo/src/main/resources/application.yaml b/lab-44/lab-44-nacos-discovery-demo/src/main/resources/application.yaml new file mode 100644 index 000000000..bfc37bc4f --- /dev/null +++ b/lab-44/lab-44-nacos-discovery-demo/src/main/resources/application.yaml @@ -0,0 +1,14 @@ +spring: + application: + name: demo-application # 应用名 + +nacos: + # Nacos 配置中心的配置项,对应 NacosDiscoveryProperties 配置类 + discovery: + server-addr: 127.0.0.1:18848 # Nacos 服务器地址 + auto-register: true # 是否自动注册到 Nacos 中。默认为 false。 + namespace: # 使用的 Nacos 的命名空间,默认为 null。 + register: + service-name: ${spring.application.name} # 注册到 Nacos 的服务名 + group-name: DEFAULT_GROUP # 使用的 Nacos 服务分组,默认为 DEFAULT_GROUP。 + cluster-name: # 集群名,默认为空。 diff --git a/lab-44/pom.xml b/lab-44/pom.xml new file mode 100644 index 000000000..10aa66700 --- /dev/null +++ b/lab-44/pom.xml @@ -0,0 +1,25 @@ + + + + labs-parent + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + lab-44 + pom + + lab-44-nacos-config-demo + lab-44-nacos-config-demo-profiles + lab-44-nacos-config-demo-auto-refresh + lab-44-nacos-config-demo-jasypt + lab-44-nacos-config-demo-actuator + lab-44-nacos-config-demo-multi + lab-44-nacos-discovery-demo + + + + diff --git a/lab-45/lab-45-apollo-demo-auto-refresh/pom.xml b/lab-45/lab-45-apollo-demo-auto-refresh/pom.xml new file mode 100644 index 000000000..150bad5e6 --- /dev/null +++ b/lab-45/lab-45-apollo-demo-auto-refresh/pom.xml @@ -0,0 +1,30 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-45-apollo-demo-auto-refresh + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.ctrip.framework.apollo + apollo-client + 1.5.1 + + + + diff --git a/lab-45/lab-45-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab45/apollodemo/Application.java b/lab-45/lab-45-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab45/apollodemo/Application.java new file mode 100644 index 000000000..b3bdae21e --- /dev/null +++ b/lab-45/lab-45-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab45/apollodemo/Application.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab45.apollodemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/lab-45/lab-45-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab45/apollodemo/controller/DemoController.java b/lab-45/lab-45-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab45/apollodemo/controller/DemoController.java new file mode 100644 index 000000000..333314aaa --- /dev/null +++ b/lab-45/lab-45-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab45/apollodemo/controller/DemoController.java @@ -0,0 +1,39 @@ +package cn.iocoder.springboot.lab45.apollodemo.controller; + +import cn.iocoder.springboot.lab45.apollodemo.properties.TestProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Value("${test.test}") + private String test; + + @GetMapping("/test") + public String test() { + return test; + } + + @Autowired + private TestProperties testProperties; + + @GetMapping("/test_properties") + public TestProperties testProperties() { + return testProperties; + } + + private Logger logger = LoggerFactory.getLogger(getClass()); + + @GetMapping("/logger") + public void logger() { + logger.debug("[logger][测试一下]"); + } + +} diff --git a/lab-45/lab-45-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab45/apollodemo/listener/LoggingSystemConfigListener.java b/lab-45/lab-45-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab45/apollodemo/listener/LoggingSystemConfigListener.java new file mode 100644 index 000000000..e68808d61 --- /dev/null +++ b/lab-45/lab-45-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab45/apollodemo/listener/LoggingSystemConfigListener.java @@ -0,0 +1,45 @@ +package cn.iocoder.springboot.lab45.apollodemo.listener; + +import com.ctrip.framework.apollo.Config; +import com.ctrip.framework.apollo.model.ConfigChangeEvent; +import com.ctrip.framework.apollo.spring.annotation.ApolloConfig; +import com.ctrip.framework.apollo.spring.annotation.ApolloConfigChangeListener; +import org.springframework.boot.logging.LogLevel; +import org.springframework.boot.logging.LoggingSystem; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.util.Set; + +@Component +public class LoggingSystemConfigListener { + + /** + * 日志配置项的前缀 + */ + private static final String LOGGER_TAG = "logging.level."; + + @Resource + private LoggingSystem loggingSystem; + + @ApolloConfig + private Config config; + + @ApolloConfigChangeListener + public void onChange(ConfigChangeEvent changeEvent) throws Exception { + // 获得 Apollo 所有配置项 + Set keys = config.getPropertyNames(); + // 遍历配置集的每个配置项,判断是否是 logging.level 配置项 + for (String key : keys) { + // 如果是 logging.level 配置项,则设置其对应的日志级别 + if (key.startsWith(LOGGER_TAG)) { + // 获得日志级别 + String strLevel = config.getProperty(key, "info"); + LogLevel level = LogLevel.valueOf(strLevel.toUpperCase()); + // 设置日志级别到 LoggingSystem 中 + loggingSystem.setLogLevel(key.replace(LOGGER_TAG, ""), level); + } + } + } + +} diff --git a/lab-45/lab-45-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab45/apollodemo/properties/TestProperties.java b/lab-45/lab-45-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab45/apollodemo/properties/TestProperties.java new file mode 100644 index 000000000..6cb5be18f --- /dev/null +++ b/lab-45/lab-45-apollo-demo-auto-refresh/src/main/java/cn/iocoder/springboot/lab45/apollodemo/properties/TestProperties.java @@ -0,0 +1,24 @@ +package cn.iocoder.springboot.lab45.apollodemo.properties; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +@ConfigurationProperties(prefix = "test") +public class TestProperties { + + /** + * 测试属性 + */ + private String test; + + public String getTest() { + return test; + } + + public TestProperties setTest(String test) { + this.test = test; + return this; + } + +} diff --git a/lab-45/lab-45-apollo-demo-auto-refresh/src/main/resources/application.yaml b/lab-45/lab-45-apollo-demo-auto-refresh/src/main/resources/application.yaml new file mode 100644 index 000000000..27c26fd50 --- /dev/null +++ b/lab-45/lab-45-apollo-demo-auto-refresh/src/main/resources/application.yaml @@ -0,0 +1,13 @@ +server: + port: 7070 # 避免和本地的 Apollo Portal 端口冲突 + +app: + id: demo-application # 使用的 Apollo 的项目(应用)编号 +apollo: + meta: http://127.0.0.1:8080 # Apollo Meta Server 地址 + bootstrap: + enabled: true # 是否开启 Apollo 配置预加载功能。默认为 false。 + eagerLoad: + enable: true # 是否开启 Apollo 支持日志级别的加载时机。默认为 false。 + namespaces: application # 使用的 Apollo 的命名空间,默认为 application。 + diff --git a/lab-45/lab-45-apollo-demo-jasypt/pom.xml b/lab-45/lab-45-apollo-demo-jasypt/pom.xml new file mode 100644 index 000000000..72e6e6d7d --- /dev/null +++ b/lab-45/lab-45-apollo-demo-jasypt/pom.xml @@ -0,0 +1,46 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-45-apollo-demo-jasypt + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.ctrip.framework.apollo + apollo-client + 1.5.1 + + + + + com.github.ulisesbocchio + jasypt-spring-boot-starter + 3.0.2 + + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + diff --git a/lab-45/lab-45-apollo-demo-jasypt/src/main/java/cn/iocoder/springboot/lab45/apollodemo/Application.java b/lab-45/lab-45-apollo-demo-jasypt/src/main/java/cn/iocoder/springboot/lab45/apollodemo/Application.java new file mode 100644 index 000000000..b3bdae21e --- /dev/null +++ b/lab-45/lab-45-apollo-demo-jasypt/src/main/java/cn/iocoder/springboot/lab45/apollodemo/Application.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab45.apollodemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/lab-45/lab-45-apollo-demo-jasypt/src/main/java/cn/iocoder/springboot/lab45/apollodemo/controller/DemoController.java b/lab-45/lab-45-apollo-demo-jasypt/src/main/java/cn/iocoder/springboot/lab45/apollodemo/controller/DemoController.java new file mode 100644 index 000000000..2b12088d9 --- /dev/null +++ b/lab-45/lab-45-apollo-demo-jasypt/src/main/java/cn/iocoder/springboot/lab45/apollodemo/controller/DemoController.java @@ -0,0 +1,20 @@ +package cn.iocoder.springboot.lab45.apollodemo.controller; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Value("${spring.application.name}") + private String applicationName; + + @GetMapping("/test") + public String test() { + return applicationName; + } + +} diff --git a/lab-45/lab-45-apollo-demo-jasypt/src/main/resources/application.yaml b/lab-45/lab-45-apollo-demo-jasypt/src/main/resources/application.yaml new file mode 100644 index 000000000..32e595322 --- /dev/null +++ b/lab-45/lab-45-apollo-demo-jasypt/src/main/resources/application.yaml @@ -0,0 +1,12 @@ +server: + port: 7070 # 避免和本地的 Apollo Portal 端口冲突 + +app: + id: demo-application-jasypt # 使用的 Apollo 的项目(应用)编号 +apollo: + meta: http://127.0.0.1:8080 # Apollo Meta Server 地址 + bootstrap: + enabled: true # 是否开启 Apollo 配置预加载功能。默认为 false。 + eagerLoad: + enable: true # 是否开启 Apollo 支持日志级别的加载时机。默认为 false。 + namespaces: application # 使用的 Apollo 的命名空间,默认为 application。 diff --git a/lab-45/lab-45-apollo-demo-jasypt/src/test/java/cn/iocoder/springboot/lab45/apollodemo/JasyptTest.java b/lab-45/lab-45-apollo-demo-jasypt/src/test/java/cn/iocoder/springboot/lab45/apollodemo/JasyptTest.java new file mode 100644 index 000000000..07ece817d --- /dev/null +++ b/lab-45/lab-45-apollo-demo-jasypt/src/test/java/cn/iocoder/springboot/lab45/apollodemo/JasyptTest.java @@ -0,0 +1,40 @@ +package cn.iocoder.springboot.lab45.apollodemo; + +import org.jasypt.encryption.StringEncryptor; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest +public class JasyptTest { + + @Autowired + private StringEncryptor encryptor; + + @Test + public void encode() { + // 第一个加密 + String applicationName = "demo-application"; + System.out.println(encryptor.encrypt(applicationName)); + +// // 第二个加密 +// applicationName = "demo-app"; +// System.out.println(encryptor.encrypt(applicationName)); + } + + @Value("${spring.application.name}") + private String applicationName; + + @Test + public void print() { + System.out.println(applicationName); + } + + @Value("${jasypt.encryptor.password}") + private String password; + +} diff --git a/lab-45/lab-45-apollo-demo-multi/pom.xml b/lab-45/lab-45-apollo-demo-multi/pom.xml new file mode 100644 index 000000000..961bb20fd --- /dev/null +++ b/lab-45/lab-45-apollo-demo-multi/pom.xml @@ -0,0 +1,30 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-45-apollo-demo-multi + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.ctrip.framework.apollo + apollo-client + 1.5.1 + + + + diff --git a/lab-45/lab-45-apollo-demo-multi/src/main/java/cn/iocoder/springboot/lab45/apollodemo/Application.java b/lab-45/lab-45-apollo-demo-multi/src/main/java/cn/iocoder/springboot/lab45/apollodemo/Application.java new file mode 100644 index 000000000..6b34fa9e8 --- /dev/null +++ b/lab-45/lab-45-apollo-demo-multi/src/main/java/cn/iocoder/springboot/lab45/apollodemo/Application.java @@ -0,0 +1,20 @@ +package cn.iocoder.springboot.lab45.apollodemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.env.Environment; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + // 启动 Spring Boot 应用 + ConfigurableApplicationContext context = SpringApplication.run(Application.class, args); + + // 查看 Environment + Environment environment = context.getEnvironment(); + System.out.println(environment); + } + +} diff --git a/lab-45/lab-45-apollo-demo-multi/src/main/java/cn/iocoder/springboot/lab45/apollodemo/controller/DemoController.java b/lab-45/lab-45-apollo-demo-multi/src/main/java/cn/iocoder/springboot/lab45/apollodemo/controller/DemoController.java new file mode 100644 index 000000000..73bbbe132 --- /dev/null +++ b/lab-45/lab-45-apollo-demo-multi/src/main/java/cn/iocoder/springboot/lab45/apollodemo/controller/DemoController.java @@ -0,0 +1,21 @@ +package cn.iocoder.springboot.lab45.apollodemo.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @Autowired + private Environment environment; + + @GetMapping("/test") + public void test() { + System.out.println(environment); + } + +} diff --git a/lab-45/lab-45-apollo-demo-multi/src/main/resources/application.yaml b/lab-45/lab-45-apollo-demo-multi/src/main/resources/application.yaml new file mode 100644 index 000000000..cd26fa071 --- /dev/null +++ b/lab-45/lab-45-apollo-demo-multi/src/main/resources/application.yaml @@ -0,0 +1,12 @@ +server: + port: 7070 # 避免和本地的 Apollo Portal 端口冲突 + +app: + id: demo-application-multi # 使用的 Apollo 的项目(应用)编号 +apollo: + meta: http://127.0.0.1:8080 # Apollo Meta Server 地址 + bootstrap: + enabled: true # 是否开启 Apollo 配置预加载功能。默认为 false。 + eagerLoad: + enable: true # 是否开启 Apollo 支持日志级别的加载时机。默认为 false。 + namespaces: application, db # 使用的 Apollo 的命名空间,默认为 application。 diff --git a/lab-45/lab-45-apollo-demo-profiles/pom.xml b/lab-45/lab-45-apollo-demo-profiles/pom.xml new file mode 100644 index 000000000..46caf772b --- /dev/null +++ b/lab-45/lab-45-apollo-demo-profiles/pom.xml @@ -0,0 +1,31 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-45-apollo-demo-profiles + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.ctrip.framework.apollo + apollo-client + 1.5.1 + + + + diff --git a/lab-45/lab-45-apollo-demo-profiles/src/main/java/cn/iocoder/springboot/lab45/apollodemo/ProfilesApplication.java b/lab-45/lab-45-apollo-demo-profiles/src/main/java/cn/iocoder/springboot/lab45/apollodemo/ProfilesApplication.java new file mode 100644 index 000000000..56fd72b00 --- /dev/null +++ b/lab-45/lab-45-apollo-demo-profiles/src/main/java/cn/iocoder/springboot/lab45/apollodemo/ProfilesApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab45.apollodemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ProfilesApplication { + + public static void main(String[] args) { + SpringApplication.run(ProfilesApplication.class, args); + } + +} diff --git a/lab-45/lab-45-apollo-demo-profiles/src/main/resources/application-dev.yaml b/lab-45/lab-45-apollo-demo-profiles/src/main/resources/application-dev.yaml new file mode 100644 index 000000000..1cd635811 --- /dev/null +++ b/lab-45/lab-45-apollo-demo-profiles/src/main/resources/application-dev.yaml @@ -0,0 +1,9 @@ +app: + id: demo-application-profiles # 使用的 Apollo 的项目(应用)编号 +apollo: + meta: http://127.0.0.1:8080 # Apollo Meta Server 地址 + bootstrap: + enabled: true # 是否开启 Apollo 配置预加载功能。默认为 false。 + eagerLoad: + enable: true # 是否开启 Apollo 支持日志级别的加载时机。默认为 false。 + namespaces: application # 使用的 Apollo 的命名空间,默认为 application。 diff --git a/lab-45/lab-45-apollo-demo-profiles/src/main/resources/application-prod.yaml b/lab-45/lab-45-apollo-demo-profiles/src/main/resources/application-prod.yaml new file mode 100644 index 000000000..b017e5aa1 --- /dev/null +++ b/lab-45/lab-45-apollo-demo-profiles/src/main/resources/application-prod.yaml @@ -0,0 +1,9 @@ +app: + id: demo-application-profiles # 使用的 Apollo 的项目(应用)编号 +apollo: + meta: http://127.0.0.1:18080 # Apollo Meta Server 地址 + bootstrap: + enabled: true # 是否开启 Apollo 配置预加载功能。默认为 false。 + eagerLoad: + enable: true # 是否开启 Apollo 支持日志级别的加载时机。默认为 false。 + namespaces: application # 使用的 Apollo 的命名空间,默认为 application。 diff --git a/lab-45/lab-45-apollo-demo-profiles/src/main/resources/application.yaml b/lab-45/lab-45-apollo-demo-profiles/src/main/resources/application.yaml new file mode 100644 index 000000000..001e788a5 --- /dev/null +++ b/lab-45/lab-45-apollo-demo-profiles/src/main/resources/application.yaml @@ -0,0 +1,6 @@ +#server: +# port: 7070 + +spring: + application: + name: demo-application diff --git a/lab-45/lab-45-apollo-demo/pom.xml b/lab-45/lab-45-apollo-demo/pom.xml new file mode 100644 index 000000000..78d364c68 --- /dev/null +++ b/lab-45/lab-45-apollo-demo/pom.xml @@ -0,0 +1,31 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-45-apollo-demo + + + + + + org.springframework.boot + spring-boot-starter + + + + + com.ctrip.framework.apollo + apollo-client + 1.5.1 + + + + diff --git a/lab-45/lab-45-apollo-demo/src/main/java/cn/iocoder/springboot/lab45/apollodemo/Application.java b/lab-45/lab-45-apollo-demo/src/main/java/cn/iocoder/springboot/lab45/apollodemo/Application.java new file mode 100644 index 000000000..fa8dfbfb5 --- /dev/null +++ b/lab-45/lab-45-apollo-demo/src/main/java/cn/iocoder/springboot/lab45/apollodemo/Application.java @@ -0,0 +1,54 @@ +package cn.iocoder.springboot.lab45.apollodemo; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.stereotype.Component; + +@SpringBootApplication +// @NacosPropertySource(dataId = "example", type = ConfigType.YAML) +public class Application { + + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + + @Component + public class OrderPropertiesCommandLineRunner implements CommandLineRunner { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Autowired + private OrderProperties orderProperties; + + @Override + public void run(String... args) { + logger.info("payTimeoutSeconds:" + orderProperties.getPayTimeoutSeconds()); + logger.info("createFrequencySeconds:" + orderProperties.getCreateFrequencySeconds()); + } + + } + + @Component + public class ValueCommandLineRunner implements CommandLineRunner { + + private final Logger logger = LoggerFactory.getLogger(getClass()); + + @Value(value = "${order.pay-timeout-seconds}") + private Integer payTimeoutSeconds; + + @Value(value = "${order.create-frequency-seconds}") + private Integer createFrequencySeconds; + + @Override + public void run(String... args) { + logger.info("payTimeoutSeconds:" + payTimeoutSeconds); + logger.info("createFrequencySeconds:" + createFrequencySeconds); + } + } + +} diff --git a/lab-45/lab-45-apollo-demo/src/main/java/cn/iocoder/springboot/lab45/apollodemo/OrderProperties.java b/lab-45/lab-45-apollo-demo/src/main/java/cn/iocoder/springboot/lab45/apollodemo/OrderProperties.java new file mode 100644 index 000000000..e550573cc --- /dev/null +++ b/lab-45/lab-45-apollo-demo/src/main/java/cn/iocoder/springboot/lab45/apollodemo/OrderProperties.java @@ -0,0 +1,53 @@ +package cn.iocoder.springboot.lab45.apollodemo; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Component +//@NacosConfigurationProperties(prefix = "order", dataId = "${nacos.config.data-id}", type = ConfigType.YAML) +@ConfigurationProperties(prefix = "order") +public class OrderProperties { + + /** + * 订单支付超时时长,单位:秒。 + */ + private Integer payTimeoutSeconds; + + /** + * 订单创建频率,单位:秒 + */ + private Integer createFrequencySeconds; + +// /** +// * 配置描述 +// */ +// private String desc; + + public Integer getPayTimeoutSeconds() { + return payTimeoutSeconds; + } + + public OrderProperties setPayTimeoutSeconds(Integer payTimeoutSeconds) { + this.payTimeoutSeconds = payTimeoutSeconds; + return this; + } + + public Integer getCreateFrequencySeconds() { + return createFrequencySeconds; + } + + public OrderProperties setCreateFrequencySeconds(Integer createFrequencySeconds) { + this.createFrequencySeconds = createFrequencySeconds; + return this; + } + +// public String getDesc() { +// return desc; +// } +// +// public OrderProperties setDesc(String desc) { +// this.desc = desc; +// return this; +// } + +} diff --git a/lab-45/lab-45-apollo-demo/src/main/resources/application.yaml b/lab-45/lab-45-apollo-demo/src/main/resources/application.yaml new file mode 100644 index 000000000..ee0075796 --- /dev/null +++ b/lab-45/lab-45-apollo-demo/src/main/resources/application.yaml @@ -0,0 +1,9 @@ +app: + id: demo-application # 使用的 Apollo 的项目(应用)编号 +apollo: + meta: http://127.0.0.1:8080 # Apollo Meta Server 地址 + bootstrap: + enabled: true # 是否开启 Apollo 配置预加载功能。默认为 false。 + eagerLoad: + enable: true # 是否开启 Apollo 支持日志级别的加载时机。默认为 false。 + namespaces: application # 使用的 Apollo 的命名空间,默认为 application。 diff --git a/lab-45/pom.xml b/lab-45/pom.xml new file mode 100644 index 000000000..291eac8b6 --- /dev/null +++ b/lab-45/pom.xml @@ -0,0 +1,23 @@ + + + + labs-parent + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + lab-45 + pom + + lab-45-apollo-demo + lab-45-apollo-demo-profiles + lab-45-apollo-demo-auto-refresh + lab-45-apollo-demo-jasypt + lab-45-apollo-demo-multi + + + + diff --git a/lab-46/lab-46-sentinel-demo-apollo/pom.xml b/lab-46/lab-46-sentinel-demo-apollo/pom.xml new file mode 100644 index 000000000..d44a37a7d --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-apollo/pom.xml @@ -0,0 +1,61 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-46-sentinel-demo-apollo + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.csp + sentinel-core + 1.7.1 + + + + com.alibaba.csp + sentinel-transport-simple-http + 1.7.1 + + + + com.alibaba.csp + sentinel-spring-webmvc-adapter + 1.7.1 + + + + com.alibaba.csp + sentinel-parameter-flow-control + 1.7.1 + + + + com.alibaba.csp + sentinel-annotation-aspectj + 1.7.1 + + + + com.alibaba.csp + sentinel-datasource-apollo + 1.7.1 + + + + diff --git a/lab-46/lab-46-sentinel-demo-apollo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/Application.java b/lab-46/lab-46-sentinel-demo-apollo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/Application.java new file mode 100644 index 000000000..de707eb1f --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-apollo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/Application.java @@ -0,0 +1,17 @@ +package cn.iocoder.springboot.lab46.sentineldemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + // 设置系统属性 project.name,提供给 Sentinel 读取 + System.setProperty("project.name", "demo-application"); + + // 启动 Spring Boot 应用 + SpringApplication.run(Application.class, args); + } + +} diff --git a/lab-46/lab-46-sentinel-demo-apollo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SentinelConfiguration.java b/lab-46/lab-46-sentinel-demo-apollo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SentinelConfiguration.java new file mode 100644 index 000000000..8a22c930b --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-apollo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SentinelConfiguration.java @@ -0,0 +1,56 @@ +package cn.iocoder.springboot.lab46.sentineldemo.config; + +import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect; +import com.alibaba.csp.sentinel.datasource.Converter; +import com.alibaba.csp.sentinel.datasource.apollo.ApolloDataSource; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Arrays; +import java.util.List; + +@Configuration +public class SentinelConfiguration { + + @Value("${spring.application.name}") + private String applicationName; + + @Bean + public SentinelResourceAspect sentinelResourceAspect() { + return new SentinelResourceAspect(); + } + + @Bean + public ApolloDataSource apolloDataSource(ObjectMapper objectMapper) { + // Apollo 配置。这里先写死,推荐后面写到 application.yaml 配置文件中。 + String appId = applicationName; // Apollo 项目编号。一般情况下,推荐和 spring.application.name 保持一致 + String serverAddress = "http://localhost:8080"; // Apollo Meta 服务器地址 + String namespace = "application"; // Apollo 命名空间 + String flowRuleKey = "sentinel.flow-rule"; // Apollo 配置项的 KEY + + // 创建 ApolloDataSource 对象 + System.setProperty("app.id", appId); + System.setProperty("apollo.meta", serverAddress); + ApolloDataSource> apolloDataSource = new ApolloDataSource<>(namespace, flowRuleKey, "", + new Converter>() { // 转换器,将读取的 Apollo 配置,转换成 FlowRule 数组 + @Override + public List convert(String value) { + try { + return Arrays.asList(objectMapper.readValue(value, FlowRule[].class)); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + }); + + // 注册到 FlowRuleManager 中 + FlowRuleManager.register2Property(apolloDataSource.getProperty()); + return apolloDataSource; + } + +} diff --git a/lab-46/lab-46-sentinel-demo-apollo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SpringMvcConfiguration.java b/lab-46/lab-46-sentinel-demo-apollo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SpringMvcConfiguration.java new file mode 100644 index 000000000..c6d06427e --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-apollo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SpringMvcConfiguration.java @@ -0,0 +1,53 @@ +package cn.iocoder.springboot.lab46.sentineldemo.config; + +import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebInterceptor; +import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebTotalInterceptor; +import com.alibaba.csp.sentinel.adapter.spring.webmvc.config.SentinelWebMvcConfig; +import com.alibaba.csp.sentinel.adapter.spring.webmvc.config.SentinelWebMvcTotalConfig; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class SpringMvcConfiguration implements WebMvcConfigurer { + + @Override + public void addInterceptors(InterceptorRegistry registry) { + // Add Sentinel interceptor +// addSentinelWebTotalInterceptor(registry); + addSentinelWebInterceptor(registry); + } + + private void addSentinelWebInterceptor(InterceptorRegistry registry) { + // 创建 SentinelWebMvcConfig 对象 + SentinelWebMvcConfig config = new SentinelWebMvcConfig(); + config.setHttpMethodSpecify(true); // 是否包含请求方法。即基于 URL 创建的资源,是否包含 Method。 + // config.setBlockExceptionHandler(new DefaultBlockExceptionHandler()); // 设置 BlockException 处理器。 +// config.setOriginParser(new RequestOriginParser() { // 设置请求来源解析器。用于黑白名单控制功能。 +// +// @Override +// public String parseOrigin(HttpServletRequest request) { +// // 从 Header 中,获得请求来源 +// String origin = request.getHeader("s-user"); +// // 如果为空,给一个默认的 +// if (StringUtils.isEmpty(origin)) { +// origin = "default"; +// } +// return origin; +// } +// +// }); + + // 添加 SentinelWebInterceptor 拦截器 + registry.addInterceptor(new SentinelWebInterceptor(config)).addPathPatterns("/**"); + } + + private void addSentinelWebTotalInterceptor(InterceptorRegistry registry) { + // 创建 SentinelWebMvcTotalConfig 对象 + SentinelWebMvcTotalConfig config = new SentinelWebMvcTotalConfig(); + + // 添加 SentinelWebTotalInterceptor 拦截器 + registry.addInterceptor(new SentinelWebTotalInterceptor(config)).addPathPatterns("/**"); + } + +} diff --git a/lab-46/lab-46-sentinel-demo-apollo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/controller/DemoController.java b/lab-46/lab-46-sentinel-demo-apollo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/controller/DemoController.java new file mode 100644 index 000000000..950b09160 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-apollo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/controller/DemoController.java @@ -0,0 +1,82 @@ +package cn.iocoder.springboot.lab46.sentineldemo.controller; + +import com.alibaba.csp.sentinel.Entry; +import com.alibaba.csp.sentinel.SphU; +import com.alibaba.csp.sentinel.annotation.SentinelResource; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @GetMapping("/echo") + public String echo() { + return "echo"; + } + + @GetMapping("/test") + public String test() { + return "test"; + } + + @GetMapping("/sleep") + public String sleep() throws InterruptedException { + Thread.sleep(100L); + return "sleep"; + } + + // 测试热点参数限流 + @GetMapping("/product_info") + @SentinelResource("demo_product_info_hot") + public String productInfo(Integer id) { + return "商品编号:" + id; + } + + // 手动使用 Sentinel 客户端 API + @GetMapping("/entry_demo") + public String entryDemo() { + Entry entry = null; + try { + // 访问资源 + entry = SphU.entry("entry_demo"); + + // ... 执行业务逻辑 + + return "执行成功"; + } catch (BlockException ex) { + return "被拒绝"; + } finally { + // 释放资源 + if (entry != null) { + entry.exit(); + } + } + } + + // 测试 @SentinelResource 注解 + @GetMapping("/annotations_demo") + @SentinelResource(value = "annotations_demo_resource", + blockHandler = "blockHandler", + fallback = "fallback") + public String annotationsDemo(@RequestParam(required = false) Integer id) throws InterruptedException { + if (id == null) { + throw new IllegalArgumentException("id 参数不允许为空"); + } + return "success..."; + } + + // BlockHandler 处理函数,参数最后多一个 BlockException,其余与原函数一致. + public String blockHandler(Integer id, BlockException ex) { + return "block:" + ex.getClass().getSimpleName(); + } + + // Fallback 处理函数,函数签名与原函数一致或加一个 Throwable 类型的参数. + public String fallback(Integer id, Throwable throwable) { + return "fallback:" + throwable.getMessage(); + } + +} diff --git a/lab-46/lab-46-sentinel-demo-apollo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/web/GlobalExceptionHandler.java b/lab-46/lab-46-sentinel-demo-apollo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/web/GlobalExceptionHandler.java new file mode 100644 index 000000000..217590255 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-apollo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/web/GlobalExceptionHandler.java @@ -0,0 +1,17 @@ +package cn.iocoder.springboot.lab46.sentineldemo.web; + +import com.alibaba.csp.sentinel.slots.block.BlockException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +@ControllerAdvice(basePackages = "cn.iocoder.springboot.lab46.sentineldemo.controller") +public class GlobalExceptionHandler { + + @ResponseBody + @ExceptionHandler(value = BlockException.class) + public String blockExceptionHandler(BlockException blockException) { + return "请求过于频繁"; + } + +} diff --git a/lab-46/lab-46-sentinel-demo-apollo/src/main/resources/application.yaml b/lab-46/lab-46-sentinel-demo-apollo/src/main/resources/application.yaml new file mode 100644 index 000000000..c33c2c660 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-apollo/src/main/resources/application.yaml @@ -0,0 +1,6 @@ +spring: + application: + name: demo-application + +server: + port: 18080 # 避免和 Apollo 使用到的 8080 端口冲突 diff --git a/lab-46/lab-46-sentinel-demo-apollo/src/main/resources/sentinel.properties b/lab-46/lab-46-sentinel-demo-apollo/src/main/resources/sentinel.properties new file mode 100644 index 000000000..be3ba2284 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-apollo/src/main/resources/sentinel.properties @@ -0,0 +1 @@ +csp.sentinel.dashboard.server=127.0.0.1:7070 diff --git a/lab-46/lab-46-sentinel-demo-file/pom.xml b/lab-46/lab-46-sentinel-demo-file/pom.xml new file mode 100644 index 000000000..c797ce2c0 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-file/pom.xml @@ -0,0 +1,60 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-46-sentinel-demo-file + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.csp + sentinel-core + 1.7.1 + + + + com.alibaba.csp + sentinel-transport-simple-http + 1.7.1 + + + + com.alibaba.csp + sentinel-spring-webmvc-adapter + 1.7.1 + + + + com.alibaba.csp + sentinel-parameter-flow-control + 1.7.1 + + + + com.alibaba.csp + sentinel-annotation-aspectj + 1.7.1 + + + + com.alibaba.csp + sentinel-datasource-extension + 1.7.1 + + + + diff --git a/lab-46/lab-46-sentinel-demo-file/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/Application.java b/lab-46/lab-46-sentinel-demo-file/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/Application.java new file mode 100644 index 000000000..de707eb1f --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-file/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/Application.java @@ -0,0 +1,17 @@ +package cn.iocoder.springboot.lab46.sentineldemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + // 设置系统属性 project.name,提供给 Sentinel 读取 + System.setProperty("project.name", "demo-application"); + + // 启动 Spring Boot 应用 + SpringApplication.run(Application.class, args); + } + +} diff --git a/lab-46/lab-46-sentinel-demo-file/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SentinelConfiguration.java b/lab-46/lab-46-sentinel-demo-file/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SentinelConfiguration.java new file mode 100644 index 000000000..7fabd27a7 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-file/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SentinelConfiguration.java @@ -0,0 +1,111 @@ +package cn.iocoder.springboot.lab46.sentineldemo.config; + +import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect; +import com.alibaba.csp.sentinel.datasource.Converter; +import com.alibaba.csp.sentinel.datasource.FileRefreshableDataSource; +import com.alibaba.csp.sentinel.datasource.FileWritableDataSource; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; +import com.alibaba.csp.sentinel.transport.util.WritableDataSourceRegistry; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; + +import java.io.File; +import java.io.IOException; +import java.util.Arrays; +import java.util.List; + +@Configuration +public class SentinelConfiguration { + + @Bean + public SentinelResourceAspect sentinelResourceAspect() { + return new SentinelResourceAspect(); + } + +// @Bean + public FileRefreshableDataSource> refreshableDataSource(ObjectMapper objectMapper) throws IOException { + // File 配置。这里先写死,推荐后面写到 application.yaml 配置文件中。 + ClassPathResource resource = new ClassPathResource("/flow-rule.json"); + + // 创建 FileRefreshableDataSource 对象 + FileRefreshableDataSource> refreshableDataSource = new FileRefreshableDataSource<>(resource.getFile(), + new Converter>() { // 转换器,将读取的文本配置,转换成 FlowRule 数组 + @Override + public List convert(String value) { + try { + return Arrays.asList(objectMapper.readValue(value, FlowRule[].class)); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + }); + + // 注册到 FlowRuleManager 中 + FlowRuleManager.register2Property(refreshableDataSource.getProperty()); + return refreshableDataSource; + } + + @Bean + public FileWritableDataSource writableDataSource(ObjectMapper objectMapper) throws IOException { + // File 配置。这里先写死,推荐后面写到 application.yaml 配置文件中。 + String directory = System.getProperty("user.home") + File.separator + + "sentinel" + File.separator + + System.getProperty("project.name"); + mkdirs(directory); + String path = directory + File.separator + "flow-rule.json"; + creteFile(path); + + // 创建 FileRefreshableDataSource 对象 + FileRefreshableDataSource> refreshableDataSource = new FileRefreshableDataSource<>(path, + new Converter>() { // 转换器,将读取的文本配置,转换成 FlowRule 数组 + @Override + public List convert(String value) { + try { + return Arrays.asList(objectMapper.readValue(value, FlowRule[].class)); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + }); + // 注册到 FlowRuleManager 中 + FlowRuleManager.register2Property(refreshableDataSource.getProperty()); + + // 创建 FileWritableDataSource 对象 + FileWritableDataSource> fileWritableDataSource = new FileWritableDataSource<>(path, + new Converter, String>() { + @Override + public String convert(List source) { + try { + return objectMapper.writeValueAsString(source); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + }); + + // 注册到 WritableDataSourceRegistry 中 + WritableDataSourceRegistry.registerFlowDataSource(fileWritableDataSource); + return fileWritableDataSource; + } + + private void mkdirs(String path) { + File file = new File(path); + if (file.exists()) { + return; + } + file.mkdirs(); + } + + private void creteFile(String path) throws IOException { + File file = new File(path); + if (file.exists()) { + return; + } + file.createNewFile(); + } + +} diff --git a/lab-46/lab-46-sentinel-demo-file/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SpringMvcConfiguration.java b/lab-46/lab-46-sentinel-demo-file/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SpringMvcConfiguration.java new file mode 100644 index 000000000..c6d06427e --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-file/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SpringMvcConfiguration.java @@ -0,0 +1,53 @@ +package cn.iocoder.springboot.lab46.sentineldemo.config; + +import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebInterceptor; +import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebTotalInterceptor; +import com.alibaba.csp.sentinel.adapter.spring.webmvc.config.SentinelWebMvcConfig; +import com.alibaba.csp.sentinel.adapter.spring.webmvc.config.SentinelWebMvcTotalConfig; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class SpringMvcConfiguration implements WebMvcConfigurer { + + @Override + public void addInterceptors(InterceptorRegistry registry) { + // Add Sentinel interceptor +// addSentinelWebTotalInterceptor(registry); + addSentinelWebInterceptor(registry); + } + + private void addSentinelWebInterceptor(InterceptorRegistry registry) { + // 创建 SentinelWebMvcConfig 对象 + SentinelWebMvcConfig config = new SentinelWebMvcConfig(); + config.setHttpMethodSpecify(true); // 是否包含请求方法。即基于 URL 创建的资源,是否包含 Method。 + // config.setBlockExceptionHandler(new DefaultBlockExceptionHandler()); // 设置 BlockException 处理器。 +// config.setOriginParser(new RequestOriginParser() { // 设置请求来源解析器。用于黑白名单控制功能。 +// +// @Override +// public String parseOrigin(HttpServletRequest request) { +// // 从 Header 中,获得请求来源 +// String origin = request.getHeader("s-user"); +// // 如果为空,给一个默认的 +// if (StringUtils.isEmpty(origin)) { +// origin = "default"; +// } +// return origin; +// } +// +// }); + + // 添加 SentinelWebInterceptor 拦截器 + registry.addInterceptor(new SentinelWebInterceptor(config)).addPathPatterns("/**"); + } + + private void addSentinelWebTotalInterceptor(InterceptorRegistry registry) { + // 创建 SentinelWebMvcTotalConfig 对象 + SentinelWebMvcTotalConfig config = new SentinelWebMvcTotalConfig(); + + // 添加 SentinelWebTotalInterceptor 拦截器 + registry.addInterceptor(new SentinelWebTotalInterceptor(config)).addPathPatterns("/**"); + } + +} diff --git a/lab-46/lab-46-sentinel-demo-file/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/controller/DemoController.java b/lab-46/lab-46-sentinel-demo-file/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/controller/DemoController.java new file mode 100644 index 000000000..950b09160 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-file/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/controller/DemoController.java @@ -0,0 +1,82 @@ +package cn.iocoder.springboot.lab46.sentineldemo.controller; + +import com.alibaba.csp.sentinel.Entry; +import com.alibaba.csp.sentinel.SphU; +import com.alibaba.csp.sentinel.annotation.SentinelResource; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @GetMapping("/echo") + public String echo() { + return "echo"; + } + + @GetMapping("/test") + public String test() { + return "test"; + } + + @GetMapping("/sleep") + public String sleep() throws InterruptedException { + Thread.sleep(100L); + return "sleep"; + } + + // 测试热点参数限流 + @GetMapping("/product_info") + @SentinelResource("demo_product_info_hot") + public String productInfo(Integer id) { + return "商品编号:" + id; + } + + // 手动使用 Sentinel 客户端 API + @GetMapping("/entry_demo") + public String entryDemo() { + Entry entry = null; + try { + // 访问资源 + entry = SphU.entry("entry_demo"); + + // ... 执行业务逻辑 + + return "执行成功"; + } catch (BlockException ex) { + return "被拒绝"; + } finally { + // 释放资源 + if (entry != null) { + entry.exit(); + } + } + } + + // 测试 @SentinelResource 注解 + @GetMapping("/annotations_demo") + @SentinelResource(value = "annotations_demo_resource", + blockHandler = "blockHandler", + fallback = "fallback") + public String annotationsDemo(@RequestParam(required = false) Integer id) throws InterruptedException { + if (id == null) { + throw new IllegalArgumentException("id 参数不允许为空"); + } + return "success..."; + } + + // BlockHandler 处理函数,参数最后多一个 BlockException,其余与原函数一致. + public String blockHandler(Integer id, BlockException ex) { + return "block:" + ex.getClass().getSimpleName(); + } + + // Fallback 处理函数,函数签名与原函数一致或加一个 Throwable 类型的参数. + public String fallback(Integer id, Throwable throwable) { + return "fallback:" + throwable.getMessage(); + } + +} diff --git a/lab-46/lab-46-sentinel-demo-file/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/web/GlobalExceptionHandler.java b/lab-46/lab-46-sentinel-demo-file/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/web/GlobalExceptionHandler.java new file mode 100644 index 000000000..217590255 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-file/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/web/GlobalExceptionHandler.java @@ -0,0 +1,17 @@ +package cn.iocoder.springboot.lab46.sentineldemo.web; + +import com.alibaba.csp.sentinel.slots.block.BlockException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +@ControllerAdvice(basePackages = "cn.iocoder.springboot.lab46.sentineldemo.controller") +public class GlobalExceptionHandler { + + @ResponseBody + @ExceptionHandler(value = BlockException.class) + public String blockExceptionHandler(BlockException blockException) { + return "请求过于频繁"; + } + +} diff --git a/lab-46/lab-46-sentinel-demo-file/src/main/resources/flow-rule.json b/lab-46/lab-46-sentinel-demo-file/src/main/resources/flow-rule.json new file mode 100644 index 000000000..5994d16e7 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-file/src/main/resources/flow-rule.json @@ -0,0 +1,11 @@ +[ + { + "resource": "GET:/demo/echo", + "limitApp": "default", + "grade": 1, + "count": 5, + "strategy": 0, + "controlBehavior": 0, + "clusterMode": false + } +] diff --git a/lab-46/lab-46-sentinel-demo-file/src/main/resources/sentinel.properties b/lab-46/lab-46-sentinel-demo-file/src/main/resources/sentinel.properties new file mode 100644 index 000000000..be3ba2284 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-file/src/main/resources/sentinel.properties @@ -0,0 +1 @@ +csp.sentinel.dashboard.server=127.0.0.1:7070 diff --git a/lab-46/lab-46-sentinel-demo-file/target/classes/sentinel.properties b/lab-46/lab-46-sentinel-demo-file/target/classes/sentinel.properties new file mode 100644 index 000000000..be3ba2284 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-file/target/classes/sentinel.properties @@ -0,0 +1 @@ +csp.sentinel.dashboard.server=127.0.0.1:7070 diff --git a/lab-46/lab-46-sentinel-demo-nacos/pom.xml b/lab-46/lab-46-sentinel-demo-nacos/pom.xml new file mode 100644 index 000000000..89f516c0b --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-nacos/pom.xml @@ -0,0 +1,60 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-46-sentinel-demo-nacos + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.csp + sentinel-core + 1.7.1 + + + + com.alibaba.csp + sentinel-transport-simple-http + 1.7.1 + + + + com.alibaba.csp + sentinel-spring-webmvc-adapter + 1.7.1 + + + + com.alibaba.csp + sentinel-parameter-flow-control + 1.7.1 + + + + com.alibaba.csp + sentinel-annotation-aspectj + 1.7.1 + + + + com.alibaba.csp + sentinel-datasource-nacos + 1.7.1 + + + + diff --git a/lab-46/lab-46-sentinel-demo-nacos/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/Application.java b/lab-46/lab-46-sentinel-demo-nacos/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/Application.java new file mode 100644 index 000000000..de707eb1f --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-nacos/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/Application.java @@ -0,0 +1,17 @@ +package cn.iocoder.springboot.lab46.sentineldemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + // 设置系统属性 project.name,提供给 Sentinel 读取 + System.setProperty("project.name", "demo-application"); + + // 启动 Spring Boot 应用 + SpringApplication.run(Application.class, args); + } + +} diff --git a/lab-46/lab-46-sentinel-demo-nacos/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SentinelConfiguration.java b/lab-46/lab-46-sentinel-demo-nacos/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SentinelConfiguration.java new file mode 100644 index 000000000..f27aa17ac --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-nacos/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SentinelConfiguration.java @@ -0,0 +1,56 @@ +package cn.iocoder.springboot.lab46.sentineldemo.config; + +import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect; +import com.alibaba.csp.sentinel.datasource.Converter; +import com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRule; +import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager; +import com.alibaba.nacos.api.PropertyKeyConst; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.util.Arrays; +import java.util.List; +import java.util.Properties; + +@Configuration +public class SentinelConfiguration { + + @Bean + public SentinelResourceAspect sentinelResourceAspect() { + return new SentinelResourceAspect(); + } + + @Bean + public NacosDataSource nacosDataSource(ObjectMapper objectMapper) { + // Nacos 配置。这里先写死,推荐后面写到 application.yaml 配置文件中。 + String serverAddress = "127.0.0.1:8848"; // Nacos 服务器地址 + String namespace = ""; // Nacos 命名空间 + String dataId = "demo-application-flow-rule"; // Nacos 配置集编号 +// String dataId = "example-sentinel"; // Nacos 配置集编号 + String group = "DEFAULT_GROUP"; // Nacos 配置分组 + + // 创建 NacosDataSource 对象 + Properties properties = new Properties(); + properties.setProperty(PropertyKeyConst.SERVER_ADDR, serverAddress); + properties.setProperty(PropertyKeyConst.NAMESPACE, namespace); + NacosDataSource> nacosDataSource = new NacosDataSource<>(properties, group, dataId, + new Converter>() { // 转换器,将读取的 Nacos 配置,转换成 FlowRule 数组 + @Override + public List convert(String value) { + try { + return Arrays.asList(objectMapper.readValue(value, FlowRule[].class)); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + } + }); + + // 注册到 FlowRuleManager 中 + FlowRuleManager.register2Property(nacosDataSource.getProperty()); + return nacosDataSource; + } + +} diff --git a/lab-46/lab-46-sentinel-demo-nacos/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SpringMvcConfiguration.java b/lab-46/lab-46-sentinel-demo-nacos/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SpringMvcConfiguration.java new file mode 100644 index 000000000..c6d06427e --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-nacos/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SpringMvcConfiguration.java @@ -0,0 +1,53 @@ +package cn.iocoder.springboot.lab46.sentineldemo.config; + +import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebInterceptor; +import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebTotalInterceptor; +import com.alibaba.csp.sentinel.adapter.spring.webmvc.config.SentinelWebMvcConfig; +import com.alibaba.csp.sentinel.adapter.spring.webmvc.config.SentinelWebMvcTotalConfig; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class SpringMvcConfiguration implements WebMvcConfigurer { + + @Override + public void addInterceptors(InterceptorRegistry registry) { + // Add Sentinel interceptor +// addSentinelWebTotalInterceptor(registry); + addSentinelWebInterceptor(registry); + } + + private void addSentinelWebInterceptor(InterceptorRegistry registry) { + // 创建 SentinelWebMvcConfig 对象 + SentinelWebMvcConfig config = new SentinelWebMvcConfig(); + config.setHttpMethodSpecify(true); // 是否包含请求方法。即基于 URL 创建的资源,是否包含 Method。 + // config.setBlockExceptionHandler(new DefaultBlockExceptionHandler()); // 设置 BlockException 处理器。 +// config.setOriginParser(new RequestOriginParser() { // 设置请求来源解析器。用于黑白名单控制功能。 +// +// @Override +// public String parseOrigin(HttpServletRequest request) { +// // 从 Header 中,获得请求来源 +// String origin = request.getHeader("s-user"); +// // 如果为空,给一个默认的 +// if (StringUtils.isEmpty(origin)) { +// origin = "default"; +// } +// return origin; +// } +// +// }); + + // 添加 SentinelWebInterceptor 拦截器 + registry.addInterceptor(new SentinelWebInterceptor(config)).addPathPatterns("/**"); + } + + private void addSentinelWebTotalInterceptor(InterceptorRegistry registry) { + // 创建 SentinelWebMvcTotalConfig 对象 + SentinelWebMvcTotalConfig config = new SentinelWebMvcTotalConfig(); + + // 添加 SentinelWebTotalInterceptor 拦截器 + registry.addInterceptor(new SentinelWebTotalInterceptor(config)).addPathPatterns("/**"); + } + +} diff --git a/lab-46/lab-46-sentinel-demo-nacos/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/controller/DemoController.java b/lab-46/lab-46-sentinel-demo-nacos/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/controller/DemoController.java new file mode 100644 index 000000000..950b09160 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-nacos/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/controller/DemoController.java @@ -0,0 +1,82 @@ +package cn.iocoder.springboot.lab46.sentineldemo.controller; + +import com.alibaba.csp.sentinel.Entry; +import com.alibaba.csp.sentinel.SphU; +import com.alibaba.csp.sentinel.annotation.SentinelResource; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @GetMapping("/echo") + public String echo() { + return "echo"; + } + + @GetMapping("/test") + public String test() { + return "test"; + } + + @GetMapping("/sleep") + public String sleep() throws InterruptedException { + Thread.sleep(100L); + return "sleep"; + } + + // 测试热点参数限流 + @GetMapping("/product_info") + @SentinelResource("demo_product_info_hot") + public String productInfo(Integer id) { + return "商品编号:" + id; + } + + // 手动使用 Sentinel 客户端 API + @GetMapping("/entry_demo") + public String entryDemo() { + Entry entry = null; + try { + // 访问资源 + entry = SphU.entry("entry_demo"); + + // ... 执行业务逻辑 + + return "执行成功"; + } catch (BlockException ex) { + return "被拒绝"; + } finally { + // 释放资源 + if (entry != null) { + entry.exit(); + } + } + } + + // 测试 @SentinelResource 注解 + @GetMapping("/annotations_demo") + @SentinelResource(value = "annotations_demo_resource", + blockHandler = "blockHandler", + fallback = "fallback") + public String annotationsDemo(@RequestParam(required = false) Integer id) throws InterruptedException { + if (id == null) { + throw new IllegalArgumentException("id 参数不允许为空"); + } + return "success..."; + } + + // BlockHandler 处理函数,参数最后多一个 BlockException,其余与原函数一致. + public String blockHandler(Integer id, BlockException ex) { + return "block:" + ex.getClass().getSimpleName(); + } + + // Fallback 处理函数,函数签名与原函数一致或加一个 Throwable 类型的参数. + public String fallback(Integer id, Throwable throwable) { + return "fallback:" + throwable.getMessage(); + } + +} diff --git a/lab-46/lab-46-sentinel-demo-nacos/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/web/GlobalExceptionHandler.java b/lab-46/lab-46-sentinel-demo-nacos/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/web/GlobalExceptionHandler.java new file mode 100644 index 000000000..217590255 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-nacos/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/web/GlobalExceptionHandler.java @@ -0,0 +1,17 @@ +package cn.iocoder.springboot.lab46.sentineldemo.web; + +import com.alibaba.csp.sentinel.slots.block.BlockException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +@ControllerAdvice(basePackages = "cn.iocoder.springboot.lab46.sentineldemo.controller") +public class GlobalExceptionHandler { + + @ResponseBody + @ExceptionHandler(value = BlockException.class) + public String blockExceptionHandler(BlockException blockException) { + return "请求过于频繁"; + } + +} diff --git a/lab-46/lab-46-sentinel-demo-nacos/src/main/resources/sentinel.properties b/lab-46/lab-46-sentinel-demo-nacos/src/main/resources/sentinel.properties new file mode 100644 index 000000000..be3ba2284 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo-nacos/src/main/resources/sentinel.properties @@ -0,0 +1 @@ +csp.sentinel.dashboard.server=127.0.0.1:7070 diff --git a/lab-46/lab-46-sentinel-demo/pom.xml b/lab-46/lab-46-sentinel-demo/pom.xml new file mode 100644 index 000000000..225debc3d --- /dev/null +++ b/lab-46/lab-46-sentinel-demo/pom.xml @@ -0,0 +1,54 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-46-sentinel-demo + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.csp + sentinel-core + 1.7.1 + + + + com.alibaba.csp + sentinel-transport-simple-http + 1.7.1 + + + + com.alibaba.csp + sentinel-spring-webmvc-adapter + 1.7.1 + + + + com.alibaba.csp + sentinel-parameter-flow-control + 1.7.1 + + + + com.alibaba.csp + sentinel-annotation-aspectj + 1.7.1 + + + + diff --git a/lab-46/lab-46-sentinel-demo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/Application.java b/lab-46/lab-46-sentinel-demo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/Application.java new file mode 100644 index 000000000..de707eb1f --- /dev/null +++ b/lab-46/lab-46-sentinel-demo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/Application.java @@ -0,0 +1,17 @@ +package cn.iocoder.springboot.lab46.sentineldemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + + public static void main(String[] args) { + // 设置系统属性 project.name,提供给 Sentinel 读取 + System.setProperty("project.name", "demo-application"); + + // 启动 Spring Boot 应用 + SpringApplication.run(Application.class, args); + } + +} diff --git a/lab-46/lab-46-sentinel-demo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SentinelConfiguration.java b/lab-46/lab-46-sentinel-demo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SentinelConfiguration.java new file mode 100644 index 000000000..e7b567a92 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SentinelConfiguration.java @@ -0,0 +1,15 @@ +package cn.iocoder.springboot.lab46.sentineldemo.config; + +import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class SentinelConfiguration { + + @Bean + public SentinelResourceAspect sentinelResourceAspect() { + return new SentinelResourceAspect(); + } + +} diff --git a/lab-46/lab-46-sentinel-demo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SpringMvcConfiguration.java b/lab-46/lab-46-sentinel-demo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SpringMvcConfiguration.java new file mode 100644 index 000000000..c6d06427e --- /dev/null +++ b/lab-46/lab-46-sentinel-demo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/config/SpringMvcConfiguration.java @@ -0,0 +1,53 @@ +package cn.iocoder.springboot.lab46.sentineldemo.config; + +import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebInterceptor; +import com.alibaba.csp.sentinel.adapter.spring.webmvc.SentinelWebTotalInterceptor; +import com.alibaba.csp.sentinel.adapter.spring.webmvc.config.SentinelWebMvcConfig; +import com.alibaba.csp.sentinel.adapter.spring.webmvc.config.SentinelWebMvcTotalConfig; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class SpringMvcConfiguration implements WebMvcConfigurer { + + @Override + public void addInterceptors(InterceptorRegistry registry) { + // Add Sentinel interceptor +// addSentinelWebTotalInterceptor(registry); + addSentinelWebInterceptor(registry); + } + + private void addSentinelWebInterceptor(InterceptorRegistry registry) { + // 创建 SentinelWebMvcConfig 对象 + SentinelWebMvcConfig config = new SentinelWebMvcConfig(); + config.setHttpMethodSpecify(true); // 是否包含请求方法。即基于 URL 创建的资源,是否包含 Method。 + // config.setBlockExceptionHandler(new DefaultBlockExceptionHandler()); // 设置 BlockException 处理器。 +// config.setOriginParser(new RequestOriginParser() { // 设置请求来源解析器。用于黑白名单控制功能。 +// +// @Override +// public String parseOrigin(HttpServletRequest request) { +// // 从 Header 中,获得请求来源 +// String origin = request.getHeader("s-user"); +// // 如果为空,给一个默认的 +// if (StringUtils.isEmpty(origin)) { +// origin = "default"; +// } +// return origin; +// } +// +// }); + + // 添加 SentinelWebInterceptor 拦截器 + registry.addInterceptor(new SentinelWebInterceptor(config)).addPathPatterns("/**"); + } + + private void addSentinelWebTotalInterceptor(InterceptorRegistry registry) { + // 创建 SentinelWebMvcTotalConfig 对象 + SentinelWebMvcTotalConfig config = new SentinelWebMvcTotalConfig(); + + // 添加 SentinelWebTotalInterceptor 拦截器 + registry.addInterceptor(new SentinelWebTotalInterceptor(config)).addPathPatterns("/**"); + } + +} diff --git a/lab-46/lab-46-sentinel-demo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/controller/DemoController.java b/lab-46/lab-46-sentinel-demo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/controller/DemoController.java new file mode 100644 index 000000000..950b09160 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/controller/DemoController.java @@ -0,0 +1,82 @@ +package cn.iocoder.springboot.lab46.sentineldemo.controller; + +import com.alibaba.csp.sentinel.Entry; +import com.alibaba.csp.sentinel.SphU; +import com.alibaba.csp.sentinel.annotation.SentinelResource; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @GetMapping("/echo") + public String echo() { + return "echo"; + } + + @GetMapping("/test") + public String test() { + return "test"; + } + + @GetMapping("/sleep") + public String sleep() throws InterruptedException { + Thread.sleep(100L); + return "sleep"; + } + + // 测试热点参数限流 + @GetMapping("/product_info") + @SentinelResource("demo_product_info_hot") + public String productInfo(Integer id) { + return "商品编号:" + id; + } + + // 手动使用 Sentinel 客户端 API + @GetMapping("/entry_demo") + public String entryDemo() { + Entry entry = null; + try { + // 访问资源 + entry = SphU.entry("entry_demo"); + + // ... 执行业务逻辑 + + return "执行成功"; + } catch (BlockException ex) { + return "被拒绝"; + } finally { + // 释放资源 + if (entry != null) { + entry.exit(); + } + } + } + + // 测试 @SentinelResource 注解 + @GetMapping("/annotations_demo") + @SentinelResource(value = "annotations_demo_resource", + blockHandler = "blockHandler", + fallback = "fallback") + public String annotationsDemo(@RequestParam(required = false) Integer id) throws InterruptedException { + if (id == null) { + throw new IllegalArgumentException("id 参数不允许为空"); + } + return "success..."; + } + + // BlockHandler 处理函数,参数最后多一个 BlockException,其余与原函数一致. + public String blockHandler(Integer id, BlockException ex) { + return "block:" + ex.getClass().getSimpleName(); + } + + // Fallback 处理函数,函数签名与原函数一致或加一个 Throwable 类型的参数. + public String fallback(Integer id, Throwable throwable) { + return "fallback:" + throwable.getMessage(); + } + +} diff --git a/lab-46/lab-46-sentinel-demo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/web/GlobalExceptionHandler.java b/lab-46/lab-46-sentinel-demo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/web/GlobalExceptionHandler.java new file mode 100644 index 000000000..217590255 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo/src/main/java/cn/iocoder/springboot/lab46/sentineldemo/web/GlobalExceptionHandler.java @@ -0,0 +1,17 @@ +package cn.iocoder.springboot.lab46.sentineldemo.web; + +import com.alibaba.csp.sentinel.slots.block.BlockException; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseBody; + +@ControllerAdvice(basePackages = "cn.iocoder.springboot.lab46.sentineldemo.controller") +public class GlobalExceptionHandler { + + @ResponseBody + @ExceptionHandler(value = BlockException.class) + public String blockExceptionHandler(BlockException blockException) { + return "请求过于频繁"; + } + +} diff --git a/lab-46/lab-46-sentinel-demo/src/main/resources/sentinel.properties b/lab-46/lab-46-sentinel-demo/src/main/resources/sentinel.properties new file mode 100644 index 000000000..be3ba2284 --- /dev/null +++ b/lab-46/lab-46-sentinel-demo/src/main/resources/sentinel.properties @@ -0,0 +1 @@ +csp.sentinel.dashboard.server=127.0.0.1:7070 diff --git a/lab-46/pom.xml b/lab-46/pom.xml new file mode 100644 index 000000000..2abba4a00 --- /dev/null +++ b/lab-46/pom.xml @@ -0,0 +1,22 @@ + + + + labs-parent + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + lab-46 + pom + + lab-46-sentinel-demo + lab-46-sentinel-demo-nacos + lab-46-sentinel-demo-apollo + lab-46-sentinel-demo-file + + + + diff --git a/lab-47/lab-47-demo/pom.xml b/lab-47/lab-47-demo/pom.xml new file mode 100644 index 000000000..e4c5180e5 --- /dev/null +++ b/lab-47/lab-47-demo/pom.xml @@ -0,0 +1,23 @@ + + + + lab-47 + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + lab-47-demo + + + + + cn.iocoder.springboot.labs + yunai-server-spring-boot-starter + 1.0-SNAPSHOT + + + + diff --git a/lab-47/lab-47-demo/src/main/java/cn/iocoder/springboot/lab47/demo/DemoApplication.java b/lab-47/lab-47-demo/src/main/java/cn/iocoder/springboot/lab47/demo/DemoApplication.java new file mode 100644 index 000000000..b43bf568d --- /dev/null +++ b/lab-47/lab-47-demo/src/main/java/cn/iocoder/springboot/lab47/demo/DemoApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab47.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } + +} diff --git a/lab-47/lab-47-demo/src/main/resources/application.yaml b/lab-47/lab-47-demo/src/main/resources/application.yaml new file mode 100644 index 000000000..52bb39f92 --- /dev/null +++ b/lab-47/lab-47-demo/src/main/resources/application.yaml @@ -0,0 +1,3 @@ +yunai: + server: + port: 8888 # 自定义 HttpServer 端口 diff --git a/lab-47/pom.xml b/lab-47/pom.xml new file mode 100644 index 000000000..df4e66938 --- /dev/null +++ b/lab-47/pom.xml @@ -0,0 +1,20 @@ + + + + labs-parent + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + lab-47 + pom + + yunai-server-spring-boot-starter + lab-47-demo + + + + diff --git a/lab-47/yunai-server-spring-boot-starter/pom.xml b/lab-47/yunai-server-spring-boot-starter/pom.xml new file mode 100644 index 000000000..f5c5d5200 --- /dev/null +++ b/lab-47/yunai-server-spring-boot-starter/pom.xml @@ -0,0 +1,23 @@ + + + + lab-47 + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + yunai-server-spring-boot-starter + + + + + org.springframework.boot + spring-boot-starter + 2.2.2.RELEASE + + + + diff --git a/lab-47/yunai-server-spring-boot-starter/src/main/java/cn/iocoder/springboot/lab47/yunaiserver/autoconfigure/YunaiServerAutoConfiguration.java b/lab-47/yunai-server-spring-boot-starter/src/main/java/cn/iocoder/springboot/lab47/yunaiserver/autoconfigure/YunaiServerAutoConfiguration.java new file mode 100644 index 000000000..b22a0e5dd --- /dev/null +++ b/lab-47/yunai-server-spring-boot-starter/src/main/java/cn/iocoder/springboot/lab47/yunaiserver/autoconfigure/YunaiServerAutoConfiguration.java @@ -0,0 +1,32 @@ +package cn.iocoder.springboot.lab47.yunaiserver.autoconfigure; + +import com.sun.net.httpserver.HttpServer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.io.IOException; +import java.net.InetSocketAddress; + +@Configuration // 声明配置类 +@EnableConfigurationProperties(YunaiServerProperties.class) // 使 YunaiServerProperties 配置属性类生效 +public class YunaiServerAutoConfiguration { + + private Logger logger = LoggerFactory.getLogger(YunaiServerAutoConfiguration.class); + + @Bean // 声明创建 Bean + @ConditionalOnClass(HttpServer.class) // 需要项目中存在 com.sun.net.httpserver.HttpServer 类。该类为 JDK 自带,所以一定成立。 + public HttpServer httpServer(YunaiServerProperties serverProperties) throws IOException { + // 创建 HttpServer 对象,并启动 + HttpServer server = HttpServer.create(new InetSocketAddress(serverProperties.getPort()), 0); + server.start(); + logger.info("[httpServer][启动服务器成功,端口为:{}]", serverProperties.getPort()); + + // 返回 + return server; + } + +} diff --git a/lab-47/yunai-server-spring-boot-starter/src/main/java/cn/iocoder/springboot/lab47/yunaiserver/autoconfigure/YunaiServerProperties.java b/lab-47/yunai-server-spring-boot-starter/src/main/java/cn/iocoder/springboot/lab47/yunaiserver/autoconfigure/YunaiServerProperties.java new file mode 100644 index 000000000..a9ec84e77 --- /dev/null +++ b/lab-47/yunai-server-spring-boot-starter/src/main/java/cn/iocoder/springboot/lab47/yunaiserver/autoconfigure/YunaiServerProperties.java @@ -0,0 +1,31 @@ +package cn.iocoder.springboot.lab47.yunaiserver.autoconfigure; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties(prefix = "yunai.server") +public class YunaiServerProperties { + + /** + * 默认端口 + */ + private static final Integer DEFAULT_PORT = 8000; + + /** + * 端口 + */ + private Integer port = DEFAULT_PORT; + + public static Integer getDefaultPort() { + return DEFAULT_PORT; + } + + public Integer getPort() { + return port; + } + + public YunaiServerProperties setPort(Integer port) { + this.port = port; + return this; + } + +} diff --git a/lab-47/yunai-server-spring-boot-starter/src/main/resources/META-INF/spring.factories b/lab-47/yunai-server-spring-boot-starter/src/main/resources/META-INF/spring.factories new file mode 100644 index 000000000..f2a16e954 --- /dev/null +++ b/lab-47/yunai-server-spring-boot-starter/src/main/resources/META-INF/spring.factories @@ -0,0 +1,2 @@ +org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ +cn.iocoder.springboot.lab47.yunaiserver.autoconfigure.YunaiServerAutoConfiguration diff --git a/lab-48/lab-48-demo/pom.xml b/lab-48/lab-48-demo/pom.xml new file mode 100644 index 000000000..359e30f31 --- /dev/null +++ b/lab-48/lab-48-demo/pom.xml @@ -0,0 +1,23 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-48-demo + + + + + org.springframework.boot + spring-boot-starter-web + + + + diff --git a/lab-48/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/DemoApplication.java b/lab-48/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/DemoApplication.java new file mode 100644 index 000000000..8dd7f0c44 --- /dev/null +++ b/lab-48/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/DemoApplication.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab48.demo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class DemoApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoApplication.class, args); + } + +} diff --git a/lab-48/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/controller/DemoController.java b/lab-48/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/controller/DemoController.java new file mode 100644 index 000000000..9f50cf75f --- /dev/null +++ b/lab-48/lab-48-demo/src/main/java/cn/iocoder/springboot/lab48/demo/controller/DemoController.java @@ -0,0 +1,16 @@ +package cn.iocoder.springboot.lab48.demo.controller; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/demo") +public class DemoController { + + @GetMapping("/echo") + public String echo() { + return "echo"; + } + +} diff --git a/lab-48/pom.xml b/lab-48/pom.xml new file mode 100644 index 000000000..be39149e0 --- /dev/null +++ b/lab-48/pom.xml @@ -0,0 +1,19 @@ + + + + labs-parent + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + lab-48 + pom + + lab-48-demo + + + + diff --git a/lab-49/lab-49-lombok-demo/pom.xml b/lab-49/lab-49-lombok-demo/pom.xml new file mode 100644 index 000000000..51417ce70 --- /dev/null +++ b/lab-49/lab-49-lombok-demo/pom.xml @@ -0,0 +1,37 @@ + + + + org.springframework.boot + spring-boot-starter-parent + 2.2.2.RELEASE + + + 4.0.0 + + lab-49-lombok-demo + + + + + org.springframework.boot + spring-boot-starter + + + + + org.projectlombok + lombok + + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + diff --git a/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/LombokApplication.java b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/LombokApplication.java new file mode 100644 index 000000000..69101f2ed --- /dev/null +++ b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/LombokApplication.java @@ -0,0 +1,14 @@ +package cn.iocoder.springboot.lab49.lombokdemo; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class LombokApplication { + + public static void main(String[] args) { + // 启动 Spring Boot 应用 + SpringApplication.run(LombokApplication.class, args); + } + +} diff --git a/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDO.java b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDO.java new file mode 100644 index 000000000..835972829 --- /dev/null +++ b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDO.java @@ -0,0 +1,16 @@ +package cn.iocoder.springboot.lab49.lombokdemo.dataobject; + +import lombok.Getter; +import lombok.Setter; + +/** + * 用户 DO + */ +@Setter +@Getter +public class UserDO { + + private String username; + private String password; + +} diff --git a/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDO01.java b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDO01.java new file mode 100644 index 000000000..e6f0f61ad --- /dev/null +++ b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDO01.java @@ -0,0 +1,14 @@ +package cn.iocoder.springboot.lab49.lombokdemo.dataobject; + +import lombok.Data; + +/** + * 用户 DO + */ +@Data +public class UserDO01 { + + private String username; + private String password; + +} diff --git a/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService.java b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService.java new file mode 100644 index 000000000..4973d7d6b --- /dev/null +++ b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService.java @@ -0,0 +1,16 @@ +package cn.iocoder.springboot.lab49.lombokdemo.service; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class UserService { + + public static void staticMethod() { + log.info("静态方法示例"); + } + + public void normalMethod() { + log.info("普通方法示例"); + } + +} diff --git a/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService01.java b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService01.java new file mode 100644 index 000000000..fcf5c1b34 --- /dev/null +++ b/lab-49/lab-49-lombok-demo/src/main/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService01.java @@ -0,0 +1,13 @@ +package cn.iocoder.springboot.lab49.lombokdemo.service; + +import lombok.NonNull; +import org.springframework.stereotype.Service; + +@Service +public class UserService01 { + + public void test(@NonNull String username, String password) { + + } + +} diff --git a/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDOTest.java b/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDOTest.java new file mode 100644 index 000000000..81016d642 --- /dev/null +++ b/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/dataobject/UserDOTest.java @@ -0,0 +1,17 @@ +package cn.iocoder.springboot.lab49.lombokdemo.dataobject; + +import org.junit.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class UserDOTest { + + @Test + public void demo01() { + UserDO user = new UserDO(); + user.setUsername("username:1"); + user.setPassword("password:1"); + System.out.println(user); + } + +} diff --git a/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/package-info.java b/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/package-info.java new file mode 100644 index 000000000..2d9c37e7d --- /dev/null +++ b/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/package-info.java @@ -0,0 +1 @@ +package cn.iocoder.springboot.lab49.lombokdemo; diff --git a/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService01Test.java b/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService01Test.java new file mode 100644 index 000000000..3c72d0019 --- /dev/null +++ b/lab-49/lab-49-lombok-demo/src/test/java/cn/iocoder/springboot/lab49/lombokdemo/service/UserService01Test.java @@ -0,0 +1,16 @@ +package cn.iocoder.springboot.lab49.lombokdemo.service; + +import org.junit.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +public class UserService01Test { + + private UserService01 userService01 = new UserService01(); + + @Test + public void test() { + userService01.test(null, null); + } + +} diff --git a/lab-49/pom.xml b/lab-49/pom.xml new file mode 100644 index 000000000..3d9d97a43 --- /dev/null +++ b/lab-49/pom.xml @@ -0,0 +1,19 @@ + + + + labs-parent + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + lab-49 + pom + + lab-49-lombok-demo + + + + diff --git a/labx-01/labx-01-sca-nacos-discovery-demo01-consumer/pom.xml b/labx-01/labx-01-sca-nacos-discovery-demo01-consumer/pom.xml new file mode 100644 index 000000000..8a82fdcd9 --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo01-consumer/pom.xml @@ -0,0 +1,64 @@ + + + + labx-01 + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + labx-01-sca-nacos-discovery-demo01-consumer + + + 2.2.4.RELEASE + Hoxton.SR1 + 2.2.0.RELEASE + + + + + + + org.springframework.boot + spring-boot-starter-parent + ${spring.boot.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring.cloud.version} + pom + import + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring.cloud.alibaba.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + diff --git a/labx-01/labx-01-sca-nacos-discovery-demo01-consumer/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/consumer/DemoConsumerApplication.java b/labx-01/labx-01-sca-nacos-discovery-demo01-consumer/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/consumer/DemoConsumerApplication.java new file mode 100644 index 000000000..aa3b7d633 --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo01-consumer/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/consumer/DemoConsumerApplication.java @@ -0,0 +1,69 @@ +package cn.iocoder.springcloudalibaba.labx01.nacosdemo.consumer; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +import java.util.List; + +@SpringBootApplication +// @EnableDiscoveryClient +public class DemoConsumerApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoConsumerApplication.class, args); + } + + @Configuration + public class RestTemplateConfiguration { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + } + + @RestController + static class TestController { + + @Autowired + private DiscoveryClient discoveryClient; + @Autowired + private RestTemplate restTemplate; + @Autowired + private LoadBalancerClient loadBalancerClient; + + @GetMapping("/hello") + public String hello(String name) { + // 获得服务 `demo-provider` 的一个实例 + ServiceInstance instance; + if (true) { + // 获取服务 `demo-provider` 对应的实例列表 + List instances = discoveryClient.getInstances("demo-provider"); + // 选择第一个 + instance = instances.size() > 0 ? instances.get(0) : null; + } else { + instance = loadBalancerClient.choose("demo-provider"); + } + // 发起调用 + if (instance == null) { + throw new IllegalStateException("获取不到实例"); + } + String targetUrl = instance.getUri() + "/echo?name=" + name; + String response = restTemplate.getForObject(targetUrl, String.class); + // 返回结果 + return "consumer:" + response; + } + + } + +} diff --git a/labx-01/labx-01-sca-nacos-discovery-demo01-consumer/src/main/resources/application.yaml b/labx-01/labx-01-sca-nacos-discovery-demo01-consumer/src/main/resources/application.yaml new file mode 100644 index 000000000..bb2c6d3de --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo01-consumer/src/main/resources/application.yaml @@ -0,0 +1,12 @@ +spring: + application: + name: demo-consumer # Spring 应用名 + cloud: + nacos: + # Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类 + discovery: + server-addr: 127.0.0.1:8848 # Nacos 服务器地址 + service: ${spring.application.name} # 注册到 Nacos 的服务名。默认值为 ${spring.application.name}。 + +server: + port: 28080 # 服务器端口。默认为 8080 diff --git a/labx-01/labx-01-sca-nacos-discovery-demo01-provider/pom.xml b/labx-01/labx-01-sca-nacos-discovery-demo01-provider/pom.xml new file mode 100644 index 000000000..18f38c02e --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo01-provider/pom.xml @@ -0,0 +1,64 @@ + + + + labx-01 + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + labx-01-sca-nacos-discovery-demo01-provider + + + 2.2.4.RELEASE + Hoxton.SR1 + 2.2.0.RELEASE + + + + + + + org.springframework.boot + spring-boot-starter-parent + ${spring.boot.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring.cloud.version} + pom + import + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring.cloud.alibaba.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + diff --git a/labx-01/labx-01-sca-nacos-discovery-demo01-provider/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/provider/DemoProviderApplication.java b/labx-01/labx-01-sca-nacos-discovery-demo01-provider/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/provider/DemoProviderApplication.java new file mode 100644 index 000000000..39b0d38b4 --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo01-provider/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/provider/DemoProviderApplication.java @@ -0,0 +1,27 @@ +package cn.iocoder.springcloudalibaba.labx01.nacosdemo.provider; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@EnableDiscoveryClient +public class DemoProviderApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoProviderApplication.class, args); + } + + @RestController + static class TestController { + + @GetMapping("/echo") + public String echo(String name) { + return "provider:" + name; + } + + } + +} diff --git a/labx-01/labx-01-sca-nacos-discovery-demo01-provider/src/main/resources/application.yaml b/labx-01/labx-01-sca-nacos-discovery-demo01-provider/src/main/resources/application.yaml new file mode 100644 index 000000000..b7c7dfd01 --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo01-provider/src/main/resources/application.yaml @@ -0,0 +1,12 @@ +spring: + application: + name: demo-provider # Spring 应用名 + cloud: + nacos: + # Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类 + discovery: + server-addr: 127.0.0.1:8848 # Nacos 服务器地址 + service: ${spring.application.name} # 注册到 Nacos 的服务名。默认值为 ${spring.application.name}。 + +server: + port: 18080 # 服务器端口。默认为 8080 diff --git a/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/pom.xml b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/pom.xml new file mode 100644 index 000000000..a971b6091 --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/pom.xml @@ -0,0 +1,64 @@ + + + + labx-01 + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + labx-01-sca-nacos-discovery-demo02-consumer + + + 2.2.4.RELEASE + Hoxton.SR1 + 2.2.0.RELEASE + + + + + + + org.springframework.boot + spring-boot-starter-parent + ${spring.boot.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring.cloud.version} + pom + import + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring.cloud.alibaba.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + diff --git a/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/consumer/DemoConsumerApplication.java b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/consumer/DemoConsumerApplication.java new file mode 100644 index 000000000..aa3b7d633 --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/consumer/DemoConsumerApplication.java @@ -0,0 +1,69 @@ +package cn.iocoder.springcloudalibaba.labx01.nacosdemo.consumer; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +import java.util.List; + +@SpringBootApplication +// @EnableDiscoveryClient +public class DemoConsumerApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoConsumerApplication.class, args); + } + + @Configuration + public class RestTemplateConfiguration { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + } + + @RestController + static class TestController { + + @Autowired + private DiscoveryClient discoveryClient; + @Autowired + private RestTemplate restTemplate; + @Autowired + private LoadBalancerClient loadBalancerClient; + + @GetMapping("/hello") + public String hello(String name) { + // 获得服务 `demo-provider` 的一个实例 + ServiceInstance instance; + if (true) { + // 获取服务 `demo-provider` 对应的实例列表 + List instances = discoveryClient.getInstances("demo-provider"); + // 选择第一个 + instance = instances.size() > 0 ? instances.get(0) : null; + } else { + instance = loadBalancerClient.choose("demo-provider"); + } + // 发起调用 + if (instance == null) { + throw new IllegalStateException("获取不到实例"); + } + String targetUrl = instance.getUri() + "/echo?name=" + name; + String response = restTemplate.getForObject(targetUrl, String.class); + // 返回结果 + return "consumer:" + response; + } + + } + +} diff --git a/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application-dev.yaml b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application-dev.yaml new file mode 100644 index 000000000..e09ff6719 --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application-dev.yaml @@ -0,0 +1,7 @@ +spring: + cloud: + nacos: + # Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类 + discovery: + server-addr: 127.0.0.1:8848 # Nacos 服务器地址 + namespace: 14226a0d-799f-424d-8905-162f6a8bf409 # Nacos 命名空间 dev 的编号 diff --git a/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application-uat.yaml b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application-uat.yaml new file mode 100644 index 000000000..bb1b405c6 --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application-uat.yaml @@ -0,0 +1,7 @@ +spring: + cloud: + nacos: + # Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类 + discovery: + server-addr: 127.0.0.1:8848 # Nacos 服务器地址 + namespace: bc8c8c2d-bd85-42bb-ada3-1a8f940ceb20 # Nacos 命名空间 uat 的编号 diff --git a/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application.yaml b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application.yaml new file mode 100644 index 000000000..7f96276ee --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo02-consumer/src/main/resources/application.yaml @@ -0,0 +1,6 @@ +spring: + application: + name: demo-consumer # Spring 应用名 + +server: + port: 28080 # 服务器端口。默认为 8080 diff --git a/labx-01/labx-01-sca-nacos-discovery-demo02-provider/pom.xml b/labx-01/labx-01-sca-nacos-discovery-demo02-provider/pom.xml new file mode 100644 index 000000000..e51cff9bc --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo02-provider/pom.xml @@ -0,0 +1,64 @@ + + + + labx-01 + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + labx-01-sca-nacos-discovery-demo02-provider + + + 2.2.4.RELEASE + Hoxton.SR1 + 2.2.0.RELEASE + + + + + + + org.springframework.boot + spring-boot-starter-parent + ${spring.boot.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring.cloud.version} + pom + import + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring.cloud.alibaba.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + diff --git a/labx-01/labx-01-sca-nacos-discovery-demo02-provider/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/provider/DemoProviderApplication.java b/labx-01/labx-01-sca-nacos-discovery-demo02-provider/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/provider/DemoProviderApplication.java new file mode 100644 index 000000000..39b0d38b4 --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo02-provider/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/provider/DemoProviderApplication.java @@ -0,0 +1,27 @@ +package cn.iocoder.springcloudalibaba.labx01.nacosdemo.provider; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +@EnableDiscoveryClient +public class DemoProviderApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoProviderApplication.class, args); + } + + @RestController + static class TestController { + + @GetMapping("/echo") + public String echo(String name) { + return "provider:" + name; + } + + } + +} diff --git a/labx-01/labx-01-sca-nacos-discovery-demo02-provider/src/main/resources/application-dev.yaml b/labx-01/labx-01-sca-nacos-discovery-demo02-provider/src/main/resources/application-dev.yaml new file mode 100644 index 000000000..e09ff6719 --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo02-provider/src/main/resources/application-dev.yaml @@ -0,0 +1,7 @@ +spring: + cloud: + nacos: + # Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类 + discovery: + server-addr: 127.0.0.1:8848 # Nacos 服务器地址 + namespace: 14226a0d-799f-424d-8905-162f6a8bf409 # Nacos 命名空间 dev 的编号 diff --git a/labx-01/labx-01-sca-nacos-discovery-demo02-provider/src/main/resources/application-uat.yaml b/labx-01/labx-01-sca-nacos-discovery-demo02-provider/src/main/resources/application-uat.yaml new file mode 100644 index 000000000..bb1b405c6 --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo02-provider/src/main/resources/application-uat.yaml @@ -0,0 +1,7 @@ +spring: + cloud: + nacos: + # Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类 + discovery: + server-addr: 127.0.0.1:8848 # Nacos 服务器地址 + namespace: bc8c8c2d-bd85-42bb-ada3-1a8f940ceb20 # Nacos 命名空间 uat 的编号 diff --git a/labx-01/labx-01-sca-nacos-discovery-demo02-provider/src/main/resources/application.yaml b/labx-01/labx-01-sca-nacos-discovery-demo02-provider/src/main/resources/application.yaml new file mode 100644 index 000000000..726d27aca --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo02-provider/src/main/resources/application.yaml @@ -0,0 +1,6 @@ +spring: + application: + name: demo-provider # Spring 应用名 + +server: + port: 18080 # 服务器端口。默认为 8080 diff --git a/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/pom.xml b/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/pom.xml new file mode 100644 index 000000000..01f6cd709 --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/pom.xml @@ -0,0 +1,70 @@ + + + + labx-01 + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + labx-01-sca-nacos-discovery-demo03-consumer + + + 2.2.4.RELEASE + Hoxton.SR1 + 2.2.0.RELEASE + + + + + + + org.springframework.boot + spring-boot-starter-parent + ${spring.boot.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring.cloud.version} + pom + import + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring.cloud.alibaba.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + diff --git a/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/consumer/DemoConsumerApplication.java b/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/consumer/DemoConsumerApplication.java new file mode 100644 index 000000000..aa3b7d633 --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/src/main/java/cn/iocoder/springcloudalibaba/labx01/nacosdemo/consumer/DemoConsumerApplication.java @@ -0,0 +1,69 @@ +package cn.iocoder.springcloudalibaba.labx01.nacosdemo.consumer; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.discovery.DiscoveryClient; +import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +import java.util.List; + +@SpringBootApplication +// @EnableDiscoveryClient +public class DemoConsumerApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoConsumerApplication.class, args); + } + + @Configuration + public class RestTemplateConfiguration { + + @Bean + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + } + + @RestController + static class TestController { + + @Autowired + private DiscoveryClient discoveryClient; + @Autowired + private RestTemplate restTemplate; + @Autowired + private LoadBalancerClient loadBalancerClient; + + @GetMapping("/hello") + public String hello(String name) { + // 获得服务 `demo-provider` 的一个实例 + ServiceInstance instance; + if (true) { + // 获取服务 `demo-provider` 对应的实例列表 + List instances = discoveryClient.getInstances("demo-provider"); + // 选择第一个 + instance = instances.size() > 0 ? instances.get(0) : null; + } else { + instance = loadBalancerClient.choose("demo-provider"); + } + // 发起调用 + if (instance == null) { + throw new IllegalStateException("获取不到实例"); + } + String targetUrl = instance.getUri() + "/echo?name=" + name; + String response = restTemplate.getForObject(targetUrl, String.class); + // 返回结果 + return "consumer:" + response; + } + + } + +} diff --git a/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/src/main/resources/application.yaml b/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/src/main/resources/application.yaml new file mode 100644 index 000000000..587e50db8 --- /dev/null +++ b/labx-01/labx-01-sca-nacos-discovery-demo03-consumer/src/main/resources/application.yaml @@ -0,0 +1,23 @@ +spring: + application: + name: demo-consumer # Spring 应用名 + cloud: + nacos: + # Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类 + discovery: + server-addr: 127.0.0.1:8848 # Nacos 服务器地址 + service: ${spring.application.name} # 注册到 Nacos 的服务名。默认值为 ${spring.application.name}。 + +server: + port: 28080 # 服务器端口。默认为 8080 + +management: + endpoints: + web: + exposure: + include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。 + endpoint: + # Health 端点配置项,对应 HealthProperties 配置类 + health: + enabled: true # 是否开启。默认为 true 开启。 + show-details: ALWAYS # 何时显示完整的健康信息。默认为 NEVER 都不展示。可选 WHEN_AUTHORIZED 当经过授权的用户;可选 ALWAYS 总是展示。 diff --git a/labx-01/pom.xml b/labx-01/pom.xml new file mode 100644 index 000000000..628179f03 --- /dev/null +++ b/labx-01/pom.xml @@ -0,0 +1,26 @@ + + + + labs-parent + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + labx-01 + pom + + + labx-01-sca-nacos-discovery-demo01-provider + labx-01-sca-nacos-discovery-demo01-consumer + + labx-01-sca-nacos-discovery-demo02-provider + labx-01-sca-nacos-discovery-demo02-consumer + + labx-01-sca-nacos-discovery-demo03-consumer + + + + diff --git a/labx-02/labx-02-scn-ribbon-demo01-consumer/pom.xml b/labx-02/labx-02-scn-ribbon-demo01-consumer/pom.xml new file mode 100644 index 000000000..d04e05d4b --- /dev/null +++ b/labx-02/labx-02-scn-ribbon-demo01-consumer/pom.xml @@ -0,0 +1,64 @@ + + + + labx-01 + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + labx-02-scn-ribbon-demo01-consumer + + + 2.2.4.RELEASE + Hoxton.SR1 + 2.2.0.RELEASE + + + + + + + org.springframework.boot + spring-boot-starter-parent + ${spring.boot.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring.cloud.version} + pom + import + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring.cloud.alibaba.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + diff --git a/labx-02/labx-02-scn-ribbon-demo01-consumer/src/main/java/cn/iocoder/springcloudnetflix/labx02/ribbondemo/consumer/DemoConsumerApplication.java b/labx-02/labx-02-scn-ribbon-demo01-consumer/src/main/java/cn/iocoder/springcloudnetflix/labx02/ribbondemo/consumer/DemoConsumerApplication.java new file mode 100644 index 000000000..ec59a0213 --- /dev/null +++ b/labx-02/labx-02-scn-ribbon-demo01-consumer/src/main/java/cn/iocoder/springcloudnetflix/labx02/ribbondemo/consumer/DemoConsumerApplication.java @@ -0,0 +1,63 @@ +package cn.iocoder.springcloudnetflix.labx02.ribbondemo.consumer; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +@SpringBootApplication +public class DemoConsumerApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoConsumerApplication.class, args); + } + + @Configuration + public class RestTemplateConfiguration { + + @Bean + @LoadBalanced + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + } + + @RestController + static class TestController { + + @Autowired + private RestTemplate restTemplate; + @Autowired + private LoadBalancerClient loadBalancerClient; + + @GetMapping("/hello") + public String hello(String name) { + // 获得服务 `demo-provider` 的一个实例 + ServiceInstance instance = loadBalancerClient.choose("demo-provider"); + // 发起调用 + String targetUrl = instance.getUri() + "/echo?name=" + name; + String response = restTemplate.getForObject(targetUrl, String.class); + // 返回结果 + return "consumer:" + response; + } + + @GetMapping("/hello02") + public String hello02(String name) { + // 直接使用 RestTemplate 调用服务 `demo-provider` + String targetUrl = "http://demo-provider/echo?name=" + name; + String response = restTemplate.getForObject(targetUrl, String.class); + // 返回结果 + return "consumer:" + response; + } + + } + +} diff --git a/labx-02/labx-02-scn-ribbon-demo01-consumer/src/main/resources/application.yaml b/labx-02/labx-02-scn-ribbon-demo01-consumer/src/main/resources/application.yaml new file mode 100644 index 000000000..ac1a89c81 --- /dev/null +++ b/labx-02/labx-02-scn-ribbon-demo01-consumer/src/main/resources/application.yaml @@ -0,0 +1,17 @@ +spring: + application: + name: demo-consumer # Spring 应用名 + cloud: + nacos: + # Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类 + discovery: + server-addr: 127.0.0.1:8848 # Nacos 服务器地址 + +server: + port: 28080 # 服务器端口。默认为 8080 + +#demo-provider: +# ribbon: +# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule +#ribbon: +# NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule diff --git a/labx-02/labx-02-scn-ribbon-demo01-provider/pom.xml b/labx-02/labx-02-scn-ribbon-demo01-provider/pom.xml new file mode 100644 index 000000000..480e0ee85 --- /dev/null +++ b/labx-02/labx-02-scn-ribbon-demo01-provider/pom.xml @@ -0,0 +1,64 @@ + + + + labx-01 + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + labx-02-scn-ribbon-demo01-provider + + + 2.2.4.RELEASE + Hoxton.SR1 + 2.2.0.RELEASE + + + + + + + org.springframework.boot + spring-boot-starter-parent + ${spring.boot.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring.cloud.version} + pom + import + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring.cloud.alibaba.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + diff --git a/labx-02/labx-02-scn-ribbon-demo01-provider/src/main/java/cn/iocoder/springcloudnetflix/labx02/ribbondemo/provider/DemoProviderApplication.java b/labx-02/labx-02-scn-ribbon-demo01-provider/src/main/java/cn/iocoder/springcloudnetflix/labx02/ribbondemo/provider/DemoProviderApplication.java new file mode 100644 index 000000000..46698510e --- /dev/null +++ b/labx-02/labx-02-scn-ribbon-demo01-provider/src/main/java/cn/iocoder/springcloudnetflix/labx02/ribbondemo/provider/DemoProviderApplication.java @@ -0,0 +1,30 @@ +package cn.iocoder.springcloudnetflix.labx02.ribbondemo.provider; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.discovery.EnableDiscoveryClient; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; + +@SpringBootApplication +public class DemoProviderApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoProviderApplication.class, args); + } + + @RestController + static class TestController { + + @Value("${server.port}") + private Integer serverPort; + + @GetMapping("/echo") + public String echo(String name) { + return serverPort + "-provider:" + name; + } + + } + +} diff --git a/labx-02/labx-02-scn-ribbon-demo01-provider/src/main/resources/application.yaml b/labx-02/labx-02-scn-ribbon-demo01-provider/src/main/resources/application.yaml new file mode 100644 index 000000000..53225aa4a --- /dev/null +++ b/labx-02/labx-02-scn-ribbon-demo01-provider/src/main/resources/application.yaml @@ -0,0 +1,12 @@ +spring: + application: + name: demo-provider # Spring 应用名 + cloud: + nacos: + # Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类 + discovery: + server-addr: 127.0.0.1:8848 # Nacos 服务器地址 + +server: + port: ${random.int[10000,19999]} # 服务器端口。默认为 8080 +# port: 18080 # 服务器端口。默认为 8080 diff --git a/labx-02/labx-02-scn-ribbon-demo02A-consumer/pom.xml b/labx-02/labx-02-scn-ribbon-demo02A-consumer/pom.xml new file mode 100644 index 000000000..f5b38e292 --- /dev/null +++ b/labx-02/labx-02-scn-ribbon-demo02A-consumer/pom.xml @@ -0,0 +1,64 @@ + + + + labx-01 + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + labx-02-scn-ribbon-demo02A-consumer + + + 2.2.4.RELEASE + Hoxton.SR1 + 2.2.0.RELEASE + + + + + + + org.springframework.boot + spring-boot-starter-parent + ${spring.boot.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring.cloud.version} + pom + import + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring.cloud.alibaba.version} + pom + import + + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + diff --git a/labx-02/labx-02-scn-ribbon-demo02A-consumer/src/main/java/cn/iocoder/springcloudnetflix/labx02/ribbondemo/consumer/DemoConsumerApplication.java b/labx-02/labx-02-scn-ribbon-demo02A-consumer/src/main/java/cn/iocoder/springcloudnetflix/labx02/ribbondemo/consumer/DemoConsumerApplication.java new file mode 100644 index 000000000..ec59a0213 --- /dev/null +++ b/labx-02/labx-02-scn-ribbon-demo02A-consumer/src/main/java/cn/iocoder/springcloudnetflix/labx02/ribbondemo/consumer/DemoConsumerApplication.java @@ -0,0 +1,63 @@ +package cn.iocoder.springcloudnetflix.labx02.ribbondemo.consumer; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cloud.client.ServiceInstance; +import org.springframework.cloud.client.loadbalancer.LoadBalanced; +import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.client.RestTemplate; + +@SpringBootApplication +public class DemoConsumerApplication { + + public static void main(String[] args) { + SpringApplication.run(DemoConsumerApplication.class, args); + } + + @Configuration + public class RestTemplateConfiguration { + + @Bean + @LoadBalanced + public RestTemplate restTemplate() { + return new RestTemplate(); + } + + } + + @RestController + static class TestController { + + @Autowired + private RestTemplate restTemplate; + @Autowired + private LoadBalancerClient loadBalancerClient; + + @GetMapping("/hello") + public String hello(String name) { + // 获得服务 `demo-provider` 的一个实例 + ServiceInstance instance = loadBalancerClient.choose("demo-provider"); + // 发起调用 + String targetUrl = instance.getUri() + "/echo?name=" + name; + String response = restTemplate.getForObject(targetUrl, String.class); + // 返回结果 + return "consumer:" + response; + } + + @GetMapping("/hello02") + public String hello02(String name) { + // 直接使用 RestTemplate 调用服务 `demo-provider` + String targetUrl = "http://demo-provider/echo?name=" + name; + String response = restTemplate.getForObject(targetUrl, String.class); + // 返回结果 + return "consumer:" + response; + } + + } + +} diff --git a/labx-02/labx-02-scn-ribbon-demo02A-consumer/src/main/resources/application.yaml b/labx-02/labx-02-scn-ribbon-demo02A-consumer/src/main/resources/application.yaml new file mode 100644 index 000000000..27eb5d0a8 --- /dev/null +++ b/labx-02/labx-02-scn-ribbon-demo02A-consumer/src/main/resources/application.yaml @@ -0,0 +1,16 @@ +spring: + application: + name: demo-consumer # Spring 应用名 + cloud: + nacos: + # Nacos 作为注册中心的配置项,对应 NacosDiscoveryProperties 配置类 + discovery: + server-addr: 127.0.0.1:8848 # Nacos 服务器地址 + +server: + port: 28080 # 服务器端口。默认为 8080 + +# 设置 Ribbon 客户端的自定义配置 +demo-provider: + ribbon: + NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule diff --git a/labx-02/pom.xml b/labx-02/pom.xml new file mode 100644 index 000000000..2ed9f34aa --- /dev/null +++ b/labx-02/pom.xml @@ -0,0 +1,21 @@ + + + + labs-parent + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + labx-02 + + + labx-02-scn-ribbon-demo01-provider + labx-02-scn-ribbon-demo01-consumer + + labx-02-scn-ribbon-demo02A-consumer + + + diff --git a/pom.xml b/pom.xml index 2003d843d..b76a850fc 100644 --- a/pom.xml +++ b/pom.xml @@ -48,7 +48,18 @@ lab-37 lab-38 lab-39 + lab-40 + lab-41 + lab-42 + lab-43 + lab-44 + lab-45 + lab-46 + lab-47 + lab-48 + lab-49 + labx-01 + labx-02 -