微服务学习-快速搭建

1. 速通版

1.1. git clone 拉取项目代码,导入 idea 中

git clone icoolkj-microservices-code: 致力于搭建微服务架构平台

1.2. git checkout v1.0.1版本

链接地址:icoolkj-microservices-code 标签 - Gitee.com

2. 项目服务结构

3. 实现重点步骤

3.1. 业务需求

实现用户下单,扣减库存,查询商品单价,扣减账户余额的功能。

3.2. 如何引入 Spring Cloud Alibaba 的依赖

3.2.1. 父工程 pom.xml 文件内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.icoolkj</groupId>
   <artifactId>icoolkj-microservices-code</artifactId>
   <version>1.0.1</version>
   <packaging>pom</packaging>
 
   <properties>
      <java.version>17</java.version>
      <!-- 微服务版本 -->
      <spring-boot.version>3.2.4</spring-boot.version>
      <spring-cloud.version>2023.0.1</spring-cloud.version>
      <spring-cloud-alibaba.version>2023.0.1.0</spring-cloud-alibaba.version>

   </properties>

   <dependencyManagement>
      <dependencies>

         <!-- Spring Boot Starter父依赖 -->
         <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>

         <!-- Spring Cloud依赖 -->
         <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>

         <!-- Spring Cloud Alibaba依赖 -->
         <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
         </dependency>

      </dependencies>
   </dependencyManagement>


</project>
3.2.2. <dependencyManagement> 和 <dependency> 的区别

Mave 使用 dependencyManagement 元素来提供一种管理依赖版本号的方式。

使用 pom.xml 中的 dependencyManagement 元素能让子项目中引用同一个版本依赖,而不用显示的列出版本号。

好处:如果多个子项目引用同一个依赖,可以避免每个子项目里面再声明版本号。

优势:当升级或切换项目中的某个依赖版本时,只需要再父 pom.xml 文件里面更新,子项目无需修改;如果某个子项目需要另外一个依赖的版本,只需要再子项目声明 version 即可。

注意:

  1. dependencyManagement 里面只是声明依赖,并不实现引入,因此子项目需要显示声明需要用的依赖;
  2. 如果不在子项目中声明依赖,是不会从父项目中继承下来的,只有在子项目中声明了依赖并且没有指定具体版本,才会从父项目继承该依赖项,且 version 和 scope 都读取父 pom;
  3. 如果子项目中指定了依赖项版本号,那么就会使用子项目指定的 jar 版本。

3.3. 环境准备

3.3.1. 在启动服务前,请先配置 Host 地址映射,确保服务能够正常启动
# 服务
127.0.0.1 icoolkj-mall-account
127.0.0.1 icoolkj-mall-order
127.0.0.1 icoolkj-mall-product
127.0.0.1 icoolkj-mall-inventory
127.0.0.1 icoolkj-mall-gateway
# 中间件
127.0.0.1 icoolkj-mall-mysql
127.0.0.1 icoolkj-mall-nacos-server
127.0.0.1 icoolkj-mall-seata-server
127.0.0.1 icoolkj-mall-sentinel-dashboard
127.0.0.1 icoolkj-mall-skywalking-server

Windows 系统路径:C:\Windows\System32\drivers\etc\hosts

macOS 系统路径:/etc/hosts

Linux 系统路径: /etc/hosts

3.3.2. 需要导入 MySQL 数据库脚本文件

脚本文件地址:spring-cloud-alibaba-examples/config/init.sql · icoolkj/icoolkj-microservices-code - Gitee.com

3.4. 项目演示

3.4.1. 启动所有服务,使用 Postman 进行测试

查询商品单价:localhost:8080/api/product/get-price-product?productId=1

查询商品库存:localhost:8081/api/inventory/get-inventory-quantity?productId=1

查询账户余额:localhost:8083/api/account/get-balance-account?userId=1

用户下单:localhost:8082/api/order/create-order

3.4.2. 发现问题
3.4.2.1. 用户正常下单,没有扣减库存,没有查询商品价格,没有扣减账户余额

微服务需要实现服务之间的调用,必须订单微服务 8082 如何调用库存微服务 8081,如何实现?

解决方案:利用 Spring 框架提供的 RestTemplate 实现服务间的调用

@Bean 的方式配置 RestTemplate

@Configuration
public class RestTemplateConfig {
    @Bean
    RestTemplate restTemplate(){
        return new RestTemplate();
    }

}

 订单服务 OrderServiceImpl 引入RestTemplate

@Autowired
private RestTemplate restTemplate;

 通过 restTemplate.postForObject restTemplate.exchange 等发放调用 商品服务,库存服务,账户服务

//deduct inventory
InventoryRequest inventoryRequest = new InventoryRequest();
inventoryRequest.setProductId(productId);
inventoryRequest.setInventoryQuantity(orderQuantity);
//RestTemplate 远程调用
String inventoryUrl = "http://localhost:8081/api/inventory/reduce-inventory";
int inventoryCode = restTemplate.postForObject(inventoryUrl, inventoryRequest, Result.class).getCode();
if(inventoryCode == Result.FAIL){
    throw new BusinessException("inventory not enough.");
}

