diff --git a/README.md b/README.md
index 2b17e35d..d2e8a6e8 100644
--- a/README.md
+++ b/README.md
@@ -65,13 +65,13 @@
## 配置中心
-* [《芋道 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 配置文件入门》](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 注册中心 Nacos 入门》](http://www.iocoder.cn/Spring-Boot/registry-nacos/?github) 对应 [lab-44](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-44) 。
## 持续交付
@@ -81,8 +81,8 @@
## 服务容错
-* [《芋道 Spring Boot 服务容错 Sentinel》](http://www.iocoder.cn/Spring-Boot/Sentinel/?github) 对应 [lab-46](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-46) 。
-* [《芋道 Spring Boot 服务容错 Hystrix》]()计划中...
+* [《芋道 Spring Boot 服务容错 Sentinel 入门》](http://www.iocoder.cn/Spring-Boot/Sentinel/?github) 对应 [lab-46](https://github.com/YunaiV/SpringBoot-Labs/tree/master/lab-46) 。
+* 《芋道 Spring Boot 服务容错 Hystrix 入门》计划中...
## 监控管理
diff --git a/lab-47/lab-47-demo/pom.xml b/lab-47/lab-47-demo/pom.xml
new file mode 100644
index 00000000..63d63dd9
--- /dev/null
+++ b/lab-47/lab-47-demo/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ lab-47
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-47-demo
+
+
+
+ cn.iocoder.springboot.labs
+ yunai-server-spring-boot-starter
+ 1.0-SNAPSHOT
+
+
+
+
diff --git a/lab-47/lab-47-demo/src/main/java/cn/iocoder/springboot/lab47/demo/DemoApplication.java b/lab-47/lab-47-demo/src/main/java/cn/iocoder/springboot/lab47/demo/DemoApplication.java
new file mode 100644
index 00000000..b43bf568
--- /dev/null
+++ b/lab-47/lab-47-demo/src/main/java/cn/iocoder/springboot/lab47/demo/DemoApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springboot.lab47.demo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class DemoApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DemoApplication.class, args);
+ }
+
+}
diff --git a/lab-47/pom.xml b/lab-47/pom.xml
new file mode 100644
index 00000000..df4e6693
--- /dev/null
+++ b/lab-47/pom.xml
@@ -0,0 +1,20 @@
+
+
+
+ labs-parent
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ lab-47
+ pom
+
+ yunai-server-spring-boot-starter
+ lab-47-demo
+
+
+
+
diff --git a/lab-47/yunai-server-spring-boot-starter/pom.xml b/lab-47/yunai-server-spring-boot-starter/pom.xml
new file mode 100644
index 00000000..9f6b9fbe
--- /dev/null
+++ b/lab-47/yunai-server-spring-boot-starter/pom.xml
@@ -0,0 +1,22 @@
+
+
+
+ lab-47
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ yunai-server-spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+ 2.2.2.RELEASE
+
+
+
+
diff --git a/lab-47/yunai-server-spring-boot-starter/src/main/java/cn/iocoder/springboot/lab47/yunaiserver/autoconfigure/YunaiServerAutoConfiguration.java b/lab-47/yunai-server-spring-boot-starter/src/main/java/cn/iocoder/springboot/lab47/yunaiserver/autoconfigure/YunaiServerAutoConfiguration.java
new file mode 100644
index 00000000..eafdb1dd
--- /dev/null
+++ b/lab-47/yunai-server-spring-boot-starter/src/main/java/cn/iocoder/springboot/lab47/yunaiserver/autoconfigure/YunaiServerAutoConfiguration.java
@@ -0,0 +1,32 @@
+package cn.iocoder.springboot.lab47.yunaiserver.autoconfigure;
+
+import com.sun.net.httpserver.HttpServer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+@Configuration
+@EnableConfigurationProperties(YunaiServerProperties.class)
+public class YunaiServerAutoConfiguration {
+
+ private Logger logger = LoggerFactory.getLogger(getClass());
+
+ @Bean
+ @ConditionalOnClass(HttpServer.class)
+ public HttpServer httpServer(YunaiServerProperties serverProperties) throws IOException {
+ // 创建 HttpServer 对象,并启动
+ HttpServer server = HttpServer.create(new InetSocketAddress(serverProperties.getPort()), 0);
+ server.start();
+ logger.info("[httpServer][启动服务器成功,端口为:{}]", serverProperties.getPort());
+
+ // 返回
+ return server;
+ }
+
+}
diff --git a/lab-47/yunai-server-spring-boot-starter/src/main/java/cn/iocoder/springboot/lab47/yunaiserver/autoconfigure/YunaiServerProperties.java b/lab-47/yunai-server-spring-boot-starter/src/main/java/cn/iocoder/springboot/lab47/yunaiserver/autoconfigure/YunaiServerProperties.java
new file mode 100644
index 00000000..a9ec84e7
--- /dev/null
+++ b/lab-47/yunai-server-spring-boot-starter/src/main/java/cn/iocoder/springboot/lab47/yunaiserver/autoconfigure/YunaiServerProperties.java
@@ -0,0 +1,31 @@
+package cn.iocoder.springboot.lab47.yunaiserver.autoconfigure;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+@ConfigurationProperties(prefix = "yunai.server")
+public class YunaiServerProperties {
+
+ /**
+ * 默认端口
+ */
+ private static final Integer DEFAULT_PORT = 8000;
+
+ /**
+ * 端口
+ */
+ private Integer port = DEFAULT_PORT;
+
+ public static Integer getDefaultPort() {
+ return DEFAULT_PORT;
+ }
+
+ public Integer getPort() {
+ return port;
+ }
+
+ public YunaiServerProperties setPort(Integer port) {
+ this.port = port;
+ return this;
+ }
+
+}
diff --git a/lab-47/yunai-server-spring-boot-starter/src/main/resources/META-INF/spring.factories b/lab-47/yunai-server-spring-boot-starter/src/main/resources/META-INF/spring.factories
new file mode 100644
index 00000000..f2a16e95
--- /dev/null
+++ b/lab-47/yunai-server-spring-boot-starter/src/main/resources/META-INF/spring.factories
@@ -0,0 +1,2 @@
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+cn.iocoder.springboot.lab47.yunaiserver.autoconfigure.YunaiServerAutoConfiguration
diff --git a/pom.xml b/pom.xml
index b51b6784..787a491a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -55,6 +55,7 @@
lab-44
lab-45
lab-46
+ lab-47