微服务案例搭建

目录

一、案例搭建

1.数据库表

2.服务模块

二、具体代码实现如下:

       (1) 首先是大体框架为:

        (2)父模块中的pom文件配置

        (3)shop_common模块,这个模块里面只需要配置pom.xml,与实体类

        (4)在shop_product、shop_order、shop_user子模块中导入公共子模块common的坐标

        (4.1)shop_product的pom.xml

         (4.2)shop_order的pom.xml

         (4.3)shop_user的pom.xml

三、服务调⽤

1.RestTemplate介绍

2.RestTemplate⽅法介绍

3.通过RestTemplate调⽤微服务

(1)shop_order的控制层

(2)shop_order的 service层:

(3)shop_order的 OrderMappper数据访问层代码:

(4)shop_order的 测试类主入口代码:

(5)shop_order的 测试类主入口代码:


一、案例搭建

        使⽤微服务架构的分布式系统,微服务之间通过⽹络通信。我们通过服务提供者与服务消费者来描述微服 务间的调⽤关系。

服务提供者:服务的被调⽤⽅,提供调⽤接⼝的⼀⽅

服务消费者:服务的调⽤⽅,依赖于其他服务的⼀⽅

        我们以电商系统中常⻅的⽤户下单为例,⽤户向订单微服务发起⼀个购买的请求。在进⾏保存订单之前 需要调⽤商品微服务查询当前商品库存,单价等信息。在这种场景下,订单微服务就是⼀个服务消费 者,商品微服务就是⼀个服务提供者。

1.数据库表

shop_order订单表

shop_product商品表

shop_user⽤户表

2.服务模块

创建公共⽗模块springcloud_alibaba

创建公共模块 shop_common ,⽤于存放公共的实体类和⼯具类

创建订单微服务模块 shop_order 端⼝809X

创建商品微服务模块 shop_product 端⼝808X

创建⽤户微服务模块 shop_user 端⼝807X


二、具体代码实现如下

       (1) 首先是大体框架为:

        其中common用于存在实体类对象,order用于创建订单,product用于操作产品信息,user用于操作用户信息。

        (2)父模块中的pom文件配置
   <!-- 项目基本信息 --><groupId>com.zad</groupId><artifactId>springcloud_alibaba</artifactId><version>1.0-SNAPSHOT</version>

        这里定义了项目的基本信息,包括groupId(组织标识符)、artifactId(项目标识符)、和version(版本号)。这些信息唯一标识了该Maven项目。

    <!-- pom:父文件 --><packaging>pom</packaging>

        这个项目打包类型为pom,意味着它是一个聚合项目或父项目,用来管理多个子模块。

    <!-- 父项目的子模块 --><modules><module>shop_order</module><module>shop_product</module><module>shop_user</module><module>shop_commen</module></modules>

         定义了该父项目的四个子模块。

    <!-- 依赖版本的锁定 --><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>Greenwich.RELEASE</spring-cloud.version><spring-cloud-alibaba.version>2.1.1.RELEASE</spring-cloud-alibaba.version></properties>

        这里定义了一些属性,如Java版本、编码格式,以及Spring Cloud和Spring Cloud Alibaba的版本。这些属性可以在整个POM文件中复用,方便管理和升级。 

    <!--dependencyManagement所包含的坐标,子项目不会直接继承,需要声明才可继承-->    <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>

         在dependencyManagement部分定义了依赖管理。这里指定了Spring Cloud和Spring Cloud Alibaba的依赖项及其版本。这些依赖项不会自动应用到子项目中,子项目需要显式声明才能继承

        (3)shop_common模块,这个模块里面只需要配置pom.xml,与实体类

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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloud_alibaba</artifactId><groupId>com.zad</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>shop_commen</artifactId><!-- 依赖 --><dependencies><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.3</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.12</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.56</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.16</version></dependency><dependency><groupId>com.zad</groupId><artifactId>springcloud_alibaba</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>

        在domain包下创建了三个实体类用于创建存储订单、产品、用户,这里只展示订单的代码,其余代码均相同逻辑:    

@TableName("shop_order")
@Data
public class Order {@TableId(value = "oid",type = IdType.AUTO)private Long oid;//订单id//用户@TableField("uid")private Integer uid;//用户id@TableField("username")private String username;//用户名//商品@TableField("pid")private Integer pid;//商品id@TableField("pname")private String pname;//商品名称@TableField("pprice")private Double pprice;//商品单价//数量@TableField("number")private Integer number;//购买数量
}

          通过@TableName映射shop_order数据库,其余的都是成员变量的创建和映射。

        (4)在shop_product、shop_order、shop_user子模块中导入公共子模块common的坐标
        <!-- shop-common --><dependency><groupId>com.zad</groupId><artifactId>shop_commen</artifactId><version>1.0-SNAPSHOT</version></dependency>
        (4.1)shop_product的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloud_alibaba</artifactId><groupId>com.zad</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>shop_product</artifactId><dependencies><!-- springboot-web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- shop-common --><dependency><groupId>com.zad</groupId><artifactId>shop_commen</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.zad</groupId><artifactId>springcloud_alibaba</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>
         (4.2)shop_order的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloud_alibaba</artifactId><groupId>com.zad</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>shop_order</artifactId><dependencies><!-- springboot-web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- shop-common --><dependency><groupId>com.zad</groupId><artifactId>shop_commen</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.zad</groupId><artifactId>springcloud_alibaba</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
