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

目录

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 {
    @Autowired
    private ProductDao productDao;
    @Override
    public Product findById(Long pid) {
        return productDao.selectById(pid);
    }
}

创建controller层

@RestController
@RequestMapping("product")
public class ProductController {
    @Autowired
    private 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 {
    @Autowired
    private OrderDao orderDao;
    @Override
    public 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 {
    @Autowired
    private OrderService orderService;
    @Autowired
    private 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 ? "下单成功" : "下单失败";


    }
}

测试

隐藏不想展示的文件:

 项目结构:

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

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

相关文章

Linux/Unix-gcc编译回顾

1、gcc编译为可执行程序四步骤&#xff1a;预处理->编译->汇编->链接 注意&#xff1a;-o 用于修改生产的文件名 2、gcc常用参数 指定头文件&#xff1a;-I 语法&#xff1a; gcc -I 头文件所在文件夹路径 源文件 -o 生成文件名 如果头文件和源文件中同一个文件夹…

Docker 常用命令

docker命令大全 命令说明docker attach将本地标准输入、输出和错误流附加到正在运行的容器docker build从 Dockerfile 构建镜像docker builder管理构建docker checkpoint管理检查点docker commit从容器的更改中创建新图像docker config管理 Docker 配置docker container管理容器…

GOPATH、GOROOT(VSCode编写第一个go程序)

1. GOROOT和GOPATH GOROOT 和 GOPATH 都是 Go 语言中的环境变量&#xff0c;用于指定 Go 工具链和工作区的路径。 GOROOT 指定了 Go 工具链的安装路径&#xff0c;它包含了 Go 语言的标准库、编译器等工具。在使用 Go 编译器、运行时等工具时&#xff0c;它们会默认从 GOROOT…

新晋 Committer!来自复旦大学的帅哥一枚

点亮Star⭐️ 支持我们 https://github.com/apache/dolphinscheduler 最近&#xff0c;社区星力量又迎来一位新晋 Committer&#xff0c;这次是来自复旦大学研究生在读的王维饶同学&#xff0c;一起来认识一下吧&#xff01; 个人简介 姓名&#xff1a;王维饶职位&#xff1a…

SignalTap II 软件使用步骤

文章目录 前言一、SignalTap II是什么&#xff1f;二、使用步骤三、总结四、参考资料 前言 环境&#xff1a; 1、Quartus18.1 2、板子型号&#xff1a;原子哥开拓者2(EP4CE10F17C8) 要求&#xff1a; 能够使用SignalTap II进行片上调试。 一、SignalTap II是什么&#xff1f; S…

华为云子网路由表作用及价值

子网路由表 子网路由表作用云专线、VPN的配置与子网路由表强关联&#xff0c;本质是在相应的子网路由表中添加了一条路由Nat路由表问题地址变更问题snat和dnat 子网路由表作用 子网内部作为一个二层网络&#xff0c;通过mac地址互通&#xff0c;不通过路由互通。跨子网&#x…

ASUS华硕ROG幻14 2021款GA401QM原厂Win10系统工厂模式带ASUS Recovery恢复功能

自带恢复分区、所有驱动、出厂主题壁纸LOGO、Office办公软件、奥创控制中心等预装程序 所需要工具&#xff1a;16G或以上的U盘(非必需) 文件格式&#xff1a;HDI,SWP,OFS,EDN,KIT,TLK多个底包 文件大小&#xff1a;11.34GB 注&#xff1a;恢复时会清空电脑上所有盘的数据&…

【布局优化】基于遗传算法的车间布局优化 车间设施布局优化【Matlab代码#50】

文章目录 【获取资源请见文章第5节&#xff1a;资源获取】1. 车间布局优化2. 基于GA的布局优化模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节&#xff1a;资源获取】 1. 车间布局优化 车间设施布置的规划一直是工业工程领域不断研究和探索的内容&am…

【人工智能】xAI——“X宇宙”又增添了一位新成员

个人主页&#xff1a;【&#x1f60a;个人主页】 &#x1f31e;热爱编程&#xff0c;热爱生活&#x1f31e; 文章目录 前言xAI团队成员做解开宇宙本质的AI 前言 有人问他&#xff0c;xAI公司是干啥的&#xff1f;马斯克的回答引用了其偶像、科幻作家道格拉斯・亚当斯的话&…

[javascript核心-08] V8 内存管理机制及性能优化

V8 内存管理 V8 本身也是程序&#xff0c;它本身也会申请内存&#xff0c;它申请的内存称为常驻内存&#xff0c;而它又将内存分为堆和栈 栈内存 栈内存介绍 栈用于存放JS 中的基本类型和引用类型指针栈空间是连续的&#xff0c;增加删除只需要移动指针&#xff0c;操作速度…

leetcode100.相同的树

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;相同的树 1️⃣ 代码&#xff1a; bool isSameTree(struct TreeNode* p, struct TreeNode* q){// 判断两棵树当前结点是否为空if (p NULL && q NULL) {// 说明是相同的return true;}// 来到这里有几种情况// …

单片机第一季:零基础6——按键

目录 1&#xff0c;独立按键 2&#xff0c;矩阵按键 &#xff08;注意&#xff1a;文章中的代码仅供参考学习&#xff0c;实际使用时要根据需要修改&#xff09; 1&#xff0c;独立按键 按键管脚两端距离长的表示默认是导通状态&#xff0c;距离短的默认是断开状态&#xf…

集群基础3——haproxy负载均衡apache

文章目录 一、环境说明二、安装配置httpd三、安装配置haproxy四、验证http负载均衡五、配置https负载均衡六、haproxy网页监控6.1 监控参数详解6.2 页面操作 一、环境说明 使用haproxy对apache进行负载均衡。 主机IP角色安装服务192.168.161.131后端服务器1httpd,80端口192.168…

前端 | (五)CSS三大特性及常用属性 | 尚硅谷前端html+css零基础教程2023最新

学习来源&#xff1a;尚硅谷前端htmlcss零基础教程&#xff0c;2023最新前端开发html5css3视频 文章目录 &#x1f4da;CSS三大属性&#x1f407;层叠性&#x1f407;继承性&#x1f407;优先级 &#x1f4da;CSS常用属性&#x1f407;像素的概念&#x1f407;颜色的表示⭐️表…

【数据挖掘】如何为可视化准备数据

一、说明 想要开始您的下一个数据可视化项目吗&#xff1f;首先与数据清理友好。数据清理是任何数据管道中的重要步骤&#xff0c;可将原始的“脏”数据输入转换为更可靠、相关和简洁的数据输入。诸如Tableau Prep或Alteryx之类的数据准备工具就是为此目的而创建的&#xff0c;…

Android 开发规范(基础版)

背景 项目的代码时间时间很长,经过太多人手,代码的规范性堪忧,目前存在较多的比较自由的「代码规范」,这非常不利于项目的维护,代码可读性也不够高。 分析现有项目的代码的情况,输出的『定制化规范』文档,用于提高代码的可读性和可维护性。 收益 对于个人:帮助团队写「…

IIS 日志分析

Microsoft互联网信息服务&#xff08;IIS&#xff09;服务器&#xff0c;包括Web和FTP&#xff0c;已成为企业必不可少的。但是&#xff0c;IT 安全管理员的工作并不仅仅局限于部署 IIS 服务器。部署后&#xff0c;管理员必须采取安全措施来保护这些服务器。监视 IIS 服务器安全…

Java版知识付费源码 Spring Cloud+Spring Boot+Mybatis+uniapp+前后端分离实现知识付费平台

知识付费平台主要指的是能够通过付费来满足用户知识需求的平台&#xff0c;用户可以通过该平台来消费知识或者开展知识买卖等行为。 此处的平台是一个广义的概念&#xff0c;可以是微信小程序或者论坛&#xff0c;也可以是网页或者手机APP&#xff0c;等&#xff0c;就我国的情…

基于IMX6ULL的AP3216C的QT动态数据曲线图显示

前言&#xff1a;本文为手把手教学 LinuxQT 的典型基础项目 AP3216C 的数据折线图显示&#xff0c;项目使用正点原子的 IMX6ULL 阿尔法( Cortex-A7 系列)开发板。项目需要实现 AP3216C 在 Linux 系统下的驱动&#xff0c;使用 QT 设计 AP3216C 的数据显示页面作为项目的应用层。…

聊聊ChatGPT是如何组织对话的

为什么要组织对话&#xff1f; 总所周知&#xff0c;ChatGPT的训练大致可分为下图中展示的几个阶段&#xff0c;其中&#xff0c;在Pretraining阶段&#xff0c;模型的训练数据是纯文本&#xff0c;目标是根据上文预测下一个token&#xff0c;而在后面的几个阶段中&#xff0c…