微服务架构+创建微服务工程(商品/订单)

news/2024/4/29 14:47:22/文章来源:https://blog.csdn.net/WQGuang/article/details/131722291

目录

1.微服务架构

1.1.单体应用架构

1.2.微服务应用

1.3 微服务架构的优势

1.4.微服务架构的缺点(挑战)

1.5. SpringCloud与微服务关系

1.6.SpringBoot和SpringCloud关系

2. 创建微服务工程

2.1.数据库

2.2.搭建父工程

2.2 创建公共模块

2.3.商品系统

2.4.订单微服务


1.微服务架构

1.1.单体应用架构

将项目所有模块(功能)打成jar或者war,然后部署一个进程

优点:

1:部署简单:由于是完整的结构体,可以直接部署在一个服务器上即可。

2:技术单一:项目不需要复杂的技术栈,往往一套熟悉的技术栈就可以完成开发。

缺点:

1:系统启动慢,一个进程包含了所有的业务逻辑,涉及到的启动模块过多,导致系统的启动、重启时间周期过长;

2:系统错误隔离性差、可用性差,任何一个模块的错误均可能造成整个系统的宕机;

3:可伸缩性差:系统的扩容只能只对这个应用进行扩容,无法结合业务模块的特点进行伸缩。

4: 线上问题修复周期长:任何一个线上问题修复需要对整个应用系统进行全面升级。

5: 跨语言程度差

6: 不利于安全管理,所有开发人员都拥有全量代码。

小型项目适合单体应用架构. 比如:OA办公系统。管理类的项目 仓库管理系统。

1.2.微服务应用

微服务架构论文

译文

简单来说,微服务架构风格[1]是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并且可通过全自动部署机制独立部署。这些服务共用一个最小型的集中式的管理,服务可用不同的语言开发,使用不同的数据存储技术。

  • > 一个项目被拆分若干个项目
  • > 每个项目可以独立运行
  • > 每个项目可以使用不同的语言开发
  • > 每个项目可以拥有独立的数据库
  • > 项目与项目之间可以通信[http协议]

解读微服务特点:  

  • 微服务是一种==项目架构思想==(风格)
  • 微服务架构是一系列小服务的组合(组件化与多服务)
  • 任何一个微服务,都是一个独立的进程(独立开发、独立维护、独立部署)
  • 轻量级通信http协议(跨语言,跨平台)
  • 服务粒度(围绕业务功能拆分---模块拆分【系统管理服务】【日志服务】【焦虑测试】【抑郁测试系统】)

1.3 微服务架构的优势

1.易于开发和维护

一个微服务只关注一个特定的业务功能,所以它的业务清晰、代码量较少。开发和维护单个微服务相对比较简单,整个应用是由若干个微服务构建而成,所以整个应用也会维持在可控状态;

⒉.单个微服务启动较快

单个微服务代码量较少,所以启动会比较快;

3.局部修改容易部署

单体应用只要有修改,就要重新部署整个应用,微服务解决了这样的问题。一般来说,对某个微服务进行修改,只需要重新部署这个服务即可;

4.技术栈不受限

在微服务中,我们可以结合项目业务及团队的特点,合理地选择技术栈

5.按需伸缩

焦虑系统访问量大,只需要对焦虑系统进行扩展

1.4.微服务架构的缺点(挑战)

1、服务太多,导致服务间的依赖错综复杂,运维难度大

2、微服务放大了分布式架构的系列问题

  • 分布式事务(seata)

  • 分布式锁怎么处理(redisson) ,

  • 服务注册与发现(nacos) .

  • 依赖服务不稳定(sentinel)导致服务雪崩怎么办?

3、运维复杂度陡增,部署数量多、监控进程多导致整体运维复杂度提升。

如何解决上面的挑战----springcloud

1.5. SpringCloud与微服务关系

Springcloud为微服务思想提供了完美的解决方案

Springcloud是一些列框架的集合体(不同的框架解决微服务面临的不同的挑战)

springcloud提供了两款模式:第一种netflix公司 第二款:alibaba-阿里巴巴。     

1.6.SpringBoot和SpringCloud关系

  • SpringBoot专注于快速方便的开发单个个体微服务。
  • SpringCloud是关注全局的微服务协调、整理、治理的框架,它将SpringBoot开发的单体整合并管理起来。
  • SpringBoot可以离开SpringCloud独立使用开发项目,但是SpringCloud离不开SpringBoot,属于依赖关系。

2. 创建微服务工程

技术栈: mysql+mybatis[mp]+springboot+springcloud alibaba 

