【Spring Cloud】微服务的简单搭建

文章目录

  • 🍃前言
  • 🎄开发环境安装
  • 🌳服务拆分的原则
    • 🚩单一职责原则
    • 🚩服务自治
    • 🚩单向依赖
  • 🍀搭建案例介绍
  • 🌴数据准备
  • 🎋工程搭建
    • 🚩构建父子工程
      • 🎈创建父工程
      • 🎈创建⼦项目-订单服务与商品服务
      • 🎈完善订单服务
      • 🎈完善商品服务
    • 🚩远程调用
      • 🎈调用需求
      • 🎈实现
      • 🎈测试
  • 🌲项目存在问题
  • ⭕总结

🍃前言

Spring Cloud 提供了⼀些可以让开发⼈员快速构建分布式服务的⼯具,⽐如配置管理, 服务发现,,熔断,智能路由等。他们可以在任何分布式环境中很好的⼯作。

简单来说,Spring Cloud 就是分布式微服务架构的⼀站式解决⽅案,是微服务架构落地的多种技术的集合

既然Spring Cloud是用来解决微服务所带来的问题。那我们接下来就先搭建一个简单的微服务。

本篇内容主要非为以下两点

  1. 开发环境安装
  2. 项⽬搭建

🎄开发环境安装

首先 JDK 版本的选择方面

我们选择 JDK17 ,选择 JDK17 的原因,是因为Spring Cloud 是基于 SpringBoot 进⾏开发的, SpringBoot 3.X以下的版本, Spring官⽅已不再进⾏维护(还可以继续使⽤), SpringBoot 3.X的版本, 使⽤的JDK版本基本为JDK17. 鉴于JDK21是 2023.09⽉发布的, 很多功能还没有在⽣产环境验证, 所以选择使⽤JDK17。

数据库方面,我们选择MySQL

🌳服务拆分的原则

微服务应用开发的第一步, 就是服务拆分.拆分后才能进行"各自开发”

微服务的拆分原则主要为以下三个原则:

  1. 单⼀职责原则

  2. 服务⾃治

  3. 单向依赖

🚩单一职责原则

单⼀职责原则原本是⾯向对象设计中的⼀个基本原则,它指的是⼀个类应该专注于单⼀功能。不要存在多于⼀个导致类变更的原因

在微服务架构中,⼀个微服务也应该只负责⼀个功能或业务领域,每个服务应该有清晰的定义和边界,只关注⾃⼰的特定业务领域

以电商平台为例,拆分为以下服务
在这里插入图片描述

🚩服务自治

服务⾃治是指每个微服务都应该具备⾼度⾃治的能⼒,即每个服务要能做到独⽴开发,独⽴测试,独⽴构建,独⽴部署,独⽴运⾏.

以上⾯的电商系统为例,每⼀个微服务应该有⾃⼰的存储,配置,在进⾏开发,构建,部署,运⾏和测试时,并不需要过多关注其他微服务的状态和数据

在这里插入图片描述

🚩单向依赖

微服务之间需要做到单向依赖, 严禁循环依赖, 双向依赖
循环依赖:A -> B -> C ->A
双向依赖: A -> B, B -> A

在这里插入图片描述

🍀搭建案例介绍

⼀个完整的电商系统是庞⼤的,搭建微服务困难较大,这里我们实现一的简单的微服务,其中的一部分,以订单列表为例:

大致可拆分为以下两个服务:

  1. 订单服务: 提供订单ID, 获取订单详细信息

  2. 商品服务: 根据商品ID, 返回商品详细信息

在这里插入图片描述

🌴数据准备

