Repository: yudaocode/SpringBoot-Labs
Branch: master
Commit: 6c12efaed06d
Files: 3513
Total size: 3.4 MB
Directory structure:
gitextract_g84ntzib/
├── .gitignore
├── README.md
├── httpRequests/
│ ├── 2020-12-20T004250.200.json
│ ├── 2020-12-20T004328.500.json
│ ├── 2020-12-20T004337.200.json
│ ├── 2020-12-20T004347.200.json
│ ├── 2020-12-20T004347.500.json
│ ├── 2020-12-20T004358.200.json
│ ├── 2020-12-20T004358.500.json
│ ├── 2020-12-20T004401.200.json
│ ├── 2020-12-20T004401.500.json
│ ├── 2020-12-20T004538.200.json
│ ├── 2020-12-20T004547.500.json
│ ├── 2020-12-20T004638.500.json
│ ├── 2020-12-20T004645.500.json
│ ├── 2020-12-20T004809.200.json
│ ├── 2020-12-20T004813.500.json
│ ├── 2020-12-20T010724.200.json
│ ├── 2020-12-20T010738.200.json
│ ├── 2020-12-20T010809.200.json
│ ├── 2020-12-20T010823.500.json
│ ├── 2020-12-20T010840.200.json
│ ├── 2020-12-20T011020.500.json
│ ├── 2020-12-20T011347.500.json
│ ├── 2020-12-20T011526.200.json
│ ├── 2020-12-20T011530.200.json
│ ├── 2020-12-20T011541.400.json
│ ├── 2020-12-20T011551.500.json
│ ├── 2020-12-20T011556.200.json
│ ├── 2020-12-20T011628-1.200.json
│ ├── 2020-12-20T011628.200.json
│ ├── 2020-12-20T011646.200.json
│ ├── 2020-12-20T011650.200.json
│ ├── 2020-12-20T011653.500.json
│ ├── 2020-12-20T011818.200.json
│ ├── 2020-12-20T011843.200.json
│ ├── 2020-12-20T011847.500.json
│ ├── 2020-12-20T012507.200.json
│ ├── 2020-12-20T012510.200.json
│ ├── 2020-12-20T012527.200.json
│ ├── 2020-12-20T012540.400.json
│ ├── 2020-12-20T012544.200.json
│ ├── 2020-12-20T012703.500.json
│ ├── 2020-12-20T012708.200.json
│ ├── 2020-12-20T012710.200.json
│ ├── 2020-12-20T013544.200.json
│ ├── 2020-12-20T013552.200.json
│ ├── 2020-12-20T013558.500.json
│ ├── 2020-12-20T013845.200.json
│ ├── 2020-12-20T014019.200.json
│ ├── 2020-12-20T021415.200.json
│ ├── http-client.cookies
│ └── http-requests-log.http
├── lab-01-spring-security/
│ ├── lab-01-springsecurity-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab01/
│ │ │ └── springsecurity/
│ │ │ ├── Application.java
│ │ │ └── controller/
│ │ │ └── AdminController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-01-springsecurity-demo-role/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab01/
│ │ └── springsecurity/
│ │ ├── Application.java
│ │ ├── config/
│ │ │ └── SecurityConfig.java
│ │ └── controller/
│ │ ├── DemoController.java
│ │ └── TestController.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 安全框架 Spring Security 入门》.md
├── lab-02-spring-security-oauth/
│ ├── authorization-code-server/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── labs/
│ │ │ └── lab01/
│ │ │ ├── Application.java
│ │ │ ├── authorization/
│ │ │ │ └── OAuth2AuthorizationServer.java
│ │ │ └── resource/
│ │ │ ├── OAuth2ResourceServer.java
│ │ │ └── api/
│ │ │ └── ExampleController.java
│ │ └── resources/
│ │ └── application.properties
│ ├── client-credentials-server/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── lab01/
│ │ ├── Application.java
│ │ ├── authorization/
│ │ │ └── OAuth2AuthorizationServer.java
│ │ └── resource/
│ │ ├── OAuth2ResourceServer.java
│ │ └── api/
│ │ └── ExampleController.java
│ ├── implicit-server/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── lab01/
│ │ │ ├── Application.java
│ │ │ ├── authorization/
│ │ │ │ └── OAuth2AuthorizationServer.java
│ │ │ └── resource/
│ │ │ ├── OAuth2ResourceServer.java
│ │ │ └── api/
│ │ │ └── ExampleController.java
│ │ └── resources/
│ │ └── application.properties
│ ├── pom.xml
│ ├── resource-owner-password-credentials-server/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── lab01/
│ │ │ ├── Application.java
│ │ │ ├── authorization/
│ │ │ │ └── OAuth2AuthorizationServer.java
│ │ │ └── resource/
│ │ │ ├── OAuth2ResourceServer.java
│ │ │ └── api/
│ │ │ └── ExampleController.java
│ │ └── resources/
│ │ └── application.properties
│ ├── resource-owner-password-credentials-server-by-jdbc-token-store/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── lab02/
│ │ │ ├── Application.java
│ │ │ ├── authorization/
│ │ │ │ └── OAuth2AuthorizationServer.java
│ │ │ └── resource/
│ │ │ ├── OAuth2ResourceServer.java
│ │ │ └── api/
│ │ │ └── ExampleController.java
│ │ └── resources/
│ │ ├── application.properties
│ │ ├── data.sql
│ │ └── schema.sql
│ ├── resource-owner-password-credentials-server-with-refresh-token/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── lab01/
│ │ │ ├── Application.java
│ │ │ ├── authorization/
│ │ │ │ └── OAuth2AuthorizationServer.java
│ │ │ └── resource/
│ │ │ ├── OAuth2ResourceServer.java
│ │ │ └── api/
│ │ │ └── ExampleController.java
│ │ └── resources/
│ │ └── application.properties
│ ├── resource-owner-password-credentials-server-with-revoke-token/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── lab2/
│ │ │ ├── Application.java
│ │ │ ├── authorization/
│ │ │ │ ├── OAuth2AuthorizationServer.java
│ │ │ │ └── token/
│ │ │ │ └── TokenController.java
│ │ │ └── resource/
│ │ │ ├── OAuth2ResourceServer.java
│ │ │ └── api/
│ │ │ └── ExampleController.java
│ │ └── resources/
│ │ └── application.properties
│ ├── 《芋道 Spring Security OAuth2 入门(新)》.md
│ └── 《芋道 Spring Security OAuth2 入门(老)》.md
├── lab-03-kafka/
│ ├── lab-03-kafka-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab03/
│ │ │ │ └── kafkademo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── KafkaConfiguration.java
│ │ │ │ ├── consumer/
│ │ │ │ │ ├── Demo01AConsumer.java
│ │ │ │ │ ├── Demo01Consumer.java
│ │ │ │ │ └── Demo04Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ ├── Demo01Message.java
│ │ │ │ │ └── Demo04Message.java
│ │ │ │ └── producer/
│ │ │ │ ├── Demo01Producer.java
│ │ │ │ └── Demo04Producer.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ └── application_bak.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab03/
│ │ └── kafkademo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ ├── Demo01ProducerTest.java
│ │ └── Demo04ProducerTest.java
│ ├── lab-03-kafka-demo-ack/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab03/
│ │ │ │ └── kafkademo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo08Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo08Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo08Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab03/
│ │ └── kafkademo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo08ProducerTest.java
│ ├── lab-03-kafka-demo-batch/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab03/
│ │ │ │ └── kafkademo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo02Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo02Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo02Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab03/
│ │ └── kafkademo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo02ProducerTest.java
│ ├── lab-03-kafka-demo-batch-consume/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab03/
│ │ │ │ └── kafkademo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo02Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo02Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo02Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab03/
│ │ └── kafkademo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo02ProducerTest.java
│ ├── lab-03-kafka-demo-broadcast/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab03/
│ │ │ │ └── kafkademo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo05Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo05Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo05Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab03/
│ │ └── kafkademo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo05ProducerTest.java
│ ├── lab-03-kafka-demo-concurrency/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab03/
│ │ │ │ └── kafkademo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo06Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo06Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo06Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab03/
│ │ └── kafkademo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo06ProducerTest.java
│ ├── lab-03-kafka-demo-transaction/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab03/
│ │ │ │ └── kafkademo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo07Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo07Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo07Producer.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ └── application_bak.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab03/
│ │ └── kafkademo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo07ProducerTest.java
│ ├── lab-03-kafka-native/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab03/
│ │ └── kafkademo/
│ │ ├── ConsumerMain.java
│ │ └── ProducerMain.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 消息队列 Kafka 入门》.md
├── lab-04-rabbitmq/
│ ├── lab-04-rabbitmq-consume-retry/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab04/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RabbitConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ ├── Demo07Consumer.java
│ │ │ │ │ └── Demo07DeadConsumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo07Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo07Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo07ProducerTest.java
│ ├── lab-04-rabbitmq-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab04/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RabbitConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ ├── Demo01Consumer.java
│ │ │ │ │ ├── Demo02Consumer.java
│ │ │ │ │ ├── Demo03ConsumerA.java
│ │ │ │ │ ├── Demo03ConsumerB.java
│ │ │ │ │ └── Demo04Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ ├── Demo01Message.java
│ │ │ │ │ ├── Demo02Message.java
│ │ │ │ │ ├── Demo03Message.java
│ │ │ │ │ └── Demo04Message.java
│ │ │ │ └── producer/
│ │ │ │ ├── Demo01Producer.java
│ │ │ │ ├── Demo02Producer.java
│ │ │ │ ├── Demo03Producer.java
│ │ │ │ └── Demo04Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ ├── Demo01ProducerTest.java
│ │ ├── Demo02ProducerTest.java
│ │ ├── Demo03ProducerTest.java
│ │ └── Demo04ProducerTest.java
│ ├── lab-04-rabbitmq-demo-ack/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab04/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RabbitConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo12Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo12Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo12Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo12ProducerTest.java
│ ├── lab-04-rabbitmq-demo-batch/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab04/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RabbitConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo05Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo05Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo05Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo05ProducerTest.java
│ ├── lab-04-rabbitmq-demo-batch-consume/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab04/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RabbitConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo05Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo05Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo06Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo05ProducerTest.java
│ ├── lab-04-rabbitmq-demo-batch-consume-02/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab04/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RabbitConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo06Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo06Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo06Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo06ProducerTest.java
│ ├── lab-04-rabbitmq-demo-concurrency/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab04/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RabbitConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo09Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo09Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo09Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo09ProducerTest.java
│ ├── lab-04-rabbitmq-demo-confirm/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab04/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RabbitConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo13Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo13Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo13Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo13ProducerTest.java
│ ├── lab-04-rabbitmq-demo-confirm-async/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab04/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RabbitConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo13Consumer.java
│ │ │ │ ├── core/
│ │ │ │ │ ├── RabbitProducerConfirmCallback.java
│ │ │ │ │ └── RabbitProducerReturnCallback.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo13Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo13Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo13ProducerTest.java
│ ├── lab-04-rabbitmq-demo-delay/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab04/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RabbitConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo08Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo08Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo08Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo08ProducerTest.java
│ ├── lab-04-rabbitmq-demo-error-handler/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab04/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RabbitConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo16Consumer.java
│ │ │ │ ├── core/
│ │ │ │ │ ├── RabbitListenerErrorHandlerImpl.java
│ │ │ │ │ └── RabbitLoggingErrorHandler.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo16Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo16Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo16ProducerTest.java
│ ├── lab-04-rabbitmq-demo-json/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab04/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RabbitConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo15Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo15Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo15Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo15ProducerTest.java
│ ├── lab-04-rabbitmq-demo-message-model/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab04/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RabbitConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ ├── BroadcastConsumer.java
│ │ │ │ │ └── ClusteringConsumer.java
│ │ │ │ ├── message/
│ │ │ │ │ ├── BroadcastMessage.java
│ │ │ │ │ └── ClusteringMessage.java
│ │ │ │ └── producer/
│ │ │ │ ├── BroadcastProducer.java
│ │ │ │ └── ClusteringProducer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ ├── BroadcastProducerTest.java
│ │ └── ClusteringProducerTest.java
│ ├── lab-04-rabbitmq-demo-orderly/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab04/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RabbitConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo10Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo10Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo10Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo10ProducerTest.java
│ ├── lab-04-rabbitmq-demo-rpc/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab04/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RabbitConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo14Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo14Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo14Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo14ProducerTest.java
│ ├── lab-04-rabbitmq-demo-transaction/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab04/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RabbitConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo11Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo11Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo11Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo11ProducerTest.java
│ ├── lab-04-rabbitmq-native/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab04/
│ │ └── rabbitmqdemo/
│ │ ├── RabbitMQConsumer.java
│ │ └── RabbitMQProducer.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 消息队列 RabbitMQ 入门》.md
├── lab-05-benchmark-tomcat-jetty-undertow/
│ ├── lab-05-jetty/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── labs/
│ │ └── lab05/
│ │ └── tomcat/
│ │ ├── Controller.java
│ │ └── JettyApplication.java
│ ├── lab-05-tomcat/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── labs/
│ │ └── lab05/
│ │ └── tomcat/
│ │ ├── Controller.java
│ │ └── TomcatApplication.java
│ ├── lab-05-tomcat-apr/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── labs/
│ │ └── lab05/
│ │ └── tomcat/
│ │ ├── Controller.java
│ │ └── TomcatAprApplication.java
│ ├── lab-05-undertow/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── labs/
│ │ └── lab05/
│ │ └── undertow/
│ │ ├── Controller.java
│ │ └── UndertowApplication.java
│ ├── pom.xml
│ └── 《性能测试 —— Tomcat、Jetty、Undertow 基准测试》.md
├── lab-06/
│ ├── lab-06-springmvc-tomcat/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── labs/
│ │ └── lab06/
│ │ └── springmvc/
│ │ ├── Controller.java
│ │ └── SpringMVCApplication.java
│ ├── lab-06-webflux-netty/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── labs/
│ │ └── lab06/
│ │ └── webflux/
│ │ ├── Controller.java
│ │ └── WebfluxNettyApplication.java
│ ├── lab-06-webflux-tomcat/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── labs/
│ │ └── lab06/
│ │ └── webflux/
│ │ ├── Controller.java
│ │ └── WebfluxTomcatApplication.java
│ ├── pom.xml
│ └── 《性能测试 —— SpringMVC、Webflux 基准测试》.md
├── lab-07/
│ ├── lab-07-spring-cloud-gateway/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── labs/
│ │ │ └── lab07/
│ │ │ └── springcloudgateway/
│ │ │ └── SpringCloudGatewayApplication.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-07-zuul/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── labs/
│ │ │ └── lab07/
│ │ │ └── zuul/
│ │ │ └── ZuulApplication.java
│ │ └── resources/
│ │ └── application.yml
│ ├── pom.xml
│ └── 《性能测试 —— Spring Cloud Gateway、Zuul 基准测试》.md
├── lab-11-spring-data-redis/
│ ├── lab-07-spring-data-redis-unit-test/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── labs/
│ │ │ │ └── lab10/
│ │ │ │ └── springdatarediswithjedis/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RedisConfiguration.java
│ │ │ │ └── util/
│ │ │ │ └── JSONUtil.java
│ │ │ └── resources/
│ │ │ ├── application.yml
│ │ │ └── redisson.yml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── labs/
│ │ └── lab10/
│ │ └── springdatarediswithjedis/
│ │ ├── Test01.java
│ │ └── config/
│ │ └── TestRedisConfiguration.java
│ ├── lab-07-spring-data-redis-with-jedis/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── labs/
│ │ │ │ └── lab10/
│ │ │ │ └── springdatarediswithjedis/
│ │ │ │ ├── Application.java
│ │ │ │ ├── cacheobject/
│ │ │ │ │ ├── ProductCacheObject.java
│ │ │ │ │ └── UserCacheObject.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RedisConfiguration.java
│ │ │ │ ├── dao/
│ │ │ │ │ ├── package-info.java
│ │ │ │ │ └── redis/
│ │ │ │ │ └── UserCacheDao.java
│ │ │ │ ├── listener/
│ │ │ │ │ ├── TestChannelTopicMessageListener.java
│ │ │ │ │ └── TestPatternTopicMessageListener.java
│ │ │ │ ├── service/
│ │ │ │ │ ├── UserService01.java
│ │ │ │ │ └── UserService02.java
│ │ │ │ └── util/
│ │ │ │ └── JSONUtil.java
│ │ │ └── resources/
│ │ │ ├── application.yml
│ │ │ └── lua/
│ │ │ ├── compareAndSet.lua
│ │ │ ├── compareAndSet2.lua
│ │ │ └── test.lua
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── labs/
│ │ └── lab10/
│ │ └── springdatarediswithjedis/
│ │ ├── PipelineTest.java
│ │ ├── PubSubTest.java
│ │ ├── ScriptTest.java
│ │ ├── SessionTest.java
│ │ ├── Test01.java
│ │ ├── TransactionTest.java
│ │ ├── UserService02Test.java
│ │ └── package-info.java
│ ├── lab-07-spring-data-redis-with-redisson/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── labs/
│ │ │ │ └── lab10/
│ │ │ │ └── springdatarediswithjedis/
│ │ │ │ ├── Application.java
│ │ │ │ ├── cacheobject/
│ │ │ │ │ ├── ProductCacheObject.java
│ │ │ │ │ └── UserCacheObject.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RedisConfiguration.java
│ │ │ │ ├── dao/
│ │ │ │ │ ├── package-info.java
│ │ │ │ │ └── redis/
│ │ │ │ │ └── UserCacheDao.java
│ │ │ │ ├── listener/
│ │ │ │ │ ├── TestChannelTopicMessageListener.java
│ │ │ │ │ └── TestPatternTopicMessageListener.java
│ │ │ │ ├── service/
│ │ │ │ │ ├── UserService01.java
│ │ │ │ │ └── UserService02.java
│ │ │ │ └── util/
│ │ │ │ └── JSONUtil.java
│ │ │ └── resources/
│ │ │ ├── application.yml
│ │ │ ├── lua/
│ │ │ │ ├── compareAndSet.lua
│ │ │ │ ├── compareAndSet2.lua
│ │ │ │ └── test.lua
│ │ │ └── redisson.yml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── labs/
│ │ └── lab10/
│ │ └── springdatarediswithjedis/
│ │ ├── LockTest.java
│ │ ├── PipelineTest.java
│ │ ├── PubSubTest.java
│ │ ├── RateLimiterTest.java
│ │ ├── ScriptTest.java
│ │ ├── SessionTest.java
│ │ ├── Test01.java
│ │ ├── TransactionTest.java
│ │ ├── UserService02Test.java
│ │ └── package-info.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot Redis 入门》.md
├── lab-12-mybatis/
│ ├── lab-12-mybatis-annotation/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab12/
│ │ │ │ └── mybatis/
│ │ │ │ ├── Application.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ └── UserDO.java
│ │ │ │ └── mapper/
│ │ │ │ └── UserMapper.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ ├── mapper/
│ │ │ │ └── UserMapper.xml
│ │ │ ├── mybatis-config.xml
│ │ │ └── sql/
│ │ │ └── users.sql
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab12/
│ │ └── mybatis/
│ │ └── mapper/
│ │ └── UserMapperTest.java
│ ├── lab-12-mybatis-plus/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab12/
│ │ │ │ └── mybatis/
│ │ │ │ ├── Application.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ └── UserDO.java
│ │ │ │ └── mapper/
│ │ │ │ └── UserMapper.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ ├── mapper/
│ │ │ │ └── UserMapper.xml
│ │ │ └── sql/
│ │ │ └── users.sql
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab12/
│ │ └── mybatis/
│ │ └── mapper/
│ │ └── UserMapperTest.java
│ ├── lab-12-mybatis-plus-tenant/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab12/
│ │ │ │ └── mybatis/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── AsyncConfig.java
│ │ │ │ │ └── MybatisPlusConfig.java
│ │ │ │ ├── context/
│ │ │ │ │ └── TenantHolder.java
│ │ │ │ ├── core/
│ │ │ │ │ └── TtlThreadPoolTaskExecutor.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ ├── UserDO.java
│ │ │ │ │ └── UserProfileDO.java
│ │ │ │ ├── mapper/
│ │ │ │ │ ├── UserMapper.java
│ │ │ │ │ └── UserProfileMapper.java
│ │ │ │ ├── service/
│ │ │ │ │ └── UserService.java
│ │ │ │ ├── util/
│ │ │ │ │ └── TtlExecutorsUtil.java
│ │ │ │ └── vo/
│ │ │ │ └── UserDetailVO.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ ├── mapper/
│ │ │ │ └── UserMapper.xml
│ │ │ └── sql/
│ │ │ └── users.sql
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab12/
│ │ └── mybatis/
│ │ ├── mapper/
│ │ │ └── UserMapperTest.java
│ │ └── service/
│ │ └── UserServiceTest.java
│ ├── lab-12-mybatis-tk/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab12/
│ │ │ │ └── mybatis/
│ │ │ │ ├── Application.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ └── UserDO.java
│ │ │ │ ├── mapper/
│ │ │ │ │ └── UserMapper.java
│ │ │ │ └── util/
│ │ │ │ └── BaseMapper.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ ├── mapper/
│ │ │ │ └── UserMapper.xml
│ │ │ ├── mybatis-config.xml
│ │ │ └── sql/
│ │ │ └── users.sql
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab12/
│ │ └── mybatis/
│ │ └── mapper/
│ │ └── UserMapperTest.java
│ ├── lab-12-mybatis-xml/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab12/
│ │ │ │ └── mybatis/
│ │ │ │ ├── Application.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ └── UserDO.java
│ │ │ │ └── mapper/
│ │ │ │ └── UserMapper.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ ├── mapper/
│ │ │ │ └── UserMapper.xml
│ │ │ ├── mybatis-config.xml
│ │ │ └── sql/
│ │ │ └── users.sql
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab12/
│ │ └── mybatis/
│ │ └── mapper/
│ │ └── UserMapperTest.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot MyBatis 入门》.md
├── lab-13-spring-data-jpa/
│ ├── lab-13-jpa/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab13/
│ │ │ │ └── jpa/
│ │ │ │ ├── Application.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ └── UserDO.java
│ │ │ │ └── repository/
│ │ │ │ ├── UserRepository01.java
│ │ │ │ ├── UserRepository02.java
│ │ │ │ ├── UserRepository03.java
│ │ │ │ └── UserRepository04.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab13/
│ │ └── jpa/
│ │ └── repository/
│ │ ├── UserRepository01Test.java
│ │ ├── UserRepository02Test.java
│ │ ├── UserRepository03Test.java
│ │ └── UserRepository04Test.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot JPA 入门》.md
├── lab-14-spring-jdbc-template/
│ ├── lab-14-jdbctemplate/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab14/
│ │ │ │ └── jdbctemplate/
│ │ │ │ ├── Application.java
│ │ │ │ ├── dao/
│ │ │ │ │ └── UserDao.java
│ │ │ │ └── dataobject/
│ │ │ │ └── UserDO.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab14/
│ │ └── jdbctemplate/
│ │ └── dao/
│ │ └── UserDaoTest.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot JdbcTemplate 入门》.md
├── lab-15-spring-data-es/
│ ├── lab-15-spring-data-elasticsearch/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab15/
│ │ │ │ └── springdataelasticsearch/
│ │ │ │ ├── Application.java
│ │ │ │ ├── bo/
│ │ │ │ │ └── ProductConditionBO.java
│ │ │ │ ├── constant/
│ │ │ │ │ └── FieldAnalyzer.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ └── ESProductDO.java
│ │ │ │ └── repository/
│ │ │ │ └── ProductRepository.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab15/
│ │ └── springdataelasticsearch/
│ │ └── repository/
│ │ ├── ProductRepository04Test.java
│ │ └── ProductRepositoryTest.java
│ ├── lab-15-spring-data-jest/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab15/
│ │ │ │ └── springdatajest/
│ │ │ │ ├── Application.java
│ │ │ │ ├── constant/
│ │ │ │ │ └── FieldAnalyzer.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ └── ESProductDO.java
│ │ │ │ └── repository/
│ │ │ │ ├── ProductRepository.java
│ │ │ │ ├── ProductRepository02.java
│ │ │ │ └── ProductRepository03.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab15/
│ │ └── springdatajest/
│ │ └── repository/
│ │ ├── ProductRepository02Test.java
│ │ ├── ProductRepository03Test.java
│ │ └── ProductRepositoryTest.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot Elasticsearch 入门》.md
├── lab-16-spring-data-mongo/
│ ├── lab-16-spring-data-mongodb/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab16/
│ │ │ │ └── springdatamongodb/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── MongoDBConfig.java
│ │ │ │ ├── dao/
│ │ │ │ │ └── UserDao.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ ├── ProductDO.java
│ │ │ │ │ └── UserDO.java
│ │ │ │ ├── mongo/
│ │ │ │ │ ├── IncIdEntity.java
│ │ │ │ │ └── MongoInsertEventListener.java
│ │ │ │ └── repository/
│ │ │ │ ├── ProductRepository.java
│ │ │ │ ├── UserRepository.java
│ │ │ │ ├── UserRepository02.java
│ │ │ │ └── UserRepository03.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab16/
│ │ └── springdatamongodb/
│ │ ├── dao/
│ │ │ └── UserDaoTest.java
│ │ └── repository/
│ │ ├── ProductRepositoryTest.java
│ │ ├── UserRepository02Test.java
│ │ ├── UserRepository03Test.java
│ │ └── UserRepositoryTest.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot MongoDB 入门》.md
├── lab-17/
│ ├── lab-17-dynamic-datasource-baomidou-01/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab17/
│ │ │ │ └── dynamicdatasource/
│ │ │ │ ├── Application.java
│ │ │ │ ├── constant/
│ │ │ │ │ └── DBConstants.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ ├── OrderDO.java
│ │ │ │ │ └── UserDO.java
│ │ │ │ ├── mapper/
│ │ │ │ │ ├── OrderMapper.java
│ │ │ │ │ └── UserMapper.java
│ │ │ │ └── service/
│ │ │ │ └── OrderService.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ ├── mapper/
│ │ │ │ ├── OrderMapper.xml
│ │ │ │ └── UserMapper.xml
│ │ │ ├── mybatis-config.xml
│ │ │ └── sql/
│ │ │ └── db.sql
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab17/
│ │ └── dynamicdatasource/
│ │ ├── mapper/
│ │ │ ├── OrderMapperTest.java
│ │ │ └── UserMapperTest.java
│ │ └── service/
│ │ └── OrderServiceTest.java
│ ├── lab-17-dynamic-datasource-baomidou-02/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab17/
│ │ │ │ └── dynamicdatasource/
│ │ │ │ ├── Application.java
│ │ │ │ ├── constant/
│ │ │ │ │ └── DBConstants.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ └── OrderDO.java
│ │ │ │ ├── mapper/
│ │ │ │ │ └── OrderMapper.java
│ │ │ │ └── service/
│ │ │ │ └── OrderService.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ ├── mapper/
│ │ │ │ └── OrderMapper.xml
│ │ │ ├── mybatis-config.xml
│ │ │ └── sql/
│ │ │ └── db.sql
│ │ └── test/
│ │ └── java/
│ │ └── dynamicdatasource/
│ │ ├── mapper/
│ │ │ └── OrderMapperTest.java
│ │ └── service/
│ │ └── OrderServiceTest.java
│ ├── lab-17-dynamic-datasource-jdbctemplate/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab17/
│ │ │ │ └── dynamicdatasource/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── JdbcTemplateOrdersConfig.java
│ │ │ │ │ └── JdbcTemplateUsersConfig.java
│ │ │ │ ├── constant/
│ │ │ │ │ └── DBConstants.java
│ │ │ │ ├── dao/
│ │ │ │ │ ├── OrderDao.java
│ │ │ │ │ └── UserDao.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ ├── OrderDO.java
│ │ │ │ │ └── UserDO.java
│ │ │ │ └── service/
│ │ │ │ └── OrderService.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab17/
│ │ └── dynamicdatasource/
│ │ ├── dao/
│ │ │ ├── OrderDaoTest.java
│ │ │ └── UserDaoTest.java
│ │ ├── package-info.java
│ │ └── service/
│ │ └── OrderServiceTest.java
│ ├── lab-17-dynamic-datasource-mybatis/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab17/
│ │ │ │ └── dynamicdatasource/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── MyBatisOrdersConfig.java
│ │ │ │ │ └── MyBatisUsersConfig.java
│ │ │ │ ├── constant/
│ │ │ │ │ └── DBConstants.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ ├── OrderDO.java
│ │ │ │ │ └── UserDO.java
│ │ │ │ ├── mapper/
│ │ │ │ │ ├── orders/
│ │ │ │ │ │ └── OrderMapper.java
│ │ │ │ │ └── users/
│ │ │ │ │ └── UserMapper.java
│ │ │ │ └── service/
│ │ │ │ └── OrderService.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ ├── mapper/
│ │ │ │ ├── orders/
│ │ │ │ │ └── OrderMapper.xml
│ │ │ │ └── users/
│ │ │ │ └── UserMapper.xml
│ │ │ ├── mybatis-config.xml
│ │ │ └── sql/
│ │ │ └── db.sql
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab17/
│ │ └── dynamicdatasource/
│ │ ├── mapper/
│ │ │ ├── orders/
│ │ │ │ └── OrderMapperTest.java
│ │ │ └── users/
│ │ │ └── UserMapperTest.java
│ │ ├── package-info.java
│ │ └── service/
│ │ └── OrderServiceTest.java
│ ├── lab-17-dynamic-datasource-sharding-jdbc-01/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab17/
│ │ │ │ └── dynamicdatasource/
│ │ │ │ ├── Application.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ ├── OrderDO.java
│ │ │ │ │ └── UserDO.java
│ │ │ │ ├── mapper/
│ │ │ │ │ ├── OrderMapper.java
│ │ │ │ │ └── UserMapper.java
│ │ │ │ └── service/
│ │ │ │ └── OrderService.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ ├── mapper/
│ │ │ │ ├── OrderMapper.xml
│ │ │ │ └── UserMapper.xml
│ │ │ ├── mybatis-config.xml
│ │ │ └── sql/
│ │ │ └── db.sql
│ │ └── test/
│ │ └── java/
│ │ └── dynamicdatasource/
│ │ ├── mapper/
│ │ │ ├── OrderMapperTest.java
│ │ │ └── UserMapperTest.java
│ │ └── service/
│ │ └── OrderServiceTest.java
│ ├── lab-17-dynamic-datasource-sharding-jdbc-02/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab17/
│ │ │ │ └── dynamicdatasource/
│ │ │ │ ├── Application.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ └── OrderDO.java
│ │ │ │ ├── mapper/
│ │ │ │ │ └── OrderMapper.java
│ │ │ │ └── service/
│ │ │ │ └── OrderService.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ ├── mapper/
│ │ │ │ └── OrderMapper.xml
│ │ │ ├── mybatis-config.xml
│ │ │ └── sql/
│ │ │ └── db.sql
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab17/
│ │ └── dynamicdatasource/
│ │ ├── mapper/
│ │ │ └── OrderMapperTest.java
│ │ └── service/
│ │ └── OrderServiceTest.java
│ ├── lab-17-dynamic-datasource-springdatajpa/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab17/
│ │ │ │ └── dynamicdatasource/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── HibernateConfig.java
│ │ │ │ │ ├── JpaOrdersConfig.java
│ │ │ │ │ └── JpaUsersConfig.java
│ │ │ │ ├── constant/
│ │ │ │ │ └── DBConstants.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ ├── OrderDO.java
│ │ │ │ │ └── UserDO.java
│ │ │ │ ├── repository/
│ │ │ │ │ ├── orders/
│ │ │ │ │ │ └── OrderRepository.java
│ │ │ │ │ └── users/
│ │ │ │ │ └── UserRepository.java
│ │ │ │ └── service/
│ │ │ │ └── OrderService.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ └── sql/
│ │ │ └── db.sql
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab17/
│ │ └── dynamicdatasource/
│ │ ├── package-info.java
│ │ ├── repository/
│ │ │ ├── orders/
│ │ │ │ └── OrderRepositoryTest.java
│ │ │ └── users/
│ │ │ └── UserRepositoryTest.java
│ │ └── service/
│ │ └── OrderServiceTest.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 多数据源(读写分离)入门》.md
├── lab-18/
│ ├── lab-18-sharding-datasource-01/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab18/
│ │ │ │ └── shardingdatasource/
│ │ │ │ ├── Application.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ ├── OrderConfigDO.java
│ │ │ │ │ └── OrderDO.java
│ │ │ │ └── mapper/
│ │ │ │ ├── OrderConfigMapper.java
│ │ │ │ └── OrderMapper.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ ├── mapper/
│ │ │ │ ├── OrderConfigMapper.xml
│ │ │ │ └── OrderMapper.xml
│ │ │ ├── mybatis-config.xml
│ │ │ └── sql/
│ │ │ ├── lab18_orders_0.sql
│ │ │ └── lab18_orders_1.sql
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab18/
│ │ └── shardingdatasource/
│ │ └── mapper/
│ │ ├── OrderConfigMapperTest.java
│ │ └── OrderMapperTest.java
│ ├── lab-18-sharding-datasource-02/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab18/
│ │ │ │ └── shardingdatasource/
│ │ │ │ ├── Application.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ └── OrderDO.java
│ │ │ │ ├── mapper/
│ │ │ │ │ └── OrderMapper.java
│ │ │ │ └── service/
│ │ │ │ └── OrderService.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab18/
│ │ └── shardingdatasource/
│ │ ├── mapper/
│ │ │ └── OrderMapperTest.java
│ │ └── service/
│ │ └── OrderServiceTest.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 分库分表入门》.md
├── lab-19/
│ ├── lab-19-datasource-pool-druid-multiple/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab19/
│ │ │ └── datasourcepool/
│ │ │ ├── Application.java
│ │ │ └── config/
│ │ │ └── DataSourceConfig.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-19-datasource-pool-druid-single/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab19/
│ │ │ └── datasourcepool/
│ │ │ ├── Application.java
│ │ │ └── controller/
│ │ │ └── DruidStatController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-19-datasource-pool-hikaricp-multiple/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab19/
│ │ │ └── datasourcepool/
│ │ │ ├── Application.java
│ │ │ └── config/
│ │ │ └── DataSourceConfig.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-19-datasource-pool-hikaricp-single/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab19/
│ │ │ └── datasourcepool/
│ │ │ └── Application.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Boot 数据库连接池入门》.md
├── lab-20/
│ ├── lab-20-database-version-control-flyway/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab20/
│ │ │ └── databaseversioncontrol/
│ │ │ ├── Application.java
│ │ │ └── migration/
│ │ │ ├── ExampleFlywayCallback.java
│ │ │ └── V1_1__FixUsername.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ └── db/
│ │ └── migration/
│ │ └── V1.0__INIT_DB.sql
│ ├── lab-20-database-version-control-liquibase/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab20/
│ │ │ └── databaseversioncontrol/
│ │ │ ├── Application.java
│ │ │ └── migration/
│ │ │ └── CHANGE_SET_3_FixUsername.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ └── db/
│ │ └── changelog/
│ │ ├── db.changelog-master-bak.yaml
│ │ ├── db.changelog-master.yaml
│ │ └── sqlfile/
│ │ └── CHAGE_SET_2_INIT_DB.sql
│ ├── pom.xml
│ └── 《芋道 Spring Boot 数据库版本管理入门》.md
├── lab-21/
│ ├── lab-21-cache-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab21/
│ │ │ │ └── cache/
│ │ │ │ ├── Application.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ └── UserDO.java
│ │ │ │ ├── mapper/
│ │ │ │ │ ├── UserCacheDao.java
│ │ │ │ │ └── UserMapper.java
│ │ │ │ └── service/
│ │ │ │ └── UserService.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ └── sql/
│ │ │ └── users.sql
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab21/
│ │ └── cache/
│ │ └── UserMapperTest.java
│ ├── lab-21-cache-ehcache/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab21/
│ │ │ │ └── cache/
│ │ │ │ ├── Application.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ └── UserDO.java
│ │ │ │ └── mapper/
│ │ │ │ └── UserMapper.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ ├── ehcache.xml
│ │ │ └── sql/
│ │ │ └── users.sql
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab21/
│ │ └── cache/
│ │ └── UserMapperTest.java
│ ├── lab-21-cache-redis/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab21/
│ │ │ │ └── cache/
│ │ │ │ ├── Application.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ └── UserDO.java
│ │ │ │ └── mapper/
│ │ │ │ └── UserMapper.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ └── sql/
│ │ │ └── users.sql
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab21/
│ │ └── cache/
│ │ └── UserMapperTest.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 缓存 Cache 入门》.md
├── lab-22/
│ ├── lab-22-validation-01/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab22/
│ │ │ │ └── validation/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── ValidationConfiguration.java
│ │ │ │ ├── constants/
│ │ │ │ │ ├── GenderEnum.java
│ │ │ │ │ └── ServiceExceptionEnum.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── UserController.java
│ │ │ │ ├── core/
│ │ │ │ │ ├── exception/
│ │ │ │ │ │ └── ServiceException.java
│ │ │ │ │ ├── package-info.java
│ │ │ │ │ ├── validator/
│ │ │ │ │ │ ├── InEnum.java
│ │ │ │ │ │ ├── InEnumValidator.java
│ │ │ │ │ │ └── IntArrayValuable.java
│ │ │ │ │ ├── vo/
│ │ │ │ │ │ └── CommonResult.java
│ │ │ │ │ └── web/
│ │ │ │ │ ├── GlobalExceptionHandler.java
│ │ │ │ │ └── GlobalResponseBodyHandler.java
│ │ │ │ ├── dto/
│ │ │ │ │ ├── UserAddDTO.java
│ │ │ │ │ ├── UserUpdateDTO.java
│ │ │ │ │ ├── UserUpdateGenderDTO.java
│ │ │ │ │ └── UserUpdateStatusDTO.java
│ │ │ │ └── service/
│ │ │ │ └── UserService.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ └── i18n/
│ │ │ ├── messages.properties
│ │ │ ├── messages_en.properties
│ │ │ └── messages_ja.properties
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab22/
│ │ └── validation/
│ │ └── service/
│ │ └── UserServiceTest.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 参数校验 Validation 入门》.md
├── lab-23/
│ ├── lab-springmvc-23-01/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab23/
│ │ │ └── springmvc/
│ │ │ ├── Application.java
│ │ │ ├── controller/
│ │ │ │ ├── UserController.java
│ │ │ │ └── UserController2.java
│ │ │ ├── dto/
│ │ │ │ ├── UserAddDTO.java
│ │ │ │ └── UserUpdateDTO.java
│ │ │ ├── service/
│ │ │ │ └── UserService.java
│ │ │ └── vo/
│ │ │ └── UserVO.java
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab23/
│ │ └── springmvc/
│ │ ├── controller/
│ │ │ ├── UserControllerTest.java
│ │ │ └── UserControllerTest2.java
│ │ └── package-info.java
│ ├── lab-springmvc-23-02/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab23/
│ │ │ └── springmvc/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ └── SpringMVCConfiguration.java
│ │ │ ├── constants/
│ │ │ │ └── ServiceExceptionEnum.java
│ │ │ ├── controller/
│ │ │ │ ├── ProductController.java
│ │ │ │ └── UserController.java
│ │ │ ├── controller2/
│ │ │ │ └── TestController.java
│ │ │ ├── core/
│ │ │ │ ├── exception/
│ │ │ │ │ └── ServiceException.java
│ │ │ │ ├── interceptor/
│ │ │ │ │ ├── FirstInterceptor.java
│ │ │ │ │ ├── SecondInterceptor.java
│ │ │ │ │ └── ThirdInterceptor.java
│ │ │ │ ├── package-info.java
│ │ │ │ ├── servlet/
│ │ │ │ │ ├── TestFilter02.java
│ │ │ │ │ ├── TestServlet02.java
│ │ │ │ │ └── TestServletContextListener02.java
│ │ │ │ ├── vo/
│ │ │ │ │ └── CommonResult.java
│ │ │ │ └── web/
│ │ │ │ ├── GlobalExceptionHandler.java
│ │ │ │ └── GlobalResponseBodyHandler.java
│ │ │ └── vo/
│ │ │ ├── ProductVO.java
│ │ │ └── UserVO.java
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab23/
│ │ └── springmvc/
│ │ └── package-info.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot SpringMVC 入门》.md
├── lab-24/
│ ├── lab-24-apidoc-japidocs/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab24/
│ │ ├── Application.java
│ │ ├── TestJApiDocs.java
│ │ ├── controller/
│ │ │ └── UserController.java
│ │ └── vo/
│ │ ├── UserCreateReqVO.java
│ │ ├── UserListReqVO.java
│ │ └── UserRespVO.java
│ ├── lab-24-apidoc-showdoc/
│ │ ├── pom.xml
│ │ ├── showdoc_api.sh
│ │ ├── showdoc_db.sh
│ │ ├── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab24/
│ │ │ └── apidoc/
│ │ │ ├── ShowDocApplication.java
│ │ │ └── controller/
│ │ │ ├── UserController.java
│ │ │ └── vo/
│ │ │ ├── UserLoginReqVO.java
│ │ │ └── UserLoginRespVO.java
│ │ └── swagger.json
│ ├── lab-24-apidoc-swagger/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab24/
│ │ └── apidoc/
│ │ ├── Application.java
│ │ ├── config/
│ │ │ └── SwaggerConfiguration.java
│ │ ├── controller/
│ │ │ ├── TestController.java
│ │ │ └── UserController.java
│ │ ├── dto/
│ │ │ ├── UserAddDTO.java
│ │ │ └── UserUpdateDTO.java
│ │ └── vo/
│ │ └── UserVO.java
│ ├── lab-24-apidoc-swagger-knife4j/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab24/
│ │ └── apidoc/
│ │ ├── Application.java
│ │ ├── config/
│ │ │ └── SwaggerConfiguration.java
│ │ ├── controller/
│ │ │ ├── TestController.java
│ │ │ └── UserController.java
│ │ ├── dto/
│ │ │ ├── UserAddDTO.java
│ │ │ └── UserUpdateDTO.java
│ │ └── vo/
│ │ └── UserVO.java
│ ├── lab-24-apidoc-swagger-starter/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab24/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ └── SwaggerConfiguration.java
│ │ │ ├── controller/
│ │ │ │ └── UserController.java
│ │ │ ├── dto/
│ │ │ │ ├── UserAddDTO.java
│ │ │ │ └── UserUpdateDTO.java
│ │ │ └── vo/
│ │ │ └── UserVO.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ ├── 《芋道 Spring Boot API 接口文档 JApiDocs 入门》.md
│ ├── 《芋道 Spring Boot API 接口文档 ShowDoc 入门》.md
│ ├── 《芋道 Spring Boot API 接口文档 Swagger Starter 入门》.md
│ └── 《芋道 Spring Boot API 接口文档 Swagger 入门》.md
├── lab-25/
│ ├── lab-websocket-25-01/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab25/
│ │ └── springwebsocket/
│ │ ├── Application.java
│ │ ├── config/
│ │ │ └── WebSocketConfiguration.java
│ │ ├── handler/
│ │ │ ├── AuthMessageHandler.java
│ │ │ ├── MessageHandler.java
│ │ │ ├── SendToAllHandler.java
│ │ │ └── SendToOneHandler.java
│ │ ├── message/
│ │ │ ├── AuthRequest.java
│ │ │ ├── AuthResponse.java
│ │ │ ├── Message.java
│ │ │ ├── SendResponse.java
│ │ │ ├── SendToAllRequest.java
│ │ │ ├── SendToOneRequest.java
│ │ │ ├── SendToUserRequest.java
│ │ │ └── UserJoinNoticeRequest.java
│ │ ├── util/
│ │ │ └── WebSocketUtil.java
│ │ └── websocket/
│ │ └── WebsocketServerEndpoint.java
│ ├── lab-websocket-25-02/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab25/
│ │ └── springwebsocket/
│ │ ├── Application.java
│ │ ├── config/
│ │ │ └── WebSocketConfiguration.java
│ │ ├── handler/
│ │ │ ├── AuthMessageHandler.java
│ │ │ ├── MessageHandler.java
│ │ │ ├── SendToAllHandler.java
│ │ │ └── SendToOneHandler.java
│ │ ├── message/
│ │ │ ├── AuthRequest.java
│ │ │ ├── AuthResponse.java
│ │ │ ├── Message.java
│ │ │ ├── SendResponse.java
│ │ │ ├── SendToAllRequest.java
│ │ │ ├── SendToOneRequest.java
│ │ │ ├── SendToUserRequest.java
│ │ │ └── UserJoinNoticeRequest.java
│ │ ├── util/
│ │ │ └── WebSocketUtil.java
│ │ └── websocket/
│ │ ├── DemoWebSocketHandler.java
│ │ └── DemoWebSocketShakeInterceptor.java
│ ├── lab-websocket-25-03/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab25/
│ │ │ └── springwebsocket/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ └── WebSocketConfiguration.java
│ │ │ ├── controller/
│ │ │ │ └── SendController.java
│ │ │ └── message/
│ │ │ ├── AuthRequest.java
│ │ │ ├── AuthResponse.java
│ │ │ ├── Message.java
│ │ │ ├── SendResponse.java
│ │ │ ├── SendToAllRequest.java
│ │ │ ├── SendToOneRequest.java
│ │ │ ├── SendToUserRequest.java
│ │ │ └── UserJoinNoticeRequest.java
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab25/
│ │ └── springwebsocket/
│ │ ├── Main.java
│ │ └── client/
│ │ ├── DemoWebSocketStompClient.java
│ │ └── handler/
│ │ ├── ConnectHandler.java
│ │ └── SendToUserRequestHandler.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot WebSocket 入门》.md
├── lab-26/
│ ├── lab-26-distributed-session-01/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab26/
│ │ │ └── distributedsession/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ └── SessionConfiguration.java
│ │ │ └── controller/
│ │ │ └── SessionController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-26-distributed-session-02/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab26/
│ │ │ └── distributedsession/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ └── SessionConfiguration.java
│ │ │ └── controller/
│ │ │ └── SessionController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-26-distributed-session-springsecurity/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab26/
│ │ │ └── distributedsession/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ └── SessionConfiguration.java
│ │ │ └── controller/
│ │ │ └── SessionController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Boot 分布式 Session 入门》.md
├── lab-27/
│ ├── lab-27-webflux-01/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab27/
│ │ │ └── springwebflux/
│ │ │ ├── Application.java
│ │ │ ├── controller/
│ │ │ │ ├── UserController.java
│ │ │ │ └── UserRouter.java
│ │ │ ├── dto/
│ │ │ │ ├── UserAddDTO.java
│ │ │ │ └── UserUpdateDTO.java
│ │ │ ├── service/
│ │ │ │ └── UserService.java
│ │ │ └── vo/
│ │ │ └── UserVO.java
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab27/
│ │ └── springwebflux/
│ │ ├── controller/
│ │ │ ├── UserControllerTest.java
│ │ │ └── UserControllerTest2.java
│ │ └── package-info.java
│ ├── lab-27-webflux-02/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab27/
│ │ └── springwebflux/
│ │ ├── Application.java
│ │ ├── config/
│ │ │ └── WebFluxConfiguration.java
│ │ ├── constants/
│ │ │ └── ServiceExceptionEnum.java
│ │ ├── controller/
│ │ │ ├── UserController.java
│ │ │ └── UserRouter.java
│ │ ├── controller2/
│ │ │ └── TestController.java
│ │ ├── core/
│ │ │ ├── exception/
│ │ │ │ └── ServiceException.java
│ │ │ ├── filter/
│ │ │ │ └── DemoWebFilter.java
│ │ │ ├── package-info.java
│ │ │ ├── vo/
│ │ │ │ └── CommonResult.java
│ │ │ └── web/
│ │ │ ├── GlobalExceptionHandler.java
│ │ │ └── GlobalResponseBodyHandler.java
│ │ └── vo/
│ │ └── UserVO.java
│ ├── lab-27-webflux-03/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab27/
│ │ └── springwebflux/
│ │ ├── Application.java
│ │ ├── controller/
│ │ │ └── UserController.java
│ │ ├── core/
│ │ │ ├── package-info.java
│ │ │ └── servlet/
│ │ │ ├── TestFilter02.java
│ │ │ ├── TestServlet02.java
│ │ │ └── TestServletContextListener02.java
│ │ └── vo/
│ │ └── UserVO.java
│ ├── lab-27-webflux-elasticsearch/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab27/
│ │ │ └── springwebflux/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ └── ElasticsearchConfiguration.java
│ │ │ ├── controller/
│ │ │ │ └── UserController.java
│ │ │ ├── dao/
│ │ │ │ └── UserRepository.java
│ │ │ ├── dataobject/
│ │ │ │ └── UserDO.java
│ │ │ ├── dto/
│ │ │ │ ├── UserAddDTO.java
│ │ │ │ └── UserUpdateDTO.java
│ │ │ └── vo/
│ │ │ └── UserVO.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-27-webflux-mongodb/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab27/
│ │ │ └── springwebflux/
│ │ │ ├── Application.java
│ │ │ ├── controller/
│ │ │ │ └── UserController.java
│ │ │ ├── dao/
│ │ │ │ └── UserRepository.java
│ │ │ ├── dataobject/
│ │ │ │ └── UserDO.java
│ │ │ ├── dto/
│ │ │ │ ├── UserAddDTO.java
│ │ │ │ └── UserUpdateDTO.java
│ │ │ └── vo/
│ │ │ └── UserVO.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-27-webflux-r2dbc/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab27/
│ │ │ └── springwebflux/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ └── DatabaseConfiguration.java
│ │ │ ├── controller/
│ │ │ │ └── UserController.java
│ │ │ ├── dao/
│ │ │ │ └── UserRepository.java
│ │ │ ├── dataobject/
│ │ │ │ └── UserDO.java
│ │ │ ├── dto/
│ │ │ │ ├── UserAddDTO.java
│ │ │ │ └── UserUpdateDTO.java
│ │ │ └── vo/
│ │ │ └── UserVO.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ └── sql/
│ │ └── users.sql
│ ├── lab-27-webflux-redis/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab27/
│ │ │ └── springwebflux/
│ │ │ ├── Application.java
│ │ │ ├── cacheobject/
│ │ │ │ └── UserCacheObject.java
│ │ │ ├── config/
│ │ │ │ └── RedisConfiguration.java
│ │ │ └── controller/
│ │ │ └── UserController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Boot 响应式 WebFlux 入门》.md
├── lab-28/
│ ├── lab-28-task-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab28/
│ │ │ └── task/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ └── ScheduleConfiguration.java
│ │ │ └── job/
│ │ │ └── DemoJob.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-28-task-quartz-jdbc/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab28/
│ │ │ │ └── task/
│ │ │ │ ├── Application.java
│ │ │ │ ├── Application02.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── DataSourceConfiguration.java
│ │ │ │ │ └── ScheduleConfiguration.java
│ │ │ │ ├── job/
│ │ │ │ │ ├── DemoJob01.java
│ │ │ │ │ └── DemoJob02.java
│ │ │ │ └── service/
│ │ │ │ └── DemoService.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab28/
│ │ └── task/
│ │ └── QuartzSchedulerTest.java
│ ├── lab-28-task-quartz-memory/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab28/
│ │ │ └── task/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ └── ScheduleConfiguration.java
│ │ │ ├── job/
│ │ │ │ ├── DemoJob01.java
│ │ │ │ └── DemoJob02.java
│ │ │ └── service/
│ │ │ └── DemoService.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-28-task-xxl-job/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab28/
│ │ │ └── task/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ └── XxlJobConfiguration.java
│ │ │ └── job/
│ │ │ └── DemoJob.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Boot 定时任务入门》.md
├── lab-29/
│ ├── lab-29-async-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab29/
│ │ │ │ └── asynctask/
│ │ │ │ ├── Application.java
│ │ │ │ ├── Demo.java
│ │ │ │ ├── config/
│ │ │ │ │ └── AsyncConfig.java
│ │ │ │ ├── core/
│ │ │ │ │ ├── async/
│ │ │ │ │ │ └── GlobalAsyncExceptionHandler.java
│ │ │ │ │ └── package-info.java
│ │ │ │ └── service/
│ │ │ │ └── DemoService.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab29/
│ │ └── asynctask/
│ │ ├── package-info.java
│ │ └── service/
│ │ └── DemoServiceTest.java
│ ├── lab-29-async-two/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab29/
│ │ │ │ └── asynctask/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── AsyncConfig.java
│ │ │ │ └── service/
│ │ │ │ └── DemoService.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab29/
│ │ └── asynctask/
│ │ ├── package-info.java
│ │ └── service/
│ │ └── DemoServiceTest.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 异步任务入门》.md
├── lab-30/
│ ├── lab-30-dubbo-annotations-demo/
│ │ ├── pom.xml
│ │ ├── user-rpc-service-api-02/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab30/
│ │ │ └── rpc/
│ │ │ ├── api/
│ │ │ │ └── UserRpcService.java
│ │ │ └── dto/
│ │ │ └── UserDTO.java
│ │ ├── user-rpc-service-consumer-02/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab30/
│ │ │ │ └── rpc/
│ │ │ │ └── ConsumerApplication.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── user-rpc-service-provider-02/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab30/
│ │ │ └── rpc/
│ │ │ ├── ProviderApplication.java
│ │ │ └── service/
│ │ │ └── UserRpcServiceImpl.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-30-dubbo-annotations-nacos/
│ │ ├── pom.xml
│ │ ├── user-rpc-service-api-03/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab30/
│ │ │ └── rpc/
│ │ │ ├── api/
│ │ │ │ └── UserRpcService.java
│ │ │ └── dto/
│ │ │ └── UserDTO.java
│ │ ├── user-rpc-service-consumer-03/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab30/
│ │ │ │ └── rpc/
│ │ │ │ └── ConsumerApplication.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── user-rpc-service-provider-03/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab30/
│ │ │ └── rpc/
│ │ │ ├── ProviderApplication.java
│ │ │ └── service/
│ │ │ └── UserRpcServiceImpl.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-30-dubbo-annotations-sentinel/
│ │ ├── pom.xml
│ │ ├── user-rpc-service-api-04/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab30/
│ │ │ └── rpc/
│ │ │ ├── api/
│ │ │ │ └── UserRpcService.java
│ │ │ └── dto/
│ │ │ └── UserDTO.java
│ │ ├── user-rpc-service-consumer-04/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab30/
│ │ │ │ └── rpc/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ └── controller/
│ │ │ │ └── UserController.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ └── sentinel.properties
│ │ └── user-rpc-service-provider-04/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab30/
│ │ │ └── rpc/
│ │ │ ├── ProviderApplication.java
│ │ │ └── service/
│ │ │ └── UserRpcServiceImpl.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ └── sentinel.properties
│ ├── lab-30-dubbo-xml-demo/
│ │ ├── pom.xml
│ │ ├── user-rpc-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab30/
│ │ │ └── rpc/
│ │ │ ├── api/
│ │ │ │ └── UserRpcService.java
│ │ │ ├── core/
│ │ │ │ ├── ServiceException.java
│ │ │ │ └── ServiceExceptionEnum.java
│ │ │ └── dto/
│ │ │ ├── UserAddDTO.java
│ │ │ └── UserDTO.java
│ │ ├── user-rpc-service-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab30/
│ │ │ │ └── rpc/
│ │ │ │ └── ConsumerApplication.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ └── dubbo.xml
│ │ └── user-rpc-service-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab30/
│ │ │ └── rpc/
│ │ │ ├── ProviderApplication.java
│ │ │ ├── filter/
│ │ │ │ └── DubboExceptionFilter.java
│ │ │ └── service/
│ │ │ └── UserRpcServiceImpl.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── dubbo/
│ │ │ └── org.apache.dubbo.rpc.Filter
│ │ ├── application.yaml
│ │ └── dubbo.xml
│ ├── pom.xml
│ ├── 《芋道 Dubbo Admin 快速入门》.md
│ ├── 《芋道 Dubbo Swagger 快速入门》.md
│ └── 《芋道 Spring Boot Dubbo 入门》.md
├── lab-31/
│ ├── lab-31-rocketmq-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab31/
│ │ │ │ └── rocketmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── consumer/
│ │ │ │ │ ├── Demo01AConsumer.java
│ │ │ │ │ ├── Demo01Consumer.java
│ │ │ │ │ ├── Demo02Consumer.java
│ │ │ │ │ ├── Demo03Consumer.java
│ │ │ │ │ ├── Demo04Consumer.java
│ │ │ │ │ ├── Demo05Consumer.java
│ │ │ │ │ ├── Demo06Consumer.java
│ │ │ │ │ └── Demo07Consumer.java
│ │ │ │ ├── core/
│ │ │ │ │ └── ExtRocketMQTemplate.java
│ │ │ │ ├── message/
│ │ │ │ │ ├── Demo01Message.java
│ │ │ │ │ ├── Demo02Message.java
│ │ │ │ │ ├── Demo03Message.java
│ │ │ │ │ ├── Demo04Message.java
│ │ │ │ │ ├── Demo05Message.java
│ │ │ │ │ ├── Demo06Message.java
│ │ │ │ │ └── Demo07Message.java
│ │ │ │ └── producer/
│ │ │ │ ├── Demo01Producer.java
│ │ │ │ ├── Demo02Producer.java
│ │ │ │ ├── Demo03Producer.java
│ │ │ │ ├── Demo04Producer.java
│ │ │ │ ├── Demo05Producer.java
│ │ │ │ ├── Demo06Producer.java
│ │ │ │ └── Demo07Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab31/
│ │ └── rocketmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ ├── Demo01ProducerTest.java
│ │ ├── Demo02ProducerTest.java
│ │ ├── Demo03ProducerTest.java
│ │ ├── Demo04ProducerTest.java
│ │ ├── Demo05ProducerTest.java
│ │ ├── Demo06ProducerTest.java
│ │ └── Demo07ProducerTest.java
│ ├── lab-31-rocketmq-ons/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab31/
│ │ │ │ └── rocketmqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo01Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo01Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo01Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab31/
│ │ └── rocketmqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo01ProducerTest.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 消息队列 RocketMQ 入门》.md
├── lab-32/
│ ├── lab-32-activemq-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab32/
│ │ │ │ └── activemqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo01Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo01Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo01Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab32/
│ │ └── activemqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo01ProducerTest.java
│ ├── lab-32-activemq-demo-concurrency/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab32/
│ │ │ │ └── activemqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo03Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo03Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo03Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab32/
│ │ └── activemqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo03ProducerTest.java
│ ├── lab-32-activemq-demo-consume-retry/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab32/
│ │ │ │ └── activemqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── ActiveMQConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo05Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo05Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo05Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab32/
│ │ └── activemqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo05ProducerTest.java
│ ├── lab-32-activemq-demo-delay/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab32/
│ │ │ │ └── activemqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo02Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo02Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo02Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab32/
│ │ └── activemqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo02ProducerTest.java
│ ├── lab-32-activemq-demo-message-model/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab32/
│ │ │ │ └── activemqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── config/
│ │ │ │ │ └── ActiveMQConfig.java
│ │ │ │ ├── consumer/
│ │ │ │ │ ├── BroadcastConsumer.java
│ │ │ │ │ └── ClusteringConsumer.java
│ │ │ │ ├── message/
│ │ │ │ │ ├── BroadcastMessage.java
│ │ │ │ │ └── ClusteringMessage.java
│ │ │ │ └── producer/
│ │ │ │ ├── BroadcastProducer.java
│ │ │ │ └── ClusteringProducer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab32/
│ │ └── activemqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ ├── BroadcastProducerTest.java
│ │ └── ClusteringProducerTest.java
│ ├── lab-32-activemq-demo-orderly/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab32/
│ │ │ │ └── activemqdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── consumer/
│ │ │ │ │ └── Demo04Consumer.java
│ │ │ │ ├── message/
│ │ │ │ │ └── Demo04Message.java
│ │ │ │ └── producer/
│ │ │ │ └── Demo04Producer.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab32/
│ │ └── activemqdemo/
│ │ ├── package-info.java
│ │ └── producer/
│ │ └── Demo04ProducerTest.java
│ ├── lab-32-activemq-native/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab32/
│ │ └── activemqdemo/
│ │ ├── ActiveMQConsumer.java
│ │ └── ActiveMQProducer.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 消息队列 ActiveMQ 入门》.md
├── lab-33/
│ ├── lab-33-shiro-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab01/
│ │ │ └── shirodemo/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ └── ShiroConfig.java
│ │ │ └── controller/
│ │ │ ├── DemoController.java
│ │ │ ├── SecurityController.java
│ │ │ └── TestController.java
│ │ └── resources/
│ │ └── static/
│ │ └── login.html
│ ├── pom.xml
│ └── 《芋道 Spring Boot 安全框架 Shiro 入门》.md
├── lab-34/
│ ├── lab-34-actuator-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab34/
│ │ │ └── actuatordemo/
│ │ │ └── Application.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-34-actuator-demo-auditevents/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab34/
│ │ │ └── actuatordemo/
│ │ │ ├── Application.java
│ │ │ └── config/
│ │ │ └── ActuateConfig.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-34-actuator-demo-custom-endpoint/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab34/
│ │ │ └── actuatordemo/
│ │ │ ├── Application.java
│ │ │ └── endpoint/
│ │ │ └── DemoEndPoint.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-34-actuator-demo-health/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab34/
│ │ │ └── actuatordemo/
│ │ │ ├── Application.java
│ │ │ └── actuate/
│ │ │ └── DemoHealthIndicator.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-34-actuator-demo-httptrace/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab34/
│ │ │ └── actuatordemo/
│ │ │ ├── Application.java
│ │ │ └── config/
│ │ │ └── ActuateConfig.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-34-actuator-demo-info/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab34/
│ │ │ └── actuatordemo/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ └── ActuateConfig.java
│ │ │ └── demo/
│ │ │ └── DemoInfoContributor.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-34-actuator-demo-metrics/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab34/
│ │ │ └── actuatordemo/
│ │ │ ├── Application.java
│ │ │ └── controller/
│ │ │ ├── DemoController.java
│ │ │ └── ExampleController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-34-actuator-demo-security/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab34/
│ │ │ └── actuatordemo/
│ │ │ ├── Application.java
│ │ │ └── config/
│ │ │ └── SecurityConfig.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-34-actuator-test/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab34/
│ │ │ └── actuatordemo/
│ │ │ ├── Application.java
│ │ │ └── controller/
│ │ │ └── TestController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Boot 监控端点 Actuator 入门》.md
├── lab-35/
│ ├── lab-35-admin-01-adminserver/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab35/
│ │ └── adminserver/
│ │ └── AdminServerApplication.java
│ ├── lab-35-admin-01-demo-application/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab35/
│ │ │ └── demo/
│ │ │ └── DemoApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-35-admin-02-adminserver/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab35/
│ │ │ └── adminserver/
│ │ │ └── AdminServerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-35-admin-02-demo-application/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab35/
│ │ │ └── demo/
│ │ │ ├── Demo01Application.java
│ │ │ └── Demo02Application.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-35-admin-02-eurekaserver/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab35/
│ │ │ └── eurekaserver/
│ │ │ └── EurekaServerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-35-admin-03-adminserver/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab35/
│ │ └── adminserver/
│ │ ├── AdminServerApplication.java
│ │ └── config/
│ │ └── SecurityConfig.java
│ ├── lab-35-admin-03-demo-application/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab35/
│ │ │ └── demo/
│ │ │ └── DemoApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-35-admin-04-adminserver/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab35/
│ │ │ └── adminserver/
│ │ │ └── AdminServerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-35-admin-05-adminserver/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab35/
│ │ └── adminserver/
│ │ ├── AdminServerApplication.java
│ │ └── notify/
│ │ └── LoggerNotifier.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 监控工具 Admin 入门》.md
├── lab-36/
│ ├── lab-36-prometheus-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab36/
│ │ │ └── prometheusdemo/
│ │ │ └── Application.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Boot 监控平台 Prometheus + Grafana 入门》.md
├── lab-37/
│ ├── lab-37-logging-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab37/
│ │ │ └── loggingdemo/
│ │ │ ├── Application.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-37-logging-aop/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab37/
│ │ │ └── loggingdemo/
│ │ │ ├── Application.java
│ │ │ ├── aspect/
│ │ │ │ └── HttpAccessAspect.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-37-logging-debug/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab37/
│ │ │ └── loggingdemo/
│ │ │ ├── Application.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-37-logging-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab37/
│ │ │ └── loggingdemo/
│ │ │ ├── Application.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-37-logging-log4j2/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab37/
│ │ │ └── loggingdemo/
│ │ │ └── Application.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ └── log4j2-spring.xml
│ ├── lab-37-logging-logback/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab37/
│ │ │ └── loggingdemo/
│ │ │ └── Application.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ └── logback-spring.xml
│ ├── lab-37-logging-multi-env/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab37/
│ │ │ └── loggingdemo/
│ │ │ └── Application.java
│ │ └── resources/
│ │ ├── application-dev.yaml
│ │ └── application-prod.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Boot 日志集成 Logging 入门》.md
├── lab-38/
│ ├── lab-38-elk-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab38/
│ │ │ └── elkdemo/
│ │ │ └── Application.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Boot 日志平台 ELK + Filebeat 入门》.md
├── lab-39/
│ ├── lab-39-activemq/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab39/
│ │ │ └── skywalkingdemo/
│ │ │ ├── ActiveMQApplication.java
│ │ │ ├── consumer/
│ │ │ │ └── DemoConsumer.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ ├── message/
│ │ │ │ └── DemoMessage.java
│ │ │ └── producer/
│ │ │ └── DemoProducer.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-39-async/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab39/
│ │ │ └── skywalkingdemo/
│ │ │ ├── AsyncApplication.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── service/
│ │ │ └── DemoService.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-39-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab39/
│ │ │ └── skywalkingdemo/
│ │ │ ├── Application.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-39-elasticsearch/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab39/
│ │ │ └── skywalkingdemo/
│ │ │ ├── ElasticsearchApplication.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ ├── dataobject/
│ │ │ │ └── ESUserDO.java
│ │ │ └── repository/
│ │ │ └── ESUserRepository.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-39-elasticsearch-jest/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab39/
│ │ │ └── skywalkingdemo/
│ │ │ ├── ElasticsearchJestApplication.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ ├── dataobject/
│ │ │ │ └── ESUserDO.java
│ │ │ └── repository/
│ │ │ └── ESUserRepository.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-39-kafka/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab39/
│ │ │ └── skywalkingdemo/
│ │ │ ├── KafkaApplication.java
│ │ │ ├── consumer/
│ │ │ │ └── DemoConsumer.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ ├── message/
│ │ │ │ └── DemoMessage.java
│ │ │ └── producer/
│ │ │ └── DemoProducer.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-39-logback/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab39/
│ │ │ └── skywalkingdemo/
│ │ │ ├── LogbackApplication.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ ├── application.yml
│ │ └── logback-spring.xml
│ ├── lab-39-mongodb/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab39/
│ │ │ └── skywalkingdemo/
│ │ │ ├── MongoDBApplication.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── dataobject/
│ │ │ └── UserDO.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-39-mysql/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab39/
│ │ │ └── skywalkingdemo/
│ │ │ ├── MySQLApplication.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-39-opentracing/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab39/
│ │ │ └── skywalkingdemo/
│ │ │ ├── OpentracingApplication.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-39-rabbitmq-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab39/
│ │ │ └── skywalkingdemo/
│ │ │ ├── RabbitMQApplication.java
│ │ │ ├── config/
│ │ │ │ └── RabbitConfig.java
│ │ │ ├── consumer/
│ │ │ │ └── DemoConsumer.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ ├── message/
│ │ │ │ └── DemoMessage.java
│ │ │ └── producer/
│ │ │ └── DemoProducer.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-39-redis/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab39/
│ │ │ └── skywalkingdemo/
│ │ │ ├── RedisApplication.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-39-rocketmq/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab39/
│ │ │ └── skywalkingdemo/
│ │ │ └── rocketmqdemo/
│ │ │ ├── RocketMQApplication.java
│ │ │ ├── consumer/
│ │ │ │ └── DemoConsumer.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ ├── message/
│ │ │ │ └── DemoMessage.java
│ │ │ └── producer/
│ │ │ └── DemoProducer.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-39-skywalking-dubbo/
│ │ ├── lab-39-skywalking-dubbo-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab39/
│ │ │ └── skywalkingdemo/
│ │ │ ├── api/
│ │ │ │ └── UserService.java
│ │ │ └── package-info.java
│ │ ├── lab-39-skywalking-dubbo-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab39/
│ │ │ │ └── skywalkingdemo/
│ │ │ │ └── consumerdemo/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ └── controller/
│ │ │ │ └── UserController.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── lab-39-skywalking-dubbo-provider/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab39/
│ │ │ │ └── skywalkingdemo/
│ │ │ │ └── providerdemo/
│ │ │ │ ├── ProviderApplication.java
│ │ │ │ └── service/
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── pom.xml
│ ├── lab-39-springmvc/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab39/
│ │ │ └── skywalkingdemo/
│ │ │ ├── Application.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-39-trace-annotations/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab39/
│ │ │ └── skywalkingdemo/
│ │ │ ├── TraceAnnotationsApplication.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── pom.xml
│ └── 《芋道 Spring Boot 链路追踪 SkyWalking 入门》.md
├── lab-40/
│ ├── lab-40-activemq/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab40/
│ │ │ └── zipkindemo/
│ │ │ ├── ActiveMQApplication.java
│ │ │ ├── config/
│ │ │ │ ├── SpringMvcConfiguration.java
│ │ │ │ └── ZipkinConfiguration.java
│ │ │ ├── consumer/
│ │ │ │ └── DemoConsumer.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ ├── message/
│ │ │ │ └── DemoMessage.java
│ │ │ └── producer/
│ │ │ └── DemoProducer.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-40-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab40/
│ │ │ └── zipkindemo/
│ │ │ ├── Application.java
│ │ │ ├── Application2.java
│ │ │ ├── config/
│ │ │ │ ├── SpringMvcConfiguration.java
│ │ │ │ └── ZipkinConfiguration.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-40-elasticsearch/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab40/
│ │ │ └── zipkindemo/
│ │ │ ├── ElasticsearchApplication.java
│ │ │ ├── config/
│ │ │ │ ├── SpringMvcConfiguration.java
│ │ │ │ └── ZipkinConfiguration.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ ├── dataobject/
│ │ │ │ └── ESUserDO.java
│ │ │ ├── repository/
│ │ │ │ └── ESUserRepository.java
│ │ │ └── spring/
│ │ │ ├── ClusterNodes.java
│ │ │ └── TracingTransportClientFactoryBean.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-40-kafka/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab40/
│ │ │ └── zipkindemo/
│ │ │ ├── KafkaApplication.java
│ │ │ ├── config/
│ │ │ │ ├── SpringMvcConfiguration.java
│ │ │ │ └── ZipkinConfiguration.java
│ │ │ ├── consumer/
│ │ │ │ └── DemoConsumer.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ ├── message/
│ │ │ │ └── DemoMessage.java
│ │ │ └── producer/
│ │ │ └── DemoProducer.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-40-logback/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab40/
│ │ │ └── zipkindemo/
│ │ │ ├── LogbackApplication.java
│ │ │ ├── config/
│ │ │ │ ├── SpringMvcConfiguration.java
│ │ │ │ └── ZipkinConfiguration.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-40-mongodb/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab40/
│ │ │ └── zipkin/
│ │ │ ├── MongoDBApplication.java
│ │ │ ├── config/
│ │ │ │ ├── SpringMvcConfiguration.java
│ │ │ │ └── ZipkinConfiguration.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── dataobject/
│ │ │ └── UserDO.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-40-mysql/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab40/
│ │ │ └── zipkindemo/
│ │ │ ├── MySQLApplication.java
│ │ │ ├── config/
│ │ │ │ ├── SpringMvcConfiguration.java
│ │ │ │ └── ZipkinConfiguration.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-40-opentracing/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab40/
│ │ │ └── zipkindemo/
│ │ │ ├── OpentracingApplication.java
│ │ │ ├── config/
│ │ │ │ ├── SpringMvcConfiguration.java
│ │ │ │ └── ZipkinConfiguration.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-40-rabbitmq/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab40/
│ │ │ └── zipkindemo/
│ │ │ ├── RabbitMQApplication.java
│ │ │ ├── config/
│ │ │ │ ├── RabbitConfig.java
│ │ │ │ ├── SpringMvcConfiguration.java
│ │ │ │ └── ZipkinConfiguration.java
│ │ │ ├── consumer/
│ │ │ │ └── DemoConsumer.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ ├── message/
│ │ │ │ └── DemoMessage.java
│ │ │ └── producer/
│ │ │ └── DemoProducer.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-40-redis/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab40/
│ │ │ └── zipkindemo/
│ │ │ ├── RedisApplication.java
│ │ │ ├── config/
│ │ │ │ ├── SpringMvcConfiguration.java
│ │ │ │ └── ZipkinConfiguration.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-40-springmvc/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab40/
│ │ │ └── zipkindemo/
│ │ │ ├── SpringMVCApplication.java
│ │ │ ├── config/
│ │ │ │ ├── SpringMvcConfiguration.java
│ │ │ │ └── ZipkinConfiguration.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-40-zipkin-dubbo/
│ │ ├── lab-40-zipkin-dubbo-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab40/
│ │ │ └── zipkindemo/
│ │ │ ├── api/
│ │ │ │ └── UserService.java
│ │ │ └── package-info.java
│ │ ├── lab-40-zipkin-dubbo-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab40/
│ │ │ │ └── zpkindemo/
│ │ │ │ └── consumerdemo/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ ├── config/
│ │ │ │ │ ├── SpringMvcConfiguration.java
│ │ │ │ │ └── ZipkinConfiguration.java
│ │ │ │ └── controller/
│ │ │ │ └── UserController.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── lab-40-zipkin-dubbo-provider/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab40/
│ │ │ │ └── zipkindemo/
│ │ │ │ └── providerdemo/
│ │ │ │ ├── ProviderApplication.java
│ │ │ │ ├── config/
│ │ │ │ │ └── ZipkinConfiguration.java
│ │ │ │ └── service/
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── pom.xml
│ ├── pom.xml
│ └── 《芋道 Spring Boot 链路追踪 Zipkin 入门》.md
├── lab-41/
│ ├── deploy.sh
│ ├── lab-41-demo01/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab40/
│ │ │ └── jenkinsdemo/
│ │ │ ├── Application.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ ├── application-dev.yaml
│ │ ├── application-local.yaml
│ │ ├── application-pre.yaml
│ │ ├── application-prod.yaml
│ │ └── application-uat.yaml
│ ├── lab-41-demo02/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab40/
│ │ │ └── jenkinsdemo/
│ │ │ ├── Demo02Application.java
│ │ │ ├── actuate/
│ │ │ │ └── ServerHealthIndicator.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ ├── application-dev.yaml
│ │ ├── application-local.yaml
│ │ ├── application-pre.yaml
│ │ ├── application-prod.yaml
│ │ └── application-uat.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Boot 持续交付 Jenkins 入门》.md
├── lab-42/
│ ├── lab-42-demo01/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab23/
│ │ │ │ └── testdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── UserController.java
│ │ │ │ ├── dao/
│ │ │ │ │ └── UserDao.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ └── UserDO.java
│ │ │ │ └── service/
│ │ │ │ └── UserService.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab23/
│ │ │ └── testdemo/
│ │ │ ├── controller/
│ │ │ │ └── UserControllerTest.java
│ │ │ ├── dao/
│ │ │ │ └── UserDaoTest.java
│ │ │ ├── package-info.java
│ │ │ └── service/
│ │ │ └── UserServiceTest.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ └── sql/
│ │ ├── clean.sql
│ │ └── create_tables.sql
│ ├── lab-42-demo02/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab23/
│ │ │ │ └── testdemo/
│ │ │ │ ├── Application.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── UserController.java
│ │ │ │ ├── dao/
│ │ │ │ │ └── UserDao.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ └── UserDO.java
│ │ │ │ └── service/
│ │ │ │ └── UserService.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab23/
│ │ │ └── testdemo/
│ │ │ ├── controller/
│ │ │ │ └── UserControllerTest.java
│ │ │ ├── dao/
│ │ │ │ └── UserDaoTest.java
│ │ │ ├── package-info.java
│ │ │ └── service/
│ │ │ ├── UserServiceTest.java
│ │ │ └── UserServiceTest2.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ └── sql/
│ │ ├── clean.sql
│ │ └── create_tables.sql
│ ├── pom.xml
│ └── 《芋道 Spring Boot 单元测试 Test 入门》.md
├── lab-43/
│ ├── lab-43-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab43/
│ │ │ └── propertydemo/
│ │ │ ├── Application.java
│ │ │ └── OrderProperties.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-43-demo-configname/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab43/
│ │ │ └── propertydemo/
│ │ │ └── Application.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ └── rpc.yaml
│ ├── lab-43-demo-jasypt/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab43/
│ │ │ │ └── propertydemo/
│ │ │ │ └── Application.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab43/
│ │ └── propertydemo/
│ │ └── JasyptTest.java
│ ├── lab-43-demo-profiles/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab43/
│ │ │ └── propertydemo/
│ │ │ └── ProfilesApplication.java
│ │ └── resources/
│ │ ├── application-dev.yaml
│ │ ├── application-local.yaml
│ │ ├── application-pre.yaml
│ │ ├── application-prod.yaml
│ │ ├── application-uat.yaml
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Boot 配置文件入门》.md
├── lab-44/
│ ├── lab-44-nacos-config-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab44/
│ │ │ └── nacosdemo/
│ │ │ ├── Application.java
│ │ │ └── OrderProperties.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-44-nacos-config-demo-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab44/
│ │ │ └── nacosdemo/
│ │ │ ├── Application.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ ├── listener/
│ │ │ │ └── LoggingSystemConfigListener.java
│ │ │ └── properties/
│ │ │ └── TestProperties.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-44-nacos-config-demo-auto-refresh/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab44/
│ │ │ └── nacosdemo/
│ │ │ ├── Application.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ ├── listener/
│ │ │ │ └── LoggingSystemConfigListener.java
│ │ │ └── properties/
│ │ │ └── TestProperties.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-44-nacos-config-demo-jasypt/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab44/
│ │ │ │ └── nacosdemo/
│ │ │ │ ├── Application.java
│ │ │ │ └── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab44/
│ │ └── nacosdemo/
│ │ └── JasyptTest.java
│ ├── lab-44-nacos-config-demo-multi/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab44/
│ │ │ └── nacosdemo/
│ │ │ ├── Application.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-44-nacos-config-demo-profiles/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab44/
│ │ │ └── nacosdemo/
│ │ │ └── ProfilesApplication.java
│ │ └── resources/
│ │ ├── application-dev.yaml
│ │ ├── application-prod.yaml
│ │ └── application.yaml
│ ├── lab-44-nacos-discovery-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab44/
│ │ │ └── nacosdemo/
│ │ │ ├── Application.java
│ │ │ └── controller/
│ │ │ ├── ConsumerController.java
│ │ │ └── ProviderController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ ├── 《芋道 Spring Boot 注册中心 Nacos 入门》.md
│ └── 《芋道 Spring Boot 配置中心 Nacos 入门》.md
├── lab-45/
│ ├── lab-45-apollo-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab45/
│ │ │ └── apollodemo/
│ │ │ ├── Application.java
│ │ │ └── OrderProperties.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-45-apollo-demo-auto-refresh/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab45/
│ │ │ └── apollodemo/
│ │ │ ├── Application.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ ├── listener/
│ │ │ │ └── LoggingSystemConfigListener.java
│ │ │ └── properties/
│ │ │ └── TestProperties.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-45-apollo-demo-jasypt/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab45/
│ │ │ │ └── apollodemo/
│ │ │ │ ├── Application.java
│ │ │ │ └── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab45/
│ │ └── apollodemo/
│ │ └── JasyptTest.java
│ ├── lab-45-apollo-demo-multi/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab45/
│ │ │ └── apollodemo/
│ │ │ ├── Application.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-45-apollo-demo-profiles/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab45/
│ │ │ └── apollodemo/
│ │ │ └── ProfilesApplication.java
│ │ └── resources/
│ │ ├── application-dev.yaml
│ │ ├── application-prod.yaml
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Boot 配置中心 Apollo 入门》.md
├── lab-46/
│ ├── lab-46-sentinel-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab46/
│ │ │ └── sentineldemo/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ ├── SentinelConfiguration.java
│ │ │ │ └── SpringMvcConfiguration.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── web/
│ │ │ └── GlobalExceptionHandler.java
│ │ └── resources/
│ │ └── sentinel.properties
│ ├── lab-46-sentinel-demo-apollo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab46/
│ │ │ └── sentineldemo/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ ├── SentinelConfiguration.java
│ │ │ │ └── SpringMvcConfiguration.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── web/
│ │ │ └── GlobalExceptionHandler.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ └── sentinel.properties
│ ├── lab-46-sentinel-demo-file/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab46/
│ │ │ └── sentineldemo/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ ├── SentinelConfiguration.java
│ │ │ │ └── SpringMvcConfiguration.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── web/
│ │ │ └── GlobalExceptionHandler.java
│ │ └── resources/
│ │ ├── flow-rule.json
│ │ └── sentinel.properties
│ ├── lab-46-sentinel-demo-nacos/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab46/
│ │ │ └── sentineldemo/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ ├── SentinelConfiguration.java
│ │ │ │ └── SpringMvcConfiguration.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── web/
│ │ │ └── GlobalExceptionHandler.java
│ │ └── resources/
│ │ └── sentinel.properties
│ ├── pom.xml
│ └── 《芋道 Spring Boot 服务容错 Sentinel 入门》.md
├── lab-47/
│ ├── lab-47-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab47/
│ │ │ └── demo/
│ │ │ └── DemoApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ ├── yunai-server-spring-boot-starter/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab47/
│ │ │ └── yunaiserver/
│ │ │ └── autoconfigure/
│ │ │ ├── YunaiServerAutoConfiguration.java
│ │ │ └── YunaiServerProperties.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── spring.factories
│ └── 《芋道 Spring Boot 自动配置原理》.md
├── lab-48-hot-swap/
│ ├── lab-48-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab48/
│ │ └── demo/
│ │ ├── DemoApplication.java
│ │ └── controller/
│ │ └── DemoController.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 热部署入门》.md
├── lab-49/
│ ├── lab-49-lombok-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab49/
│ │ │ └── lombokdemo/
│ │ │ ├── LombokApplication.java
│ │ │ ├── dataobject/
│ │ │ │ ├── UserDO.java
│ │ │ │ └── UserDO01.java
│ │ │ └── service/
│ │ │ ├── UserService.java
│ │ │ └── UserService01.java
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab49/
│ │ └── lombokdemo/
│ │ ├── dataobject/
│ │ │ └── UserDOTest.java
│ │ ├── package-info.java
│ │ └── service/
│ │ └── UserService01Test.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 消除冗余代码 Lombok 入门》.md
├── lab-50/
│ ├── lab-50-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab50/
│ │ │ │ └── maildemo/
│ │ │ │ └── Application.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab50/
│ │ └── maildemo/
│ │ └── ApplicationTests.java
│ ├── pom.xml
│ └── 计划中
├── lab-51/
│ ├── lab-51-sentry-logback/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab51/
│ │ │ └── sentrydemo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── core/
│ │ │ ├── package-info.java
│ │ │ └── web/
│ │ │ └── GlobalExceptionHandler.java
│ │ └── resources/
│ │ ├── logback-spring.xml
│ │ └── sentry.properties
│ ├── lab-51-sentry-spring/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab51/
│ │ │ └── sentrydemo/
│ │ │ ├── DemoApplication.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── pom.xml
│ └── 《芋道 Spring Boot 异常管理平台 Sentry 入门》.md
├── lab-52/
│ ├── lab-52-multiple-datasource/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab52/
│ │ │ └── seatademo/
│ │ │ ├── MultipleDatasourceApplication.java
│ │ │ ├── controller/
│ │ │ │ └── OrderController.java
│ │ │ ├── dao/
│ │ │ │ ├── AccountDao.java
│ │ │ │ ├── OrderDao.java
│ │ │ │ └── ProductDao.java
│ │ │ ├── entity/
│ │ │ │ └── OrderDO.java
│ │ │ └── service/
│ │ │ ├── AccountService.java
│ │ │ ├── OrderService.java
│ │ │ ├── ProductService.java
│ │ │ └── impl/
│ │ │ ├── AccountServiceImpl.java
│ │ │ ├── OrderServiceImpl.java
│ │ │ └── ProductServiceImpl.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ └── data.sql
│ ├── lab-52-seata-at-httpclient-demo/
│ │ ├── lab-52-seata-at-httpclient-demo-account-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab52/
│ │ │ │ └── accountservice/
│ │ │ │ ├── AccountServiceApplication.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── AccountController.java
│ │ │ │ ├── dao/
│ │ │ │ │ └── AccountDao.java
│ │ │ │ ├── dto/
│ │ │ │ │ └── AccountReduceBalanceDTO.java
│ │ │ │ └── service/
│ │ │ │ ├── AccountService.java
│ │ │ │ └── AccountServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── lab-52-seata-at-httpclient-demo-order-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab52/
│ │ │ │ └── orderservice/
│ │ │ │ ├── OrderServiceApplication.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── OrderController.java
│ │ │ │ ├── dao/
│ │ │ │ │ └── OrderDao.java
│ │ │ │ ├── entity/
│ │ │ │ │ └── OrderDO.java
│ │ │ │ └── service/
│ │ │ │ ├── OrderService.java
│ │ │ │ └── OrderServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── lab-52-seata-at-httpclient-demo-product-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab52/
│ │ │ │ └── productservice/
│ │ │ │ ├── ProductServiceApplication.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── ProductController.java
│ │ │ │ ├── dao/
│ │ │ │ │ └── ProductDao.java
│ │ │ │ ├── dto/
│ │ │ │ │ └── ProductReduceStockDTO.java
│ │ │ │ └── service/
│ │ │ │ ├── ProductService.java
│ │ │ │ └── ProductServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── pom.xml
│ ├── pom.xml
│ └── 《芋道 Spring Boot 分布式事务 Seata 入门》.md
├── lab-53/
│ ├── lab-53-seata-at-dubbo-demo/
│ │ ├── data.sql
│ │ ├── lab-53-seata-at-dubbo-demo-account-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab53/
│ │ │ │ └── accountservice/
│ │ │ │ ├── AccountServiceApplication.java
│ │ │ │ ├── dao/
│ │ │ │ │ └── AccountDao.java
│ │ │ │ └── service/
│ │ │ │ └── AccountServiceImpl.java
│ │ │ └── resources/
│ │ │ ├── application-file.yaml
│ │ │ └── application.yaml
│ │ ├── lab-53-seata-at-dubbo-demo-account-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab53/
│ │ │ └── accountservice/
│ │ │ └── api/
│ │ │ └── AccountService.java
│ │ ├── lab-53-seata-at-dubbo-demo-order-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab53/
│ │ │ │ └── orderservice/
│ │ │ │ ├── OrderServiceApplication.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── OrderController.java
│ │ │ │ ├── dao/
│ │ │ │ │ └── OrderDao.java
│ │ │ │ ├── entity/
│ │ │ │ │ └── OrderDO.java
│ │ │ │ └── service/
│ │ │ │ └── OrderServiceImpl.java
│ │ │ └── resources/
│ │ │ ├── application-file.yaml
│ │ │ └── application.yaml
│ │ ├── lab-53-seata-at-dubbo-demo-order-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab53/
│ │ │ └── orderservice/
│ │ │ └── api/
│ │ │ └── OrderService.java
│ │ ├── lab-53-seata-at-dubbo-demo-product-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab53/
│ │ │ │ └── productservice/
│ │ │ │ ├── ProductServiceApplication.java
│ │ │ │ ├── dao/
│ │ │ │ │ └── ProductDao.java
│ │ │ │ └── service/
│ │ │ │ └── ProductServiceImpl.java
│ │ │ └── resources/
│ │ │ ├── application-file.yaml
│ │ │ └── application.yaml
│ │ ├── lab-53-seata-at-dubbo-demo-product-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab53/
│ │ │ └── productservice/
│ │ │ └── api/
│ │ │ └── ProductService.java
│ │ └── pom.xml
│ ├── pom.xml
│ └── 《Dubbo 分布式事务 Seata 入门》.md
├── lab-54/
│ ├── lab-54-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab54/
│ │ └── eventdemo/
│ │ ├── DemoApplication.java
│ │ ├── controller/
│ │ │ └── DemoController.java
│ │ ├── event/
│ │ │ └── UserRegisterEvent.java
│ │ └── service/
│ │ ├── CouponService.java
│ │ ├── EmailService.java
│ │ └── UserService.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 事件机制 Event 入门》.md
├── lab-55/
│ ├── lab-55-mapstruct-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab55/
│ │ └── mapstructdemo/
│ │ ├── UserBOTest.java
│ │ ├── UserDetailBOTest.java
│ │ ├── bo/
│ │ │ ├── UserBO.java
│ │ │ └── UserDetailBO.java
│ │ ├── convert/
│ │ │ └── UserConvert.java
│ │ └── dataobject/
│ │ └── UserDO.java
│ ├── lab-55-mapstruct-demo-lombok/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab55/
│ │ └── mapstructdemo/
│ │ ├── UserBOTest.java
│ │ ├── bo/
│ │ │ └── UserBO.java
│ │ ├── convert/
│ │ │ └── UserConvert.java
│ │ └── dataobject/
│ │ └── UserDO.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 对象转换 MapStruct 入门》.md
├── lab-56/
│ ├── lab-56-demo01/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab56/
│ │ ├── Demo01Application.java
│ │ ├── Demo02Application.java
│ │ └── controller/
│ │ └── DemoController.java
│ ├── pom.xml
│ ├── 《芋道 APISIX 极简入门(国产微服务网关)》.md
│ └── 《芋道 Kong 极简入门(微服务网关)》.md
├── lab-57/
│ ├── lab-57-hystrix-demo01/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab57/
│ │ └── hystrixdemo/
│ │ ├── DemoApplication.java
│ │ ├── config/
│ │ │ └── HystrixConfig.java
│ │ └── controller/
│ │ └── DemoController.java
│ ├── lab-57-hystrix-dubbo-demo/
│ │ ├── lab-57-hystrix-dubbo-demo-application/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx23/
│ │ │ │ └── demo/
│ │ │ │ ├── DemoApplication.java
│ │ │ │ ├── config/
│ │ │ │ │ └── HystrixConfig.java
│ │ │ │ └── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── lab-57-hystrix-dubbo-demo-user-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab57/
│ │ │ │ └── userservice/
│ │ │ │ ├── UserServiceApplication.java
│ │ │ │ └── service/
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── lab-57-hystrix-dubbo-demo-user-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab57/
│ │ │ └── userservice/
│ │ │ └── api/
│ │ │ └── UserService.java
│ │ └── pom.xml
│ ├── lab-57-user-service/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab57/
│ │ └── userservice/
│ │ └── UserServiceApplication.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 服务容错 Hystrix 入门》.md
├── lab-58/
│ ├── lab-58-feign-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab58/
│ │ └── feigndemo/
│ │ ├── FeignDemoApplication.java
│ │ ├── config/
│ │ │ └── FeignConfig.java
│ │ ├── controller/
│ │ │ ├── DemoController.java
│ │ │ └── DemoController02.java
│ │ └── feign/
│ │ ├── UserServiceFeignClient.java
│ │ ├── UserServiceFeignClient02.java
│ │ ├── request/
│ │ │ └── UserAddRequest.java
│ │ └── response/
│ │ └── UserResponse.java
│ ├── lab-58-user-service/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab58/
│ │ └── userservice/
│ │ ├── UserServiceApplication.java
│ │ ├── controller/
│ │ │ └── UserController.java
│ │ ├── request/
│ │ │ └── UserAddRequest.java
│ │ └── response/
│ │ └── UserResponse.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 声明式调用 Feign 入门》.md
├── lab-59/
│ ├── lab-59-resilience4j-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab59/
│ │ │ └── resillience4jdemo/
│ │ │ ├── DemoApplication.java
│ │ │ └── controller/
│ │ │ ├── BulkheadDemoController.java
│ │ │ ├── DemoController.java
│ │ │ ├── RateLimiterDemoController.java
│ │ │ ├── RetryDemoController.java
│ │ │ ├── ThreadPoolBulkheadDemoController.java
│ │ │ └── TimeLimiterDemoController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-59-resilience4j-demo01/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab59/
│ │ │ └── resillience4jdemo/
│ │ │ ├── DemoApplication.java
│ │ │ └── controller/
│ │ │ ├── BulkheadDemoController.java
│ │ │ ├── DemoController.java
│ │ │ ├── RateLimiterDemoController.java
│ │ │ ├── RetryDemoController.java
│ │ │ ├── ThreadPoolBulkheadDemoController.java
│ │ │ └── TimeLimiterDemoController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-59-user-service/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab59/
│ │ └── userservice/
│ │ └── UserServiceApplication.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 服务容错 Resilience4j 入门》.md
├── lab-60/
│ ├── lab-60-soul-dubbo-demo/
│ │ ├── lab-60-soul-dubbo-demo-user-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab60/
│ │ │ │ └── userservice/
│ │ │ │ ├── UserServiceApplication.java
│ │ │ │ └── service/
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── lab-60-soul-dubbo-demo-user-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab60/
│ │ │ └── userservice/
│ │ │ └── api/
│ │ │ ├── UserService.java
│ │ │ └── dto/
│ │ │ └── UserCreateDTO.java
│ │ └── pom.xml
│ ├── lab-60-soul-spring-boot-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab60/
│ │ │ ├── DemoApplication.java
│ │ │ ├── controller/
│ │ │ │ └── UserController.java
│ │ │ └── dto/
│ │ │ └── UserCreateDTO.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── lab-60-soul-spring-cloud-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── lab60/
│ │ │ ├── DemoApplication.java
│ │ │ ├── controller/
│ │ │ │ └── UserController.java
│ │ │ └── dto/
│ │ │ └── UserCreateDTO.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Soul 极简入门(国产微服务网关)》.md
├── lab-61/
│ ├── lab-61-cat-opentracing/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab61/
│ │ └── cat/
│ │ └── opentracing/
│ │ ├── CatSpan.java
│ │ ├── CatSpanBuilder.java
│ │ ├── CatTracer.java
│ │ └── Tag.java
│ ├── lab-61-cat-opentracing-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── catdemo/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ └── ZipkinConfig.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── app.properties
│ ├── lab-61-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab61/
│ │ │ └── catdemo/
│ │ │ ├── Application.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── app.properties
│ ├── lab-61-logback/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab61/
│ │ │ └── catdemo/
│ │ │ ├── Application.java
│ │ │ └── controller/
│ │ │ └── LoggerController.java
│ │ └── resources/
│ │ ├── META-INF/
│ │ │ └── app.properties
│ │ └── logback-spring.xml
│ ├── lab-61-springmvc/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab61/
│ │ │ └── catdemo/
│ │ │ ├── Application.java
│ │ │ ├── config/
│ │ │ │ └── CatFilterConfigure.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── META-INF/
│ │ └── app.properties
│ ├── pom.xml
│ └── 《芋道 Spring Boot 监控平台 CAT 入门》.md
├── lab-62/
│ ├── lab-62-sofarpc-annotations-demo/
│ │ ├── lab-62-sofarpc-annotations-demo-user-rpc-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab62/
│ │ │ └── rpc/
│ │ │ ├── api/
│ │ │ │ └── UserRpcService.java
│ │ │ └── dto/
│ │ │ ├── UserAddDTO.java
│ │ │ └── UserDTO.java
│ │ ├── lab-62-sofarpc-annotations-demo-user-rpc-service-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab62/
│ │ │ │ └── rpc/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ └── controller/
│ │ │ │ └── UserController.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── lab-62-sofarpc-annotations-demo-user-rpc-service-provider/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab62/
│ │ │ │ └── rpc/
│ │ │ │ ├── ProviderApplication.java
│ │ │ │ └── service/
│ │ │ │ └── UserRpcServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── pom.xml
│ ├── lab-62-sofarpc-xml-demo/
│ │ ├── lab-62-sofarpc-xml-demo-user-rpc-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab62/
│ │ │ └── rpc/
│ │ │ ├── api/
│ │ │ │ └── UserRpcService.java
│ │ │ └── dto/
│ │ │ ├── UserAddDTO.java
│ │ │ └── UserDTO.java
│ │ ├── lab-62-sofarpc-xml-demo-user-rpc-service-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab62/
│ │ │ │ └── rpc/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ └── controller/
│ │ │ │ └── UserController.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ └── sofarpc.xml
│ │ ├── lab-62-sofarpc-xml-demo-user-rpc-service-provider/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab62/
│ │ │ │ └── rpc/
│ │ │ │ ├── ProviderApplication.java
│ │ │ │ └── service/
│ │ │ │ └── UserRpcServiceImpl.java
│ │ │ └── resources/
│ │ │ ├── application.yaml
│ │ │ └── sofarpc.xml
│ │ └── pom.xml
│ ├── pom.xml
│ └── 《芋道 Spring Boot SOFARPC 入门》.md
├── lab-63/
│ ├── lab-63-motan-annotations-demo/
│ │ ├── lab-63-motan-annotations-demo-user-rpc-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab63/
│ │ │ └── rpc/
│ │ │ ├── api/
│ │ │ │ └── UserRpcService.java
│ │ │ └── dto/
│ │ │ ├── UserAddDTO.java
│ │ │ └── UserDTO.java
│ │ ├── lab-63-motan-annotations-demo-user-rpc-service-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab63/
│ │ │ │ └── rpc/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ └── controller/
│ │ │ │ └── UserController.java
│ │ │ └── resources/
│ │ │ └── motan.xml
│ │ ├── lab-63-motan-annotations-demo-user-rpc-service-provider/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab63/
│ │ │ │ └── rpc/
│ │ │ │ ├── ProviderApplication.java
│ │ │ │ └── service/
│ │ │ │ └── UserRpcServiceImpl.java
│ │ │ └── resources/
│ │ │ └── motan.xml
│ │ └── pom.xml
│ ├── lab-63-motan-xml-demo/
│ │ ├── lab-63-motan-xml-demo-user-rpc-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab63/
│ │ │ └── rpc/
│ │ │ ├── api/
│ │ │ │ └── UserRpcService.java
│ │ │ └── dto/
│ │ │ ├── UserAddDTO.java
│ │ │ └── UserDTO.java
│ │ ├── lab-63-motan-xml-demo-user-rpc-service-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab63/
│ │ │ │ └── rpc/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ └── controller/
│ │ │ │ └── UserController.java
│ │ │ └── resources/
│ │ │ └── motan.xml
│ │ ├── lab-63-motan-xml-demo-user-rpc-service-provider/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab63/
│ │ │ │ └── rpc/
│ │ │ │ ├── ProviderApplication.java
│ │ │ │ └── service/
│ │ │ │ └── UserRpcServiceImpl.java
│ │ │ └── resources/
│ │ │ └── motan.xml
│ │ └── pom.xml
│ ├── pom.xml
│ └── 《芋道 Spring Boot Motan 入门》.md
├── lab-64/
│ ├── lab-64-grpc-demo/
│ │ ├── lab-64-grpc-demo-application/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab64/
│ │ │ └── demo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── config/
│ │ │ │ └── GrpcConfig.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ ├── lab-64-grpc-demo-user-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab64/
│ │ │ └── userservice/
│ │ │ ├── UserServiceApplication.java
│ │ │ ├── config/
│ │ │ │ └── GrpcConfig.java
│ │ │ └── rpc/
│ │ │ └── UserServiceGrpcImpl.java
│ │ ├── lab-64-grpc-demo-user-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── proto/
│ │ │ └── UserService.proto
│ │ └── pom.xml
│ ├── lab-64-grpc-starter/
│ │ ├── lab-64-grpc-starter-application/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab64/
│ │ │ │ └── demo/
│ │ │ │ ├── DemoApplication.java
│ │ │ │ └── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ ├── lab-64-grpc-starter-user-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab64/
│ │ │ │ └── userservice/
│ │ │ │ ├── UserServiceApplication.java
│ │ │ │ └── rpc/
│ │ │ │ └── UserServiceGrpcImpl.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ ├── lab-64-grpc-starter-user-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── proto/
│ │ │ └── UserService.proto
│ │ └── pom.xml
│ ├── pom.xml
│ └── 《芋道 Spring Boot gRPC 入门》.md
├── lab-65/
│ ├── lab-65-cxf-ws-demo/
│ │ ├── lab-65-cxf-ws-demo-application/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab65/
│ │ │ │ └── demo/
│ │ │ │ ├── DemoApplication.java
│ │ │ │ ├── config/
│ │ │ │ │ └── CXFConfig.java
│ │ │ │ └── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── resources/
│ │ │ └── wsdl/
│ │ │ └── user.wsdl
│ │ ├── lab-65-cxf-ws-demo-user-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab65/
│ │ │ │ └── userservice/
│ │ │ │ ├── UserServiceApplication.java
│ │ │ │ ├── config/
│ │ │ │ │ └── CXFConfig.java
│ │ │ │ ├── request/
│ │ │ │ │ ├── UserCreateRequest.java
│ │ │ │ │ └── UserGetRequest.java
│ │ │ │ ├── response/
│ │ │ │ │ ├── UserCreateResponse.java
│ │ │ │ │ └── UserGetResponse.java
│ │ │ │ └── service/
│ │ │ │ ├── UserService.java
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ └── pom.xml
│ ├── lab-65-spring-ws-demo/
│ │ ├── lab-65-spring-ws-demo-application/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab65/
│ │ │ │ └── demo/
│ │ │ │ ├── DemoApplication.java
│ │ │ │ ├── client/
│ │ │ │ │ └── UserClient.java
│ │ │ │ ├── config/
│ │ │ │ │ └── WebServicesConfig.java
│ │ │ │ └── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ ├── lab-65-spring-ws-demo-user-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab65/
│ │ │ │ └── userservice/
│ │ │ │ ├── UserServiceApplication.java
│ │ │ │ ├── config/
│ │ │ │ │ └── WebServicesConfig.java
│ │ │ │ └── endpoint/
│ │ │ │ └── UserEndpoint.java
│ │ │ └── resources/
│ │ │ └── users.xsd
│ │ └── pom.xml
│ ├── lab-65-ws-feign-client/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab65/
│ │ │ └── demo/
│ │ │ ├── FeignDemoApplication.java
│ │ │ ├── config/
│ │ │ │ └── FeignConfig.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── feign/
│ │ │ └── UserServiceFeignClient.java
│ │ └── resources/
│ │ └── application.yml
│ ├── pom.xml
│ └── 《芋道 Spring Boot Web Services 入门》.md
├── lab-66/
│ ├── lab-66-spring-data-solr/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab15/
│ │ │ │ └── springdatasolr/
│ │ │ │ ├── Application.java
│ │ │ │ ├── dataobject/
│ │ │ │ │ └── SolrProductDO.java
│ │ │ │ └── repository/
│ │ │ │ ├── ProductRepository.java
│ │ │ │ ├── ProductRepository02.java
│ │ │ │ └── ProductRepository03.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab15/
│ │ └── springdatasolr/
│ │ └── repository/
│ │ ├── ProductRepository02Test.java
│ │ ├── ProductRepository03Test.java
│ │ └── ProductRepositoryTest.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot Web Solr 入门》.md
├── lab-67/
│ ├── lab-67-netty-demo/
│ │ ├── lab-67-netty-demo-client/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab67/
│ │ │ │ └── nettyclientdemo/
│ │ │ │ ├── NettyClientApplication.java
│ │ │ │ ├── client/
│ │ │ │ │ ├── NettyClient.java
│ │ │ │ │ └── handler/
│ │ │ │ │ ├── NettyClientHandler.java
│ │ │ │ │ └── NettyClientHandlerInitializer.java
│ │ │ │ ├── config/
│ │ │ │ │ └── NettyClientConfig.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── TestController.java
│ │ │ │ ├── message/
│ │ │ │ │ ├── auth/
│ │ │ │ │ │ ├── AuthRequest.java
│ │ │ │ │ │ └── AuthResponse.java
│ │ │ │ │ ├── chat/
│ │ │ │ │ │ ├── ChatRedirectToUserRequest.java
│ │ │ │ │ │ ├── ChatSendResponse.java
│ │ │ │ │ │ ├── ChatSendToAllRequest.java
│ │ │ │ │ │ └── ChatSendToOneRequest.java
│ │ │ │ │ └── heartbeat/
│ │ │ │ │ ├── HeartbeatRequest.java
│ │ │ │ │ └── HeartbeatResponse.java
│ │ │ │ └── messagehandler/
│ │ │ │ ├── auth/
│ │ │ │ │ └── AuthResponseHandler.java
│ │ │ │ ├── chat/
│ │ │ │ │ ├── ChatRedirectToUserRequestHandler.java
│ │ │ │ │ └── ChatSendResponseHandler.java
│ │ │ │ └── heartbeat/
│ │ │ │ └── HeartbeatResponseHandler.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ ├── lab-67-netty-demo-common/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab67/
│ │ │ └── nettycommondemo/
│ │ │ ├── codec/
│ │ │ │ ├── Invocation.java
│ │ │ │ ├── InvocationDecoder.java
│ │ │ │ └── InvocationEncoder.java
│ │ │ └── dispatcher/
│ │ │ ├── Message.java
│ │ │ ├── MessageDispatcher.java
│ │ │ ├── MessageHandler.java
│ │ │ └── MessageHandlerContainer.java
│ │ ├── lab-67-netty-demo-server/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springboot/
│ │ │ │ └── lab67/
│ │ │ │ └── nettyserverdemo/
│ │ │ │ ├── NettyServerApplication.java
│ │ │ │ ├── config/
│ │ │ │ │ └── NettyServerConfig.java
│ │ │ │ ├── message/
│ │ │ │ │ ├── auth/
│ │ │ │ │ │ ├── AuthRequest.java
│ │ │ │ │ │ └── AuthResponse.java
│ │ │ │ │ ├── chat/
│ │ │ │ │ │ ├── ChatRedirectToUserRequest.java
│ │ │ │ │ │ ├── ChatSendResponse.java
│ │ │ │ │ │ ├── ChatSendToAllRequest.java
│ │ │ │ │ │ └── ChatSendToOneRequest.java
│ │ │ │ │ └── heartbeat/
│ │ │ │ │ ├── HeartbeatRequest.java
│ │ │ │ │ └── HeartbeatResponse.java
│ │ │ │ ├── messagehandler/
│ │ │ │ │ ├── auth/
│ │ │ │ │ │ └── AuthRequestHandler.java
│ │ │ │ │ ├── chat/
│ │ │ │ │ │ ├── ChatSendToAllHandler.java
│ │ │ │ │ │ └── ChatSendToOneHandler.java
│ │ │ │ │ └── heartbeat/
│ │ │ │ │ └── HeartbeatRequestHandler.java
│ │ │ │ └── server/
│ │ │ │ ├── NettyChannelManager.java
│ │ │ │ ├── NettyServer.java
│ │ │ │ └── handler/
│ │ │ │ ├── NettyServerHandler.java
│ │ │ │ └── NettyServerHandlerInitializer.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ └── pom.xml
│ ├── pom.xml
│ └── 《芋道 Spring Boot Netty 入门》.md
├── lab-68-spring-security-oauth/
│ ├── lab-68-demo01-authorization-code-server/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab68/
│ │ └── resourceserverdemo/
│ │ ├── ResourceServerApplication.java
│ │ ├── config/
│ │ │ ├── OAuth2AuthorizationServerConfig.java
│ │ │ ├── OAuth2ResourceServerConfig.java
│ │ │ └── SecurityConfig.java
│ │ └── controller/
│ │ └── ExampleController.java
│ ├── lab-68-demo01-client-credentials-server/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab68/
│ │ └── resourceserverdemo/
│ │ ├── ResourceServerApplication.java
│ │ ├── config/
│ │ │ ├── OAuth2AuthorizationServerConfig.java
│ │ │ └── OAuth2ResourceServerConfig.java
│ │ └── controller/
│ │ └── ExampleController.java
│ ├── lab-68-demo01-implicit-server/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab68/
│ │ └── resourceserverdemo/
│ │ ├── ResourceServerApplication.java
│ │ ├── config/
│ │ │ ├── OAuth2AuthorizationServerConfig.java
│ │ │ ├── OAuth2ResourceServerConfig.java
│ │ │ └── SecurityConfig.java
│ │ └── controller/
│ │ └── ExampleController.java
│ ├── lab-68-demo01-resource-owner-password-credentials-server/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab68/
│ │ └── resourceserverdemo/
│ │ ├── ResourceServerApplication.java
│ │ ├── config/
│ │ │ ├── OAuth2AuthorizationServerConfig.java
│ │ │ ├── OAuth2ResourceServerConfig.java
│ │ │ └── SecurityConfig.java
│ │ └── controller/
│ │ └── ExampleController.java
│ ├── lab-68-demo02-authorization-server-with-authorization-code/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab68/
│ │ └── authorizationserverdemo/
│ │ ├── AuthorizationServerApplication.java
│ │ └── config/
│ │ ├── OAuth2AuthorizationServerConfig.java
│ │ └── SecurityConfig.java
│ ├── lab-68-demo02-authorization-server-with-client-credentials/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab68/
│ │ └── authorizationserverdemo/
│ │ ├── AuthorizationServerApplication.java
│ │ └── config/
│ │ └── OAuth2AuthorizationServerConfig.java
│ ├── lab-68-demo02-authorization-server-with-implicit/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab68/
│ │ └── authorizationserverdemo/
│ │ ├── AuthorizationServerApplication.java
│ │ └── config/
│ │ ├── OAuth2AuthorizationServerConfig.java
│ │ └── SecurityConfig.java
│ ├── lab-68-demo02-authorization-server-with-resource-owner-password-credentials/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab68/
│ │ └── authorizationserverdemo/
│ │ ├── AuthorizationServerApplication.java
│ │ └── config/
│ │ ├── OAuth2AuthorizationServerConfig.java
│ │ └── SecurityConfig.java
│ ├── lab-68-demo02-resource-server/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab68/
│ │ │ └── resourceserverdemo/
│ │ │ ├── ResourceServerApplication.java
│ │ │ ├── config/
│ │ │ │ └── OAuth2ResourceServerConfig.java
│ │ │ └── controller/
│ │ │ ├── Callback02Controller.java
│ │ │ ├── CallbackController.java
│ │ │ ├── ClientLoginController.java
│ │ │ ├── ExampleController.java
│ │ │ └── LoginController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-68-demo03-authorization-server-with-resource-owner-password-credentials/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab68/
│ │ └── authorizationserverdemo/
│ │ ├── AuthorizationServerApplication.java
│ │ ├── config/
│ │ │ ├── OAuth2AuthorizationServerConfig.java
│ │ │ └── SecurityConfig.java
│ │ └── controller/
│ │ └── TokenDemoController.java
│ ├── lab-68-demo11-authorization-server-by-jdbc-store/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab68/
│ │ │ └── authorizationserverdemo/
│ │ │ ├── AuthorizationServerApplication.java
│ │ │ └── config/
│ │ │ ├── OAuth2AuthorizationServerConfig.java
│ │ │ └── SecurityConfig.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ └── db/
│ │ ├── data.sql
│ │ └── schema.sql
│ ├── lab-68-demo11-authorization-server-by-jwt-store/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab68/
│ │ └── authorizationserverdemo/
│ │ ├── AuthorizationServerApplication.java
│ │ └── config/
│ │ ├── OAuth2AuthorizationServerConfig.java
│ │ └── SecurityConfig.java
│ ├── lab-68-demo11-authorization-server-by-redis-store/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab68/
│ │ │ └── authorizationserverdemo/
│ │ │ ├── AuthorizationServerApplication.java
│ │ │ └── config/
│ │ │ ├── OAuth2AuthorizationServerConfig.java
│ │ │ └── SecurityConfig.java
│ │ └── resources/
│ │ └── application.yml
│ ├── lab-68-demo21-authorization-server-on-sso/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab68/
│ │ │ └── authorizationserverdemo/
│ │ │ ├── AuthorizationServerApplication.java
│ │ │ └── config/
│ │ │ ├── OAuth2AuthorizationServerConfig.java
│ │ │ └── SecurityConfig.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ └── db/
│ │ ├── oauth_data.sql
│ │ ├── oauth_schema.sql
│ │ ├── user_data.sql
│ │ └── user_schema.sql
│ ├── lab-68-demo21-resource-server-on-sso/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── lab68/
│ │ │ └── resourceserverdemo/
│ │ │ ├── ResourceServerApplication.java
│ │ │ ├── config/
│ │ │ │ ├── OAuthSsoConfig.java
│ │ │ │ └── SecurityConfig.java
│ │ │ └── controller/
│ │ │ ├── DemoController.java
│ │ │ └── UserController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── pom.xml
│ ├── 《芋道 Spring Security OAuth2 入门》.md
│ ├── 《芋道 Spring Security OAuth2 单点登陆》.md
│ └── 《芋道 Spring Security OAuth2 存储器》.md
├── lab-69-proxy/
│ ├── lab-69-proxy-cglib/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── labs/
│ │ └── lab69/
│ │ ├── TestProxyMain.java
│ │ ├── intercept/
│ │ │ └── UserServiceMethodInterceptor.java
│ │ └── service/
│ │ └── UserServiceImpl.java
│ ├── lab-69-proxy-jdk/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── labs/
│ │ └── lab69/
│ │ ├── GenerateProxyMain.java
│ │ ├── TestProxyMain.java
│ │ ├── handler/
│ │ │ └── UserServiceHandler.java
│ │ └── service/
│ │ ├── UserService.java
│ │ └── UserServiceImpl.java
│ └── pom.xml
├── lab-70-db-doc/
│ ├── lab-70-db-doc-screw-01/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── ScrewMain.java
│ ├── lab-70-db-doc-screw-02/
│ │ ├── doc/
│ │ │ └── 测试文档名称.html
│ │ └── pom.xml
│ ├── lab-70-db-doc-screw-03/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── ScrewMain.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot 数据表结构文档》.md
├── lab-71-http-debug/
│ ├── lab-71-idea-http-client/
│ │ ├── http-client.env.json
│ │ ├── http-client.private.env.json
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab71/
│ │ ├── Application.java
│ │ ├── controller/
│ │ │ ├── UserController.http
│ │ │ ├── UserController.java
│ │ │ ├── UserController2.http
│ │ │ ├── UserController3.http
│ │ │ └── UserController4.http
│ │ └── vo/
│ │ └── UserUpdateVO.java
│ ├── pom.xml
│ └── 《芋道 Spring Boot API 接口调试 IDEA HTTP Client》.md
├── lab-72-minio/
│ ├── pom.xml
│ ├── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springboot/
│ │ └── lab72/
│ │ ├── MinIOApplication.java
│ │ ├── config/
│ │ │ └── MinIOConfiguration.java
│ │ └── controller/
│ │ └── FileController.java
│ └── 《芋道 Spring Boot 对象存储 MinIO 入门》.md
├── labx-01-spring-cloud-alibaba-nacos-discovery/
│ ├── labx-01-sca-nacos-discovery-demo01-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx01/
│ │ │ └── nacosdemo/
│ │ │ └── consumer/
│ │ │ └── DemoConsumerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-01-sca-nacos-discovery-demo01-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx01/
│ │ │ └── nacosdemo/
│ │ │ └── provider/
│ │ │ └── DemoProviderApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-01-sca-nacos-discovery-demo02-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx01/
│ │ │ └── nacosdemo/
│ │ │ └── consumer/
│ │ │ └── DemoConsumerApplication.java
│ │ └── resources/
│ │ ├── application-dev.yaml
│ │ ├── application-uat.yaml
│ │ └── application.yaml
│ ├── labx-01-sca-nacos-discovery-demo02-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx01/
│ │ │ └── nacosdemo/
│ │ │ └── provider/
│ │ │ └── DemoProviderApplication.java
│ │ └── resources/
│ │ ├── application-dev.yaml
│ │ ├── application-uat.yaml
│ │ └── application.yaml
│ ├── labx-01-sca-nacos-discovery-demo03-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx01/
│ │ │ └── nacosdemo/
│ │ │ └── consumer/
│ │ │ └── DemoConsumerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud Alibaba 注册中心 Nacos 入门》.md
├── labx-02-spring-cloud-netflix-ribbon/
│ ├── labx-02-scn-ribbon-demo01-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudnetflix/
│ │ │ └── labx02/
│ │ │ └── ribbondemo/
│ │ │ └── consumer/
│ │ │ └── DemoConsumerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-02-scn-ribbon-demo01-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudnetflix/
│ │ │ └── labx02/
│ │ │ └── ribbondemo/
│ │ │ └── provider/
│ │ │ └── DemoProviderApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-02-scn-ribbon-demo02A-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudnetflix/
│ │ │ └── labx02/
│ │ │ └── ribbondemo/
│ │ │ └── consumer/
│ │ │ └── DemoConsumerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-02-scn-ribbon-demo02B-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ ├── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloudnetflix/
│ │ │ │ └── labx02/
│ │ │ │ └── ribbondemo/
│ │ │ │ └── consumer/
│ │ │ │ ├── DemoConsumerApplication.java
│ │ │ │ └── config/
│ │ │ │ └── RibbonConfiguration.java
│ │ │ └── ribbon/
│ │ │ ├── DefaultRibbonClientConfiguration.java
│ │ │ └── UserProviderRibbonClientConfiguration.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-02-scn-ribbon-demo03-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudnetflix/
│ │ │ └── labx02/
│ │ │ └── ribbondemo/
│ │ │ └── consumer/
│ │ │ └── DemoConsumerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-02-scn-ribbon-demo04-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudnetflix/
│ │ │ └── labx02/
│ │ │ └── ribbondemo/
│ │ │ └── consumer/
│ │ │ └── DemoConsumerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-02-scn-ribbon-demo05-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudnetflix/
│ │ │ └── labx02/
│ │ │ └── ribbondemo/
│ │ │ └── consumer/
│ │ │ └── DemoConsumerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-02-scn-ribbon-demo06-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudnetflix/
│ │ │ └── labx02/
│ │ │ └── ribbondemo/
│ │ │ └── consumer/
│ │ │ └── DemoConsumerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》.md
├── labx-03-spring-cloud-feign/
│ ├── labx-03-sc-feign-demo01-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx03/
│ │ │ └── feigndemo/
│ │ │ └── consumer/
│ │ │ ├── DemoConsumerApplication.java
│ │ │ ├── FeignDemo.java
│ │ │ ├── controller/
│ │ │ │ └── ConsumerController.java
│ │ │ └── feign/
│ │ │ └── DemoProviderFeignClient.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-03-sc-feign-demo01-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx03/
│ │ │ └── feigndemo/
│ │ │ └── provider/
│ │ │ ├── DemoProviderApplication.java
│ │ │ └── controller/
│ │ │ └── ProviderController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-03-sc-feign-demo02A-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx03/
│ │ │ └── feigndemo/
│ │ │ └── consumer/
│ │ │ ├── DemoConsumerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── ConsumerController.java
│ │ │ └── feign/
│ │ │ └── DemoProviderFeignClient.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-03-sc-feign-demo02B-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx03/
│ │ │ └── feigndemo/
│ │ │ └── consumer/
│ │ │ ├── DemoConsumerApplication.java
│ │ │ ├── config/
│ │ │ │ ├── DefaultFeignClientConfiguration.java
│ │ │ │ └── DemoProviderFeignClientConfiguration.java
│ │ │ ├── controller/
│ │ │ │ └── ConsumerController.java
│ │ │ └── feign/
│ │ │ └── DemoProviderFeignClient.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-03-sc-feign-demo03-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx03/
│ │ │ └── feigndemo/
│ │ │ └── consumer/
│ │ │ ├── DemoConsumerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── ConsumerController.java
│ │ │ └── feign/
│ │ │ └── DemoProviderFeignClient.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-03-sc-feign-demo03-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx03/
│ │ │ └── feigndemo/
│ │ │ └── provider/
│ │ │ ├── DemoProviderApplication.java
│ │ │ └── controller/
│ │ │ └── ProviderController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-03-sc-feign-demo03-provider-api/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springcloud/
│ │ └── labx03/
│ │ └── feigndemo/
│ │ └── provider/
│ │ └── api/
│ │ └── ProviderService.java
│ ├── labx-03-sc-feign-demo04-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx03/
│ │ │ └── feigndemo/
│ │ │ └── consumer/
│ │ │ ├── DemoConsumerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── ConsumerController.java
│ │ │ ├── dto/
│ │ │ │ └── DemoDTO.java
│ │ │ └── feign/
│ │ │ └── DemoProviderFeignClient.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-03-sc-feign-demo04-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx03/
│ │ │ └── feigndemo/
│ │ │ └── provider/
│ │ │ ├── DemoProviderApplication.java
│ │ │ ├── controller/
│ │ │ │ └── ProviderController.java
│ │ │ └── dto/
│ │ │ └── DemoDTO.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-03-sc-feign-demo05-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx03/
│ │ │ └── feigndemo/
│ │ │ └── consumer/
│ │ │ ├── DemoConsumerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── ConsumerController.java
│ │ │ └── feign/
│ │ │ └── DemoProviderFeignClient.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-03-sc-feign-demo06A-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx03/
│ │ │ └── feigndemo/
│ │ │ └── consumer/
│ │ │ ├── DemoConsumerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── ConsumerController.java
│ │ │ └── feign/
│ │ │ └── DemoProviderFeignClient.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-03-sc-feign-demo06B-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx03/
│ │ │ └── feigndemo/
│ │ │ └── consumer/
│ │ │ ├── DemoConsumerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── ConsumerController.java
│ │ │ └── feign/
│ │ │ └── DemoProviderFeignClient.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-03-sc-feign-demo07-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx03/
│ │ │ └── feigndemo/
│ │ │ └── consumer/
│ │ │ ├── DemoConsumerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── ConsumerController.java
│ │ │ └── feign/
│ │ │ └── DemoProviderFeignClient.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 声明式调用 Feign 入门》.md
├── labx-04-spring-cloud-alibaba-sentinel/
│ ├── labx-04-sca-sentinel-actuator-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx04/
│ │ │ └── sentineldemo/
│ │ │ └── provider/
│ │ │ ├── DemoProviderApplication.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── web/
│ │ │ ├── CustomBlockExceptionHandler.java
│ │ │ ├── CustomRequestOriginParser.java
│ │ │ └── GlobalExceptionHandler.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-04-sca-sentinel-apollo-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx04/
│ │ │ └── sentineldemo/
│ │ │ └── provider/
│ │ │ ├── DemoProviderApplication.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── web/
│ │ │ ├── CustomBlockExceptionHandler.java
│ │ │ ├── CustomRequestOriginParser.java
│ │ │ └── GlobalExceptionHandler.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-04-sca-sentinel-demo01-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx04/
│ │ │ └── sentineldemo/
│ │ │ └── provider/
│ │ │ ├── DemoProviderApplication.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── web/
│ │ │ ├── CustomBlockExceptionHandler.java
│ │ │ ├── CustomRequestOriginParser.java
│ │ │ └── GlobalExceptionHandler.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-04-sca-sentinel-feign-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx04/
│ │ │ └── sentineldemo/
│ │ │ └── provider/
│ │ │ ├── DemoConsumerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── ConsumerController.java
│ │ │ ├── fallback/
│ │ │ │ ├── DemoProviderFeignClientFallback.java
│ │ │ │ └── DemoProviderFeignClientFallbackFactory.java
│ │ │ └── feign/
│ │ │ └── DemoProviderFeignClient.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-04-sca-sentinel-file-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx04/
│ │ │ └── sentineldemo/
│ │ │ └── provider/
│ │ │ ├── DemoProviderApplication.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── web/
│ │ │ ├── CustomBlockExceptionHandler.java
│ │ │ ├── CustomRequestOriginParser.java
│ │ │ └── GlobalExceptionHandler.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-04-sca-sentinel-nacos-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx04/
│ │ │ └── sentineldemo/
│ │ │ └── provider/
│ │ │ ├── DemoProviderApplication.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── web/
│ │ │ ├── CustomBlockExceptionHandler.java
│ │ │ ├── CustomRequestOriginParser.java
│ │ │ └── GlobalExceptionHandler.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-04-sca-sentinel-resttemplate-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx04/
│ │ │ └── sentineldemo/
│ │ │ └── provider/
│ │ │ ├── DemoConsumerApplication.java
│ │ │ ├── config/
│ │ │ │ └── RestTemplateConfiguration.java
│ │ │ └── controller/
│ │ │ └── ConsumerController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud Alibaba 服务容错 Sentinel 入门》.md
├── labx-05-spring-cloud-alibaba-nacos-config/
│ ├── labx-05-sca-nacos-config-auto-refresh/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx5/
│ │ │ └── nacosdemo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── config/
│ │ │ │ └── OrderProperties.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── listener/
│ │ │ └── DemoEnvironmentChangeListener.java
│ │ └── resources/
│ │ └── bootstrap.yaml
│ ├── labx-05-sca-nacos-config-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx5/
│ │ │ └── nacosdemo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── config/
│ │ │ │ └── OrderProperties.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── bootstrap.yaml
│ ├── labx-05-sca-nacos-config-demo-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx5/
│ │ │ └── nacosdemo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── config/
│ │ │ │ └── OrderProperties.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ └── bootstrap.yaml
│ ├── labx-05-sca-nacos-config-demo-jasypt/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloudalibaba/
│ │ │ │ └── labx5/
│ │ │ │ └── nacosdemo/
│ │ │ │ ├── DemoApplication.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── DemoController.java
│ │ │ │ └── listener/
│ │ │ │ └── JasyptEnvironmentChangeListener.java
│ │ │ └── resources/
│ │ │ └── bootstrap.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springcloudalibaba/
│ │ └── labx5/
│ │ └── nacosdemo/
│ │ └── JasyptTest.java
│ ├── labx-05-sca-nacos-config-demo-multi/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx5/
│ │ │ └── nacosdemo/
│ │ │ └── DemoApplication.java
│ │ └── resources/
│ │ └── bootstrap.yaml
│ ├── labx-05-sca-nacos-config-demo-profiles/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx5/
│ │ │ └── nacosdemo/
│ │ │ └── ProfilesApplication.java
│ │ └── resources/
│ │ ├── bootstrap-dev.yaml
│ │ ├── bootstrap-prod.yaml
│ │ └── bootstrap.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud Alibaba 配置中心 Nacos 入门》.md
├── labx-06-spring-cloud-stream-rocketmq/
│ ├── labx-06-sca-stream-rocketmq-consumer-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx6/
│ │ │ └── rocketmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-06-sca-stream-rocketmq-consumer-aliyun/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx6/
│ │ │ └── rocketmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-06-sca-stream-rocketmq-consumer-broadcasting/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx6/
│ │ │ └── rocketmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-06-sca-stream-rocketmq-consumer-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx6/
│ │ │ └── rocketmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-06-sca-stream-rocketmq-consumer-error-handler/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx6/
│ │ │ └── rocketmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-06-sca-stream-rocketmq-consumer-filter/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx6/
│ │ │ └── rocketmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-06-sca-stream-rocketmq-consumer-orderly/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx6/
│ │ │ └── rocketmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-06-sca-stream-rocketmq-consumer-retry/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx6/
│ │ │ └── rocketmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-06-sca-stream-rocketmq-producer-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx6/
│ │ │ └── rocketmqdemo/
│ │ │ └── producerdemo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-06-sca-stream-rocketmq-producer-aliyun/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx6/
│ │ │ └── rocketmqdemo/
│ │ │ └── producerdemo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-06-sca-stream-rocketmq-producer-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx6/
│ │ │ └── rocketmqdemo/
│ │ │ └── producerdemo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-06-sca-stream-rocketmq-producer-orderly/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx6/
│ │ │ └── rocketmqdemo/
│ │ │ └── producerdemo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-06-sca-stream-rocketmq-producer-transaction/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx6/
│ │ │ └── rocketmqdemo/
│ │ │ └── producerdemo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ ├── listener/
│ │ │ │ └── TransactionListenerImpl.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》.md
├── labx-07-spring-cloud-alibaba-dubbo/
│ ├── labx-07-sca-dubbo-demo01/
│ │ ├── labx-07-sca-dubbo-demo01-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx7/
│ │ │ ├── api/
│ │ │ │ └── UserService.java
│ │ │ └── dto/
│ │ │ ├── UserAddDTO.java
│ │ │ └── UserDTO.java
│ │ ├── labx-07-sca-dubbo-demo01-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloudalibaba/
│ │ │ │ └── labx7/
│ │ │ │ └── consumerdemo/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ └── controller/
│ │ │ │ └── UserController.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── labx-07-sca-dubbo-demo01-provider/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloudalibaba/
│ │ │ │ └── labx7/
│ │ │ │ └── providerdemo/
│ │ │ │ ├── ProviderApplication.java
│ │ │ │ └── service/
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── pom.xml
│ ├── labx-07-sca-dubbo-demo02/
│ │ ├── labx-07-sca-dubbo-demo02-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx7/
│ │ │ ├── api/
│ │ │ │ └── UserService.java
│ │ │ └── dto/
│ │ │ ├── UserAddDTO.java
│ │ │ └── UserDTO.java
│ │ ├── labx-07-sca-dubbo-demo02-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloudalibaba/
│ │ │ │ └── labx7/
│ │ │ │ └── consumerdemo/
│ │ │ │ ├── FeignConsumerApplication.java
│ │ │ │ ├── config/
│ │ │ │ │ └── RestTemplateConfig.java
│ │ │ │ ├── controller/
│ │ │ │ │ ├── User01Controller.java
│ │ │ │ │ ├── User02Controller.java
│ │ │ │ │ ├── User03Controller.java
│ │ │ │ │ └── User04Controller.java
│ │ │ │ ├── dto/
│ │ │ │ │ ├── UserAddDTO.java
│ │ │ │ │ └── UserDTO.java
│ │ │ │ └── feign/
│ │ │ │ ├── UserFeignClient.java
│ │ │ │ └── UserFeignClient02.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── labx-07-sca-dubbo-demo02-provider-rest/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloudalibaba/
│ │ │ │ └── labx7/
│ │ │ │ └── providerdemo/
│ │ │ │ ├── RestProviderApplication.java
│ │ │ │ └── service/
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── labx-07-sca-dubbo-demo02-provider-springmvc/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloudalibaba/
│ │ │ │ └── labx7/
│ │ │ │ └── providerdemo/
│ │ │ │ ├── SpringMVCProviderApplication.java
│ │ │ │ └── service/
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── pom.xml
│ ├── labx-07-sca-dubbo-demo03-validation/
│ │ ├── labx-07-sca-dubbo-demo03-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx7/
│ │ │ ├── api/
│ │ │ │ └── UserService.java
│ │ │ └── dto/
│ │ │ ├── UserAddDTO.java
│ │ │ └── UserDTO.java
│ │ ├── labx-07-sca-dubbo-demo03-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloudalibaba/
│ │ │ │ └── labx7/
│ │ │ │ └── consumerdemo/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ └── controller/
│ │ │ │ └── UserController.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── labx-07-sca-dubbo-demo03-provider/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloudalibaba/
│ │ │ │ └── labx7/
│ │ │ │ └── providerdemo/
│ │ │ │ ├── ProviderApplication.java
│ │ │ │ └── service/
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── pom.xml
│ ├── labx-07-sca-dubbo-demo04-filter/
│ │ ├── labx-07-sca-dubbo-demo04-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx7/
│ │ │ ├── api/
│ │ │ │ └── UserService.java
│ │ │ ├── core/
│ │ │ │ ├── ServiceException.java
│ │ │ │ └── ServiceExceptionEnum.java
│ │ │ └── dto/
│ │ │ ├── UserAddDTO.java
│ │ │ └── UserDTO.java
│ │ ├── labx-07-sca-dubbo-demo04-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloudalibaba/
│ │ │ │ └── labx7/
│ │ │ │ └── consumerdemo/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ └── controller/
│ │ │ │ └── UserController.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── labx-07-sca-dubbo-demo04-provider/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloudalibaba/
│ │ │ │ └── labx7/
│ │ │ │ └── providerdemo/
│ │ │ │ ├── ProviderApplication.java
│ │ │ │ ├── filter/
│ │ │ │ │ └── DubboExceptionFilter.java
│ │ │ │ └── service/
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources/
│ │ │ ├── META-INF/
│ │ │ │ └── dubbo/
│ │ │ │ └── org.apache.dubbo.rpc.Filter
│ │ │ └── application.yaml
│ │ └── pom.xml
│ ├── labx-07-sca-dubbo-demo05-sentinel/
│ │ ├── labx-07-sca-dubbo-demo05-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx7/
│ │ │ ├── api/
│ │ │ │ └── UserService.java
│ │ │ └── dto/
│ │ │ ├── UserAddDTO.java
│ │ │ └── UserDTO.java
│ │ ├── labx-07-sca-dubbo-demo05-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloudalibaba/
│ │ │ │ └── labx7/
│ │ │ │ └── consumerdemo/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ └── controller/
│ │ │ │ └── UserController.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── labx-07-sca-dubbo-demo05-provider/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloudalibaba/
│ │ │ │ └── labx7/
│ │ │ │ └── providerdemo/
│ │ │ │ ├── ProviderApplication.java
│ │ │ │ └── service/
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── pom.xml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》.md
├── labx-08-spring-cloud-gateway/
│ ├── labx-08-sc-gateway-demo01/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx08/
│ │ │ └── gatewaydemo/
│ │ │ └── GatewayApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-08-sc-gateway-demo01-test/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx08/
│ │ │ └── gatewaydemo/
│ │ │ ├── GatewayApplication.java
│ │ │ └── config/
│ │ │ └── GatewayConfig.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-08-sc-gateway-demo02-registry/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx08/
│ │ │ └── gatewaydemo/
│ │ │ └── GatewayApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-08-sc-gateway-demo03-config-apollo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx08/
│ │ │ └── gatewaydemo/
│ │ │ ├── GatewayApplication.java
│ │ │ └── GatewayPropertiesRefresher.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-08-sc-gateway-demo03-config-nacos/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx08/
│ │ │ └── gatewaydemo/
│ │ │ └── GatewayApplication.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ └── bootstrap.yaml
│ ├── labx-08-sc-gateway-demo04/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx08/
│ │ │ └── gatewaydemo/
│ │ │ └── GatewayApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-08-sc-gateway-demo05-custom-gateway-filter/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx08/
│ │ │ └── gatewaydemo/
│ │ │ ├── GatewayApplication.java
│ │ │ └── filter/
│ │ │ └── AuthGatewayFilterFactory.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-08-sc-gateway-demo06-rate-limiter/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx08/
│ │ │ └── gatewaydemo/
│ │ │ ├── GatewayApplication.java
│ │ │ └── config/
│ │ │ └── GatewayConfig.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-08-sc-gateway-demo07-hystrix/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx08/
│ │ │ └── gatewaydemo/
│ │ │ ├── GatewayApplication.java
│ │ │ └── controller/
│ │ │ └── FallbackController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-08-sc-gateway-demo07-sentinel/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx08/
│ │ │ └── gatewaydemo/
│ │ │ ├── CustomBlockRequestHandler.java
│ │ │ └── GatewayApplication.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ ├── sentinel-gw-api-group.json
│ │ └── sentinel-gw-flow.json
│ ├── labx-08-sc-gateway-demo08-custom-global-filter/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx08/
│ │ │ └── gatewaydemo/
│ │ │ ├── GatewayApplication.java
│ │ │ ├── User03Controller.java
│ │ │ ├── config/
│ │ │ │ └── RestTemplateConfig.java
│ │ │ └── filter/
│ │ │ └── DubboFilter.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-08-sc-gateway-demo09-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx08/
│ │ │ └── gatewaydemo/
│ │ │ └── GatewayApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-08-sc-gateway-demo10-troubleshooting/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx08/
│ │ │ └── gatewaydemo/
│ │ │ └── GatewayApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-08-sc-user-service/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx08/
│ │ │ └── userservice/
│ │ │ ├── UserServiceApplication.java
│ │ │ ├── controller/
│ │ │ │ └── UserController.java
│ │ │ └── dto/
│ │ │ ├── UserAddDTO.java
│ │ │ └── UserDTO.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 网关 Spring Cloud Gateway 入门》.md
├── labx-09-spring-cloud-apollo/
│ ├── labx-09-sc-apollo-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx09/
│ │ │ └── apollodemo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── config/
│ │ │ │ └── OrderProperties.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-09-sc-apollo-demo-auto-refresh/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx09/
│ │ │ └── apollodemo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── config/
│ │ │ │ └── OrderProperties.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── listener/
│ │ │ └── ApolloPropertiesRefresher.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-09-sc-apollo-demo-jasypt/
│ │ ├── pom.xml
│ │ └── src/
│ │ ├── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx09/
│ │ │ │ └── apollodemo/
│ │ │ │ ├── DemoApplication.java
│ │ │ │ └── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── test/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springcloud/
│ │ └── labx09/
│ │ └── apollodemo/
│ │ └── JasyptTest.java
│ ├── labx-09-sc-apollo-demo-multi/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx09/
│ │ │ └── apollodemo/
│ │ │ └── DemoApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-09-sc-apollo-demo-profiles/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx09/
│ │ │ └── apollodemo/
│ │ │ └── DemoApplication.java
│ │ └── resources/
│ │ ├── application-dev.yaml
│ │ ├── application-prod.yaml
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 配置中心 Apollo 入门》.md
├── labx-10-spring-cloud-stream-rabbitmq/
│ ├── labx-10-sc-stream-rabbitmq-consumer-ack/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-consumer-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-consumer-batch/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-consumer-broadcasting/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-consumer-concurrency/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-consumer-delay/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-consumer-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-consumer-error-handler/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-consumer-filter/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-consumer-partitioning/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-consumer-retry/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-producer-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── producerdemo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-producer-batch/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── producerdemo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-producer-confirm/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── producerdemo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ ├── Demo01ProducerConfirmCallback.java
│ │ │ ├── Demo01ProducerReturnCallback.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-producer-delay/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── producerdemo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-producer-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── producerdemo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-producer-partitioning/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── producerdemo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-10-sc-stream-rabbitmq-producer-transaction/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx10/
│ │ │ └── rabbitmqdemo/
│ │ │ └── producerdemo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── config/
│ │ │ │ └── TransactionConfig.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 消息队列 RabbitMQ 入门》.md
├── labx-11-spring-cloud-stream-kafka/
│ ├── labx-11-sc-stream-kafka-consumer-ack/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx11/
│ │ │ └── kafkademo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-11-sc-stream-kafka-consumer-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx11/
│ │ │ └── kafkademo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-11-sc-stream-kafka-consumer-batch/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx11/
│ │ │ └── kafkademo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-11-sc-stream-kafka-consumer-broadcasting/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx11/
│ │ │ └── kafkademo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-11-sc-stream-kafka-consumer-concurrency/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx11/
│ │ │ └── kafkademo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-11-sc-stream-kafka-consumer-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx11/
│ │ │ └── kafkademo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-11-sc-stream-kafka-consumer-error-handler/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx11/
│ │ │ └── kafkademo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-11-sc-stream-kafka-consumer-filter/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx11/
│ │ │ └── kafkademo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-11-sc-stream-kafka-consumer-partitioning/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx11/
│ │ │ └── kafkademo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-11-sc-stream-kafka-consumer-retry/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx11/
│ │ │ └── kafkademo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-11-sc-stream-kafka-consumer-transaction/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx11/
│ │ │ └── kafkademo/
│ │ │ └── consumerdemo/
│ │ │ ├── ConsumerApplication.java
│ │ │ ├── listener/
│ │ │ │ ├── Demo01Consumer.java
│ │ │ │ └── MySink.java
│ │ │ └── message/
│ │ │ └── Demo01Message.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-11-sc-stream-kafka-producer-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx11/
│ │ │ └── kafkademo/
│ │ │ └── kafkademo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-11-sc-stream-kafka-producer-batch/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx11/
│ │ │ └── kafkademo/
│ │ │ └── kafkademo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-11-sc-stream-kafka-producer-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx11/
│ │ │ └── kafkademo/
│ │ │ └── kafkademo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-11-sc-stream-kafka-producer-partitioning/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx11/
│ │ │ └── kafkademo/
│ │ │ └── kafkademo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-11-sc-stream-kafka-producer-transaction/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx11/
│ │ │ └── kafkademo/
│ │ │ └── kafkademo/
│ │ │ ├── ProducerApplication.java
│ │ │ ├── config/
│ │ │ │ └── TransactionConfig.java
│ │ │ ├── controller/
│ │ │ │ └── Demo01Controller.java
│ │ │ └── message/
│ │ │ ├── Demo01Message.java
│ │ │ └── MySource.java
│ │ └── resources/
│ │ └── application.yml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 消息队列 Kafka 入门》.md
├── labx-12-spring-cloud-config/
│ ├── labx-12-sc-config-server-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx12/
│ │ │ └── configserverdemo/
│ │ │ └── ConfigServerApplication.java
│ │ └── resources/
│ │ ├── application.yml
│ │ └── shared/
│ │ └── user-application.yml
│ ├── labx-12-sc-config-server-git/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx12/
│ │ │ └── configserverdemo/
│ │ │ └── ConfigServerApplication.java
│ │ └── resources/
│ │ ├── application.yml
│ │ ├── bootstrap.yml
│ │ └── configserver.jks
│ ├── labx-12-sc-config-server-git-auto-refresh-by-bus/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx12/
│ │ │ └── configserverdemo/
│ │ │ └── ConfigServerApplication.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-12-sc-config-server-git-nacos/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx12/
│ │ │ └── configserverdemo/
│ │ │ └── ConfigServerApplication.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-12-sc-config-user-application/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx12/
│ │ │ └── userapplication/
│ │ │ ├── UserApplication.java
│ │ │ ├── config/
│ │ │ │ └── OrderProperties.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── bootstrap.yml
│ ├── labx-12-sc-config-user-application-auto-refresh-by-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx12/
│ │ │ └── userapplication/
│ │ │ ├── UserApplication.java
│ │ │ ├── config/
│ │ │ │ └── OrderProperties.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── listener/
│ │ │ └── DemoEnvironmentChangeListener.java
│ │ └── resources/
│ │ ├── application.yml
│ │ └── bootstrap.yml
│ ├── labx-12-sc-config-user-application-auto-refresh-by-bus/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx12/
│ │ │ └── userapplication/
│ │ │ ├── UserApplication.java
│ │ │ ├── config/
│ │ │ │ └── OrderProperties.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ ├── application.yml
│ │ └── bootstrap.yml
│ ├── labx-12-sc-config-user-application-nacos/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx12/
│ │ │ └── userapplication/
│ │ │ ├── UserApplication.java
│ │ │ ├── config/
│ │ │ │ └── OrderProperties.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── bootstrap.yml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 配置中心 Spring Cloud Config 入门》.md
├── labx-13/
│ ├── labx-13-sc-sleuth-db-elasticsearch/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx13/
│ │ │ └── springmvcdemo/
│ │ │ ├── UserServiceApplication.java
│ │ │ ├── config/
│ │ │ │ └── SleuthConfiguration.java
│ │ │ ├── controller/
│ │ │ │ └── UserController.java
│ │ │ ├── dataobject/
│ │ │ │ └── ESUserDO.java
│ │ │ ├── repository/
│ │ │ │ └── ESUserRepository.java
│ │ │ └── spring/
│ │ │ ├── ClusterNodes.java
│ │ │ └── TracingTransportClientFactoryBean.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-13-sc-sleuth-db-mongodb/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx13/
│ │ │ └── springmvcdemo/
│ │ │ ├── UserServiceApplication.java
│ │ │ ├── config/
│ │ │ │ └── SleuthConfiguration.java
│ │ │ ├── controller/
│ │ │ │ └── UserController.java
│ │ │ └── dataobject/
│ │ │ └── UserDO.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-13-sc-sleuth-db-mysql/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx13/
│ │ │ └── springmvcdemo/
│ │ │ ├── UserServiceApplication.java
│ │ │ └── controller/
│ │ │ └── UserController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-13-sc-sleuth-db-redis/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx13/
│ │ │ └── springmvcdemo/
│ │ │ ├── UserServiceApplication.java
│ │ │ ├── config/
│ │ │ │ └── SleuthConfiguration.java
│ │ │ └── controller/
│ │ │ └── UserController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-13-sc-sleuth-dubbo/
│ │ ├── labx-13-sc-sleuth-dubbo-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx13/
│ │ │ ├── api/
│ │ │ │ └── UserService.java
│ │ │ └── package-info.java
│ │ ├── labx-13-sc-sleuth-dubbo-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx13/
│ │ │ │ └── consumerdemo/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ └── controller/
│ │ │ │ └── UserController.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── labx-13-sc-sleuth-dubbo-provider/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx13/
│ │ │ │ └── providerdemo/
│ │ │ │ ├── ProviderApplication.java
│ │ │ │ └── service/
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── pom.xml
│ ├── labx-13-sc-sleuth-feign/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx13/
│ │ │ └── springmvcdemo/
│ │ │ ├── FeignApplication.java
│ │ │ ├── controller/
│ │ │ │ └── FeignController.java
│ │ │ └── feign/
│ │ │ └── UserServiceFeignClient.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-13-sc-sleuth-logback/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx13/
│ │ │ └── springmvcdemo/
│ │ │ ├── UserServiceApplication.java
│ │ │ └── controller/
│ │ │ └── UserController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-13-sc-sleuth-mq-activemq/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springboot/
│ │ │ └── labx13/
│ │ │ └── activemqdemo/
│ │ │ ├── ActiveMQApplication.java
│ │ │ ├── consumer/
│ │ │ │ └── DemoConsumer.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ ├── message/
│ │ │ │ └── DemoMessage.java
│ │ │ └── producer/
│ │ │ └── DemoProducer.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-13-sc-sleuth-mq-kafka/
│ │ ├── labx-13-sc-sleuth-mq-kafka-producer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx13/
│ │ │ │ └── kafkademo/
│ │ │ │ └── producerdemo/
│ │ │ │ ├── ProducerApplication.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── Demo01Controller.java
│ │ │ │ └── message/
│ │ │ │ ├── Demo01Message.java
│ │ │ │ └── MySource.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ ├── labx-13-sc-stream-mq-kafka-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx13/
│ │ │ │ └── kafkademo/
│ │ │ │ └── consumerdemo/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ ├── listener/
│ │ │ │ │ ├── Demo01Consumer.java
│ │ │ │ │ └── MySink.java
│ │ │ │ └── message/
│ │ │ │ └── Demo01Message.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ └── pom.xml
│ ├── labx-13-sc-sleuth-mq-rabbitmq/
│ │ ├── labx-13-sc-sleuth-mq-rabbitmq-producer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx13/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ └── producerdemo/
│ │ │ │ ├── ProducerApplication.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── Demo01Controller.java
│ │ │ │ └── message/
│ │ │ │ ├── Demo01Message.java
│ │ │ │ └── MySource.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ ├── labx-13-sc-stream-mq-rabbitmq-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx13/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ └── consumerdemo/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ ├── listener/
│ │ │ │ │ ├── Demo01Consumer.java
│ │ │ │ │ └── MySink.java
│ │ │ │ └── message/
│ │ │ │ └── Demo01Message.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ └── pom.xml
│ ├── labx-13-sc-sleuth-opentracing/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx13/
│ │ │ └── springmvcdemo/
│ │ │ ├── UserServiceApplication.java
│ │ │ └── controller/
│ │ │ └── UserController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-13-sc-sleuth-sampler/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx13/
│ │ │ └── springmvcdemo/
│ │ │ ├── UserServiceApplication.java
│ │ │ └── controller/
│ │ │ └── UserController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-13-sc-sleuth-springcloudgateway/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx13/
│ │ │ └── gatewaydemo/
│ │ │ └── GatewayApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-13-sc-sleuth-springmvc/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx13/
│ │ │ └── springmvcdemo/
│ │ │ ├── UserServiceApplication.java
│ │ │ └── controller/
│ │ │ └── UserController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-13-sc-sleuth-zipkin-server-demo-in-memory/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx13/
│ │ │ └── sleuthzipkinserverdemo/
│ │ │ └── SleuthZipkinServerApplication.java
│ │ └── resources/
│ │ └── application.yml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 链路追踪 Spring Cloud Sleuth》.md
├── labx-14/
│ ├── labx-14-sc-skywalking-dubbo/
│ │ ├── labx-14-sc-skywalking-dubbo-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx14/
│ │ │ ├── api/
│ │ │ │ └── UserService.java
│ │ │ └── package-info.java
│ │ ├── labx-14-sc-skywalking-dubbo-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx14/
│ │ │ │ └── consumerdemo/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ └── controller/
│ │ │ │ └── UserController.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── labx-14-sc-skywalking-dubbo-provider/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx14/
│ │ │ │ └── providerdemo/
│ │ │ │ ├── ProviderApplication.java
│ │ │ │ └── service/
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ └── pom.xml
│ ├── labx-14-sc-skywalking-feign/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx14/
│ │ │ └── springmvcdemo/
│ │ │ ├── FeignApplication.java
│ │ │ ├── controller/
│ │ │ │ └── FeignController.java
│ │ │ └── feign/
│ │ │ └── UserServiceFeignClient.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-14-sc-skywalking-mq-kafka/
│ │ ├── labx-14-sc-skywalking-mq-kafka-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx14/
│ │ │ │ └── kafkademo/
│ │ │ │ └── consumerdemo/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ ├── listener/
│ │ │ │ │ ├── Demo01Consumer.java
│ │ │ │ │ └── MySink.java
│ │ │ │ └── message/
│ │ │ │ └── Demo01Message.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ ├── labx-14-sc-skywalking-mq-kafka-producer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx14/
│ │ │ │ └── kafkademo/
│ │ │ │ └── producerdemo/
│ │ │ │ ├── ProducerApplication.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── Demo01Controller.java
│ │ │ │ └── message/
│ │ │ │ ├── Demo01Message.java
│ │ │ │ └── MySource.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ └── pom.xml
│ ├── labx-14-sc-skywalking-mq-rabbitmq/
│ │ ├── labx-14-sc-skywalking-mq-rabbitmq-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx14/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ └── consumerdemo/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ ├── listener/
│ │ │ │ │ ├── Demo01Consumer.java
│ │ │ │ │ └── MySink.java
│ │ │ │ └── message/
│ │ │ │ └── Demo01Message.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ ├── labx-14-sc-skywalking-mq-rabbitmq-producer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx14/
│ │ │ │ └── rabbitmqdemo/
│ │ │ │ └── producerdemo/
│ │ │ │ ├── ProducerApplication.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── Demo01Controller.java
│ │ │ │ └── message/
│ │ │ │ ├── Demo01Message.java
│ │ │ │ └── MySource.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ └── pom.xml
│ ├── labx-14-sc-skywalking-mq-rocketmq/
│ │ ├── labx-14-sc-skywalking-mq-rocketmq-consumer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx14/
│ │ │ │ └── rocketmqdemo/
│ │ │ │ └── consumerdemo/
│ │ │ │ ├── ConsumerApplication.java
│ │ │ │ ├── listener/
│ │ │ │ │ ├── Demo01Consumer.java
│ │ │ │ │ └── MySink.java
│ │ │ │ └── message/
│ │ │ │ └── Demo01Message.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ ├── labx-14-sc-skywalking-mq-rocketmq-producer/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx14/
│ │ │ │ └── rocketmqdemo/
│ │ │ │ └── producerdemo/
│ │ │ │ ├── ProducerApplication.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── Demo01Controller.java
│ │ │ │ └── message/
│ │ │ │ ├── Demo01Message.java
│ │ │ │ └── MySource.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ └── pom.xml
│ ├── labx-14-sc-skywalking-springcloudgateway/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx14/
│ │ │ └── gatewaydemo/
│ │ │ └── GatewayApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-14-sc-skywalking-springmvc/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx14/
│ │ │ └── springmvcdemo/
│ │ │ ├── UserServiceApplication.java
│ │ │ └── controller/
│ │ │ └── UserController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 链路追踪 SkyWalking》.md
├── labx-15/
│ ├── labx-15-admin-02-adminserver/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx15/
│ │ │ └── adminserver/
│ │ │ └── AdminServerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-15-admin-02-demo-application/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx15/
│ │ │ └── demo/
│ │ │ ├── Demo01Application.java
│ │ │ ├── Demo02Application.java
│ │ │ └── Demo03Application.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-15-admin-03-adminserver/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx15/
│ │ │ └── adminserver/
│ │ │ ├── AdminServerApplication.java
│ │ │ └── config/
│ │ │ └── SecurityConfig.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-15-admin-03-demo-application/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx15/
│ │ │ └── demo/
│ │ │ ├── Demo01Application.java
│ │ │ └── Demo02Application.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-15-admin-04-adminserver-custom/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx15/
│ │ │ └── adminserver/
│ │ │ ├── AdminServerApplication.java
│ │ │ └── notify/
│ │ │ └── LoggerNotifier.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-15-admin-04-adminserver-mail/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx15/
│ │ │ └── adminserver/
│ │ │ └── AdminServerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 监控工具 Admin 入门》.md
├── labx-16/
│ ├── deploy.sh
│ ├── labx-16-demo-01/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── lab16/
│ │ │ └── jenkinsdemo/
│ │ │ ├── Application.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ ├── application-dev.yaml
│ │ ├── application-local.yaml
│ │ ├── application-pre.yaml
│ │ ├── application-prod.yaml
│ │ └── application-uat.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 持续交付 Jenkins 入门》.md
├── labx-17/
│ ├── labx-17-sc-seata-at-feign-demo/
│ │ ├── data.sql
│ │ ├── labx-17-sc-seata-at-feign-demo-account-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx17/
│ │ │ │ └── accountservice/
│ │ │ │ ├── AccountServiceApplication.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── AccountController.java
│ │ │ │ ├── dao/
│ │ │ │ │ └── AccountDao.java
│ │ │ │ ├── dto/
│ │ │ │ │ └── AccountReduceBalanceDTO.java
│ │ │ │ └── service/
│ │ │ │ ├── AccountService.java
│ │ │ │ └── impl/
│ │ │ │ └── AccountServiceImpl.java
│ │ │ └── resources/
│ │ │ ├── application-file.yaml
│ │ │ └── application.yaml
│ │ ├── labx-17-sc-seata-at-feign-demo-order-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx17/
│ │ │ │ └── orderservice/
│ │ │ │ ├── OrderServiceApplication.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── OrderController.java
│ │ │ │ ├── dao/
│ │ │ │ │ └── OrderDao.java
│ │ │ │ ├── entity/
│ │ │ │ │ └── OrderDO.java
│ │ │ │ ├── feign/
│ │ │ │ │ ├── AccountServiceFeignClient.java
│ │ │ │ │ ├── ProductServiceFeignClient.java
│ │ │ │ │ └── dto/
│ │ │ │ │ ├── AccountReduceBalanceDTO.java
│ │ │ │ │ └── ProductReduceStockDTO.java
│ │ │ │ └── service/
│ │ │ │ ├── OrderService.java
│ │ │ │ └── impl/
│ │ │ │ └── OrderServiceImpl.java
│ │ │ └── resources/
│ │ │ ├── application-file.yaml
│ │ │ └── application.yaml
│ │ ├── labx-17-sc-seata-at-feign-demo-product-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx17/
│ │ │ │ └── productservice/
│ │ │ │ ├── ProductServiceApplication.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── ProductController.java
│ │ │ │ ├── dao/
│ │ │ │ │ └── ProductDao.java
│ │ │ │ ├── dto/
│ │ │ │ │ └── ProductReduceStockDTO.java
│ │ │ │ └── service/
│ │ │ │ ├── ProductService.java
│ │ │ │ └── impl/
│ │ │ │ └── ProductServiceImpl.java
│ │ │ └── resources/
│ │ │ ├── application-file.yaml
│ │ │ └── application.yaml
│ │ └── pom.xml
│ ├── labx-17-sca-seata-at-dubbo-demo/
│ │ ├── data.sql
│ │ ├── labx-17-sca-seata-at-dubbo-demo-account-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloudalibaba/
│ │ │ │ └── labx17/
│ │ │ │ └── accountservice/
│ │ │ │ ├── AccountServiceApplication.java
│ │ │ │ ├── dao/
│ │ │ │ │ └── AccountDao.java
│ │ │ │ └── service/
│ │ │ │ └── AccountServiceImpl.java
│ │ │ └── resources/
│ │ │ ├── application-file.yaml
│ │ │ └── application.yaml
│ │ ├── labx-17-sca-seata-at-dubbo-demo-account-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx17/
│ │ │ └── accountservice/
│ │ │ └── api/
│ │ │ └── AccountService.java
│ │ ├── labx-17-sca-seata-at-dubbo-demo-order-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloudalibaba/
│ │ │ │ └── labx17/
│ │ │ │ └── orderservice/
│ │ │ │ ├── OrderServiceApplication.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── OrderController.java
│ │ │ │ ├── dao/
│ │ │ │ │ └── OrderDao.java
│ │ │ │ ├── entity/
│ │ │ │ │ └── OrderDO.java
│ │ │ │ └── service/
│ │ │ │ └── OrderServiceImpl.java
│ │ │ └── resources/
│ │ │ ├── application-file.yaml
│ │ │ └── application.yaml
│ │ ├── labx-17-sca-seata-at-dubbo-demo-order-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx17/
│ │ │ └── orderservice/
│ │ │ └── api/
│ │ │ └── OrderService.java
│ │ ├── labx-17-sca-seata-at-dubbo-demo-product-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloudalibaba/
│ │ │ │ └── labx17/
│ │ │ │ └── productservice/
│ │ │ │ ├── ProductServiceApplication.java
│ │ │ │ ├── dao/
│ │ │ │ │ └── ProductDao.java
│ │ │ │ └── service/
│ │ │ │ └── ProductServiceImpl.java
│ │ │ └── resources/
│ │ │ ├── application-file.yaml
│ │ │ └── application.yaml
│ │ ├── labx-17-sca-seata-at-dubbo-demo-product-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx17/
│ │ │ └── producctservice/
│ │ │ └── api/
│ │ │ └── ProductService.java
│ │ └── pom.xml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud Alibaba 分布式事务 Seata 入门》.md
├── labx-18/
│ ├── labx-18-sc-bus-rabbitmq-demo-listener/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx18/
│ │ │ └── listenerdemo/
│ │ │ ├── ListenerDemoApplication.java
│ │ │ ├── event/
│ │ │ │ └── UserRegisterEvent.java
│ │ │ └── listener/
│ │ │ └── UserRegisterListener.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-18-sc-bus-rabbitmq-demo-listener-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx18/
│ │ │ └── listenerdemo/
│ │ │ ├── ListenerDemoApplication.java
│ │ │ ├── event/
│ │ │ │ └── UserRegisterEvent.java
│ │ │ └── listener/
│ │ │ └── UserRegisterListener.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-18-sc-bus-rabbitmq-demo-publisher/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx18/
│ │ │ └── publisherdemo/
│ │ │ ├── PublisherDemoApplication.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── event/
│ │ │ └── UserRegisterEvent.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-18-sc-bus-rabbitmq-demo-publisher-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx18/
│ │ │ └── publisherdemo/
│ │ │ ├── PublisherDemoApplication.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── event/
│ │ │ └── UserRegisterEvent.java
│ │ └── resources/
│ │ └── application.yml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 事件总线 RabbitMQ 入门》.md
├── labx-19/
│ ├── labx-19-sc-bus-kafka-demo-listener/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx19/
│ │ │ └── listenerdemo/
│ │ │ ├── ListenerDemoApplication.java
│ │ │ ├── event/
│ │ │ │ └── UserRegisterEvent.java
│ │ │ └── listener/
│ │ │ └── UserRegisterListener.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-19-sc-bus-kafka-demo-listener-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx19/
│ │ │ └── listenerdemo/
│ │ │ ├── ListenerDemoApplication.java
│ │ │ ├── event/
│ │ │ │ └── UserRegisterEvent.java
│ │ │ └── listener/
│ │ │ └── UserRegisterListener.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-19-sc-bus-kafka-demo-publisher/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx19/
│ │ │ └── publisherdemo/
│ │ │ ├── PublisherDemoApplication.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── event/
│ │ │ └── UserRegisterEvent.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-19-sc-bus-kafka-demo-publisher-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx19/
│ │ │ └── publisherdemo/
│ │ │ ├── PublisherDemoApplication.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── event/
│ │ │ └── UserRegisterEvent.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-19-sc-config-server-git-auto-refresh-by-bus/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx19/
│ │ │ └── configserverdemo/
│ │ │ └── ConfigServerApplication.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-19-sc-config-user-application-auto-refresh-by-bus/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx19/
│ │ │ └── userapplication/
│ │ │ ├── UserApplication.java
│ │ │ ├── config/
│ │ │ │ └── OrderProperties.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ ├── application.yml
│ │ └── bootstrap.yml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 事件总线 Kafka 入门》.md
├── labx-20/
│ ├── labx-20-sc-config-server-git-auto-refresh-by-bus/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx20/
│ │ │ └── configserverdemo/
│ │ │ └── ConfigServerApplication.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-20-sc-config-user-application-auto-refresh-by-bus/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx20/
│ │ │ └── userapplication/
│ │ │ ├── UserApplication.java
│ │ │ ├── config/
│ │ │ │ └── OrderProperties.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ ├── application.yml
│ │ └── bootstrap.yml
│ ├── labx-20-sca-bus-rocketmq-demo-listener/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx20/
│ │ │ └── listenerdemo/
│ │ │ ├── ListenerDemoApplication.java
│ │ │ ├── event/
│ │ │ │ └── UserRegisterEvent.java
│ │ │ └── listener/
│ │ │ └── UserRegisterListener.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-20-sca-bus-rocketmq-demo-listener-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx20/
│ │ │ └── listenerdemo/
│ │ │ ├── ListenerDemoApplication.java
│ │ │ ├── event/
│ │ │ │ └── UserRegisterEvent.java
│ │ │ └── listener/
│ │ │ └── UserRegisterListener.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-20-sca-bus-rocketmq-demo-publisher/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx20/
│ │ │ └── publisherdemo/
│ │ │ ├── PublisherDemoApplication.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── event/
│ │ │ └── UserRegisterEvent.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-20-sca-bus-rocketmq-demo-publisher-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx20/
│ │ │ └── publisherdemo/
│ │ │ ├── PublisherDemoApplication.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── event/
│ │ │ └── UserRegisterEvent.java
│ │ └── resources/
│ │ └── application.yml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud Alibaba 事件总线 Bus RocketMQ 入门》.md
├── labx-21/
│ ├── labx-21-sc-user-service/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx21/
│ │ │ └── userservice/
│ │ │ ├── UserServiceApplication.java
│ │ │ ├── controller/
│ │ │ │ └── UserController.java
│ │ │ └── dto/
│ │ │ ├── UserAddDTO.java
│ │ │ └── UserDTO.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-21-sc-zuul-demo01/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx21/
│ │ │ └── zuuldemo/
│ │ │ └── ZuulApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-21-sc-zuul-demo02-registry/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx21/
│ │ │ └── zuuldemo/
│ │ │ └── ZuulApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-21-sc-zuul-demo03-config-apollo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx21/
│ │ │ └── zuuldemo/
│ │ │ ├── ZuulApplication.java
│ │ │ └── ZuulPropertiesRefresher.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-21-sc-zuul-demo03-config-nacos/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx21/
│ │ │ └── zuuldemo/
│ │ │ ├── ZuulApplication.java
│ │ │ └── ZuulRouteRefreshListener.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ └── bootstrap.yaml
│ ├── labx-21-sc-zuul-demo05-custom-zuul-filter/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx21/
│ │ │ └── zuuldemo/
│ │ │ ├── ZuulApplication.java
│ │ │ └── filter/
│ │ │ └── AuthZuulFilter.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-21-sc-zuul-demo07-hystrix/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx21/
│ │ │ └── zuuldemo/
│ │ │ ├── ZuulApplication.java
│ │ │ └── fallback/
│ │ │ └── ApiFallbackProvider.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-21-sc-zuul-demo07-sentinel/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx21/
│ │ │ └── zuuldemo/
│ │ │ ├── CustomBlockFallbackProvider.java
│ │ │ └── ZuulApplication.java
│ │ └── resources/
│ │ ├── application.yaml
│ │ ├── sentinel-gw-api-group.json
│ │ └── sentinel-gw-flow.json
│ ├── labx-21-sc-zuul-demo09-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx21/
│ │ │ └── zuuldemo/
│ │ │ └── ZuulApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 网关 Zuul 入门》.md
├── labx-22/
│ ├── labx-22-scn-eureka-demo01-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx22/
│ │ │ └── consumerdemo/
│ │ │ └── DemoConsumerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-22-scn-eureka-demo01-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx22/
│ │ │ └── providerdemo/
│ │ │ └── DemoProviderApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-22-scn-eureka-demo02-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx22/
│ │ │ └── consumerdemo/
│ │ │ └── DemoConsumerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-22-scn-eureka-demo02-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx22/
│ │ │ └── providerdemo/
│ │ │ └── DemoProviderApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-22-scn-eureka-demo03-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx22/
│ │ │ └── consumerdemo/
│ │ │ └── DemoConsumerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-22-scn-eureka-demo03-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx22/
│ │ │ └── providerdemo/
│ │ │ └── DemoProviderApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-22-scn-eureka-server-cluster/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx22/
│ │ │ └── eurekaserverdemo/
│ │ │ └── EurekaServerApplication.java
│ │ └── resources/
│ │ ├── application-node01.yaml
│ │ └── application-node02.yaml
│ ├── labx-22-scn-eureka-server-security/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx22/
│ │ │ └── eurekaserverdemo/
│ │ │ ├── EurekaServerApplication.java
│ │ │ └── config/
│ │ │ └── WebSecurityConfig.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-22-scn-eureka-server-standalone/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloudalibaba/
│ │ │ └── labx22/
│ │ │ └── eurekaserverdemo/
│ │ │ └── EurekaServerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud Netflix 注册中心 Eureka 入门》.md
├── labx-23/
│ ├── labx-23-scn-hystrix-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx23/
│ │ │ └── hystrixdemo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── controller/
│ │ │ │ ├── CacheDemoController.java
│ │ │ │ ├── CollapserDemoController.java
│ │ │ │ └── DemoController.java
│ │ │ ├── filter/
│ │ │ │ └── HystrixRequestContextFilter.java
│ │ │ └── service/
│ │ │ ├── CacheDemoService.java
│ │ │ └── CollapserDemoService.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-23-scn-hystrix-dashboard/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx23/
│ │ │ └── hystrixdemo/
│ │ │ └── HystrixDashboardApplication.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-23-scn-hystrix-dashboard-turbine/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx23/
│ │ │ └── hystrixdemo/
│ │ │ └── HystrixDashboardApplication.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-23-scn-hystrix-demo01/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springcloud/
│ │ └── labx23/
│ │ └── hystrixdemo/
│ │ ├── DemoApplication.java
│ │ ├── controller/
│ │ │ ├── CacheDemoController.java
│ │ │ ├── CollapserDemoController.java
│ │ │ └── DemoController.java
│ │ ├── filter/
│ │ │ └── HystrixRequestContextFilter.java
│ │ └── service/
│ │ ├── CacheDemoService.java
│ │ └── CollapserDemoService.java
│ ├── labx-23-scn-hystrix-demo01-cluster/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx23/
│ │ │ └── hystrixdemo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── controller/
│ │ │ │ ├── CacheDemoController.java
│ │ │ │ ├── CollapserDemoController.java
│ │ │ │ └── DemoController.java
│ │ │ ├── filter/
│ │ │ │ └── HystrixRequestContextFilter.java
│ │ │ └── service/
│ │ │ ├── CacheDemoService.java
│ │ │ └── CollapserDemoService.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-23-scn-hystrix-dubbo-demo/
│ │ ├── labx-23-scn-hystrix-dubbo-demo-application/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx23/
│ │ │ │ └── demo/
│ │ │ │ ├── DemoApplication.java
│ │ │ │ └── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── labx-23-scn-hystrix-dubbo-demo-user-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx23/
│ │ │ │ └── userservice/
│ │ │ │ ├── UserServiceApplication.java
│ │ │ │ └── service/
│ │ │ │ └── UserServiceImpl.java
│ │ │ └── resources/
│ │ │ └── application.yaml
│ │ ├── labx-23-scn-hystrix-dubbo-demo-user-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx23/
│ │ │ └── userservice/
│ │ │ └── api/
│ │ │ └── UserService.java
│ │ └── pom.xml
│ ├── labx-23-scn-hystrix-feign/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx23/
│ │ │ └── hystrixdemo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── controller/
│ │ │ │ └── FeignDemoController.java
│ │ │ ├── fallback/
│ │ │ │ └── UserServiceFeignClientFallbackFactory.java
│ │ │ └── feign/
│ │ │ └── UserServiceFeignClient.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-23-user-service/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springcloud/
│ │ └── labx23/
│ │ └── userservice/
│ │ └── UserServiceApplication.java
│ ├── pom.xml
│ └── 《芋道 Spring Cloud Netflix 服务容错 Hystrix 入门》.md
├── labx-24/
│ ├── labx-24-resilience4j-demo01/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx24/
│ │ │ └── resilience4jdemo/
│ │ │ ├── DemoApplication.java
│ │ │ └── controller/
│ │ │ ├── BulkheadDemoController.java
│ │ │ ├── DemoController.java
│ │ │ ├── RateLimiterDemoController.java
│ │ │ ├── RetryDemoController.java
│ │ │ ├── ThreadPoolBulkheadDemoController.java
│ │ │ └── TimeLimiterDemoController.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-24-resilience4j-demo02/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springcloud/
│ │ └── labx24/
│ │ └── resilience4jdemo/
│ │ ├── DemoApplication.java
│ │ ├── config/
│ │ │ └── Resilience4jConfig.java
│ │ └── controller/
│ │ └── DemoController.java
│ ├── labx-24-user-service/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ └── java/
│ │ └── cn/
│ │ └── iocoder/
│ │ └── springcloud/
│ │ └── labx24/
│ │ └── userservice/
│ │ └── UserServiceApplication.java
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 服务容错 Resilience4j 入门》.md
├── labx-25/
│ ├── labx-25-sc-zookeeper-discovery-demo01-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx25/
│ │ │ └── zookeeperdemo/
│ │ │ └── consumer/
│ │ │ └── DemoConsumerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-25-sc-zookeeper-discovery-demo01-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx25/
│ │ │ └── zookeeperdemo/
│ │ │ └── provider/
│ │ │ └── DemoProviderApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 注册中心 ZooKeeper 入门》.md
├── labx-26/
│ ├── labx-26-sc-zookeeper-config-auto-refresh/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx26/
│ │ │ └── zookeeperdemo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── config/
│ │ │ │ └── OrderProperties.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── listener/
│ │ │ └── DemoEnvironmentChangeListener.java
│ │ └── resources/
│ │ └── bootstrap.yaml
│ ├── labx-26-sc-zookeeper-config-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx26/
│ │ │ └── zookeeperdemo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── config/
│ │ │ │ └── OrderProperties.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── bootstrap.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 配置中心 ZooKeeper 入门》.md
├── labx-27/
│ ├── labx-27-sc-consul-discovery-demo01-consumer/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx27/
│ │ │ └── consuldemo/
│ │ │ └── consumer/
│ │ │ └── DemoConsumerApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── labx-27-sc-consul-discovery-demo01-provider/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx27/
│ │ │ └── consuldemo/
│ │ │ └── provider/
│ │ │ └── DemoProviderApplication.java
│ │ └── resources/
│ │ └── application.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 注册中心 Consul 入门》.md
├── labx-28/
│ ├── labx-28-sc-consul-config-auto-refresh/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx28/
│ │ │ └── consuldemo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── config/
│ │ │ │ └── OrderProperties.java
│ │ │ ├── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── listener/
│ │ │ └── DemoEnvironmentChangeListener.java
│ │ └── resources/
│ │ └── bootstrap.yaml
│ ├── labx-28-sc-consul-config-demo/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx28/
│ │ │ └── consuldemo/
│ │ │ ├── DemoApplication.java
│ │ │ ├── config/
│ │ │ │ └── OrderProperties.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ └── bootstrap.yaml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 配置中心 Consul 入门》.md
├── labx-29-spring-cloud-consul-bus/
│ ├── labx-29-sc-bus-consul-demo-listener/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx29/
│ │ │ └── listenerdemo/
│ │ │ ├── ListenerDemoApplication.java
│ │ │ ├── event/
│ │ │ │ └── UserRegisterEvent.java
│ │ │ └── listener/
│ │ │ └── UserRegisterListener.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-29-sc-bus-consul-demo-listener-actuator/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ ├── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx29/
│ │ │ │ └── listenerdemo/
│ │ │ │ ├── ListenerDemoApplication.java
│ │ │ │ ├── event/
│ │ │ │ │ └── UserRegisterEvent.java
│ │ │ │ └── listener/
│ │ │ │ └── UserRegisterListener.java
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── cloud/
│ │ │ └── consul/
│ │ │ └── binder/
│ │ │ └── ConsulSendingHandler.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-29-sc-bus-consul-demo-publisher/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ ├── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx29/
│ │ │ │ └── publisherdemo/
│ │ │ │ ├── PublisherDemoApplication.java
│ │ │ │ ├── controller/
│ │ │ │ │ └── DemoController.java
│ │ │ │ └── event/
│ │ │ │ └── UserRegisterEvent.java
│ │ │ └── org/
│ │ │ └── springframework/
│ │ │ └── cloud/
│ │ │ └── consul/
│ │ │ └── binder/
│ │ │ └── ConsulSendingHandler.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-29-sc-config-server-git-auto-refresh-by-bus/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx29/
│ │ │ └── configserverdemo/
│ │ │ └── ConfigServerApplication.java
│ │ └── resources/
│ │ └── application.yml
│ ├── labx-29-sc-config-user-application-auto-refresh-by-bus/
│ │ ├── pom.xml
│ │ └── src/
│ │ └── main/
│ │ ├── java/
│ │ │ └── cn/
│ │ │ └── iocoder/
│ │ │ └── springcloud/
│ │ │ └── labx29/
│ │ │ └── userapplication/
│ │ │ ├── UserApplication.java
│ │ │ ├── config/
│ │ │ │ └── OrderProperties.java
│ │ │ └── controller/
│ │ │ └── DemoController.java
│ │ └── resources/
│ │ ├── application.yml
│ │ └── bootstrap.yml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud 消息总线 Bus Consul 入门》.md
├── labx-30-spring-cloud-grpc/
│ ├── labx-30-grpc-cloud/
│ │ ├── labx-30-grpc-cloud-application/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx30/
│ │ │ │ └── demo/
│ │ │ │ ├── DemoApplication.java
│ │ │ │ └── controller/
│ │ │ │ └── DemoController.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ ├── labx-30-grpc-cloud-user-service/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ ├── java/
│ │ │ │ └── cn/
│ │ │ │ └── iocoder/
│ │ │ │ └── springcloud/
│ │ │ │ └── labx30/
│ │ │ │ └── userservice/
│ │ │ │ ├── UserServiceApplication.java
│ │ │ │ └── rpc/
│ │ │ │ └── UserServiceGrpcImpl.java
│ │ │ └── resources/
│ │ │ └── application.yml
│ │ ├── labx-30-grpc-cloud-user-service-api/
│ │ │ ├── pom.xml
│ │ │ └── src/
│ │ │ └── main/
│ │ │ └── proto/
│ │ │ └── UserService.proto
│ │ └── pom.xml
│ ├── pom.xml
│ └── 《芋道 Spring Cloud gRPC 入门》.md
└── pom.xml
================================================
FILE CONTENTS
================================================
================================================
FILE: .gitignore
================================================
# Created by .ignore support plugin (hsz.mobi)
### Java template
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
SpringBoot-Labs.ipr
SpringBoot-Labs.iws
target/**
*.lst
*.iml
*ipr
*.iws
### IntelliJ IDEA
.idea
target
================================================
FILE: README.md
================================================
> 友情提示:因为提供了 50000+ 行示例代码,所以艿艿默认注释了所有 Maven Module。
>
> 胖友可以根据自己的需要,修改 [`pom.xml`](https://github.com/YunaiV/SpringBoot-Labs/blob/master/pom.xml) 即可。
一个涵盖六个主流技术栈的**正经**仓库:
* [《Spring Boot 专栏》](https://github.com/YunaiV/SpringBoot-Labs#spring-boot-%E4%B8%93%E6%A0%8F)
* [《Spring Cloud Alibaba 专栏》](https://github.com/YunaiV/SpringBoot-Labs#spring-cloud-alibaba-%E4%B8%93%E6%A0%8F)
* [《Spring Cloud 专栏》](https://github.com/YunaiV/SpringBoot-Labs#spring-cloud-%E4%B8%93%E6%A0%8F)
* [《Dubbo 专栏》](https://github.com/YunaiV/SpringBoot-Labs#Dubbo-%E4%B8%93%E6%A0%8F)
* [《消息队列 MQ 专栏》](https://github.com/YunaiV/SpringBoot-Labs#%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97-mq-%E4%B8%93%E6%A0%8F)
* [《分布式事务专栏》](https://github.com/YunaiV/SpringBoot-Labs#分布式事务专栏)
作为一个热爱**深夜**撸码的 18 岁头发茂密的可爱小男孩,希望大佬能够**一键三连**。

> **亲,一键三连啊**
# 交流群
扫码如下**二维码**,回复「艿艿」关键字。
可以添加 18 岁的我为好友,并拉你进一个~~交流~~**装逼群**。

😈 等后面,艿艿**头发**重新长一点出来,给旁友们录制点视频哈!
# Spring Boot 专栏
基于 Spring Boot 2.X 版本的**深度**入门教程。
市面上的 Spring Boot **基础**入门文章很多,但是**深度**入门文章却很少。对于很多开发者来说,入门即是其对某个技术栈的最终理解,一方面是开发者“比较懒”,另一方面是文章作者把 Spring Boot 入门写的太浅,又或者不够全面。
因此,艿艿开始了这个 Spring Boot 专栏,一个**深度**且**全面**的 Spring Boot 2.X 入门。
* 在带你快速学会 SpringMVC API 接口的编写的同时,我还想告诉你还有全局返回、全局异常、拦截器、跨域处理等等功能。
* 在带你快速学会 MQ 消息的发送与消费的同时,我还想告诉你 MQ 还有集群消费、广播消费、顺序消息、定时消息、事务消息、消费重试等等特性。
* 在带你快速学会 Job 任务的编写的同时,我还想告诉你还有 Quartz 单体、Quartz 集群、XXL-JOB 等等企业使用更多的调度平台。
* ...
让我们一起愉快的挖坑,挖深坑,哇哈哈。
## 打好基础
* [《芋道 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 Jar 启动原理》](http://www.iocoder.cn/Spring-Boot/jar/?github)
* [《芋道 Spring Boot 调试环境》](http://www.iocoder.cn/Spring-Boot/build-debugging-environment-2-6-0/?github)
## 开发工具
* [《芋道 Spring Boot 热部署入门》](http://www.iocoder.cn/Spring-Boot/hot-swap/?github) 对应 [lab-48-hot-swap](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-48-hot-swap)
* [《芋道 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 入门》](http://www.iocoder.cn/Spring-Boot/MapStruct/?github) 对应 [lab-55](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-55)
## 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 API 接口文档 Swagger Starter 入门》](http://www.iocoder.cn/Spring-Boot/Swagger-Starter/?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)
* [《性能测试 —— Tomcat、Jetty、Undertow 基准测试》](http://www.iocoder.cn/Performance-Testing/Tomcat-Jetty-Undertow-benchmark/?github) 对应 [lab-05-benchmark-tomcat-jetty-undertow](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-05-benchmark-tomcat-jetty-undertow)
* [《性能测试 —— 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 Boot API 接口文档 JApiDocs 入门》](http://www.iocoder.cn/Spring-Boot/JApiDocs/?github) 对应 [lab-24](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-24)
* [《芋道 Spring Boot API 接口文档 ShowDoc 入门》](http://www.iocoder.cn/Spring-Boot/ShowDoc/?github) 对应 [lab-24](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-24)
* [《芋道 Spring Boot API 接口调试 IDEA HTTP Client》](http://www.iocoder.cn/Spring-Boot/IDEA-HTTP-Client/?github) 对应 [lab-71-http-debug](https://github.com/YunaiV/SpringBoot-Labs/blob/master/lab-71-http-debug/)
## RPC 开发
* [《芋道 Spring Boot Netty 入门》](http://www.iocoder.cn/Spring-Boot/Netty/?github) 对应 [lab-67](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-67)
* [《芋道 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 声明式调用 Feign 入门》](http://www.iocoder.cn/Spring-Boot/Feign/?github) 对应 [lab-58](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-58)
* [《芋道 Spring Boot gRPC 入门》](http://www.iocoder.cn/Spring-Boot/gRPC/?github) 对应 [lab-64](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-64)
* [《芋道 Spring Boot Web Services 入门》](http://www.iocoder.cn/Spring-Boot/Web-Services/?github) 对应 [lab-65](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-65)
* [《芋道 Spring Boot SOFARPC 入门》](http://www.iocoder.cn/Spring-Boot/SOFARPC/?github) 对应 [lab-62](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-62)
* [《芋道 Spring Boot Motan 入门》](http://www.iocoder.cn/Spring-Boot/Motan/?github) 对应 [lab-63](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-63)
* 《芋道 Spring Boot RSocket 入门》计划中...
* 《芋道 Spring Boot Tars 入门》计划中...
## 文件存储
* [《芋道 Spring Boot 对象存储 MinIO 入门》](https://www.iocoder.cn/Spring-Boot/MinIO/?github) 对应 [lab-72-minio](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-72-minio)
## 数据访问
**关系数据库**
* [《芋道 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-mybatis](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-12-mybatis)
* [《芋道 Spring Boot JPA 入门》](http://www.iocoder.cn/Spring-Boot/JPA/?github) 对应 [lab-13-spring-data-jpa](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-13-spring-data-jpa)
* [《芋道 Spring Boot JdbcTemplate 入门》](http://www.iocoder.cn/Spring-Boot/JdbcTemplate/?github) 对应 [lab-14-spring-jdbc-template](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-14-spring-jdbc-template)
* [《芋道 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 数据表结构文档》](http://www.iocoder.cn/Spring-Boot/DB-Doc-screw/?github) 对应 [lab-70-db-doc](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-70-db-doc)
**非关系数据库**
* [《芋道 Spring Boot Redis 入门》](http://www.iocoder.cn/Spring-Boot/Redis/?github) 对应 [lab-11-spring-data-redis](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-11-spring-data-redis)
* [《芋道 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 MongoDB 入门》](http://www.iocoder.cn/Spring-Boot/MongoDB/?github) 对应 [lab-16-spring-data-mongo](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-16-spring-data-mongo)
* [《芋道 Spring Boot Elasticsearch 入门》](http://www.iocoder.cn/Spring-Boot/Elasticsearch/?github) 对应 [lab-15-spring-data-es](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-15-spring-data-es)
* [《芋道 Spring Boot Solr 入门》](http://www.iocoder.cn/Spring-Boot/Solr/?github) 对应 [lab-66](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-66)
## 事务管理
* [《芋道 Spring Boot 分布式事务 Seata 入门》](http://www.iocoder.cn/Spring-Boot/Seata/?github) 对应 [lab-52](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-52)
## 安全控制
* [《芋道 Spring Boot 安全框架 Spring Security 入门》](http://www.iocoder.cn/Spring-Boot/Spring-Security/?github) 对应 [lab-01-spring-security](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-01-spring-security)
* [《芋道 Spring Boot 安全框架 Shiro 入门》](http://www.iocoder.cn/Spring-Boot/Shiro/?github) 对应 [lab-33](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-33)
**OAuth 2.0**
* [《芋道 Spring Security OAuth2 入门》](http://www.iocoder.cn/Spring-Security/OAuth2-learning/?github) 对应 [lab-68-spring-security-oauth](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-68-spring-security-oauth)
* [《芋道 Spring Security OAuth2 存储器》](http://www.iocoder.cn/Spring-Security/OAuth2-learning-store/?github) 对应 [lab-68-spring-security-oauth](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-68-spring-security-oauth)
* [《芋道 Spring Security OAuth2 单点登陆》](http://www.iocoder.cn/Spring-Security/OAuth2-learning-sso/?github) 对应 [lab-68-spring-security-oauth](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-68-spring-security-oauth)
## 定时任务与异步任务
* [《芋道 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-kafka](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-03-kafka)
* [《芋道 Spring Boot 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Boot/RabbitMQ/?github) 对应 [lab-04-rabbitmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-04-rabbitmq)
* [《芋道 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 事件机制 Event 入门》](http://www.iocoder.cn/Spring-Boot/Event/?github) 对应 对应 [lab-54](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-54)
## 配置中心
* [《芋道 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 入门》](http://www.iocoder.cn/Spring-Boot/Hystrix/?github) 对应 [lab-57](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-57)
* [《芋道 Spring Boot 服务容错 Resilience4j 入门》](http://www.iocoder.cn/Spring-Boot/Resilience4j/?github) 对应 [lab-59](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-59)
## 监控管理
* [《芋道 Spring Boot 异常管理平台 Sentry 入门》](http://www.iocoder.cn/Spring-Boot/Sentry/?github) 对应 [lab-51](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-51)
* [《芋道 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 入门》](http://www.iocoder.cn/Spring-Boot/CAT/?github) 对应 [lab-61](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-61)
## 日志管理
* [《芋道 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 日志平台 Loki 入门》计划中...
## 链路追踪
* [《芋道 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 入门》计划中...
# Spring Cloud Alibaba 专栏
## Spring Cloud Alibaba 全家桶
* [《芋道 Spring Cloud Alibaba 介绍》](http://www.iocoder.cn/Spring-Cloud-Alibaba/intro/?github)
* [《芋道 Spring Cloud Alibaba 注册中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Discovery/?github) 对应 [labx-01-spring-cloud-alibaba-nacos-discovery](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-01-spring-cloud-alibaba-nacos-discovery)
* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github) 对应 [labx-07-spring-cloud-alibaba-dubbo](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-07-spring-cloud-alibaba-dubbo)
* [《芋道 Spring Cloud Alibaba 服务容错 Sentinel 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Sentinel/?github) 对应 [labx-04-spring-cloud-alibaba-sentinel](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-04-spring-cloud-alibaba-sentinel)
* [《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/RocketMQ/?github) 对应 [labx-06-spring-cloud-stream-rocketmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-06-spring-cloud-stream-rocketmq)
* [《芋道 Spring Cloud Alibaba 事件总线 Bus RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Bus-RocketMQ/?github) 对应 [labx-20](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-20)
* [《芋道 Spring Cloud Alibaba 配置中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Config/?github) 对应 [labx-05-spring-cloud-alibaba-nacos-config](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-05-spring-cloud-alibaba-nacos-config)
* [《芋道 Spring Cloud Alibaba 分布式事务 Seata 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Seata/?github) 对应 [labx-17](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-17)
## 推荐搭配食用
* [《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》](http://www.iocoder.cn/Spring-Cloud-Netflix/Ribbon/?github) 对应 [labx-02-spring-cloud-netflix-ribbon](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-02-spring-cloud-netflix-ribbon)
* [《芋道 Spring Cloud 声明式调用 Feign 入门》](http://www.iocoder.cn/Spring-Cloud/Feign/?github) 对应 [labx-03-spring-cloud-feign](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-03-spring-cloud-feign)
* [《芋道 Spring Cloud 服务网关 Spring Cloud Gateway 入门》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Gateway/?github) 对应 [labx-08-spring-cloud-gateway](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-08-spring-cloud-gateway)
* [《芋道 Spring Cloud 链路追踪 SkyWalking 入门》](http://www.iocoder.cn/Spring-Cloud/SkyWalking/?github) 对应 [labx-14](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-14)
* [《芋道 Dubbo Admin 快速入门》](http://www.iocoder.cn/Dubbo/Admin/?github)
* [《芋道 Dubbo Swagger 快速入门》](http://www.iocoder.cn/Dubbo/Swagger/?github) 对应 [swagger-dubbo](https://github.com/YunaiV/swagger-dubbo)
# Spring Cloud 专栏
## 注册中心
* [《芋道 Spring Cloud Alibaba 注册中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Discovery/?github) 对应 [labx-01-spring-cloud-alibaba-nacos-discovery](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-01-spring-cloud-alibaba-nacos-discovery)
* [《芋道 Spring Cloud Netflix 注册中心 Eureka 入门》](http://www.iocoder.cn/Spring-Cloud/Netflix-Eureka?github) 对应 [labx-22](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-22)
* [《芋道 Spring Cloud 注册中心 Zookeeper 入门》](http://www.iocoder.cn/Spring-Cloud/ZooKeeper-Discovery/?github) 对应 [labx-25](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-25)
* [《芋道 Spring Cloud 注册中心 Consul 入门》](http://www.iocoder.cn/Spring-Cloud/Consul-Discovery/?github) 对应 [labx-27](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-27)
* [《芋道 Spring Cloud 注册中心 Etcd 入门》](http://www.iocoder.cn/Spring-Cloud/Etcd/?github)
## 服务调用
* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github) 对应 [labx-07-spring-cloud-alibaba-dubbo](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-07-spring-cloud-alibaba-dubbo)
* [《芋道 Spring Cloud Netflix 负载均衡 Ribbon 入门》](http://www.iocoder.cn/Spring-Cloud-Netflix/Ribbon/?github) 对应 [labx-02-spring-cloud-netflix-ribbon](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-02-spring-cloud-netflix-ribbon)
* [《芋道 Spring Cloud 声明式调用 Feign 入门》](http://www.iocoder.cn/Spring-Cloud/Feign/?github) 对应 [labx-03-spring-cloud-feign](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-03-spring-cloud-feign)
* [《芋道 Spring Cloud 服务调用 gRPC 入门》](http://www.iocoder.cn/Spring-Cloud/gRPC/?github) 对应 [labx-30-spring-cloud-grpc](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-30-spring-cloud-grpc)
## 服务容错
* [《芋道 Spring Cloud Alibaba 服务容错 Sentinel 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Sentinel/?github) 对应 [labx-04-spring-cloud-alibaba-sentinel](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-04-spring-cloud-alibaba-sentinel)
* [《芋道 Spring Cloud Netflix 服务容错 Hystrix 入门》](http://www.iocoder.cn/Spring-Cloud/Netflix-Hystrix/?github) 对应 [labx-23](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-23)
* [《芋道 Spring Cloud 服务容错 Resilience4j 入门》](http://www.iocoder.cn/Spring-Cloud/Resilience4j/?github) 对应 [lab-59](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-59)
* 《芋道 Spring Cloud 服务容错 Spring Cloud CircuitBreaker》计划中...
## API 网关
* [《芋道 Spring Cloud 服务网关 Spring Cloud Gateway 入门》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Gateway/?github) 对应 [labx-08-spring-cloud-gateway](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-08-spring-cloud-gateway)
* [《芋道 Spring Cloud Netflix 服务网关 Zuul 入门》](http://www.iocoder.cn/Spring-Cloud/Netflix-Zuul/?github) 对应 对应 [labx-21](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-21)
* [《性能测试 —— 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 网关,先放在这里...
* [《芋道 APISIX 极简入门(国产微服务网关)》](http://www.iocoder.cn/APISIX/install/?github) 对应 [lab-56](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-56)
* [《芋道 Soul 极简入门(国产微服务网关)》](http://www.iocoder.cn/Soul/install/?github) 对应 [lab-60](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-60)
* [《芋道 Kong 极简入门(微服务网关)》](http://www.iocoder.cn/Kong/install/?github) 对应 [lab-56](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-56)
## 配置中心
* [《芋道 Spring Cloud Alibaba 配置中心 Nacos 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Nacos-Config/?github) 对应 [labx-05-spring-cloud-alibaba-nacos-config](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-05-spring-cloud-alibaba-nacos-config)
* [《芋道 Spring Cloud 配置中心 Apollo 入门》](http://www.iocoder.cn/Spring-Cloud/Apollo/?github) 对应 [labx-09-spring-cloud-apollo](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-09-spring-cloud-apollo)
* [《芋道 Spring Cloud 配置中心 Spring Cloud Config 入门》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Config/?github) 对应 [labx-12-spring-cloud-config](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-12-spring-cloud-config)
* [《芋道 Spring Cloud 配置中心 Zookeeper 入门》](http://www.iocoder.cn/Spring-Cloud/ZooKeeper-Config/?github) 对应 [labx-26](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-26)
* [《芋道 Spring Cloud 配置中心 Consul 入门》](http://www.iocoder.cn/Spring-Cloud/Consul-Config/?github) 对应 [labx-28](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-28)
* [《芋道 Spring Cloud 配置中心 Etcd 入门》](http://www.iocoder.cn/Spring-Cloud/Etcd/?github)
## 消息队列
**Spring Cloud Stream**
* [《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/RocketMQ/?github) 对应 [labx-06-spring-cloud-stream-rocketmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-06-spring-cloud-stream-rocketmq)
* [《芋道 Spring Cloud 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Cloud/RabbitMQ/?github) 对应 [labx-10-spring-cloud-stream-rabbitmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-10-spring-cloud-stream-rabbitmq)
* [《芋道 Spring Cloud 消息队列 Kafka 入门》](http://www.iocoder.cn/Spring-Cloud/Kafka/?github) 对应 [labx-11-spring-cloud-stream-kafka](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-11-spring-cloud-stream-kafka)
* [《芋道 Spring Cloud 消息队列 ActiveMQ 入门》](http://www.iocoder.cn/Spring-Cloud/ActiveMQ/?github)
**Spring Cloud Bus**
* [《芋道 Spring Cloud Alibaba 事件总线 Bus RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Bus-RocketMQ/?github) 对应 [labx-20](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-20)
* [《芋道 Spring Cloud 事件总线 Bus RabbitMQ 入门》](http://www.iocoder.cn/Spring-Cloud/Bus-RabbitMQ/?github) 对应 [labx-19](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-19)
* [《芋道 Spring Cloud 事件总线 Bus Kafka 入门》](http://www.iocoder.cn/Spring-Cloud/Bus-Kafka/?github) 对应 [labx-18](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-18)
* [《芋道 Spring Cloud 事件总线 Bus Consul 入门》](http://www.iocoder.cn/Spring-Cloud/Bus-Consul/?github) 对应 [labx-29-spring-cloud-consul-bus](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-29-spring-cloud-consul-bus)
## 分布式事务
* [《芋道 Spring Cloud Alibaba 分布式事务 Seata 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Seata/?github) 对应 [labx-17](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-17)
## 监控管理
* [《芋道 Spring Boot 异常管理平台 Sentry 入门》](http://www.iocoder.cn/Spring-Boot/Sentry/?github) 对应 [lab-51](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-51)
* [《芋道 Spring Boot 监控端点 Actuator 入门》](http://www.iocoder.cn/Spring-Boot/Actuator/?github) 对应 [lab-34](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-34)
* [《芋道 Spring Cloud 监控工具 Admin 入门》](http://www.iocoder.cn/Spring-Cloud/SB-Admin/?github) 对应 [labx-15](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-15)
* [《芋道 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 Cloud 持续交付 Jenkins 入门》](http://www.iocoder.cn/Spring-Cloud/Jenkins/?github) 对应 [labx-16](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-16)
* [《芋道 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 Cloud 容器 Docker 入门》计划中...
## 链路追踪
* [《芋道 Spring Cloud 链路追踪 SkyWalking 入门》](http://www.iocoder.cn/Spring-Cloud/SkyWalking/?github) 对应 [labx-14](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-14)
* [《芋道 Spring Cloud 链路追踪 Spring Cloud Sleuth》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Sleuth/?github) 对应 [labx-13](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-13)
# Dubbo 专栏
## 基础入门
* [《芋道 Spring Boot Dubbo 入门》](http://www.iocoder.cn/Spring-Boot/Dubbo/?github) 对应 [lab-30](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-30)
* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github) 对应 [labx-07-spring-cloud-alibaba-dubbo](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-07-spring-cloud-alibaba-dubbo)
* [《性能测试 —— Dubbo 基准测试》](http://www.iocoder.cn/Performance-Testing/Dubbo-benchmark/?github)
* [《芋道 Dubbo Swagger 快速入门》](http://www.iocoder.cn/Dubbo/Swagger/?github) 对应 [swagger-dubbo](https://github.com/YunaiV/swagger-dubbo)
## 注册中心
**[Zookeeper](http://www.iocoder.cn/Zookeeper/install/?github)**
* [《芋道 Spring Boot Dubbo 入门》](http://www.iocoder.cn/Spring-Boot/Dubbo/?github)的[「2. XML 配置」](#)和[「3. 注解配置」](#)小节
**[Nacos](http://www.iocoder.cn/Nacos/install/?github)**
* [《芋道 Spring Boot Dubbo 入门》](http://www.iocoder.cn/Spring-Boot/Dubbo/?github)的[「6. 整合 Nacos」](#)小节
* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github)的[「2. 快速入门」](#)小节
## 服务容错
**[Sentinel](http://www.iocoder.cn/Sentinel/install/?github)**
* [《芋道 Spring Boot Dubbo 入门》](http://www.iocoder.cn/Spring-Boot/Dubbo/?github)的[「7. 整合 Sentinel」](#)小节
* [《芋道 Spring Cloud Alibaba 服务调用 Dubbo 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Dubbo/?github)的[「6. 整合 Sentinel」](#)小节
**[Hystrix](http://www.iocoder.cn/categories/Hystrix/?github)**
* [《芋道 Spring Boot 服务容错 Hystrix 入门》](http://www.iocoder.cn/Spring-Boot/Hystrix/?github)的[「6. 集成到 Dubbo」](#)小节
* [《芋道 Spring Cloud Netflix 服务容错 Hystrix 入门》](http://www.iocoder.cn/Spring-Cloud/Netflix-Hystrix/?github)的[「10. 集成到 Dubbo」](#)小节
**[Resilience4j](http://www.iocoder.cn/categories/Resilience4j/?github)**
* [《芋道 Spring Boot 服务容错 Resilience4j 入门》](http://www.iocoder.cn/Spring-Boot/Resilience4j/?github)的[「10. 集成到 Dubbo」](#)小节
## API 网关
* [《芋道 Soul 极简入门(国产微服务网关)》](http://www.iocoder.cn/Soul/install/?github)的[「3. 接入 Dubbo 应用」](#)小节
## 分布式事务
**[Seata](http://www.iocoder.cn/Seata/install/?github)**
* [《芋道 Dubbo 分布式事务 Seata 入门》](http://www.iocoder.cn/Dubbo/Seata/?github) 对应 [lab-53](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-53)
* [《芋道 Spring Cloud Alibaba 分布式事务 Seata 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Seata/?github)的[「2. AT 模式 + Dubbo」](#)小节
**[TCC Transaction](http://www.iocoder.cn/categories/TCC-Transaction/?github)**
* [《TCC-Transaction 源码分析 —— Dubbo 支持》](http://www.iocoder.cn/TCC-Transaction/dubbo-support/?self)
## 链路追踪
**[SkyWalking](http://www.iocoder.cn/SkyWalking/install/?github)**
* [《芋道 Spring Boot 链路追踪 SkyWalking 入门》](http://www.iocoder.cn/Spring-Boot/SkyWalking/?github) 的[「16. Dubbo 示例」](#)小节
* [《芋道 Spring Cloud 链路追踪 SkyWalking 入门》](http://www.iocoder.cn/Spring-Cloud/SkyWalking/?github) 的[「7. Dubbo 示例」](#)小节
**[Zipkin](http://www.iocoder.cn/Zipkin/install/?github)**
* [《芋道 Spring Boot 链路追踪 Zipkin》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Sleuth/?github) 的[「13. Dubbo 示例」](#)小节
* [《芋道 Spring Cloud 链路追踪 Spring Cloud Sleuth》](http://www.iocoder.cn/Spring-Cloud/Spring-Cloud-Sleuth/?github) 的[「7. Dubbo 示例」](#)小节
## 监控管理
**[CAT](http://www.iocoder.cn/CAT/install/?github)**
* [《芋道 Spring Boot 监控平台 CAT 入门》](http://www.iocoder.cn/Spring-Boot/CAT/?github) 的[「13. Dubbo 集成」](#)小节
**[Dubbo Admin](http://www.iocoder.cn/Dubbo/Admin/?github)**
* [《芋道 Dubbo Admin 快速入门》](http://www.iocoder.cn/Dubbo/Admin/?github)
# 消息队列 MQ 专栏
## RocketMQ
* [《RocketMQ 极简入门》](http://www.iocoder.cn/RocketMQ/install/?github)
* [《芋道 Spring Boot 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Boot/RocketMQ/?github) 对应 [lab-31](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-31)
* [《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/RocketMQ/?github) 对应 [labx-06-spring-cloud-stream-rocketmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-06-spring-cloud-stream-rocketmq)
* [《芋道 Spring Cloud Alibaba 事件总线 Bus RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Bus-RocketMQ/?github) 对应 [labx-20](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-20)
* [《芋道 RocketMQ 源码解析系列》](http://www.iocoder.cn/categories/RocketMQ/?github)
* [《性能测试 —— RocketMQ 基准测试》](http://www.iocoder.cn/Performance-Testing/RocketMQ-benchmark/?github)
* [《RocketMQ 书单整理》](http://www.iocoder.cn/Books/RocketMQ-books-recommended/?github)
## RabbitMQ
* [《RabbitMQ 极简入门》](http://www.iocoder.cn/RabbitMQ/install/?github)
* [《芋道 Spring Boot 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Boot/RabbitMQ/?github) 对应 [lab-04-rabbitmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-04-rabbitmq)
* [《芋道 Spring Cloud 消息队列 RabbitMQ 入门》](http://www.iocoder.cn/Spring-Cloud/RabbitMQ/?github) 对应 [labx-10-spring-cloud-stream-rabbitmq](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-10-spring-cloud-stream-rabbitmq)
* [《芋道 Spring Cloud 事件总线 Bus RabbitMQ 入门》](http://www.iocoder.cn/Spring-Cloud/Bus-RabbitMQ/?github) 对应 [labx-19](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-19)
* [《RabbitMQ 书单整理》](http://www.iocoder.cn/Books/RabbitMQ-books-recommended/?github)
## Kafka
* [《Kafka 极简入门》](http://www.iocoder.cn/Kafka/install/?github)
* [《芋道 Spring Boot 消息队列 Kafka 入门》](http://www.iocoder.cn/Spring-Boot/Kafka/?github) 对应 [lab-03](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-03)
* [《芋道 Spring Cloud 消息队列 Kafka 入门》](http://www.iocoder.cn/Spring-Cloud/Kafka/?github) 对应 [labx-11-spring-cloud-stream-kafka](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-11-spring-cloud-stream-kafka)
* [《芋道 Spring Cloud 事件总线 Bus Kafka 入门》](http://www.iocoder.cn/Spring-Cloud/Bus-Kafka/?github) 对应 [labx-18](https://github.com/YunaiV/SpringBoot-Labs/tree/master/labx-18)
* [《Kafka 书单整理》](http://www.iocoder.cn/Books/Kafka-books-recommended/?github)
## ActiveMQ
* [《ActiveMQ 极简入门》](http://www.iocoder.cn/ActiveMQ/install/?github)
* [《芋道 Spring Boot 消息队列 ActiveMQ 入门》](http://www.iocoder.cn/Spring-Boot/ActiveMQ/?github) 对应 [lab-32](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-32)
* [《芋道 Spring Cloud 消息队列 ActiveMQ 入门》](http://www.iocoder.cn/Spring-Cloud/ActiveMQ/?github)
# 分布式事务专栏
目前分布式事务的解决方案有 AT、TCC、Saga、MQ、XA、BED 六种。
## AT 方案
* [《芋道 Spring Boot 分布式事务 Seata 入门》](http://www.iocoder.cn/Spring-Boot/Seata/?github)的[「2. AT 模式 + 多数据源」](#)小节,实现单体 Spring Boot 项目在多数据源下的分布式事务
* [《芋道 Spring Boot 分布式事务 Seata 入门》](http://www.iocoder.cn/Spring-Boot/Seata/?github)的[「AT 模式 + HttpClient 远程调用」](#)小节,实现多个 Spring Boot 项目的分布式事务
* [《芋道 Dubbo 分布式事务 Seata 入门》](http://www.iocoder.cn/Dubbo/Seata/?github) 的[「2. AT 模式」](#)小节,实现多个 Dubbo 服务的分布式事务。
* [《芋道 Spring Cloud Alibaba 分布式事务 Seata 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/Seata/?github)的[「3. AT 模式 + Feign」](#)小节,实现多个 Spring Cloud 服务下的分布式事务。
## TCC 方案
* [《TCC-Transaction 源码解析系列》](http://www.iocoder.cn/categories/TCC-Transaction/?github)
## Saga 方案
## MQ 方案
* [《芋道 Spring Boot 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Boot/RocketMQ/?github) 的[「9. 事务消息」](#)小节
* [《芋道 Spring Cloud Alibaba 消息队列 RocketMQ 入门》](http://www.iocoder.cn/Spring-Cloud-Alibaba/RocketMQ/?github) 的[「10. 事务消息」](#)小节
* [《RocketMQ 源码分析 —— 事务消息》](http://www.iocoder.cn/RocketMQ/message-transaction/?github)
## XA 方案
* [《MyCAT 源码分析 —— XA分布式事务》](http://www.iocoder.cn/MyCAT/xa-distributed-transaction/?github)
## BED 方案
* [《Sharding-JDBC 源码分析 —— 分布式事务(一)之最大努力型》](http://www.iocoder.cn/Sharding-JDBC/transaction-bed/?github)
---------
如下是草稿目录,未来需要整理下
# lab-50
Email 示例
# lab-69-proxy
动态代理
================================================
FILE: httpRequests/2020-12-20T004250.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T004328.500.json
================================================
{
"timestamp": "2020-12-19T16:43:28.332+0000",
"status": 500,
"error": "Internal Server Error",
"message": "小朋友,你的账号密码不正确哟!",
"path": "/user/login"
}
================================================
FILE: httpRequests/2020-12-20T004337.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T004347.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T004347.500.json
================================================
{
"timestamp": "2020-12-19T16:43:47.777+0000",
"status": 500,
"error": "Internal Server Error",
"message": "小朋友,你的账号密码不正确哟!",
"path": "/user/login"
}
================================================
FILE: httpRequests/2020-12-20T004358.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T004358.500.json
================================================
{
"timestamp": "2020-12-19T16:43:58.210+0000",
"status": 500,
"error": "Internal Server Error",
"message": "小朋友,你的账号密码不正确哟!",
"path": "/user/login"
}
================================================
FILE: httpRequests/2020-12-20T004401.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T004401.500.json
================================================
{
"timestamp": "2020-12-19T16:44:01.275+0000",
"status": 500,
"error": "Internal Server Error",
"message": "小朋友,你的账号密码不正确哟!",
"path": "/user/login"
}
================================================
FILE: httpRequests/2020-12-20T004538.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T004547.500.json
================================================
{
"timestamp": "2020-12-19T16:45:47.364+0000",
"status": 500,
"error": "Internal Server Error",
"message": "小朋友,你的账号密码不正确哟!",
"path": "/user/login"
}
================================================
FILE: httpRequests/2020-12-20T004638.500.json
================================================
{
"timestamp": "2020-12-19T16:46:38.505+0000",
"status": 500,
"error": "Internal Server Error",
"message": "小朋友,你的账号密码不正确哟!",
"path": "/user/login"
}
================================================
FILE: httpRequests/2020-12-20T004645.500.json
================================================
{
"timestamp": "2020-12-19T16:46:45.875+0000",
"status": 500,
"error": "Internal Server Error",
"message": "小朋友,你的账号密码不正确哟!",
"path": "/user/login"
}
================================================
FILE: httpRequests/2020-12-20T004809.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T004813.500.json
================================================
{
"timestamp": "2020-12-19T16:48:13.674+0000",
"status": 500,
"error": "Internal Server Error",
"message": "小朋友,你的账号密码不正确哟!",
"path": "/user/login"
}
================================================
FILE: httpRequests/2020-12-20T010724.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T010738.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T010809.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T010823.500.json
================================================
{
"timestamp": "2020-12-19T17:08:23.036+0000",
"status": 500,
"error": "Internal Server Error",
"message": "小朋友,你的账号密码不正确哟!",
"path": "/user/login"
}
================================================
FILE: httpRequests/2020-12-20T010840.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T011020.500.json
================================================
{
"timestamp": "2020-12-19T17:10:20.615+0000",
"status": 500,
"error": "Internal Server Error",
"message": "小朋友,你的账号密码不正确哟!",
"path": "/user/login"
}
================================================
FILE: httpRequests/2020-12-20T011347.500.json
================================================
{
"timestamp": "2020-12-19T17:13:47.777+0000",
"status": 500,
"error": "Internal Server Error",
"message": "小朋友,你没有登录哟!",
"path": "/user/get-current"
}
================================================
FILE: httpRequests/2020-12-20T011526.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T011530.200.json
================================================
{
"gender": 1,
"nickname": "芋道源码",
"id": 1
}
================================================
FILE: httpRequests/2020-12-20T011541.400.json
================================================
{
"timestamp": "2020-12-19T17:15:40.992+0000",
"status": 400,
"error": "Bad Request",
"message": "Missing request header 'Authorization' for method parameter of type String",
"path": "/user/get-current"
}
================================================
FILE: httpRequests/2020-12-20T011551.500.json
================================================
{
"timestamp": "2020-12-19T17:15:51.919+0000",
"status": 500,
"error": "Internal Server Error",
"message": "小朋友,你没有登录哟!",
"path": "/user/get-current"
}
================================================
FILE: httpRequests/2020-12-20T011556.200.json
================================================
{
"gender": 1,
"nickname": "芋道源码",
"id": 1
}
================================================
FILE: httpRequests/2020-12-20T011628-1.200.json
================================================
{
"gender": 1,
"nickname": "芋道源码",
"id": 1
}
================================================
FILE: httpRequests/2020-12-20T011628.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T011646.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T011650.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T011653.500.json
================================================
{
"timestamp": "2020-12-19T17:16:53.489+0000",
"status": 500,
"error": "Internal Server Error",
"message": "小朋友,你没有登录哟!",
"path": "/user/get-current"
}
================================================
FILE: httpRequests/2020-12-20T011818.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T011843.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T011847.500.json
================================================
{
"timestamp": "2020-12-19T17:18:47.862+0000",
"status": 500,
"error": "Internal Server Error",
"message": "小朋友,你没有登录哟!",
"path": "/user/get-current"
}
================================================
FILE: httpRequests/2020-12-20T012507.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T012510.200.json
================================================
{
"gender": 1,
"nickname": "芋道源码",
"id": 1
}
================================================
FILE: httpRequests/2020-12-20T012527.200.json
================================================
{
"gender": 1,
"nickname": "芋道源码",
"id": 1
}
================================================
FILE: httpRequests/2020-12-20T012540.400.json
================================================
{
"timestamp": "2020-12-19T17:25:40.604+0000",
"status": 400,
"error": "Bad Request",
"message": "Missing request header 'Authorization' for method parameter of type String",
"path": "/user/get-current"
}
================================================
FILE: httpRequests/2020-12-20T012544.200.json
================================================
{
"gender": 1,
"nickname": "芋道源码",
"id": 1
}
================================================
FILE: httpRequests/2020-12-20T012703.500.json
================================================
{
"timestamp": "2020-12-19T17:27:03.272+0000",
"status": 500,
"error": "Internal Server Error",
"message": "小朋友,你没有登录哟!",
"path": "/user/get-current"
}
================================================
FILE: httpRequests/2020-12-20T012708.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T012710.200.json
================================================
{
"gender": 1,
"nickname": "芋道源码",
"id": 1
}
================================================
FILE: httpRequests/2020-12-20T013544.200.json
================================================
{
"gender": 1,
"nickname": "芋道源码",
"id": 1
}
================================================
FILE: httpRequests/2020-12-20T013552.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T013558.500.json
================================================
{
"timestamp": "2020-12-19T17:35:58.033+0000",
"status": 500,
"error": "Internal Server Error",
"message": "小朋友,你没有登录哟!",
"path": "/user/get-current"
}
================================================
FILE: httpRequests/2020-12-20T013845.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/2020-12-20T014019.200.json
================================================
{
"gender": 1,
"nickname": "芋道源码",
"id": 1
}
================================================
FILE: httpRequests/2020-12-20T021415.200.json
================================================
{
"userId": 1,
"token": "token001"
}
================================================
FILE: httpRequests/http-client.cookies
================================================
# domain path name value date
================================================
FILE: httpRequests/http-requests-log.http
================================================
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T021415.200.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001
<> 2020-12-20T014019.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T013845.200.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: 1
<> 2020-12-20T013558.500.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T013552.200.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001
<> 2020-12-20T013544.200.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001
<> 2020-12-20T012710.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T012708.200.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: {{token_from_server}}
<> 2020-12-20T012703.500.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: {{token_from_server}}
###
GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001
<> 2020-12-20T012544.200.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
<> 2020-12-20T012540.400.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001
<> 2020-12-20T012527.200.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001
<> 2020-12-20T012510.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T012507.200.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: 1
<> 2020-12-20T011847.500.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T011843.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T011818.200.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: 0
<> 2020-12-20T011653.500.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T011650.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T011646.200.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001
<> 2020-12-20T011628-1.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T011628.200.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001
<> 2020-12-20T011556.200.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: {{token_from_server1}}
<> 2020-12-20T011551.500.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
<> 2020-12-20T011541.400.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token001
<> 2020-12-20T011530.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T011526.200.json
###
GET http://127.0.0.1:8080/user/get-current?full=true
Authorization: token002
<> 2020-12-20T011347.500.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=buzhidao
<> 2020-12-20T011020.500.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T010840.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=buzhidao
<> 2020-12-20T010823.500.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T010809.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T010738.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T010724.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=buzhidao
<> 2020-12-20T004813.500.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T004809.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=buzhidao
<> 2020-12-20T004645.500.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=buzhidao
<> 2020-12-20T004638.500.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=buzhidao
<> 2020-12-20T004547.500.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T004538.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=buzhidao
<> 2020-12-20T004401.500.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T004401.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=buzhidao
<> 2020-12-20T004358.500.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T004358.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=buzhidao
<> 2020-12-20T004347.500.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T004347.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T004337.200.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=buzhidao
<> 2020-12-20T004328.500.json
###
POST http://127.0.0.1:8080/user/login
Content-Type: application/x-www-form-urlencoded
username=yudaoyuanma&password=123456
<> 2020-12-20T004250.200.json
###
================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo/pom.xml
================================================
org.springframework.boot
spring-boot-starter-parent
2.1.10.RELEASE
4.0.0
lab-01-springsecurity-demo
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-security
================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java
================================================
package cn.iocoder.springboot.lab01.springsecurity;
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);
}
}
================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/AdminController.java
================================================
package cn.iocoder.springboot.lab01.springsecurity.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/admin")
public class AdminController {
@GetMapping("/demo")
public String demo() {
return "示例返回";
}
}
================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo/src/main/resources/application.yaml
================================================
spring:
# Spring Security 配置项,对应 SecurityProperties 配置类
security:
# 配置默认的 InMemoryUserDetailsManager 的用户账号与密码。
user:
name: user # 账号
password: user # 密码
roles: ADMIN # 拥有角色
================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo-role/pom.xml
================================================
org.springframework.boot
spring-boot-starter-parent
2.1.10.RELEASE
4.0.0
lab-01-springsecurity-demo-role
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-security
================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/Application.java
================================================
package cn.iocoder.springboot.lab01.springsecurity;
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);
}
}
================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/config/SecurityConfig.java
================================================
package cn.iocoder.springboot.lab01.springsecurity.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
@Configuration
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
// 配置请求地址的权限
.authorizeRequests()
.antMatchers("/test/demo").permitAll() // 所有用户可访问
.antMatchers("/test/admin").hasRole("ADMIN") // 需要 ADMIN 角色
.antMatchers("/test/normal").access("hasRole('ROLE_NORMAL')") // 需要 NORMAL 角色。
// 任何请求,访问的用户都需要经过认证
.anyRequest().authenticated()
.and()
// 设置 Form 表单登陆
.formLogin()
// .loginPage("/login") // 登陆 URL 地址
.permitAll() // 所有用户可访问
.and()
// 配置退出相关
.logout()
// .logoutUrl("/logout") // 退出 URL 地址
.permitAll(); // 所有用户可访问
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.
// 使用内存中的 InMemoryUserDetailsManager
inMemoryAuthentication()
// 不使用 PasswordEncoder 密码编码器
.passwordEncoder(NoOpPasswordEncoder.getInstance())
// 配置 admin 用户
.withUser("admin").password("admin").roles("ADMIN")
// 配置 normal 用户
.and().withUser("normal").password("normal").roles("NORMAL");
}
}
================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/DemoController.java
================================================
package cn.iocoder.springboot.lab01.springsecurity.controller;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.security.PermitAll;
@RestController
@RequestMapping("/demo")
public class DemoController {
@PermitAll
@GetMapping("/echo")
public String demo() {
return "示例返回";
}
@GetMapping("/home")
public String home() {
return "我是首页";
}
@PreAuthorize("hasRole('ROLE_ADMIN')")
@GetMapping("/admin")
public String admin() {
return "我是管理员";
}
@PreAuthorize("hasRole('ROLE_NORMAL')")
@GetMapping("/normal")
public String normal() {
return "我是普通用户";
}
}
================================================
FILE: lab-01-spring-security/lab-01-springsecurity-demo-role/src/main/java/cn/iocoder/springboot/lab01/springsecurity/controller/TestController.java
================================================
package cn.iocoder.springboot.lab01.springsecurity.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class TestController {
@GetMapping("/demo")
public String demo() {
return "示例返回";
}
@GetMapping("/home")
public String home() {
return "我是首页";
}
@GetMapping("/admin")
public String admin() {
return "我是管理员";
}
@GetMapping("/normal")
public String normal() {
return "我是普通用户";
}
}
================================================
FILE: lab-01-spring-security/pom.xml
================================================
labs-parent
cn.iocoder.springboot.labs
1.0-SNAPSHOT
4.0.0
lab-02-spring-security
pom
lab-01-springsecurity-demo
lab-01-springsecurity-demo-role
================================================
FILE: lab-01-spring-security/《芋道 Spring Boot 安全框架 Spring Security 入门》.md
================================================
================================================
FILE: lab-02-spring-security-oauth/authorization-code-server/pom.xml
================================================
org.springframework.boot
spring-boot-starter-parent
1.5.16.RELEASE
4.0.0
authorization-code-server
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-security
org.springframework.security.oauth
spring-security-oauth2
================================================
FILE: lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/Application.java
================================================
package cn.iocoder.springboot.labs.lab01;
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);
}
}
================================================
FILE: lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/authorization/OAuth2AuthorizationServer.java
================================================
package cn.iocoder.springboot.labs.lab01.authorization;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
// 授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("clientapp").secret("112233") // Client 账号、密码。
.redirectUris("http://localhost:9001/callback") // 配置回调地址,选填。
.authorizedGrantTypes("authorization_code") // 授权码模式
.scopes("read_userinfo", "read_contacts") // 可授权的 Scope
// .and().withClient() // 可以继续配置新的 Client
;
}
}
================================================
FILE: lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/resource/OAuth2ResourceServer.java
================================================
package cn.iocoder.springboot.labs.lab01.resource;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
// 资源服务配置
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// 对 "/api/**" 开启认证
.anyRequest()
.authenticated()
.and()
.requestMatchers()
.antMatchers("/api/**");
}
}
// 实际,OAuth2ResourceServer 不是和 OAuth2AuthorizationServer 一起。
// 主要考虑,简化 demo ,所以改成这样。
================================================
FILE: lab-02-spring-security-oauth/authorization-code-server/src/main/java/cn/iocoder/springboot/labs/lab01/resource/api/ExampleController.java
================================================
package cn.iocoder.springboot.labs.lab01.resource.api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 示例模块 Controller
*/
@RestController
@RequestMapping("/api/example")
public class ExampleController {
@RequestMapping("/hello")
public String hello() {
return "world";
}
}
================================================
FILE: lab-02-spring-security-oauth/authorization-code-server/src/main/resources/application.properties
================================================
# Spring Security Setting
security.user.name=yunai
security.user.password=1024
================================================
FILE: lab-02-spring-security-oauth/client-credentials-server/pom.xml
================================================
org.springframework.boot
spring-boot-starter-parent
1.5.16.RELEASE
4.0.0
client-credentials-server
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-security
org.springframework.security.oauth
spring-security-oauth2
================================================
FILE: lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/Application.java
================================================
package lab01;
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);
}
}
================================================
FILE: lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
================================================
package lab01.authorization;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
// 授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("clientapp").secret("112233") // Client 账号、密码。
.authorizedGrantTypes("client_credentials") // 授权码模式
.scopes("read_userinfo", "read_contacts") // 可授权的 Scope
// .and().withClient() // 可以继续配置新的 Client
;
}
}
================================================
FILE: lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
================================================
package lab01.resource;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
// 资源服务配置
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// 对 "/api/**" 开启认证
.anyRequest()
.authenticated()
.and()
.requestMatchers()
.antMatchers("/api/**");
}
}
// 实际,OAuth2ResourceServer 不是和 OAuth2AuthorizationServer 一起。
// 主要考虑,简化 demo ,所以改成这样。
================================================
FILE: lab-02-spring-security-oauth/client-credentials-server/src/main/java/lab01/resource/api/ExampleController.java
================================================
package lab01.resource.api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 示例模块 Controller
*/
@RestController
@RequestMapping("/api/example")
public class ExampleController {
@RequestMapping("/hello")
public String hello() {
return "world";
}
}
================================================
FILE: lab-02-spring-security-oauth/implicit-server/pom.xml
================================================
org.springframework.boot
spring-boot-starter-parent
1.5.16.RELEASE
4.0.0
implicit-server
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-security
org.springframework.security.oauth
spring-security-oauth2
================================================
FILE: lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/Application.java
================================================
package lab01;
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);
}
}
================================================
FILE: lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
================================================
package lab01.authorization;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
// 授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("clientapp").secret("112233") // Client 账号、密码。
.redirectUris("http://localhost:9001/callback") // 配置回调地址,选填。
.authorizedGrantTypes("implicit") // 授权码模式
.scopes("read_userinfo", "read_contacts") // 可授权的 Scope
// .and().withClient() // 可以继续配置新的 Client
;
}
}
================================================
FILE: lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
================================================
package lab01.resource;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
// 资源服务配置
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// 对 "/api/**" 开启认证
.anyRequest()
.authenticated()
.and()
.requestMatchers()
.antMatchers("/api/**")
// .and()
// .cors()
;
}
}
// 实际,OAuth2ResourceServer 不是和 OAuth2AuthorizationServer 一起。
// 主要考虑,简化 demo ,所以改成这样。
================================================
FILE: lab-02-spring-security-oauth/implicit-server/src/main/java/lab01/resource/api/ExampleController.java
================================================
package lab01.resource.api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 示例模块 Controller
*/
@RestController
@RequestMapping("/api/example")
public class ExampleController {
// @CrossOrigin
@RequestMapping("/hello")
public String hello() {
return "world";
}
}
================================================
FILE: lab-02-spring-security-oauth/implicit-server/src/main/resources/application.properties
================================================
# Spring Security Setting
security.user.name=yunai
security.user.password=1024
================================================
FILE: lab-02-spring-security-oauth/pom.xml
================================================
labs-parent
cn.iocoder.springboot.labs
1.0-SNAPSHOT
4.0.0
lab-02-spring-security-oauth
pom
authorization-code-server
resource-owner-password-credentials-server
implicit-server
client-credentials-server
resource-owner-password-credentials-server-with-refresh-token
resource-owner-password-credentials-server-with-revoke-token
resource-owner-password-credentials-server-by-jdbc-token-store
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server/pom.xml
================================================
org.springframework.boot
spring-boot-starter-parent
1.5.16.RELEASE
4.0.0
resource-owner-password-credentials-server
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-security
org.springframework.security.oauth
spring-security-oauth2
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/Application.java
================================================
package lab01;
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);
}
}
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
================================================
package lab01.authorization;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
// 授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {
// 用户认证
@Autowired
private AuthenticationManager authenticationManager;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("clientapp").secret("112233") // Client 账号、密码。
.authorizedGrantTypes("password") // 密码模式
.scopes("read_userinfo", "read_contacts") // 可授权的 Scope
// .and().withClient() // 可以继续配置新的 Client
;
}
}
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/resource/OAuth2ResourceServer.java
================================================
package lab01.resource;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
// 资源服务配置
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// 对 "/api/**" 开启认证
.anyRequest()
.authenticated()
.and()
.requestMatchers()
.antMatchers("/api/**");
}
}
// 实际,OAuth2ResourceServer 不是和 OAuth2AuthorizationServer 一起。
// 主要考虑,简化 demo ,所以改成这样。
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/java/lab01/resource/api/ExampleController.java
================================================
package lab01.resource.api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 示例模块 Controller
*/
@RestController
@RequestMapping("/api/example")
public class ExampleController {
@RequestMapping("/hello")
public String hello() {
return "world";
}
}
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server/src/main/resources/application.properties
================================================
# Spring Security Setting
security.user.name=yunai
security.user.password=1024
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/pom.xml
================================================
org.springframework.boot
spring-boot-starter-parent
1.5.16.RELEASE
4.0.0
resource-owner-password-credentials-server-by-jdbc-token-store
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-security
org.springframework.security.oauth
spring-security-oauth2
org.springframework
spring-jdbc
mysql
mysql-connector-java
runtime
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/Application.java
================================================
package lab02;
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);
}
}
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/authorization/OAuth2AuthorizationServer.java
================================================
package lab02.authorization;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.JdbcTokenStore;
import javax.sql.DataSource;
// 授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {
@Autowired
private Environment env;
// 用户认证
@Autowired
private AuthenticationManager authenticationManager;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(tokenStore()) // 设置 tokenStore
.authenticationManager(authenticationManager); // 设置 authenticationManager
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
// clients.inMemory()
// .withClient("clientapp").secret("112233") // Client 账号、密码。
// .authorizedGrantTypes("password") // 密码模式
// .scopes("read_userinfo", "read_contacts") // 可授权的 Scope
//// .and().withClient() // 可以继续配置新的 Client
// ;
// 加载 ClientDetails
clients.jdbc(dataSource());
}
@Bean
public DataSource dataSource() {
final DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
dataSource.setUrl(env.getProperty("jdbc.url"));
dataSource.setUsername(env.getProperty("jdbc.user"));
dataSource.setPassword(env.getProperty("jdbc.pass"));
return dataSource;
}
@Bean
public TokenStore tokenStore() {
return new JdbcTokenStore(dataSource());
}
}
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/resource/OAuth2ResourceServer.java
================================================
package lab02.resource;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
// 资源服务配置
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// 对 "/api/**" 开启认证
.anyRequest()
.authenticated()
.and()
.requestMatchers()
.antMatchers("/api/**");
}
}
// 实际,OAuth2ResourceServer 不是和 OAuth2AuthorizationServer 一起。
// 主要考虑,简化 demo ,所以改成这样。
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/java/lab02/resource/api/ExampleController.java
================================================
package lab02.resource.api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 示例模块 Controller
*/
@RestController
@RequestMapping("/api/example")
public class ExampleController {
@RequestMapping("/hello")
public String hello() {
return "world";
}
}
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/application.properties
================================================
# 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
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/data.sql
================================================
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);
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-by-jdbc-token-store/src/main/resources/schema.sql
================================================
--------------- 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)
);
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/pom.xml
================================================
org.springframework.boot
spring-boot-starter-parent
1.5.16.RELEASE
4.0.0
resource-owner-password-credentials-server-with-refresh-token
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-security
org.springframework.security.oauth
spring-security-oauth2
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/Application.java
================================================
package lab01;
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);
}
}
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/authorization/OAuth2AuthorizationServer.java
================================================
package lab01.authorization;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
// 授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {
// 用户认证
@Autowired
private AuthenticationManager authenticationManager;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("clientapp").secret("112233") // Client 账号、密码。
.authorizedGrantTypes("password", "refresh_token") // 密码模式
.scopes("read_userinfo", "read_contacts") // 可授权的 Scope
.refreshTokenValiditySeconds(1200) // 1200 秒过期
// .and().withClient() // 可以继续配置新的 Client
;
}
}
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/resource/OAuth2ResourceServer.java
================================================
package lab01.resource;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
// 资源服务配置
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// 对 "/api/**" 开启认证
.anyRequest()
.authenticated()
.and()
.requestMatchers()
.antMatchers("/api/**");
}
}
// 实际,OAuth2ResourceServer 不是和 OAuth2AuthorizationServer 一起。
// 主要考虑,简化 demo ,所以改成这样。
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/java/lab01/resource/api/ExampleController.java
================================================
package lab01.resource.api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 示例模块 Controller
*/
@RestController
@RequestMapping("/api/example")
public class ExampleController {
@RequestMapping("/hello")
public String hello() {
return "world";
}
}
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-refresh-token/src/main/resources/application.properties
================================================
# Spring Security Setting
security.user.name=yunai
security.user.password=1024
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/pom.xml
================================================
org.springframework.boot
spring-boot-starter-parent
1.5.16.RELEASE
4.0.0
resource-owner-password-credentials-server-with-revoke-token
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-security
org.springframework.security.oauth
spring-security-oauth2
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/Application.java
================================================
package lab2;
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);
}
}
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/authorization/OAuth2AuthorizationServer.java
================================================
package lab2.authorization;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
// 授权服务器配置
@Configuration
@EnableAuthorizationServer
public class OAuth2AuthorizationServer extends AuthorizationServerConfigurerAdapter {
// 用户认证
@Autowired
private AuthenticationManager authenticationManager;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("clientapp").secret("112233") // Client 账号、密码。
.authorizedGrantTypes("password", "refresh_token") // 密码模式
.scopes("read_userinfo", "read_contacts") // 可授权的 Scope
.refreshTokenValiditySeconds(1200) // 1200 秒过期
// .and().withClient() // 可以继续配置新的 Client
;
}
}
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/authorization/token/TokenController.java
================================================
package lab2.authorization.token;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.oauth2.common.DefaultOAuth2RefreshToken;
import org.springframework.security.oauth2.provider.token.ConsumerTokenServices;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TokenController {
@Autowired
private ConsumerTokenServices tokenServices;
@Autowired(required = false)
private TokenStore tokenStore;
@RequestMapping(method = RequestMethod.POST, value = "api/access_token/revoke")
public String revokeToken(@RequestParam("token") String token) {
tokenServices.revokeToken(token);
return token;
}
@RequestMapping(method = RequestMethod.POST, value = "api/refresh_token/revoke")
public String revokeRefreshToken(@RequestParam("token") String token) {
tokenStore.removeRefreshToken(new DefaultOAuth2RefreshToken(token));
return token;
}
}
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/resource/OAuth2ResourceServer.java
================================================
package lab2.resource;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;
// 资源服务配置
@Configuration
@EnableResourceServer
public class OAuth2ResourceServer extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
// 对 "/api/**" 开启认证
.anyRequest()
.authenticated()
.and()
.requestMatchers()
.antMatchers("/api/**");
}
}
// 实际,OAuth2ResourceServer 不是和 OAuth2AuthorizationServer 一起。
// 主要考虑,简化 demo ,所以改成这样。
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/java/lab2/resource/api/ExampleController.java
================================================
package lab2.resource.api;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 示例模块 Controller
*/
@RestController
@RequestMapping("/api/example")
public class ExampleController {
@RequestMapping("/hello")
public String hello() {
return "world";
}
}
================================================
FILE: lab-02-spring-security-oauth/resource-owner-password-credentials-server-with-revoke-token/src/main/resources/application.properties
================================================
# Spring Security Setting
security.user.name=yunai
security.user.password=1024
================================================
FILE: lab-02-spring-security-oauth/《芋道 Spring Security OAuth2 入门(新)》.md
================================================
对应 [lab-68](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-68) 示例。
================================================
FILE: lab-02-spring-security-oauth/《芋道 Spring Security OAuth2 入门(老)》.md
================================================
================================================
FILE: lab-03-kafka/lab-03-kafka-demo/pom.xml
================================================
org.springframework.boot
spring-boot-starter-parent
2.2.1.RELEASE
4.0.0
lab-03-kafka-demo
org.springframework.kafka
spring-kafka
2.3.3.RELEASE
org.springframework.boot
spring-boot-starter-json
org.springframework.boot
spring-boot-starter-test
test
================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/Application.java
================================================
package cn.iocoder.springboot.lab03.kafkademo;
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);
}
}
================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/config/KafkaConfiguration.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.listener.*;
import org.springframework.util.backoff.BackOff;
import org.springframework.util.backoff.FixedBackOff;
@Configuration
public class KafkaConfiguration {
@Bean
@Primary
public ErrorHandler kafkaErrorHandler(KafkaTemplate, ?> template) {
// 创建 DeadLetterPublishingRecoverer 对象
ConsumerRecordRecoverer recoverer = new DeadLetterPublishingRecoverer(template);
// 创建 FixedBackOff 对象
BackOff backOff = new FixedBackOff(10 * 1000L, 3L);
// 创建 SeekToCurrentErrorHandler 对象
return new SeekToCurrentErrorHandler(recoverer, backOff);
}
// @Bean
// @Primary
// public BatchErrorHandler kafkaBatchErrorHandler() {
// // 创建 SeekToCurrentBatchErrorHandler 对象
// SeekToCurrentBatchErrorHandler batchErrorHandler = new SeekToCurrentBatchErrorHandler();
// // 创建 FixedBackOff 对象
// BackOff backOff = new FixedBackOff(10 * 1000L, 3L);
// batchErrorHandler.setBackOff(backOff);
// // 返回
// return batchErrorHandler;
// }
}
================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo01AConsumer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.consumer;
import cn.iocoder.springboot.lab03.kafkademo.message.Demo01Message;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
@Component
public class Demo01AConsumer {
private Logger logger = LoggerFactory.getLogger(getClass());
@KafkaListener(topics = Demo01Message.TOPIC,
groupId = "demo01-A-consumer-group-" + Demo01Message.TOPIC)
public void onMessage(ConsumerRecord record) {
logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), record);
}
// @KafkaListener(topics = Demo01Message.TOPIC,
// groupId = "demo01-B-consumer-group-" + Demo01Message.TOPIC)
// public void onMessage(ConsumerRecord record) throws InterruptedException {
// logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), record.partition());
// Thread.sleep(10 * 1000L);
// Thread.sleep(1L);
// logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), record.partition());
// }
}
================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo01Consumer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.consumer;
import cn.iocoder.springboot.lab03.kafkademo.message.Demo01Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
@Component
public class Demo01Consumer {
private Logger logger = LoggerFactory.getLogger(getClass());
@KafkaListener(topics = Demo01Message.TOPIC,
groupId = "demo01-consumer-group-" + Demo01Message.TOPIC)
public void onMessage(Demo01Message message) {
logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
}
}
================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/consumer/Demo04Consumer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.consumer;
import cn.iocoder.springboot.lab03.kafkademo.message.Demo04Message;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
import java.util.concurrent.atomic.AtomicInteger;
@Component
public class Demo04Consumer {
private AtomicInteger count = new AtomicInteger(0);
private Logger logger = LoggerFactory.getLogger(getClass());
@KafkaListener(topics = Demo04Message.TOPIC,
groupId = "demo04-consumer-group-" + Demo04Message.TOPIC)
public void onMessage(Demo04Message message) {
logger.info("[onMessage][线程编号:{} 消息内容:{}]", Thread.currentThread().getId(), message);
// 注意,此处抛出一个 RuntimeException 异常,模拟消费失败
throw new RuntimeException("我就是故意抛出一个异常");
}
}
================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo01Message.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.message;
/**
* 示例 01 的 Message 消息
*/
public class Demo01Message {
public static final String TOPIC = "DEMO_01";
/**
* 编号
*/
private Integer id;
public Demo01Message setId(Integer id) {
this.id = id;
return this;
}
public Integer getId() {
return id;
}
@Override
public String toString() {
return "Demo01Message{" +
"id=" + id +
'}';
}
}
================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/message/Demo04Message.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.message;
/**
* 示例 04 的 Message 消息
*/
public class Demo04Message {
public static final String TOPIC = "DEMO_04";
/**
* 编号
*/
private Integer id;
public Demo04Message setId(Integer id) {
this.id = id;
return this;
}
public Integer getId() {
return id;
}
@Override
public String toString() {
return "Demo04Message{" +
"id=" + id +
'}';
}
}
================================================
FILE: lab-03-kafka/lab-03-kafka-demo/src/main/java/cn/iocoder/springboot/lab03/kafkademo/producer/Demo01Producer.java
================================================
package cn.iocoder.springboot.lab03.kafkademo.producer;
import cn.iocoder.springboot.lab03.kafkademo.message.Demo01Message;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.support.SendResult;
import org.springframework.stereotype.Component;
import org.springframework.util.concurrent.ListenableFuture;
import javax.annotation.Resource;
import java.util.concurrent.ExecutionException;
@Component
public class Demo01Producer {
@Resource
private KafkaTemplate