2.1.数据库

订单数据库:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for shop_order
-- ----------------------------
DROP TABLE IF EXISTS `shop_order`;
CREATE TABLE `shop_order`  (`oid` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '订单id',`uid` int(0) NULL DEFAULT NULL COMMENT '用户id',`username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '用户名',`pid` bigint(0) NULL DEFAULT NULL COMMENT '商品id',`pname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品名称',`pprice` decimal(10, 2) NULL DEFAULT NULL COMMENT '商品价格',`number` int(0) NULL DEFAULT NULL COMMENT '购买数量',PRIMARY KEY (`oid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 44956 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of shop_order
-- ----------------------------SET FOREIGN_KEY_CHECKS = 1;

商品数据库:

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for shop_product
-- ----------------------------
DROP TABLE IF EXISTS `shop_product`;
CREATE TABLE `shop_product`  (`pid` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '商品id',`pname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品名',`pprice` decimal(10, 2) NULL DEFAULT NULL COMMENT '商品价格',`stock` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '商品库存',PRIMARY KEY (`pid`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of shop_product
-- ----------------------------
INSERT INTO `shop_product` VALUES (1, '华为手机', 1999.00, '100');
INSERT INTO `shop_product` VALUES (2, 'vivo手机', 2999.00, '100');
INSERT INTO `shop_product` VALUES (3, '小米', 2222.00, '1000');SET FOREIGN_KEY_CHECKS = 1;

2.2.搭建父工程

创建maven工程作为父工程

引入依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.aaa</groupId><artifactId>springcloud-2</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><!--继承springboot父工程--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.2.RELEASE</version></parent><!--定义版本号--><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF- 8</project.reporting.outputEncoding><spring-cloud.version>Hoxton.SR8</spring-cloud.version><spring-cloud-alibaba.version>2.2.3.RELEASE</spring-cloud-alibaba.version></properties><!--dependencyManagement: 它只负责jar的管理 不负责jar的下载 子类使用该类型的jar包时,直接引用而无需写版本--><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><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>

springboot 和 springcloud 以及springcloud  alibaba他们的版本必须匹配

2.2 创建公共模块

创建maven工程作为公共模块

 引入依赖

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>com.aaa</groupId><artifactId>springcloud-2</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>common</artifactId><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version></dependency></dependencies></project>

创建相应的实体类

@Data
@TableName(value = "shop_product")
public class Product implements Serializable {//商品@TableId(value = "pid",type = IdType.AUTO)private Long pid;private String pname;private BigDecimal pprice;private Integer stock;}
@Data
@TableName("shop_order")
public class Order implements Serializable {//订单@TableId(value = "oid",type = IdType.AUTO)private Long oid;private Long uid;private String username;private Long pid;private String pname;private BigDecimal pprice;private Integer number;}

2.3.商品系统

创建maven工程作为商品系统

 引入依赖

 <dependencies><!--公共模块引入--><dependency><groupId>com.aaa</groupId><artifactId>common</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies>

创建配置文件

#端口号8001~8008
server.port=8001
#数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///springcloud-product?serverTimezone=Asia/Shanghai
spring.datasource.password=123456789
spring.datasource.username=root#mpd的日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

创建主启动类

@SpringBootApplication
@MapperScan(basePackages = "com.aaa.product.dao")
public class ProductApp {public static void main(String[] args) {SpringApplication.run(ProductApp.class,args);}
}

创建dao接口

public interface ProductDao extends BaseMapper<Product> {
}

创建service层及实现类

public interface ProductService {/*** 根据商品id查询商品信息* @param pid 商品id* @return 商品信息*/public Product findById(Long pid);
}
@Service
public class ProductServiceImpl implements ProductService {@Autowiredprivate ProductDao productDao;@Overridepublic Product findById(Long pid) {return productDao.selectById(pid);}
}

创建controller层

@RestController
@RequestMapping("product")
public class ProductController {@Autowiredprivate ProductService productService;@GetMapping("getById/{id}")public Product getById(@PathVariable Long id) {Product product = productService.findById(id);return product;}
}

测试

2.4.订单微服务

创建maven工程作为订单系统

 引入依赖

 <dependencies><!--公共模块引入--><dependency><groupId>com.aaa</groupId><artifactId>common</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency></dependencies>

创建配置文件

#端口号9001~9008
server.port=9001
#数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///springcloud-order?serverTimezone=Asia/Shanghai&characterEncoding=utf-8
spring.datasource.password=123456789
spring.datasource.username=root#mpd的日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

创建主启动类

@SpringBootApplication
@MapperScan(basePackages = "com.aaa.order.dao")
public class OrderApp {public static void main(String[] args) {SpringApplication.run(OrderApp.class,args);}
}

创建dao接口

public interface OrderDao extends BaseMapper<Order> {
}

创建service层及实现类

public interface OrderService {//添加订单public Order save(Order order);
}
@Service
public class OrderServiceImpl implements OrderService {@Autowiredprivate OrderDao orderDao;@Overridepublic Order save(Order order) {int insert = orderDao.insert(order);if (insert > 0){return order;}else {throw new RuntimeException("订单添加失败~~~~~~~");}}
}

主启动类中加入RestTemplate

创建controller层

@RestController
@RequestMapping("order")
public class OrderController {@Autowiredprivate OrderService orderService;@Autowiredprivate RestTemplate restTemplate;@GetMapping("insert")public String insert(Long pid, Integer num) {//创建一个订单对象Order order = new Order();order.setUid(1L);order.setUsername("安卓手机");order.setNumber(num);//商品信息---调用商品微服务的接口。---如何调用商品微服务的接口?--远程调用。[1]借助rabbitmq  [2]http远程调用【在java端模拟浏览器调用】。//spring封装了http远程调用 RestTemplate.默认该类没有交于spring容器管理. 创建一个配置类 写一个方法@Bean注解/*** String url, 远程调用的服务器的地址* Class<T> responseType, 远程调用的接口返回类型的反射类* Object... uriVariables: 远程接口需要传递的参数。*/Product product = restTemplate.getForObject("http://localhost:8001/product/getById/" + pid, Product.class);order.setPid(product.getPid());order.setPname(product.getPname());order.setPprice(product.getPprice());int i = orderService.save(order);return i > 0 ? "下单成功" : "下单失败";}
}

测试

隐藏不想展示的文件:

 项目结构:

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

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

相关文章

在Linux中使用curl访问EasyCVR页面,返回报错Unauthorized是什么原因?

EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&#xff0c;比如&#xff1a;视…

检测到错误页面web应用服务器版本信息泄露

详细描述 Web服务器未能正确处理异常请求导致Web服务器版本信息泄露&#xff0c;攻击者收集到服务器信息后可进行进一步针对性攻击。 解决办法 临时修复建议如下&#xff1a; 1、关闭web服务器错误提示。 2、关闭运行平台的错误提示。 3、建立错误机制&#xff0c;不要把真实…

力扣 198.打家劫舍【中等】

198.打家劫舍 1 题目2 思路3 代码4 结果 1 题目 题目来源&#xff1a;力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/house-robber 题目&#xff1a;你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃…

优化产品知识库的 SEO 技巧

在当今数字化的商业环境中&#xff0c;为产品知识库进行搜索引擎优化&#xff08;SEO&#xff09;是至关重要的。随着用户越来越倾向于通过搜索引擎获取信息&#xff0c;优化产品知识库可以帮助你的企业在竞争激烈的市场中脱颖而出。 通过改进SEO&#xff0c;你可以帮助用户找到…

K8S V1.25.11安装以及踩坑之旅

说明&#xff1a; 系统&#xff1a;centos9 stream K8S版本&#xff1a;V1.25.11&#xff08;不要装最新的&#xff0c;后续的可视化界面安装的是个坑&#xff0c;基本上不支持&#xff0c;时间&#xff1a;2023年7月14日&#xff09; Docker版本&#xff1a;20.10.16 (不要…

4.postgresql--rollup,grouping sets,cube

PostgreSQL ROLLUP 是group by 的子句&#xff0c;是生成多个分组集合的快捷功能。与Cube子句的差异是&#xff0c;rollup 不生成基于特定列所有可能的分组集合&#xff0c;生成分组集合为其子集。 ROLLUP假设输入列之间存在层次结构&#xff0c;从而生成有意义的所有分组集合…

力扣21. 合并两个有序链表

题目 将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 链接&#xff1a;21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 题解 设置两个指针head和tail&#xff0c;head用来指向新链表的头结点&#xff0c;tail…

第G1周:生成对抗网络(GAN)入门

目录 一、课题背景和开发环境二、理论基础1.生成器2. 判别器3. 基本原理 三、前期准备工作1. 定义超参数2.下载数据3. 配置数据 四、定义模型1. 定义鉴别器2. 定义生成器 五、训练模型1. 创建实例2. 训练模型3. 保存模型 &#x1f368; 本文为&#x1f517;365天深度学习训练营…

prometheus调整默认数据存储时间

调整kubernetes部署的prometheus数据存储时间 由于prometheus是用kuberentes部署的&#xff0c;没办法像传统部署方式那种直接在启动参数增加存储时间的参数。需要在configmap里或者在deployment里添加&#xff0c;我这里使用的方式是在deployement里添加调整存储时间的参数。…

React native 已有项目升级兼容web

基础 概念 | webpack 中文文档 | webpack 中文文档 | webpack 中文网 深入理解Webpack及Babel的使用 - 掘金 Introduction to React Native for Web // React Native for Web Webpack 是一个现代的 JavaScript 应用程序的静态模块打包工具&#xff0c;它将应用程序所依赖的各…

Star History 月度开源精选|2023 年 6 月

上一期 Star History 月度精选是写给市场、运营人员的&#xff0c;而这一期回归到 DevTools 类别&#xff0c;我们六月发现了好一些开发者可以用的不错工具&#xff01; AI Getting Started 还记得 Supabase “Build in a weekend” 的广告词吗&#xff01;AI Getting Started…

AIGC文生图:使用ControlNet 控制 Stable Diffusion

1 ControlNet介绍 1.1 ControlNet是什么&#xff1f; ControlNet是斯坦福大学研究人员开发的Stable Diffusion的扩展&#xff0c;使创作者能够轻松地控制AI图像和视频中的对象。它将根据边缘检测、草图处理或人体姿势等各种条件来控制图像生成。 论坛地址&#xff1a;Adding…

Docker安装Rabbitmq超详细教程

&#x1f680; Docker安装Rabbitmq保姆级教程 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1…

Java 装箱拆箱原理 包装类型缓存池

JAVA中的基本数据类型 byteshortintlongfloatdoublebooleanchar 为了让上述基本数据类型可以转为对象&#xff0c;Java在1.5推出了一系列包装类&#xff0c;基本类和包装类互相转换的过程&#xff0c;称为装箱和拆箱 缓存池 缓存池也叫常量池。它是事先存储一些常量数据用以…

数据结构——各种常见算法的实现方法和思路

文章目录 常见的排序算法类型复杂度和稳定性 1.冒泡排序2.直接插入排序3.希尔排序4.简单选择排序方法1&#xff1a;双向遍历选择排序方法2&#xff1a;单向遍历选择排序 5.归并排序方法1&#xff1a;递归方法2&#xff1a;非递归 6.快速排序方法1&#xff1a;随机取keyi方法2&a…

JMeter自定义日志与日志分析

1 JMeter日志概览 JMeter与Java程序一样&#xff0c;会记录事件日志&#xff0c;日志文件保存在bin目录中&#xff0c;名称为jmeter.log。当然&#xff0c;我们也可以在面板中直接察看日志&#xff0c;点击右上角黄色标志物可以打开日志面板&#xff0c;再次点击收起。 可见&…

PostgreSQL MVCC的弊端优化方案

我们之前的博客文章“我们最讨厌的 PostgreSQL 部分”讨论了大家最喜欢的 DBMS 多版本并发控制 (MVCC) 实现所带来的问题。其中包括版本复制、表膨胀、索引维护和真空管理。本文将探讨针对每个问题优化 PostgreSQL 的方法。 尽管 PostgreSQL 的 MVCC 实现是 Oracle 和 MySQL 等…

layui会议OA项目数据表格新增改查

文章目录 前言一、后台代码编写1.1 数据表优化1.2 R工具类1.3 UserDao新增改查1.4 Servlet的编写 二、前台页面的编写2.1 userManege.jsp2.2 userManage.js2.3 新增、修改用户共用jsp2.4add、edit的js 三、演示3.1 查询3.2 新增3.3 修改3.4 删除 前言 在上篇博客我们实现了左侧…

【数据结构】二叉树——链式结构

目录 一、前置声明 二、二叉树的遍历 2.1 前序、中序以及后序遍历 2.2 层序遍历 三、节点个数以及高度 3.1 节点个数 3.2 叶子节点个数 3.3 第k层节点个数 3.4 二叉树的高度/深度 3.5 查找值为x的节点 四、二叉树的创建和销毁 4.1 构建二叉树 4.2 二叉树销毁 4.3 …

Javaweb的三大组件:servlet、filter、listener

1.前言 Servlet翻译过来是小服务程序&#xff0c;所以呢&#xff0c;在javaweb中Servlet是用来处理客户端请求的动态资源&#xff0c;一般表示小程序&#xff0c;在实际开发javaweb的过程中使用的比较多一些&#xff0c;通常的使用方法是根据具体的业务需求来继承HttpServlet&a…