-- 建cloud_order库
create database if not exists cloud_order charset utf8mb4;
-- 订单表
DROP TABLE IF EXISTS order_detail;
CREATE TABLE order_detail (`id` INT NOT NULL AUTO_INCREMENT COMMENT '订单id',`user_id` BIGINT ( 20 ) NOT NULL COMMENT '⽤⼾ID',`product_id` BIGINT ( 20 ) NULL COMMENT '产品id',`num` INT ( 10 ) NULL DEFAULT 0 COMMENT '下单数量',`price` BIGINT ( 20 ) NOT NULL COMMENT '实付款',`delete_flag` TINYINT ( 4 ) NULL DEFAULT 0,`create_time` DATETIME DEFAULT now(),`update_time` DATETIME DEFAULT now(),
PRIMARY KEY ( id )) ENGINE = INNODB DEFAULT CHARACTER
SET = utf8mb4 COMMENT = '订单表';
-- 数据初始化
insert into order_detail (user_id,product_id,num,price)
values
(2001, 1001,1,99), (2002, 1002,1,30), (2001, 1003,1,40),
(2003, 1004,3,58), (2004, 1005,7,85), (2005, 1006,7,94);-- 建cloud_product库
create database if not exists cloud_product charset utf8mb4;
-- 产品表
DROP TABLE IF EXISTS product_detail;
CREATE TABLE product_detail (`id` INT NOT NULL AUTO_INCREMENT COMMENT '产品id',`product_name` varchar ( 128 ) NULL COMMENT '产品名称',`product_price` BIGINT ( 20 ) NOT NULL COMMENT '产品价格',`state` TINYINT ( 4 ) NULL DEFAULT 0 COMMENT '产品状态 0-有效 1-下架',`create_time` DATETIME DEFAULT now(),`update_time` DATETIME DEFAULT now(),
PRIMARY KEY ( id )) ENGINE = INNODB DEFAULT CHARACTER
SET = utf8mb4 COMMENT = '产品表';
-- 数据初始化
insert into product_detail (id, product_name,product_price,state)
values
(1001,"T恤", 101, 0), (1002, "短袖",30, 0), (1003, "短裤",44, 0),
(1004, "卫⾐",58, 0), (1005, "⻢甲",98, 0),(1006,"⽻绒服", 101, 0),
(1007, "冲锋⾐",30, 0), (1008, "袜⼦",44, 0), (1009, "鞋⼦",58, 0),
(10010, "⽑⾐",98, 0)

🎋工程搭建

🚩构建父子工程

🎈创建父工程

  1. 创建⼀个空的Maven项⽬,删除所有代码,只保留pom.xml

在这里插入图片描述

目录结构如下:

在这里插入图片描述

  1. 完善pom⽂件

使⽤properties来进⾏版本号的统⼀管理,使⽤dependencyManagement来管理依赖,声明⽗⼯程的打包⽅式为pom

<?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>org.example</groupId><artifactId>spring_cloud</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>order-service</module><module>product-service</module></modules><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.1.6</version><relativePath/> <!-- lookup parent from repository --></parent><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><java.version>17</java.version><mybatis.version>3.0.3</mybatis.version><mysql.version>8.0.33</mysql.version><spring-cloud.version>2022.0.3</spring-cloud.version></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency></dependencies><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>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.version}</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter-test</artifactId><version>${mybatis.version}</version><scope>test</scope></dependency></dependencies></dependencyManagement></project>

这里有两个标签,DependencyManagement 和 Dependencies,作用如下

dependencies :将所依赖的jar直接加到项⽬中。⼦项⽬也会继承该依赖. dependencyManagement:只是声明依赖,并不实现Jar包引⼊。如果⼦项⽬需要⽤到相关依赖,需要显式声明。如果⼦项⽬没有指定具体版本,会从⽗项⽬中读取version。如果⼦项⽬中指定了版本号,就会使⽤⼦项⽬中指定的jar版本。此外⽗⼯程的打包⽅式应该是pom,不是jar,这⾥需要⼿动使⽤packaging 来声明

这里需要注意的时,由于后续使用的Spring Cloud 是基于SpringBoot搭建的,所以Spring Cloud 版本与SpringBoot版本有关
在这里插入图片描述

这里使用的咱们项⽬中使⽤的SpringBoot 版本为 3.1.6, 对应的Spring Cloud版本应该为2022.0.x。各位也可以根据自己的版本进行选择。

🎈创建⼦项目-订单服务与商品服务

以下为订单服务的创建过程,商品服务与之一样,名字不同罢了

在这里插入图片描述
在这里插入图片描述

声明项⽬依赖和项⽬构建插件

<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId></dependency><!--mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency>
</dependencies>
<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins>
</build>