</project>
         (4.3)shop_user的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 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>springcloud_alibaba</artifactId><groupId>com.zad</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>shop_user</artifactId><dependencies><!-- springboot-web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- shop-common --><dependency><groupId>com.zad</groupId><artifactId>shop_commen</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>com.zad</groupId><artifactId>springcloud_alibaba</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies></project>

三、服务调⽤

        前⽂已经编写了三个基础的微服务,在⽤户下单时需要调⽤商品微服务获取商品数据。那应该怎么做 呢?总⼈皆知商品微服务提供了供⼈调⽤的HTTP接⼝。所以可以再下定单的时候使⽤http请求的相关⼯ 具类完成,如常⻅的HttpClient ,OkHttp,当然也可以使⽤Spring提供的RestTemplate 

1.RestTemplate介绍

        Spring框架提供的RestTemplate类可⽤于在应⽤中调⽤rest服务,它简化了与http服务的通信⽅式,统 ⼀了RESTful的标准,封装了http链接, 我们只需要传⼊url及返回值类型即可。相较于之前常⽤的 HttpClient ,RestTemplate是⼀种更优雅的调⽤RESTful服务的⽅式。

        在Spring应⽤程序中访问第三⽅REST服务与使⽤Spring RestTemplate类有关。 RestTemplate类的设 计 原则与许多其他Spring 模板类(例如JdbcTemplate、JmsTemplate)相同,为执⾏复杂任务提供了⼀ 种具有默认⾏为的简化⽅法。

        RestTemplate默认依赖JDK提供http连接的能⼒(HttpURLConnection),如果有需要的话也可以通过 setRequestFactory⽅法替换为例如 Apache HttpComponents、 Netty或OkHttp等其它HTTP library。 考虑到RestTemplate类是为调⽤REST服务⽽设计的,因此它的主要⽅法与REST的基础紧密相连就不⾜ 为奇了,后者是HTTP协议的⽅法:HEAD、GET、 POST、 PUT、 DELETE和OPTIONS。例如, RestTemplate类具有headForHeaders()、getForObject()、 postForObject()、 put()和delete()等⽅法。

2.RestTemplate⽅法介绍

分为三组:

  • getForObject --- optionsForAllow 分为一组,这类方法是常规的 Rest API(GET、POST、DELETE 等)方法调用;
  • exchange:接收一个 RequestEntity 参数,可以自己设置 HTTP method,URL,headers 和 body,返回 ResponseEntity;
  • execute:通过 callback 接口,可以对请求和返回做更加全面的自定义控制。
3.通过RestTemplate调⽤微服务
(1)shop_order的控制层
@RestController
public class OrderController {@Autowiredprivate RestTemplate restTemplate;@Autowiredprivate IOrderService orderService;//下单@RequestMapping("/order/prod/{pid}")public Order order(@PathVariable("pid") Integer pid) {//调用商品微服务,查询商品信息Product product =restTemplate.getForObject("http://localhost:8081/product/" + pid, Product.class);//下单(创建订单)Order order = new Order();order.setUid(1);order.setUsername("测试用户");order.setPid(pid);order.setPname(product.getPname());order.setPprice(product.getPprice());order.setNumber(1);orderService.createOrder(order);return order;}
}

          其中RestTemplate对象是用于在服务之间发起 HTTP 请求的模板类。它封装了 HTTP 请求和响应的处理逻辑,提供了一组便捷的方法来与外部 RESTful 服务进行交互。

        通过.getForObject方法,调用商品微服务,通过 HTTP GET 请求调用商品服务的接口获取商品信息。

        然后再创建order对象通过mybatis-puls提供的接口来调用创建订单的方法:

(2)shop_order的 service层:

接口:

public interface IOrderService extends IService<Order> {//创建订单void createOrder(Order order);
}

         IService 是 MyBatis-Plus 提供的一个通用服务接口,提供了许多 CRUD(创建、读取、更新、删除)操作的默认实现方法。继承了 IService<Order> 后,IOrderService 接口就拥有了这些通用的 CRUD 功能,比如 save、remove、update、getById 等。

实现类:

