当前位置: 首页 > news >正文

Spring Cloud工程完善

目录

完善订单服务

启动类

配置文件

实体类

Controller

Service

Mapper

测试运行

完成商品服务

启动类

配置文件

实体类

Controller

Service

Mapper

测试运行

远程调用

需求

实现

1.定义RestTemplate

2.修改order-service中的OrderService

测试运行

RestTemplate

什么是REST?

什么是RESTful?

RESTful API 缺点:


完善订单服务

启动类
package order;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}
}
配置文件
server:port: 8080
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_order?characterEncoding=utf8&useSSL=falseusername: rootpassword: #密码driver-class-name: com.mysql.cj.jdbc.Driver
# 设置 Mybatis 的 xml 保存路径
mybatis:configuration: # 配置打印 MyBatis 执行的 SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true  #自动驼峰转换
实体类
package order.model;import lombok.Data;import java.util.Date;@Data
public class OrderInfo {private Integer id;private Integer userId;private Integer productId;private Integer num;private Integer price;private Integer deleteFlag;private Date createTime;private Date updateTime;
}
Controller
package order.controller;import order.model.OrderInfo;
import order.service.OrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/order")
@RestController
public class OrderController {@Autowiredprivate OrderService orderService;@RequestMapping("/{orderId}")public OrderInfo getOrderById(@PathVariable("orderId") Integer orderId){return orderService.selectOrderById(orderId);}
}
Service
package order.service;import order.mapper.OrderMapper;
import order.model.OrderInfo;
import order.model.ProductInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;public OrderInfo selectOrderById(Integer orderId) {OrderInfo orderInfo = orderMapper.selectOrderById(orderId);return orderInfo;}
}
Mapper
package order.mapper;import order.model.OrderInfo;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;@Mapper
public interface OrderMapper {@Select("select * from order_detail where id=#{orderId}")OrderInfo selectOrderById(Integer orderId);
}
测试运行

完成商品服务

启动类
package product;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class ProductServiceApplication {public static void main(String[] args) {SpringApplication.run(ProductServiceApplication.class, args);}
}
配置文件
server:port: 9090
spring:datasource:url: jdbc:mysql://127.0.0.1:3306/cloud_product?characterEncoding=utf8&useSSL=falseusername: rootpassword: #密码driver-class-name: com.mysql.cj.jdbc.Driver
# 设置 Mybatis 的 xml 保存路径
mybatis:configuration: # 配置打印 MyBatis 执行的 SQLlog-impl: org.apache.ibatis.logging.stdout.StdOutImplmap-underscore-to-camel-case: true  #自动驼峰转换
实体类
package product.model;import lombok.Data;import java.util.Date;@Data
public class ProductInfo {private Integer id;private String productName;private Integer productPrice;private Integer state;private Date createTime;private Date updateTime;
}
Controller
package product.controller;import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import product.model.ProductInfo;
import product.service.ProductService;@Slf4j
@RequestMapping("/product")
@RestController
public class ProductController {@Autowiredprivate ProductService productService;@RequestMapping("/{productId}")public ProductInfo getProductById(@PathVariable("productId") Integer productId){log.info("接收到参数"+productId);return productService.selectProductById(productId);}
}
Service
package product.service;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import product.mapper.ProductMapper;
import product.model.ProductInfo;@Service
public class ProductService {@Autowiredprivate ProductMapper productMapper;public ProductInfo selectProductById(Integer id){return productMapper.selectProductById(id);}
}
Mapper
package product.mapper;import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import product.model.ProductInfo;@Mapper
public interface ProductMapper {@Select("select * from product_detail where id = #{id}")ProductInfo selectProductById(Integer id);
}
测试运行

远程调用

需求

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

实现

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

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