🎈完善订单服务

在这里插入图片描述

启动类:

@SpringBootApplication
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class,args);}
}

配置文件:

server:port: 9998
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncoding=utf8&useSSL=falseusername: 用户password: 密码driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:configuration: # 配置打印 MyBatis⽇志log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true #配置驼峰⾃动转换

实体类:

@Data
public class OrderInfo {private int id;private int userId;private int productId;private int num;private long price;private boolean deleteFlag;private Date createTime;private Date update_time;
}

mapper:

@Mapper
public interface OrderMapper {@Select("select * from order_detail where id=#{id}")OrderInfo selectAll(int id);
}

service:

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;public OrderInfo selectAll(Integer userid) {OrderInfo orderInfo = orderMapper.selectAll(userid);return orderInfo;}
}

controller:

@RestController
@RequestMapping("/order")
public class OrderController {@AutowiredOrderService orderService;@RequestMapping("/{id}")public OrderInfo selectAll(@PathVariable("id") int id) {return orderService.selectAll(id);}
}

测试访问:http://127.0.0.1:9998/order/1

即可看到以下界面:
在这里插入图片描述

🎈完善商品服务

在这里插入图片描述
启动类:

@SpringBootApplication
public class ProductServiceApplication {public static void main(String[] args) {SpringApplication.run(ProductServiceApplication.class,args);}
}

配置文件:

server:port: 9999
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncoding=utf8&useSSL=falseusername: 用户password: 密码driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:configuration: # 配置打印 MyBatis⽇志log-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true #配置驼峰⾃动转换

实体类:

@Data
public class ProductInfo {private int id;private String productName;private long productPrice;private boolean state;private Date createTime;private Date updateTime;
}

mapper

@Mapper
public interface ProductMapper {@Select("select * from product_detail where id=#{id}")ProductInfo selectById(int id);
}

service

@Service
public class ProductService {@AutowiredProductMapper productMapper;public ProductInfo selectById(int id) {return productMapper.selectById(id);}
}

controller

@RestController
@RequestMapping("/product")
public class ProductController {@AutowiredProductService productService;@RequestMapping("/{id}")public ProductInfo selectById(@PathVariable("id") int id) {ProductInfo productInfo = productService.selectById(id);return productInfo;}
}

测试:http://127.0.0.1:9999/product/1001
页面返回结果如下:
在这里插入图片描述

🚩远程调用

🎈调用需求

我们一般有如下需求:

根据订单查询订单信息时,根据订单⾥产品ID,获取产品的详细信息

在这里插入图片描述
意思是,我们希望访问订单页面时,也可以访问到商品服务。

🎈实现

实现思路:order-service服务向product-service服务发送⼀个http请求,把得到的返回结果,和订单结果融合在⼀起,返回给调⽤⽅。

实现⽅式:采⽤Spring提供的RestTemplate

首先因为我们需要返回商品的信息,所以这里我们需要对我们的实体类进行修改,修改如下:
在这里插入图片描述
在这里插入图片描述

其次,我们创建一个config文件,在其文件下进行以下配置:

@Configuration
public class OrderConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}

接下来,我们对我们原先的 service 类里面的代码进行修改,修改如下:

