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; + } +}