// 获取商品单价
String getPriceProductUrl = "http://localhost:8080/api/product/get-price-product?productId=" + productId;
// 使用泛型解析嵌套数据
ParameterizedTypeReference<Result<ProductResponse>> responseType =
        new ParameterizedTypeReference<Result<ProductResponse>>() {};
ResponseEntity<Result<ProductResponse>> responseEntity =
        restTemplate.exchange(getPriceProductUrl, HttpMethod.GET, null, responseType);

// 获取返回结果
Result<ProductResponse> result = responseEntity.getBody();
BigDecimal orderCost = null;
if(result.getCode() == Result.SUCCESS){
    ProductResponse productResponse = result.getData();
    if (productResponse != null && productResponse.getProductPrice() != null) {
        orderCost= productResponse.getProductPrice().multiply(new BigDecimal(orderQuantity));
    }
}
if(orderCost == null){
    throw new BusinessException("product price wrong, please check the product price.");
}
AccountRequest accountRequest = new AccountRequest();
accountRequest.setUserId(userId);
accountRequest.setOrderCost(orderCost);
//RestTemplate远程调用
String account_url = "http://localhost:8083/api/account/reduce-balance";
int accountCode = restTemplate.postForObject(account_url, accountRequest, Result.class).getCode();
// Integer accountCode = accountService.reduceBalance(accountDTO).getCode();
if (accountCode == Result.FAIL) {
    throw new BusinessException("balance not enough");
}
3.4.2.2. 微服务所在的 IP 地址和端口号都是硬编码,如果库存服务(服务提供者)的 IP 和端口发送变化,或者增加多个库存服务如何调用?

RestTemplate 远程调用

String inventoryUrl = "http://localhost:8081/api/inventory/reduce-inventory";
int inventoryCode = restTemplate.postForObject(inventoryUrl, inventoryRequest, Result.class).getCode();

需要实现服务发现功能,比如订单服务调用前能够获取到最新的库存、商品、账户等服务的列表

解决方案:引入注册中心 Nacos,实现服务的注册与发现,比如将库存、商品、账户等服务注册到 Nacos 中,订单服务调用之前从 Nacos 获取相应的服务列表。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/955794.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

加密货币的基本交易技术指标

是币安交易市场的基本版视图,trading View是有更复杂的参数追踪。币安的交易的技术指标有主图和副图。有很多指标&#xff0c;让ai解释一下相关概念和意义。加密货币交易中可能遇到的主图指标及其含义&#xff1a; 1. MA&#xff08;移动平均线&#xff0c;Moving Average&…

简单介绍JSONStream的使用

