微服务学习-快速搭建

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 {@BeanRestTemplate 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 获取相应的服务列表。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

arkime安装

这次试一下新的办法 先下载centOS 7 然后改成阿里云镜像 输入命令备份官方yum源配置文件 cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 下载阿里云源配置&#xff0c;覆盖原文件 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirr…

/usr/bin/ssh-copy-id: ERROR: no identities found 解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

基于springboot+thymeleaf+Redis仿知乎网站问答项目源码

项目介绍 基于springbootthymeleafRedis仿知乎网站问答项目源码&#xff0c;可以作为毕业设计项目参考学习 按照需要一定动手能力 发文章&#xff0c;发视频&#xff0c;发想法&#xff0c;提问回答&#xff0c;注册登录 开发环境 使用技术&#xff1a;springbootthymeleafRe…

apisix的authz-casbin

目录 1、apisix的auth-casbin官方介绍 2、casbin介绍和使用 2.1基本知识&#xff1a; 2.2使用例子 3、配置插件 4、postman调用 5、auth-casbin的坑 1、apisix的auth-casbin官方介绍 authz-casbin | Apache APISIX -- Cloud-Native API Gateway 2、casbin介绍和使用 c…

自动驾驶之DriveMM: All-in-One Large Multimodal Model for Autonomous Driving

1. 写在前面 工作之后,主要从事于偏工程比较多的内容, 很少有机会读论文了,但2025年,由于之前有些算法的背景, 后面可能会接触一些多模态大模型相关的工作,所以又调头有点往算法的方向偏移, 而算法呢,很重要的一点就是阅读论文。2025年,再拾起论文这块的工作。 今天…

BGP分解实验·9——路由聚合与条件性通告(1)

路由聚合是有效控制缩减BGP路由表的方法之一&#xff0c;路由聚合的前提和IGP一样&#xff0c;需要有路由目标存在BGP表中&#xff0c;与IGP不同的是&#xff0c;BGP路由聚合可以定义按需抑制路由的能力。 实验拓扑如下所示&#xff1a; 现在开始把从R1的R5的基础配置先准备好…

Linux C\C++方式下的文件I/O编程

【图书推荐】《Linux C与C一线开发实践&#xff08;第2版&#xff09;》_linux c与c一线开发实践pdf-CSDN博客 《Linux C与C一线开发实践&#xff08;第2版&#xff09;&#xff08;Linux技术丛书&#xff09;》(朱文伟&#xff0c;李建英)【摘要 书评 试读】- 京东图书 Lin…

C语言:位段

位段的内存分配: 1. 位段的成员可以是 int unsigned int signed int 或者是char &#xff08;属于整形家族&#xff09;类型 2. 位段的空间上是按照需要以4个字节&#xff08; 类型 int &#xff09;或者1个字节&#xff08; char &#xff09;的方式来开辟的。 3. 位段涉及…

SpringMVC 实战指南:文件上传

第一章&#xff1a;常用的注解&#xff1a; RequestParam 注解&#xff1a; 作用&#xff1a;把请求中的指定名称的参数传递给控制器中的形参赋值属性&#xff1a; value&#xff1a;请求参数中的名称required&#xff1a;请求参数中是否必须提供此参数&#xff0c;默认值是 tr…

【部署】将项目部署到云服务器

目录 1.获得服务器 2.连接到云服务器 3.配置环境 3.1.Java&#xff08;运行后端所需&#xff09; 3.2.MySQL数据库 3.3.Nginx&#xff08;运行前端所需&#xff09; 3.4. Node.js&#xff08;构建前端所需&#xff09; 4.打包项目 4.1.打包后端项目 4.2.打包前端项目…

C++实现矩阵Matrix类 实现基本运算

本系列文章致力于实现“手搓有限元&#xff0c;干翻Ansys的目标”&#xff0c;基本框架为前端显示使用QT实现交互&#xff0c;后端计算采用Visual Studio C。 目录 Matrix类 1、public function 1.1、构造函数与析构函数 1.2、获取矩阵数值 1.3、设置矩阵 1.4、矩阵转置…

HTML<form>标签

例子 具有两个输入字段和一个提交按钮的HTML表单&#xff1a; <form action"/action_page.php" method"get"> <label for"fname">First name:</label> <input type"text" id"fname" name"f…

《贪心算法:原理剖析与典型例题精解》

必刷的贪心算法典型例题&#xff01; 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法1——数塔问题-CSDN博客 算法竞赛&#xff08;蓝桥杯&#xff09;贪心算法2——需要安排几位师傅加工零件-CSDN博客 算法&#xff08;蓝桥杯&#xff09;贪心算法3——二维数组排序与贪心算…

“Cultural diversity” 和 “multicultural”应用场景区别

“Cultural diversity” 和 “multicultural” 都涉及到不同文化的存在和互动&#xff0c;但它们在使用时有细微的差别&#xff0c;主要体现在侧重点和语境上。以下是它们各自的应用场景&#xff1a; 1. Cultural Diversity&#xff08;文化多样性&#xff09; 定义&#xff…

在 Linux 和 Windows 下查看文件 MD5 值的几种方法

MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种常见的哈希算法&#xff0c;用于生成文件的唯一“指纹”。它在文件传输和验证过程中非常有用&#xff0c;能够确保文件未被篡改。本文将介绍在 Linux 和 Windows 下查看文件 MD5 值的几种方法&#xff0c;并分别列…

QT 占位符的用法

这段代码是 Qt 中常用的字符串格式化方法&#xff0c;用于动态生成带有变量值的字符串。以下是详细的拆解和解释&#xff1a; QString("Elapsed time: %1 seconds").arg(elapsed_seconds.count())1. QString 的构造 QString(“Elapsed time: %1 seconds”) 创建了一…

【2024 年度总结】从小白慢慢成长

【2024 年度总结】从小白慢慢成长 1. 加入 CSDN 的契机2. 学习过程2.1 万事开头难2.2 下定决心开始学习2.3 融入技术圈2.4 完成万粉的目标 3. 经验分享3.1 工具的选择3.2 如何提升文章质量3.3 学会善用 AI 工具 4. 保持初心&#xff0c;继续前行 1. 加入 CSDN 的契机 首次接触…

如何通过云计算优化网站性能?

随着互联网的迅猛发展&#xff0c;网站的性能已经成为用户体验的关键因素之一。响应速度慢、加载时间长&#xff0c;甚至服务器崩溃都会直接影响用户的满意度&#xff0c;进而影响企业的品牌形象和盈利能力。而云计算提供了一个高效、灵活、可扩展的解决方案&#xff0c;帮助企…

【C++篇】红黑树封装 实现map和set

目录 前言&#xff1a; 一&#xff0c;库中map和set的大致结构 二&#xff0c;模拟实现 2.1&#xff0c;大致框架 2.2&#xff0c;复用红黑树实现insert接口 2.3&#xff0c;迭代器iterator的实现 operator()的实现&#xff1a; operator--()的实现&#xff1a; 对inser…

面试-业务逻辑3

应用 小明随机拿一些带有编号的积木组成一排&#xff0c;数字编号可能相同。小明让小刚找到这排积木中数字相同且所处位置最远的2块积木&#xff0c;并计算他们的距离。 实现 N int(input("请输入积木总数&#xff1a;")) a_list list()for i in range(0, N):a …