1.定义RestTemplate
package order.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;@Configuration
public class BeanConfig {@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}
2.修改order-service中的OrderService
package order.service;import order.mapper.OrderMapper;
import order.model.OrderInfo;
import order.model.ProductInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;@Service
public class OrderService {@Autowiredprivate OrderMapper orderMapper;@Autowiredprivate RestTemplate restTemplate;public OrderInfo selectOrderById(Integer orderId){OrderInfo orderInfo = orderMapper.selectOrderById(orderId);String url = "http://127.0.0.1:9090/product/"+orderInfo.getProductId();ProductInfo productInfo = restTemplate.getForObject(url, ProductInfo.class);orderInfo.setProductInfo(productInfo);return orderInfo;}
}
测试运行

RestTemplate

RestTemplate 是从 Spring3.0 开始⽀持的⼀个 HTTP 请求⼯具, 它是⼀个同步的 REST API 客⼾端, 提供了常⻅的REST请求⽅案的模版。

什么是REST?

REST(Representational State Transfer), 表现层资源状态转移.
REST是由HTTP的主要设计者Roy Fielding博⼠在2000年他的博⼠论⽂中提出来的⼀种软件架构⻛格.

这⾥⾯主要有三个概念:

1. 资源: ⽹络上的所有事物都可以抽象为资源, 每个资源都有⼀个唯⼀的资源标识符(URI)
2. 表现层: 资源的表现形式, ⽐如⽂本作为资源, 可以⽤txt格式表现, 也可以通过HTML, XML, JSON等格式来表现, 甚⾄以⼆进制的格式表现.
3. 状态转移: 访问URI, 也就是客⼾端和服务器的交互过程. 客⼾端⽤到的⼿段,只能是HTTP协议. 这个过程中, 可能会涉及到数据状态的变化. ⽐如对数据的增删改查, 都是状态的转移.

REST 是⼀种设计⻛格, 指资源在⽹络中以某种表现形式进⾏状态转移.
简单来说: REST描述的是在⽹络中Client和Server的⼀种交互形式, REST本⾝不实⽤,实⽤的是如何设计 RESTful API(REST⻛格的⽹络接⼝).

什么是RESTful?

REST 是⼀种设计⻛格, 并没有⼀个明确的标准. 满⾜这种设计⻛格的程序或接⼝我们称之为RESTful(从单词字⾯来看就是⼀个形容词). 所以RESTful API 就是满⾜REST架构⻛格的接⼝.
RESTful ⻛格⼤致有以下⼏个主要特征:

1. 资源: 资源可以是⼀个图⽚, ⾳频, 视频或者JSON格式等⽹络上的⼀个实体, 除了⼀些⼆进制的资源外普通的⽂本资源更多以JSON为载体、⾯向⽤⼾的⼀组数据(通常从数据库中查询⽽得到) .

2. 统⼀接⼝: 对资源的操作. ⽐如获取, 创建, 修改和删除. 这些操作正好对应HTTP协议提供的GET、POST、PUT和DELETE⽅法. 换⾔⽽知,如果使⽤RESTful⻛格的接⼝, 从接⼝上你可能只能定位其资源,但是⽆法知晓它具体进⾏了什么操作,需要具体了解其发⽣了什么操作动作要从其HTTP请求⽅法类型上进⾏判断。

RestTemplate 是Spring提供, 封装HTTP调⽤, 并强制使⽤RESTful⻛格. 它会处理HTTP连接和关闭,只需要使⽤者提供资源的地址和参数即可.

RESTful实践

RESTful⻛格的API 固然很好很规范, 但⼤多数互联⽹公司并没有按照其规则来设计, 因为REST是⼀种风格,⽽不是⼀种约束或规则, 过于理想的RESTful API 会付出太多的成本.

RESTful API 缺点:

1. 操作⽅式繁琐, RESTful API通常根据GET, POST, PUT, DELETE 来区分对资源的操作动作. 但是HTTP Method 并不可直接⻅到, 需要通过抓包等⼯具才能观察. 如果把动作放在URL上反⽽更加直观, 更利于团队的理解和交流.
2. ⼀些浏览器对GET, POST之外的请求⽀持不太友好, 需要额外处理.
3. 过分强调资源. ⽽实际业务需求可能⽐较复杂, 并不能单纯使⽤增删改查就能满⾜需求, 强⾏使⽤RESTful API会增加开发难度和成本。 