@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public OrderInfo selectAll(Integer userid) {OrderInfo orderInfo = orderMapper.selectAll(userid);String url = "http://127.0.0.1:9999/product/" + orderInfo.getProductId();restTemplate.getForObject(url, ProductInfo.class);ProductInfo productInfo = restTemplate.getForObject(url,ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
}

🎈测试

启动商品服务与订单服务;

访问:http://127.0.0.1:9998/order/1

则会出现以下界面:
在这里插入图片描述

🌲项目存在问题

  • 远程调⽤时,URL的IP和端⼝号是写死的,如果更换IP,需要修改代码 。调⽤⽅如何可以不依赖服务提供⽅的IP?
  • 多机部署,如何分摊压⼒?
  • 远程调⽤时,URL⾮常容易写错,⽽且复⽤性不⾼,如何优雅的实现远程调⽤
  • 所有的服务都可以调⽤该接,是否有⻛险?

  • 除此之外,微服务架构还⾯临很多问题,而Spring Cloud 来就是用来解决这些问题

具体如何解决,后续文章再进行一一介绍

⭕总结

关于《【Spring Cloud】微服务的简单搭建》就讲解到这儿,感谢大家的支持,欢迎各位留言交流以及批评指正,如果文章对您有帮助或者觉得作者写的还不错可以点一下关注,点赞,收藏支持一下!

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

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

相关文章

LabVIEW幅频特性测试系统

使用LabVIEW软件开发的幅频特性测试系统。该系统整合了Agilent 83732B信号源与Agilent 8563EC频谱仪&#xff0c;通过LabVIEW编程实现自动控制和数据处理&#xff0c;提供了成本效益高、操作简便的解决方案&#xff0c;有效替代了昂贵的专用仪器&#xff0c;提高了测试效率和设…

聊天室时间构思

记得选择数据库的Data.sql 如果有一方发信息&#xff0c;显示时间&#xff0c;显示发送信息 设置计时器&#xff0c;如果在一分钟&#xff0c;60*1000L毫秒有回复&#xff0c;不显示时间&#xff0c;否则显示时间在显示信息 具体就看哔哩哔哩哔哩哔哩 设置两个时间&#xff0…

短视频博主:成都柏煜文化传媒有限公司

短视频博主&#xff1a;数字时代的新星&#xff0c;创意与梦想的舞台 在移动互联网的浪潮中&#xff0c;短视频以其独特的魅力迅速崛起&#xff0c;成为连接亿万用户、展现生活百态的重要窗口。成都柏煜文化传媒有限公司 而在这片充满无限可能的土地上&#xff0c;短视频博主…

QCustomPlot+ vs2022+ qt

零、printSupport 步骤一&#xff1a;下载QCustomPlot 访问QCustomPlot的官网 QCustomPlot 下载最新版本的源代码。 步骤二&#xff1a;配置项目 创建新的Qt项目&#xff1a; 打开VS2022&#xff0c;创建一个新的Qt Widgets Application项目。 将QCustomPlot源代码添加到项目…

MySQL基础篇(二)字符集以及校验规则

在MySQL基础篇&#xff08;一&#xff09;中&#xff0c;我们知道了如何创建数据库&#xff0c;这篇文章带大家了解创建的一些细节。 红色框&#xff1a;可省略&#xff0c;作用如果存在相同的数据库名称&#xff0c;就不会再创建&#xff0c;反之&#xff0c;创建。 蓝色框&…

鸿蒙应用实践:利用扣子API开发起床文案生成器

前言 扣子是一个新一代 AI 应用开发平台&#xff0c;无需编程基础即可快速搭建基于大模型的 Bot&#xff0c;并发布到各个渠道。平台优势包括无限拓展的能力集&#xff08;内置和自定义插件&#xff09;、丰富的数据源&#xff08;支持多种数据格式和上传方式&#xff09;、持…

星光云VR全景系统源码

星光云VR全景系统源码 体验地址请查看

使用flask的web网页部署介绍

使用flask的web网页部署介绍 文章目录 前言一、网页介绍二、数据库设计介绍总结 前言 flaskbootstrapjquerymysql搭建三叶青在线识别网站&#xff0c;使用nginxgunicorn将网站部署在腾讯云上&#xff0c;配置SSL证书。网站地址&#xff1a;https://www.whtuu.cn 三叶青图像识…

STM32-输入捕获IC和编码器接口

本内容基于江协科技STM32视频学习之后整理而得。 文章目录 1. 输入捕获IC1.1 输入捕获IC简介1.2 频率测量1.3 输入捕获通道1.4 主从触发模式1.5 输入捕获基本结构1.6 PWMI基本结构 2. 输入捕获库函数及代码2.1 输入捕获库函数2.2 6-6 输入捕获模式测频率2.2.1 硬件连接2.2.2 硬…

Appium启动APP时报错Security exception: Permission Denial

报错内容Security exception: Permission Denial: starting Intent 直接通过am命令尝试也是同样的报错 查阅资料了解到&#xff1a;android:exported | App quality | Android Developers exported属性默认false&#xff0c;所以android:exported"false"修改为t…

ubuntu下运行程序时提示缺库问题的有效解决方法

目录 一、问题现象二、解决方式三、总结 一、问题现象 当我们平时在ubuntu上运行一个程序时时长会遇到如下情况&#xff0c;含义为本机缺少执行程序需要的库 这时候我们可能会根据缺少的库使用apt install 库名的模糊名字 进行安装&#xff0c;然后再去运行&#xff0c;此时可…

永磁同步电机控制算法--最大转矩电流比控制(虚拟信号注入法)

目前&#xff0c;国内外相关学者对 MTPA 控制方法进行了一系列的理论研究与仿真分析。通过研究取得的成果综合来看&#xff0c;该控制方法主要有&#xff1a;直接公式计算法、曲线拟合法、查表法、搜索法、高频信号注入法以及参数辨识法等。 之前的文章中已经介绍了直接公式计…

时间处理的未来:Java 8全新日期与时间API完全解析

文章目录 一、改进背景二、本地日期时间三、时区日期时间四、格式化 一、改进背景 Java 8针对时间处理进行了全面的改进&#xff0c;重新设计了所有日期时间、日历及时区相关的 API。并把它们都统一放置在 java.time 包和子包下。 Java5的不足之处&#xff1a; 非线程安全&…

Pycharm远程连接GPU(内容:下载安装Pycharm、GPU租借、配置SSH、将代码同步到镜像、命令行操控远程镜像、配置远程GPU解释器)

目录 windows下载安装pycharmGPU租借网站AutoDlfeaturize好易智算 GPU租借GPU选择选择镜像充值 然后创建镜像创建成功 复制SSH登录信息 远程进入镜像 在Pycharm中进行ssh连接新建SFTP配置SSH复制ssh根据复制的信息填写ssh配置测试连接 将代码同步到远程镜像上设置mappings将本地…

数字化精益生产系统--QMS质量管理系统

QMS质量管理系统&#xff08;Quality Management System&#xff09;是现代企业管理的关键组成部分&#xff0c;旨在确保产品和服务的质量达到或超过客户需求和期望。 以下是对QMS质量管理系统的功能设计&#xff1a;

MAX98357、MAX98357A、MAX98357B小巧、低成本、PCM D类IIS放大器,具有AB类性能中文说明规格书

前言&#xff1a; MAX98357A支持标准I2S数据&#xff0c;MAX98357B支持左对齐数字音频数据。两个版本均支持8通道TDM音频数据。 IIS数字功放MAX98357开发板/评估系统 MAX98357 WLP-9(1.347x1.437mm)封装的外观和丝印AKM MAX98357 TQFN-16-EP(3x3mm)封装的外观和丝印AKK 引脚说…

基于PHP技术的在线校园美食攻略程序设计与实现

基于PHP技术的在线校园美食攻略程序设计与实现 摘 要 网络技术正在以空前持续的速度在改变着我们的生活。利用互联网技术&#xff0c;人们对网上食物共享越来越关注。基于此&#xff0c;本文利用 PHP技术&#xff0c;对网上大学饮食指南应用软件进行了研究。 整个系统的设计&a…

目标检测算法简述

招聘信息共享社群https://bbs.csdn.net/forums/f6512aad40c7444c8252754ce2dbb427 目标检测算法是一种计算机视觉技术&#xff0c;用于识别图像或视频中的特定对象&#xff0c;并确定这些对象在场景中的精确位置。这些算法通常结合了分类和定位的功能&#xff0c;能够输出每个…

从0构建一款appium-inspector工具

上一篇博客从源码层面解释了appium-inspector工具实现原理&#xff0c;这篇博客将介绍如何从0构建一款简单的类似appium-inspector的工具。如果要实现一款类似appium-inspector的demo工具&#xff0c;大致需要完成如下六个模块内容 启动 Appium 服务器连接到移动设备或模拟器启…

leetcode每日一题-3101 交替子数组计数

暴力遍历&#xff1a;看起来像是回溯,实际上就是递归 class Solution { private:long long _res 0; public:long long countAlternatingSubarrays(vector<int>& nums) {backtrack(nums, 0);return _res;}void backtrack(vector<int>& nums, long long st…