@Service
public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements IOrderService {@Autowired(required = false)private OrderMapper orderMapper;@Overridepublic void createOrder(Order order) {orderMapper.insert(order);}
}

        这个继承了ServiceImpl抽象类,是 MyBatis-Plus 提供的一个抽象类,实现了IService接口的大部分常用方法,又实现了IOrderService的接口,通过继承 ServiceImpl,OrderServiceImpl 类自动获得了所有 CRUD 方法的实现,无需手动编写这些基本操作的代码。

(3)shop_order的 OrderMappper数据访问层代码:
@Mapper
public interface OrderMapper extends BaseMapper<Order> {
}

          BaseMapper 是 MyBatis-Plus 提供的一个通用 Mapper 接口,已经实现了基本的 CRUD(创建、读取、更新、删除)操作。

(4)shop_order的 测试类主入口代码:
@SpringBootApplication
public class OrderApplication {public static void main(String[] args) {SpringApplication.run(OrderApplication.class);}@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}}

         因为控制器需要用到restTemplate,所以在测试类中定义了一个RestTemplate的bean。

(5)shop_order的 测试类主入口代码:
server:port: 8091
spring:application:name: service_orderdatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql:///shop?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=trueusername: rootpassword: password

         其中server:port代表配置Spring Boot 应用的服务器端口号。

         spring: application: name: service-order配置应用程序的名称为 service-order。这个名称在微服务架构中很重要,通常用于服务发现、注册中心(如 Nacos 或 Eureka)等场景。

        后面的是配置数据库和jdbc的连接。


        这里我就省略shop_product和shop_user的代码了,同时执行三个模块,通过shop_order中的restTemplate去调用地址实现获取商品信息和用户信息,最后进行下单操作。

 执行结果

在数据库中也可以查询到增加的订单信息。

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

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

相关文章

MySQL如何判断一个字段里面是否包含汉字

SQL查询中&#xff0c;length() 和 char_length() 都是用来获取字符串长度的函数 在单字节字符集下&#xff08;如ASCII&#xff09;&#xff1a;每个字符通常占用1个字节&#xff0c;因此length()和char_length()在这类字符集中给出的结果是一样 在多字节字符集下&#xff0…

matplotlib绘制子图以及局部放大效果

需求&#xff1a;绘制1*2的子图&#xff0c;子图1显示两个三角函数&#xff0c;子图2显示三个对数函数&#xff0c;子图2中对指定的区域进行放大。 绘图细节&#xff1a; 每个子图中每个函数的数据存放到一个列表中&#xff0c;然后将每个子图的数据统一存到一个列表中&#…

Go 使用Redis安装、实例和基本操作

Go使用Redis&#xff1a;详解go-redis/v9库 引言 Redis作为一个高性能的键值对数据库&#xff0c;广泛应用于缓存、消息队列、实时数据分析等场景。在Go语言中&#xff0c;go-redis/v9库提供了丰富的接口和高效的数据交互能力&#xff0c;使得在Go项目中集成Redis变得简单而高…

接口限流经典算法

文章目录 限流基于计数器的限流基于滑动窗口的限流桶漏斗算法令牌桶算法 限流 为了保证系统的安全性和稳定性&#xff0c;防止恶意流量和突发大量流量短时间内大量请求接口&#xff0c;造成服务器崩溃&#xff0c;接口的限流是有必要的。 以下是四种经典的限流算法。 基于计数…

Python测试框架Pytest的使用

pytest基础功能 pytset功能及使用示例1.assert断言2.参数化3.运行参数4.生成测试报告5.获取帮助6.控制用例的执行7.多进程运行用例8.通过标记表达式执行用例9.重新运行失败的用例10.setup和teardown函数 pytset功能及使用示例 1.assert断言 借助python的运算符号和关键字实现不…

UE5打包iOS运行查看Crash日志

