diff --git a/labx-21/labx-21-sc-user-service/pom.xml b/labx-21/labx-21-sc-user-service/pom.xml
new file mode 100644
index 00000000..055cc5d7
--- /dev/null
+++ b/labx-21/labx-21-sc-user-service/pom.xml
@@ -0,0 +1,64 @@
+
+
+
+ labx-08
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-21-sc-user-service
+
+
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
diff --git a/labx-21/labx-21-sc-user-service/src/main/java/cn/iocoder/springcloud/labx21/userservice/UserServiceApplication.java b/labx-21/labx-21-sc-user-service/src/main/java/cn/iocoder/springcloud/labx21/userservice/UserServiceApplication.java
new file mode 100644
index 00000000..a0457841
--- /dev/null
+++ b/labx-21/labx-21-sc-user-service/src/main/java/cn/iocoder/springcloud/labx21/userservice/UserServiceApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.springcloud.labx21.userservice;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class UserServiceApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(UserServiceApplication.class, args);
+ }
+
+}
diff --git a/labx-21/labx-21-sc-user-service/src/main/java/cn/iocoder/springcloud/labx21/userservice/controller/UserController.java b/labx-21/labx-21-sc-user-service/src/main/java/cn/iocoder/springcloud/labx21/userservice/controller/UserController.java
new file mode 100644
index 00000000..ec03034f
--- /dev/null
+++ b/labx-21/labx-21-sc-user-service/src/main/java/cn/iocoder/springcloud/labx21/userservice/controller/UserController.java
@@ -0,0 +1,23 @@
+package cn.iocoder.springcloud.labx21.userservice.controller;
+
+import cn.iocoder.springcloud.labx21.userservice.dto.UserAddDTO;
+import cn.iocoder.springcloud.labx21.userservice.dto.UserDTO;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/user")
+public class UserController {
+
+ @GetMapping("/get")
+ public UserDTO get(@RequestParam("id") Integer id) {
+ return new UserDTO().setId(id)
+ .setName("没有昵称:" + id)
+ .setGender(id % 2 + 1); // 1 - 男;2 - 女
+ }
+
+ @PostMapping("/add")
+ public Integer add(UserAddDTO addDTO) {
+ return (int) (System.currentTimeMillis() / 1000); // 嘿嘿,随便返回一个 id
+ }
+
+}
diff --git a/labx-21/labx-21-sc-user-service/src/main/java/cn/iocoder/springcloud/labx21/userservice/dto/UserAddDTO.java b/labx-21/labx-21-sc-user-service/src/main/java/cn/iocoder/springcloud/labx21/userservice/dto/UserAddDTO.java
new file mode 100644
index 00000000..e4c2a233
--- /dev/null
+++ b/labx-21/labx-21-sc-user-service/src/main/java/cn/iocoder/springcloud/labx21/userservice/dto/UserAddDTO.java
@@ -0,0 +1,37 @@
+package cn.iocoder.springcloud.labx21.userservice.dto;
+
+import java.io.Serializable;
+
+/**
+ * 用户添加 DTO
+ */
+public class UserAddDTO implements Serializable {
+
+ /**
+ * 昵称
+ */
+ private String name;
+ /**
+ * 性别
+ */
+ private Integer gender;
+
+ public String getName() {
+ return name;
+ }
+
+ public UserAddDTO setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Integer getGender() {
+ return gender;
+ }
+
+ public UserAddDTO setGender(Integer gender) {
+ this.gender = gender;
+ return this;
+ }
+
+}
diff --git a/labx-21/labx-21-sc-user-service/src/main/java/cn/iocoder/springcloud/labx21/userservice/dto/UserDTO.java b/labx-21/labx-21-sc-user-service/src/main/java/cn/iocoder/springcloud/labx21/userservice/dto/UserDTO.java
new file mode 100644
index 00000000..40184202
--- /dev/null
+++ b/labx-21/labx-21-sc-user-service/src/main/java/cn/iocoder/springcloud/labx21/userservice/dto/UserDTO.java
@@ -0,0 +1,49 @@
+package cn.iocoder.springcloud.labx21.userservice.dto;
+
+import java.io.Serializable;
+
+/**
+ * 用户信息 DTO
+ */
+public class UserDTO implements Serializable {
+
+ /**
+ * 用户编号
+ */
+ private Integer id;
+ /**
+ * 昵称
+ */
+ private String name;
+ /**
+ * 性别
+ */
+ private Integer gender;
+
+ public Integer getId() {
+ return id;
+ }
+
+ public UserDTO setId(Integer id) {
+ this.id = id;
+ return this;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public UserDTO setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public Integer getGender() {
+ return gender;
+ }
+
+ public UserDTO setGender(Integer gender) {
+ this.gender = gender;
+ return this;
+ }
+}
diff --git a/labx-21/labx-21-sc-user-service/src/main/resources/application.yaml b/labx-21/labx-21-sc-user-service/src/main/resources/application.yaml
new file mode 100644
index 00000000..ea9d953b
--- /dev/null
+++ b/labx-21/labx-21-sc-user-service/src/main/resources/application.yaml
@@ -0,0 +1,12 @@
+spring:
+ application:
+ name: user-service # Spring 应用名
+ cloud:
+ nacos:
+ # Nacos 作为注册中心的配置项
+ discovery:
+ server-addr: 127.0.0.1:8848 # Nacos 服务器地址
+
+server:
+ port: ${random.int[10000,19999]} # 服务器端口。默认为 8080
+# port: 18080 # 服务器端口。默认为 8080
diff --git a/labx-21/labx-21-sc-zuul-demo02-registry/pom.xml b/labx-21/labx-21-sc-zuul-demo02-registry/pom.xml
new file mode 100644
index 00000000..03afb620
--- /dev/null
+++ b/labx-21/labx-21-sc-zuul-demo02-registry/pom.xml
@@ -0,0 +1,64 @@
+
+
+
+ labx-21
+ cn.iocoder.springboot.labs
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ labx-21-sc-zuul-demo02-registry
+
+
+ 2.2.4.RELEASE
+ Hoxton.SR1
+ 2.2.0.RELEASE
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ ${spring.boot.version}
+ pom
+ import
+
+
+ org.springframework.cloud
+ spring-cloud-dependencies
+ ${spring.cloud.version}
+ pom
+ import
+
+
+ com.alibaba.cloud
+ spring-cloud-alibaba-dependencies
+ ${spring.cloud.alibaba.version}
+ pom
+ import
+
+
+
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-netflix-zuul
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
diff --git a/labx-21/labx-21-sc-zuul-demo02-registry/src/main/java/cn/iocoder/springcloud/labx21/zuuldemo/ZuulApplication.java b/labx-21/labx-21-sc-zuul-demo02-registry/src/main/java/cn/iocoder/springcloud/labx21/zuuldemo/ZuulApplication.java
new file mode 100644
index 00000000..e9f0fce2
--- /dev/null
+++ b/labx-21/labx-21-sc-zuul-demo02-registry/src/main/java/cn/iocoder/springcloud/labx21/zuuldemo/ZuulApplication.java
@@ -0,0 +1,15 @@
+package cn.iocoder.springcloud.labx21.zuuldemo;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
+
+@SpringBootApplication
+@EnableZuulProxy // 开启 Zuul 网关
+public class ZuulApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ZuulApplication.class, args);
+ }
+
+}
diff --git a/labx-21/labx-21-sc-zuul-demo02-registry/src/main/resources/application.yaml b/labx-21/labx-21-sc-zuul-demo02-registry/src/main/resources/application.yaml
new file mode 100644
index 00000000..91d2b8db
--- /dev/null
+++ b/labx-21/labx-21-sc-zuul-demo02-registry/src/main/resources/application.yaml
@@ -0,0 +1,21 @@
+server:
+ port: 8888
+
+spring:
+ application:
+ name: zuul-application
+
+# Zuul 配置项,对应 ZuulProperties 配置类
+zuul:
+ servlet-path: / # ZuulServlet 匹配的路径,默认为 /zuul
+ # 路由配置项,对应 ZuulRoute Map
+ routes:
+ route_yudaoyuanma:
+ path: /blog/**
+ url: http://www.iocoder.cn
+ route_oschina:
+ path: /oschina/**
+ url: https://www.oschina.net
+ route_user_service:
+ path: /user-serevice/**
+ service-id: user-service
diff --git a/labx-21/pom.xml b/labx-21/pom.xml
index d3aa2794..4fc32f46 100644
--- a/labx-21/pom.xml
+++ b/labx-21/pom.xml
@@ -13,6 +13,8 @@
pom
labx-21-sc-zuul-demo01
+ labx-21-sc-zuul-demo02-registry
+ labx-21-sc-user-service