所以, 在实际开发中, 如果业务需求和RESTful API不太匹配或者很⿇烦时, 也可以不⽤RESTful API. 如果使⽤场景和REST⻛格⽐较匹配, 就可以采⽤RESTful API.
总之: ⽆论哪种⻛格的API, 都是为了⽅便团队开发, 协商以及管理, 不能墨守成规. 尽信书不如⽆书, 尽信规范不如⽆规范。 

欢迎大家访问我的主页---》链接

相关文章:

Spring Cloud工程完善

目录 完善订单服务 启动类 配置文件 实体类 Controller Service Mapper 测试运行 完成商品服务 启动类 配置文件 实体类 Controller Service Mapper 测试运行 远程调用 需求 实现 1.定义RestTemplate 2.修改order-service中的OrderService 测试运行 Rest…...

SSM仓库物品管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.用户登录代码:2.保存物品信息代码:3.删除仓库信息代码: 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SSM框架开发的仓库…...

UI自动化测试中如何处理验证码?

在UI自动化测试中处理验证码是常见的技术挑战,以下是分步解决方案及实际应用建议: 一、验证码处理策略对比 方法实现方式优点缺点适用场景禁用验证码测试环境配置关闭验证码生成简单快捷,零成本无法测试验证码功能本身非验证码相关功能测试万…...

华为交换机堆叠配置

一、CSS堆叠集群配置(框式交换机) 1、通过集群卡连接方式组建集群 [SwitchA] set css mode css-card \\配置集群卡连接方式 [SwitchA] set css id 1 \\配置成员交换机的集群ID(缺省值为1) [SwitchA] set css priority 100 \\配…...

Vue 和 dhtmlx-gantt 实现图表构建动态多级甘特图效果 ,横坐标为动态刻度不是日期

注意事项:1、横坐标根据日期转换成时间刻度在( gantt.config.scales);2、获取时间刻度的最大值(findMaxRepairTime);3、甘特图多级列表需注意二级三级每个父子id需要唯一(convertData) 安装依赖 npm install dhtmlx-gantt --save 在当前页引入和配置 dhtmlx-gantt im…...

collabora online+nextcloud+mariadb在线文档协助

1、环境 龙蜥os 8.9 docker 2、安装docker dnf -y install dnf-plugins-core dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sed -i shttps://download.docker.comhttps://mirrors.tuna.tsinghua.edu.cn/docker-ce /etc/yum.repos.…...

“可通过HTTP获取远端WWW服务信息”漏洞修复

环境说明:①操作系统:windows server;②nginx:1.27.1。 1.漏洞说明 “可通过HTTP获取远端WWW服务信息”。 修复前,在“响应标头”能看到Server信息,如下图所示: 修复后,“响应标头…...

【AI时代】-开发环境准备 之 Conda 创建 Python 环境 (含pip常用命令、jupyter 安装及汉化、自定义文档位置等配置)

一、 安装 Anaconda 1.1 下载并安装 https://www.anaconda.com/download/success 1.2 验证是否成功 CMD输入命令: conda --version注意:找不到命令需要配置环境变量: Path 中 添加 Anaconda 的安装路径: 如果没有修改安装位…...

[LeetCode] day19 454. 四数相加 II

题目链接 题目描述 给你四个整数数组 nums1、nums2、nums3 和 nums4 &#xff0c;数组长度都是 n &#xff0c;请你计算有多少个元组 (i, j, k, l) 能满足&#xff1a; 0 < i, j, k, l < n nums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1&#xff1a; 输入&…...

LeetCodehot 力扣热题100 验证二叉搜索树