地址 作用 这个模块是根据需要筛选出json数据中自己所需要的数据 使用 var JSONStream require("JSONStream"); var parse require("fast-json-parse"); var fs require("fs");fs.createReadStream("./time.json").pipe(JSONSt…

UOS扩容攻略:迁移home

原文链接&#xff1a;UOS扩容攻略&#xff1a;迁移/home Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇关于 UOS 扩容攻略&#xff1a;迁移 /home 目录 的文章。相信很多朋友在使用 UOS 系统时&#xff0c;会遇到系统分区空间不足&#xff0c;尤其是 /home 目录存…

RK3588平台开发系列讲解(NPU篇)NPU 驱动的组成

文章目录 一、NPU 驱动组成二、查询 NPU 驱动版本三、查询 rknn_server 版本四、查询 librknn_runtime 版本沉淀、分享、成长,让自己和他人都能有所收获!😄 一、NPU 驱动组成 NPU 驱动版本、rknn_server 版本、librknn_runtime 版本以及 RKNN Toolkit 版本的对应关系尤为重…

【实践】操作系统智能助手OS Copilot新功能测评

一、引言 数字化加速发展&#xff0c;尤其人工智能的发展速度越来越快。操作系统智能助手成为提升用户体验与操作效率的关键因素。OS Copilot借助语言模型&#xff0c;人工智能等&#xff0c;对操作系统的自然语言交互操作 推出很多功能&#xff0c;值得开发&#xff0c;尤其运…

C# OpenCvSharp 部署3D人脸重建3DDFA-V3

目录 说明 效果 模型信息 landmark.onnx net_recon.onnx net_recon_mbnet.onnx retinaface_resnet50.onnx 项目 代码 下载 参考 C# OpenCvSharp 部署3D人脸重建3DDFA-V3 说明 地址&#xff1a;https://github.com/wang-zidu/3DDFA-V3 3DDFA_V3 uses the geometri…

Linux-day08

第17章 大数据定制篇-shell编程 shell编程快速入门 shell变量 设置环境变量 把行号打开 set nu 位置参数变量 预定义变量 在一个脚本中执行了另外一个脚本所以卡住了 CTRLC退出 运算符 operator运算符 条件判断 流程控制 单分支多分支 case语句 for循环 反复的把取出来的i值…

海康工业相机的应用部署不是简简单单!?

作者&#xff1a;SkyXZ CSDN&#xff1a;SkyXZ&#xff5e;-CSDN博客 博客园&#xff1a;SkyXZ - 博客园 笔者使用的设备及环境&#xff1a;WSL2-Ubuntu22.04MV-CS016-10UC 不会吧&#xff1f;不会吧&#xff1f;不会还有人拿到海康工业相机还是一脸懵叭&#xff1f;不会还有人…

ComfyUI-PromptOptimizer:文生图提示优化节点

ComfyUI-PromptOptimizer 是 ComfyUI 的一个自定义节点&#xff0c;旨在优化文本转图像模型的提示。它将用户输入的提示转换为更详细、更多样化、更生动的描述&#xff0c;使其更适合生成高质量的图像。无需本地模型。 1、功能 提示优化&#xff1a;优化用户输入的提示以生成…

力扣 完全平方数

动态规划&#xff0c;找到前几个状态做更新。 题目 从题可看出又是一道dp&#xff0c;只要找到一个最大的平方数&#xff0c;然后往回退到上个状态&#xff0c;然后再用回退的状态加回去这个平方数即加上这一种。注意这里的所含平方数并不是随着数字变大而变大的&#xff0c;因…

使用 Java 开发 Android 应用:Kotlin 与 Java 的混合编程

使用 Java 开发 Android 应用&#xff1a;Kotlin 与 Java 的混合编程 在开发 Android 应用程序时&#xff0c;我们通常可以选择使用 Java 或 Kotlin 作为主要的编程语言。然而&#xff0c;有些开发者可能会想要在同一个项目中同时使用这两种语言&#xff0c;这就是所谓的混合编…

BeanFactory 是什么?它与 ApplicationContext 有什么区别?

谈到Spring&#xff0c;那势必要讲讲容器 BeanFactory 和 ApplicationContext。 BeanFactory是什么&#xff1f; BeanFactory&#xff0c;其实就是 Spring 容器&#xff0c;用于管理和操作 Spring 容器中的 Bean。可能此时又有初学的小伙伴会问&#xff1a;Bean 是什么&#x…

ABP - 缓存模块(1)

ABP - 缓存模块&#xff08;1&#xff09; 1. 与 .NET Core 缓存的关系和差异2. Abp 缓存的使用2.1 常规使用2.2 非字符串类型的 Key2.3 批量操作 3. 额外功能 1. 与 .NET Core 缓存的关系和差异 ABP 框架中的缓存系统核心包是 Volo.Abp.Caching &#xff0c;而对于分布式缓存…

SWD仿真接口(for ARM)的使用方法

概述: JTAG JTAG代表联合测试行动小组(定义JTAG标准的小组),旨在作为测试板的一种方式。JTAG允许用户与微控制器的各个部分进行对话。在许多情况下,这涉及一组指令或对电路板进行编程。JTAG标准定义了5个引脚: TCK: Test Clock TMS: Test Mode Select TDI: Test Data-…

Linux UDP 编程详解

一、引言 在网络编程领域&#xff0c;UDP&#xff08;User Datagram Protocol&#xff0c;用户数据报协议&#xff09;作为一种轻量级的传输层协议&#xff0c;具有独特的优势和适用场景。与 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff0…

OpenCV相机标定与3D重建(60)用于立体校正的函数stereoRectify()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 为已校准的立体相机的每个头计算校正变换。 cv::stereoRectify 是 OpenCV 中用于立体校正的函数&#xff0c;它基于已知的相机参数和相对位置&am…

AWS物联网连接的数据记录器在冰川环境中的性能比较:Campbell CR1000X与ESP32开源

论文标题 中文&#xff1a;AWS物联网连接的数据记录器在冰川环境中的性能比较&#xff1a;Campbell CR1000X与ESP32开源 英文&#xff1a;Performance comparison of AWS IoT connected dataloggers in glacier environments: Campbell CR1000X vs. ESP32 Open source 作者信…

K8S 节点选择器

今天我们来实验 pod 调度的 nodeName 与 nodeSelector。官网描述如下&#xff1a; 假设有如下三个节点的 K8S 集群&#xff1a; k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、镜像准备 1.1、镜像拉取 docker pull tomcat:8.5-jre8…

Python爬虫学习前传 —— Python从安装到学会一站式服务

早上好啊&#xff0c;大佬们。我们的python基础内容的这一篇终于写好了&#xff0c;啪唧啪唧啪唧…… 说实话&#xff0c;这一篇确实写了很久&#xff0c;一方面是在忙其他几个专栏的内容&#xff0c;再加上生活学业上的事儿&#xff0c;确实精力有限&#xff0c;另一方面&…

【书生大模型实战营】Git 基础知识-L0G3000

本文是书生大模型实战营系列的第三篇文章&#xff0c;本文的主题是&#xff1a;Git基础知识点。 原始教程链接&#xff1a;Tutorial/docs/L0/git/readme.md at camp4 InternLM/Tutorial 1.Git总览 什么是Git&#xff1f; Git是一个分布式版本控制系统&#xff0c;广泛用于…