1、查看Crash 1、通过xCode打开设备 2、选择APP打开最近的日志 3、选择崩溃时间点对应的日志 4、选择对应的工程打开 5、就能看到对应的Crash日志 2、为了防止Crash写代码需要注意 1、UObject在RemoveFromRoot之前先判断是否Root if (SelectedImage && Selecte…

Frog4Shell — FritzFrog 僵尸网络将一日攻击纳入其武器库

FritzFrog 的背景 Akamai 通过我们的全球传感器网络持续监控威胁,包括我们之前发现的威胁。其中包括FritzFrog 僵尸网络(最初于 2020 年发现),这是一个基于 Golang 的复杂点对点僵尸网络,经过编译可同时支持基于 AMD 和 ARM 的机器。该恶意软件得到积极维护,多年来通过增…

百日筑基第六十天-学习一下Tomcat

百日筑基第六十天-学习一下Tomcat 一、Tomcat 顶层架构 Tomcat 中最顶层的容器是 Server&#xff0c;代表着整个服务器&#xff0c;从上图中可以看出&#xff0c;一个 Server可以包含至少一个 Service&#xff0c;用于具体提供服务。Service 主要包含两个部分&#xff1a;Conn…

AI周报(8.18-8.24)

AI应用-XGO-Rider: 全球首款轮腿式桌面 AI 机器人 中国的 Luwu 智能打造的XGO-Rider 是全球首款轮腿式桌面 AI 机器人。这个小巧紧凑的机器人将轮式机器人的灵活性与腿式机器人的障碍处理能力相结合&#xff0c;可以全方位移动&#xff0c;轻松适应各种地形。 XGO-Rider 主要设…

服务商模式实现JSAPI小程序微信支付(javaphp)

官方文档 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/open/pay/chapter2_1.shtml 使用wechatpay-php实现JSAPI支付&#xff08;服务商和普通商户&#xff09;文章浏览阅读1.3k次&#xff0c;点赞3次&#xff0c;收藏7次。之前我使用的sdk是“wechatpay-guzzle-middle…

python实用教程(二):安装配置Pycharm及使用(Win10)

上一篇&#xff1a;python实用教程&#xff08;一&#xff09;&#xff1a;安装配置anaconda&#xff08;Win10&#xff09;-CSDN博客 1、简介及下载 PyCharm是一款功能强大的 Python 编辑器&#xff0c;具有跨平台性。是Jetbrains家族中的一个明星产品。 下载地址&#xff…

redis实战——go-redis的使用与redis基础数据类型的使用场景(二)

一.go-redis操作hash 常用命令&#xff1a; redisClient.HSet("map", "name", "jack") // 批量设置 redisClient.HMSet("map", map[string]interface{}{"a": "b", "c": "d", "e"…

计算机毕业设计选题推荐-游戏比赛网上售票系统-Java/Python项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

棚子影院CMS程序PHP源码

01, 棚子影视是我现在最常用的一个看视频的网站&#xff0c;支持观看电影、国漫&#xff01;动漫&#xff0c;电视剧、综艺、记录片、香港剧等等。同时棚子影视支持手机&#xff0c;PC端在线观看&#xff0c;不用下载任何播放器&#xff0c;直接电脑或者手机打开网址就可以在线…

vue3 RouterLink路由跳转后RouterView组件未加载,页面未显示,且控制台无任何报错

在使用 vue3 开发项目过程中&#xff0c;组件之间使用 router-link 跳转&#xff0c;但是当我开发的组件跳转到其他组件时&#xff0c;其他组件的页面未加载&#xff0c;再跳转回自己的组件时&#xff0c;自己的组件也加载不出来了&#xff0c;浏览器刷新后页面可以加载出来。但…

结合 curl 与住宅代理实现高效数据抓取

引言 什么是 curl&#xff1f;有哪些功能&#xff1f; 基本 curl 命令有哪些&#xff1f; 为什么要使用 curl 处理 HTTP 请求&#xff1f; 如何使用 curl 和住宅代理进行网络抓取&#xff1f; 总结 引言 在当今数据驱动的商业环境中&#xff0c;数据的获取和分析能力是企…

Redis | 非关系型数据库Redis的初步认识

本节内容相对理论&#xff0c;着重看基础通用命令这一节 Redis 非关 kv型{字典} 概念应用ubuntu安装配置 windows添加密码 可能问题【ubuntu】远程连接 基础通用命令 ⭐ 概念 特点&#xff1a; 1、开源的&#xff0c;使用C编写&#xff0c;基于内存且支持持久化 2、没有表 支持…

Linux服务器不能使用su切换到其他用户

1. 现象 使用非root用户登录系统后&#xff0c;想使用su - 切换到root时&#xff0c;输入正确的密码后出现&#xff1a; 一开始以为自己密码记错了&#xff0c;或者是系统被入侵后篡改了root用户密码&#xff0c;服务器上的数据非常重要。后面不通过SSH连接&#xff0c;直接去…

图文详解ThreadLocal:原理、结构与内存泄漏解析

目录 一.什么是ThreadLocal 二.ThreadLocal的内部结构 三.ThreadLocal带来的内存泄露问题 ▐ key强引用 ▐ key弱引用 总结 一.什么是ThreadLocal 在Java中&#xff0c;ThreadLocal 类提供了一种方式&#xff0c;使得每个线程可以独立地持有自己的变量副本&#xff0c;而…

AI副业:别只顾刷黑神话悟空!AI做神话账号,商单月入过万(附教程)

前言 国产3A大作《黑神话&#xff1a;悟空》一经发布&#xff0c;瞬间登顶steam榜首&#xff0c;打破单机游戏在线记录&#xff0c;全球几十万国外玩家听着中文配音&#xff0c;看着翻译过来的英文字幕&#xff0c;玩的不亦乐乎&#xff01; 甚至国外论坛上兴起了一股西游风&a…