class Solution {vector<int> nums; // 用来存储二叉树节点值的数组 public:bool isValidBST(TreeNode* root) {inorder(root); // 中序遍历二叉树&#xff0c;填充 nums 数组// 遍历 nums 数组&#xff0c;检查是否为严格递增序列for(int i0; i<nums.size()-1; i){…...

四次挥手详解

文章目录 一、四次挥手各状态FIN_WAIT_1CLOSE_WAITFIN_WAIT_2LAST_ACKTIME_WAITCLOSE 二、双方同时调用close()&#xff0c;FIN_WAIT_1状态后进入CLOSING状态CLOSING状态 三、TIME_WAIT状态详解(1) TIME_WAIT状态下的2MSL是什么MSL &#xff08;报文最大生存时间&#xff09;为…...

Deepseek-v3 / Dify api接入飞书机器人go程序

准备工作 开通了接收消息权限的飞书机器人&#xff0c;例如我希望用户跟飞书机器人私聊&#xff0c;就需要开通这个权限&#xff1a;读取用户发给机器人的单聊消息 im:message.p2p_msg:readonly准备好飞书机器人的API key 和Secretdeepseek-v3的api keysecret&#xff1a;http…...

2025.2.9 每日学习记录2:技术报告写了一半+一点点读后感

0.近期主任务线 1.完成小论文准备 目标是3月份完成实验点1的全部实验和论文。 2.准备教资笔试 打算留个十多天左右&#xff0c;一次性备考笔试的三个科目 1.实习申请技术准备&#xff1a;微调、Agent、RAG 1.今日完成任务 1.电子斗蛐蛐&#xff08;文本书写领域&am…...

qml ToolBar详解

1、概述 在 QML 中&#xff0c;ToolBar 是一种常用的 UI 组件&#xff0c;通常位于窗口的顶部或底部&#xff0c;用于提供一系列的操作按钮、菜单或其他交互元素。它可以帮助用户快速访问应用程序的常用功能&#xff0c;提高用户操作的便捷性。ToolBar 可以包含多个 ToolButto…...

机器学习在癌症分子亚型分类中的应用

学习笔记&#xff1a;机器学习在癌症分子亚型分类中的应用——Cancer Cell 研究解析 1. 文章基本信息 标题&#xff1a;Classification of non-TCGA cancer samples to TCGA molecular subtypes using machine learning发表期刊&#xff1a;Cancer Cell发表时间&#xff1a;20…...

Ansible自动化部署K8s集群一 Ansible的基础使用实战

一、Ansible介绍 1.安装ansible: yum install ansible -y 2.ansible的架构图&#xff1a; 3.ansible四部分&#xff1a; inventory:ansible管理的主机信息&#xff0c;包括ip地址、ssh端口、账号和密码等 modules:任务均由模块完成 plugins:增加ansible的核心功能 pla…...

ZooKeeper Watcher 机制详解:从注册到回调的全过程

引言 在分布式系统中&#xff0c;数据的实时性和一致性是至关重要的。ZooKeeper 通过其 Watcher 机制提供了一种高效的方式来监听数据变化或事件&#xff0c;从而使客户端能够在数据发生变化时立即收到通知。本文将深入探讨 ZooKeeper 的 Watcher 机制&#xff0c;具体包括客户…...

flutter_tools/gradle Unsupported class file major version 65 问题解决

1.问题定位 使用 命令 flutter doctor --verbose 可以查看当前项目中&#xff0c;使用的java的版本。 [✓] Android Studio (version 2024.2)• Android Studio at /Applications/Android Studio.app/Contents• Flutter plugin can be installed from:&#x1f528; https…...

C++设计模式 - 模板模式

一&#xff1a;概述 模板方法&#xff08;Template Method&#xff09;是一种行为型设计模式。它定义了一个算法的基本框架&#xff0c;并且可能是《设计模式&#xff1a;可复用面向对象软件的基础》一书中最常用的设计模式之一。 模板方法的核心思想很容易理解。我们需要定义一…...

mysql查缺补漏

好文推荐&#xff1a; 【数据库】快速理解脏读、不可重复读、幻读-CSDN博客 再探幻读&#xff01;什么是幻读?为什么会产生幻读&#xff0c;MySQL中是怎么解决幻读的&#xff1f;-CSDN博客 引擎 mysql默认引擎&#xff1a;innodb 1.支持行锁 2.支持事务 3.支持外键 索引…...

Cursor Pro免费激活指南:3步解锁AI编程工具的完整功能

Cursor Pro免费激活指南&#xff1a;3步解锁AI编程工具的完整功能 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached your tri…...

长期用嘴呼吸,颈肩肌肉代偿性紧张

很多人因为鼻塞、习惯等原因长期用嘴呼吸&#xff0c;却不知道这会导致颈肩肌肉代偿性紧张&#xff0c;影响颈腰椎健康。用嘴呼吸时&#xff0c;头部会不自觉地向前伸、仰起&#xff0c;颈椎长期处于过度前屈或后伸状态&#xff0c;颈部肌肉持续牵拉&#xff0c;容易导致肌肉劳…...

手把手教你学Simulink——基于Simulink的无差拍控制三相整流器高精度电流跟踪

目录 手把手教你学Simulink ——基于Simulink的无差拍控制三相整流器高精度电流跟踪 一、问题背景 二、系统建模与控制原理 1. 三相整流器拓扑 2. dq 轴数学模型(同步旋转坐标系) 3. 无差拍控制律推导 三、整体控制架构 四、Simulink 建模步骤 第一步:搭建三相整流…...

忍者像素绘卷入门必看:Z-Image-Turbo模型结构精简与推理速度提升原理

忍者像素绘卷入门必看&#xff1a;Z-Image-Turbo模型结构精简与推理速度提升原理 1. 项目概述 忍者像素绘卷是一款基于Z-Image-Turbo深度优化的图像生成工作站&#xff0c;专为16-Bit复古游戏美学风格设计。它采用明亮的"云端"视觉设计&#xff0c;为用户提供清爽且…...

AI驱动的科研绘图革命:DeTikZify如何终结图表代码的手动时代

AI驱动的科研绘图革命&#xff1a;DeTikZify如何终结图表代码的手动时代 【免费下载链接】DeTikZify Synthesizing Graphics Programs for Scientific Figures and Sketches with TikZ 项目地址: https://gitcode.com/gh_mirrors/de/DeTikZify 当deadline遇上绘图难题&a…...

双轴光伏智能跟踪系统,怎么让光伏发电效率提上来的?

做光伏相关开发和落地的朋友&#xff0c;应该都绕不开一个核心痛点&#xff1a;传统固定式光伏的光能利用率&#xff0c;一直有明显的天花板。今天就用通俗的方式&#xff0c;拆解WZ HELIO这套双轴智能跟踪系统&#xff0c;看看它是怎么解决这个行业老问题的。先搞懂核心逻辑&a…...

Linux性能优化之上下文切换

写在前面 上下文切换因为会导致消耗大量的CPU资源&#xff0c;导致CPU升高&#xff0c;所以上下文切换也是最常见的性能杀手之一。本文就一起来看下这部分内容吧。 1&#xff1a;基础内容介绍 1.1&#xff1a;什么是上下文切换&#xff1f; CPU在执行的时候需要两部分的内容…...

多平台资源下载解决方案:res-downloader实现数字内容自由获取

多平台资源下载解决方案&#xff1a;res-downloader实现数字内容自由获取 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 在数…...

解锁智能OCR新范式:Pix2Text多模态内容识别技术全解析

解锁智能OCR新范式&#xff1a;Pix2Text多模态内容识别技术全解析 【免费下载链接】Pix2Text Pix In, Latex & Text Out. Recognize Chinese, English Texts, and Math Formulas from Images. 项目地址: https://gitcode.com/gh_mirrors/pi/Pix2Text Pix2Text是一款…...

光伏产业发展带动紧固件需求增长 市场趋势与应用分析 上海紧固件专业展

2026第十六届上海紧固件专业展&#xff08;Fastener Expo Shanghai 2026&#xff09;将于6月24日至26日在上海国家会展中心举行。随着新能源产业持续升温&#xff0c;光伏行业的快速发展正在显著带动紧固件市场需求增长&#xff0c;成为行业关注的重要方向。在全球能源转型的大…...