diff --git a/cloud-demo/model/pom.xml b/cloud-demo/model/pom.xml
new file mode 100644
index 0000000..cc35c36
--- /dev/null
+++ b/cloud-demo/model/pom.xml
@@ -0,0 +1,26 @@
+
+ 4.0.0
+
+ cn.bunny.mq
+ cloud-demo
+ 0.0.1-SNAPSHOT
+
+
+ model
+ jar
+
+ model
+ https://maven.apache.org
+
+
+ UTF-8
+
+
+
+
+ org.projectlombok
+ lombok
+
+
+
diff --git a/cloud-demo/model/src/main/java/cn/bunny/model/order/bean/Order.java b/cloud-demo/model/src/main/java/cn/bunny/model/order/bean/Order.java
new file mode 100644
index 0000000..81d53c8
--- /dev/null
+++ b/cloud-demo/model/src/main/java/cn/bunny/model/order/bean/Order.java
@@ -0,0 +1,24 @@
+package cn.bunny.model.order.bean;
+
+import cn.bunny.model.product.bean.Product;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class Order {
+
+ private Long id;
+
+ private BigDecimal totalAmount;
+
+ private Long userId;
+
+ private String nickName;
+
+ private String address;
+
+ private List productList;
+
+}
diff --git a/cloud-demo/model/src/main/java/cn/bunny/model/product/bean/Product.java b/cloud-demo/model/src/main/java/cn/bunny/model/product/bean/Product.java
new file mode 100644
index 0000000..cc78b5e
--- /dev/null
+++ b/cloud-demo/model/src/main/java/cn/bunny/model/product/bean/Product.java
@@ -0,0 +1,18 @@
+package cn.bunny.model.product.bean;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class Product {
+
+ private Long id;
+
+ private BigDecimal price;
+
+ private String productName;
+
+ private int num;
+
+}
diff --git a/cloud-demo/pom.xml b/cloud-demo/pom.xml
index f205c17..37e58dc 100644
--- a/cloud-demo/pom.xml
+++ b/cloud-demo/pom.xml
@@ -16,6 +16,7 @@
cloud-demo
services
+ model
pom
@@ -24,21 +25,17 @@
3.8.1
4.5.0
2.0.47
+ 1.18.32
+ 4.5.0
-
-
- org.springframework.boot
- spring-boot-starter-thymeleaf
-
-
org.projectlombok
lombok
- true
+ ${lombok.version}
@@ -48,7 +45,7 @@
${junit.version}
test
-
+
com.alibaba.cloud
diff --git a/cloud-demo/services/pom.xml b/cloud-demo/services/pom.xml
index 2523ad0..2cc7a67 100644
--- a/cloud-demo/services/pom.xml
+++ b/cloud-demo/services/pom.xml
@@ -22,11 +22,22 @@
+
+ cn.bunny.mq
+ model
+ 0.0.1-SNAPSHOT
+
+
org.springframework.boot
spring-boot-starter-web
+
+
+ org.springframework.boot
+ spring-boot-starter-thymeleaf
+
@@ -58,5 +69,20 @@
spring-cloud-starter-openfeign
+
+
+ com.github.xiaoymin
+ knife4j-openapi3-jakarta-spring-boot-starter
+
+
+
+
+
+
+
+
+
+
+
diff --git a/cloud-demo/services/service-order/src/main/java/cn/bunny/service/config/Knife4jConfig.java b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/config/Knife4jConfig.java
new file mode 100644
index 0000000..7a79646
--- /dev/null
+++ b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/config/Knife4jConfig.java
@@ -0,0 +1,38 @@
+package cn.bunny.service.config;
+
+import io.swagger.v3.oas.models.ExternalDocumentation;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Contact;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.info.License;
+import lombok.extern.slf4j.Slf4j;
+import org.springdoc.core.models.GroupedOpenApi;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@Slf4j
+public class Knife4jConfig {
+ @Bean
+ public OpenAPI openAPI() {
+ // 作者等信息
+ Contact contact = new Contact().name("Bunny").email("1319900154@qq.com").url("http://bunny-web.site");
+ // 使用协议
+ License license = new License().name("MIT").url("https://mit-license.org");
+ // 相关信息
+ Info info = new Info().title("Bunny-Admin")
+ .contact(contact).license(license)
+ .description("微服务")
+ .summary("微服务教程")
+ .termsOfService("http://bunny-web.site")
+ .version("v0.0.1");
+
+ return new OpenAPI().info(info).externalDocs(new ExternalDocumentation());
+ }
+
+ @Bean
+ public GroupedOpenApi all() {
+ return GroupedOpenApi.builder().group("全部请求接口").pathsToMatch("/api/**").build();
+ }
+
+}
diff --git a/cloud-demo/services/service-order/src/main/java/cn/bunny/service/config/OrderServiceConfig.java b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/config/OrderServiceConfig.java
new file mode 100644
index 0000000..a64fe66
--- /dev/null
+++ b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/config/OrderServiceConfig.java
@@ -0,0 +1,15 @@
+package cn.bunny.service.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class OrderServiceConfig {
+
+ @Bean
+ public RestTemplate restTemplate() {
+ return new RestTemplate();
+ }
+
+}
diff --git a/cloud-demo/services/service-order/src/main/java/cn/bunny/service/controller/IndexController.java b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/controller/IndexController.java
new file mode 100644
index 0000000..a4f1ec5
--- /dev/null
+++ b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/controller/IndexController.java
@@ -0,0 +1,13 @@
+package cn.bunny.service.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.GetMapping;
+
+@Controller
+public class IndexController {
+
+ @GetMapping("")
+ public String index() {
+ return "index";
+ }
+}
diff --git a/cloud-demo/services/service-order/src/main/java/cn/bunny/service/controller/OrderController.java b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/controller/OrderController.java
new file mode 100644
index 0000000..12f02ab
--- /dev/null
+++ b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/controller/OrderController.java
@@ -0,0 +1,23 @@
+package cn.bunny.service.controller;
+
+import cn.bunny.model.order.bean.Order;
+import cn.bunny.service.service.OrderService;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/order")
+@RequiredArgsConstructor
+public class OrderController {
+
+ private final OrderService orderService;
+
+ @Operation(summary = "创建订单")
+ @GetMapping("create")
+ public Order createOrder(Long userId, Long productId) {
+ return orderService.createOrder(productId, userId);
+ }
+}
diff --git a/cloud-demo/services/service-order/src/main/java/cn/bunny/service/service/OrderService.java b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/service/OrderService.java
new file mode 100644
index 0000000..048bc63
--- /dev/null
+++ b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/service/OrderService.java
@@ -0,0 +1,15 @@
+package cn.bunny.service.service;
+
+import cn.bunny.model.order.bean.Order;
+
+public interface OrderService {
+
+ /**
+ * 创建订单信息
+ *
+ * @param productId 订单信息
+ * @param userId 用户id
+ * @return 订单内容
+ */
+ Order createOrder(Long productId, Long userId);
+}
diff --git a/cloud-demo/services/service-order/src/main/java/cn/bunny/service/service/impl/OrderServiceImpl.java b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/service/impl/OrderServiceImpl.java
new file mode 100644
index 0000000..6ee84e9
--- /dev/null
+++ b/cloud-demo/services/service-order/src/main/java/cn/bunny/service/service/impl/OrderServiceImpl.java
@@ -0,0 +1,60 @@
+package cn.bunny.service.service.impl;
+
+import cn.bunny.model.order.bean.Order;
+import cn.bunny.model.product.bean.Product;
+import cn.bunny.service.service.OrderService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.client.ServiceInstance;
+import org.springframework.cloud.client.discovery.DiscoveryClient;
+import org.springframework.stereotype.Service;
+import org.springframework.web.client.RestTemplate;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class OrderServiceImpl implements OrderService {
+
+ private final DiscoveryClient discoveryClient;
+ private final RestTemplate restTemplate;
+
+ /**
+ * 创建订单信息
+ *
+ * @param productId 订单信息
+ * @param userId 用户id
+ * @return 订单内容
+ */
+ @Override
+ public Order createOrder(Long productId, Long userId) {
+ Product product = getProductFromRemote(productId);
+
+ Order order = new Order();
+ order.setId(1L);
+ // 查询总金额
+ BigDecimal amount = product.getPrice().multiply(new BigDecimal(product.getNum()));
+ order.setTotalAmount(amount);
+ order.setNickName("在资质");
+ order.setAddress("地址地址。。。");
+
+ // TODO 远程查询
+ order.setProductList(List.of(product));
+ return order;
+ }
+
+ private Product getProductFromRemote(Long productId) {
+ // 获取商品服务所有及其的 IP+port
+ List instances = discoveryClient.getInstances("service-product");
+ ServiceInstance instance = instances.get(0);
+
+ // 远程URL
+ String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/api/product/" + productId;
+
+ // 2. 远程发送请求
+ log.info("远程调用:{}", url);
+ return restTemplate.getForObject(url, Product.class);
+ }
+}
diff --git a/cloud-demo/services/service-product/src/main/java/cn/bunny/service/config/Knife4jConfig.java b/cloud-demo/services/service-product/src/main/java/cn/bunny/service/config/Knife4jConfig.java
new file mode 100644
index 0000000..7a79646
--- /dev/null
+++ b/cloud-demo/services/service-product/src/main/java/cn/bunny/service/config/Knife4jConfig.java
@@ -0,0 +1,38 @@
+package cn.bunny.service.config;
+
+import io.swagger.v3.oas.models.ExternalDocumentation;
+import io.swagger.v3.oas.models.OpenAPI;
+import io.swagger.v3.oas.models.info.Contact;
+import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.info.License;
+import lombok.extern.slf4j.Slf4j;
+import org.springdoc.core.models.GroupedOpenApi;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@Slf4j
+public class Knife4jConfig {
+ @Bean
+ public OpenAPI openAPI() {
+ // 作者等信息
+ Contact contact = new Contact().name("Bunny").email("1319900154@qq.com").url("http://bunny-web.site");
+ // 使用协议
+ License license = new License().name("MIT").url("https://mit-license.org");
+ // 相关信息
+ Info info = new Info().title("Bunny-Admin")
+ .contact(contact).license(license)
+ .description("微服务")
+ .summary("微服务教程")
+ .termsOfService("http://bunny-web.site")
+ .version("v0.0.1");
+
+ return new OpenAPI().info(info).externalDocs(new ExternalDocumentation());
+ }
+
+ @Bean
+ public GroupedOpenApi all() {
+ return GroupedOpenApi.builder().group("全部请求接口").pathsToMatch("/api/**").build();
+ }
+
+}
diff --git a/cloud-demo/services/service-product/src/main/java/cn/bunny/service/config/ProductServiceConfig.java b/cloud-demo/services/service-product/src/main/java/cn/bunny/service/config/ProductServiceConfig.java
new file mode 100644
index 0000000..9fde958
--- /dev/null
+++ b/cloud-demo/services/service-product/src/main/java/cn/bunny/service/config/ProductServiceConfig.java
@@ -0,0 +1,15 @@
+package cn.bunny.service.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.client.RestTemplate;
+
+@Configuration
+public class ProductServiceConfig {
+
+ @Bean
+ public RestTemplate restTemplate() {
+ return new RestTemplate();
+ }
+
+}
diff --git a/cloud-demo/services/service-product/src/main/java/cn/bunny/service/controller/ProductController.java b/cloud-demo/services/service-product/src/main/java/cn/bunny/service/controller/ProductController.java
new file mode 100644
index 0000000..9e5e75a
--- /dev/null
+++ b/cloud-demo/services/service-product/src/main/java/cn/bunny/service/controller/ProductController.java
@@ -0,0 +1,24 @@
+package cn.bunny.service.controller;
+
+import cn.bunny.model.product.bean.Product;
+import cn.bunny.service.service.ProductService;
+import io.swagger.v3.oas.annotations.Operation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@RequestMapping("/api/product")
+@RequiredArgsConstructor
+public class ProductController {
+
+ private final ProductService productService;
+
+ @Operation(summary = "根据id查询商品")
+ @GetMapping("{id}")
+ public Product getProduct(@PathVariable("id") Long productId) {
+ return productService.getProductById(productId);
+ }
+}
diff --git a/cloud-demo/services/service-product/src/main/java/cn/bunny/service/service/ProductService.java b/cloud-demo/services/service-product/src/main/java/cn/bunny/service/service/ProductService.java
new file mode 100644
index 0000000..0d48668
--- /dev/null
+++ b/cloud-demo/services/service-product/src/main/java/cn/bunny/service/service/ProductService.java
@@ -0,0 +1,13 @@
+package cn.bunny.service.service;
+
+import cn.bunny.model.product.bean.Product;
+
+public interface ProductService {
+ /**
+ * 根据id获取商品
+ *
+ * @param productId 商品id
+ * @return 商品内容
+ */
+ Product getProductById(Long productId);
+}
diff --git a/cloud-demo/services/service-product/src/main/java/cn/bunny/service/service/impl/ProductServiceImpl.java b/cloud-demo/services/service-product/src/main/java/cn/bunny/service/service/impl/ProductServiceImpl.java
new file mode 100644
index 0000000..bf749fa
--- /dev/null
+++ b/cloud-demo/services/service-product/src/main/java/cn/bunny/service/service/impl/ProductServiceImpl.java
@@ -0,0 +1,26 @@
+package cn.bunny.service.service.impl;
+
+import cn.bunny.model.product.bean.Product;
+import cn.bunny.service.service.ProductService;
+import org.springframework.stereotype.Service;
+
+import java.math.BigDecimal;
+
+@Service
+public class ProductServiceImpl implements ProductService {
+ /**
+ * 根据id获取商品
+ *
+ * @param productId 商品id
+ * @return 商品内容
+ */
+ @Override
+ public Product getProductById(Long productId) {
+ Product product = new Product();
+ product.setId(productId);
+ product.setPrice(new BigDecimal("10"));
+ product.setProductName("xxx");
+ product.setNum(2);
+ return product;
+ }
+}