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

springcloud-1环境搭建、service provider

搭建项目环境

  1. 创建新项目,选择archetype-webapp,创建一个父项目,该父项目会去管理多个微服务模块(module)

  1. 项目设置

  • Settings->Editor->File Encoding:Global/Project Encoding 改为UTF-8

  • Default encoding for properties files:默认属性文件编码 改为UTF-8

  • Settings->Build..->Compiler->Java Compiler: Module ,Target bytecode version改为8

  1. 整体删除src目录。这是一个聚合的父项目,所以删了干净一点。

  1. 配置父工程pom.xml,作为聚合其它模块

  • 表明是一个父工程,聚合管理其他模块

<packaging>war</packaging>    改成
<packaging>pom</packaging>
  • 从1.7修改成8

  <properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target><!--下面是新增的配置,指定版本--><junit.version>4.12</junit.version><!--说明:使用最新版本log4j,防止安全漏洞--><log4j.version>2.17.2</log4j.version><lombok.version>1.18.20</lombok.version><mysql.version>5.1.47</mysql.version><druid.version>1.1.17</druid.version><mybatis.spring.boot.version>2.2.0</mybatis.spring.boot.version></properties>
  • 删除依赖。因为是父工程,不进行具体依赖。由子工程进行。

<dependencies>及其子标签
  • 删除<build>及其字标签

  • 管理依赖及版本

 <!--使用dependencyManagement管理子项目的依赖和版本。本身仅用于锁定版本,并不引入依赖jar--><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>2.2.2.RELEASE</version><!--说明:1.<type>pom 和<scope>import 组合使用2.用来解决maven单继承的问题。同时继承SpringBoot项目,和SpringCloud项目--><type>pom</type><scope>import</scope></dependency><!--配置spring-cloud。注意版本与spring-boot之间的对应关系--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Hoxton.SR1</version><type>pom</type><scope>import</scope></dependency><!--配置spring-boot-cloud-alibaba--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>2.1.0.RELEASE</version><type>pom</type><scope>import</scope></dependency><!--配置mysql,版本引用上面指定的--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><!--配置druid--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>${druid.version}</version></dependency><!--配置springboot整合mybatis--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.spring.boot.version}</version></dependency><!--使用的高版本,修复了一些高危漏洞--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j</artifactId><version>${log4j.version}</version></dependency><!--测试使用--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>${junit.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version></dependency></dependencies></dependencyManagement>

dependencyManagement细节说明:

1、Maven使用dependencyManagement元素来提供了一种管理依赖版本号的方式。通常在项目<packaging>为POM中使用dependencyManagement元素。

2、使用pom.xml中的dependencyManagement元素能让所有在子项目中引用一个依赖,Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用这个dependencyManagement元素中指定的版本号。

3、好处:如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号当升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要分别在子项目的修改:另外如果某个子项目需要另外的一个版本,只需要声明version就可。

4、dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。

5、如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom

6、如果子项目中指定了版本号,那么会使用子项目中指定的jar版本


创建会员中心微服务模块-service provider

思路分析/图解

  1. 创建Module & 完成配置

  1. 创建member-service-provider-10000微服务模块【提供会员服务】

  • new Module...->maven->finish

  • 检查该子模块的pom.xml,看parent父项目内容是否正确

  • 检查父项目的pom.xml,看module内容是否正确

b. 子项目pom.xml引入相关依赖

    <dependencies><!--使用版本仲裁--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--说明:starter-actuator是springboot程序的监控系统,可实现系统的健康检测可以通过http://localhost:10000/actuator看到相关的连接和信息--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!--引入mybatis,整合到springboot--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><!--引入druid-spring-boot-starter,这个和druid不一样,因为父项目没有,不指定版本会报错--><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.17</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency></dependencies>

c.创建 子项目/resources/application.yml

server:port: 10000
spring:application:name: member-service-provider-10000 #配置应用的名称。可以自定义,这儿保持一致了datasource:type: com.alibaba.druid.pool.DruidDataSource #指定使用的数据源url: jdbc:mysql://localhost:3306/furn_ssm?useSSL=true&useUnicode=true&characterEncoding=utf-8username: rootpassword: rootmybatis:mapper-locations: classpath:mapper/*.xml #指定mapper.xml文件位置type-aliases-package: com.stein.springcloud.entity #指明实体类所在包别名,可以通过类名直接引用

d. 创建主启动类

@SpringBootApplication
public class MemberApplication {public static void main(String[] args) {SpringApplication.run(MemberApplication.class,args);}
}
  1. 创建数据库/表

  • 注意表的编码格式:charset=utf8;之前前端新建数据出错,就是这儿没有设置导致的。

CREATE DATABASE e_commerce_center_db
USE e_commerce_center_dbCREATE TABLE member(
id BIGINT NOT NULL AUTO_INCREMENT COMMENT 'id',
`NAME` VARCHAR(64) COMMENT '用户名',
pwd CHAR(32) COMMENT'密码',
mobile VARCHAR(20) COMMENT'手机号码',
email VARCHAR(64) COMMENT'邮箱',
gender TINYINT COMMENT '性别',
PRIMARY KEY (id)
)charset=utf8;INSERT INTO member VALUES
(NULL,'smith',MD5('123'),'123456789000','smith@sohu.com',1);
  1. 创建entity->dao/Mapper.xml->service->controller

  • entity类

  • Member

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Member {private long id;private String name;private String pwd;private String mobile;private String email;private Integer gender;
}
  • Result 返回集

public class Result <T>{private String code;private String msg;private T data;public String getCode() {return code;}public void setCode(String code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public T getData() {return data;}public void setData(T data) {this.data = data;}//    无参构造器public Result(){}//有参构造器public Result(T data){this.data=data;}//成功方法返回-无参public static Result success(){Result result = new Result<>();result.setCode("200");result.setMsg("success");return result;}//    泛型方法public static <T>Result<T> success(T data){Result<T> result = new Result<>(data);result.setCode("200");result.setMsg("success");return result;}//错误-无返回datapublic static Result error(String code,String msg){Result result = new Result<>();result.setCode(code);result.setMsg(msg);return result;}//错误-有返回datapublic static <T> Result<T> error(String code,String msg,T data){Result<T> result = new Result<>(data);result.setCode(code);result.setMsg(msg);return result;}
}
  • Dao层。这个项目使用的是Mybatis(不是Plus版本)

  • 创建接口。注意DAO层的注解在接口

@Mapper
public interface MemberDao {Member queryById(Long id);int addMember(Member member);
}
  • 用xml实现接口

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--这是Mybatis的头文件。Plus直接在类里面实现的-->
<!--namespace对应实现的类-->
<mapper namespace="com.stein.springcloud.dao.MemberDao"><resultMap id="BaseResultMap" type="Member"><id property="id" column="id" jdbcType="BIGINT"/><id property="name" column="name" jdbcType="VARCHAR"/><id property="pwd" column="pwd" jdbcType="VARCHAR"/><id property="mobile" column="mobile" jdbcType="VARCHAR"/><id property="email" column="email" jdbcType="VARCHAR"/><id property="gender" column="gender" jdbcType="TINYINT"/></resultMap><select id="queryById" parameterType="Long" resultMap="BaseResultMap">select * from `member` where `id`=#{id}</select><insert id="addMember" parameterType="Member" useGeneratedKeys="true" keyProperty="id">insert into `member`(name,pwd,mobile,email,gender) values(#{name},md5(#{pwd}),#{mobile},#{email},${gender})</insert></mapper>
  • 测试

@Slf4j
@SpringBootTest
public class MemberTest {@Resourceprivate MemberDao memberDao;@Testpublic void selectById(){Member member = memberDao.queryById(1l);log.info("member={}",member);}@Testpublic void save(){Member member = new Member(null, "王强", "wangqiang", "13000000000", "wangqiang@soho.cn", 1);int affected = memberDao.addMember(member);log.info("affected={}",affected);}
}
  • service层

  • 创建接口

public interface MemberService {Member queryById(Long id);int addMember(Member member);
}
  • 实现接口。注意service层的注解在实现类

@Service
public class MemberServiceImpl implements MemberService {@Resourceprivate MemberDao memberDao;@Overridepublic Member queryById(Long id) {return memberDao.queryById(id);}@Overridepublic int addMember(Member member) {return memberDao.addMember(member);}
}
  • 测试

@Slf4j
@SpringBootTest
public class MemberTest {@Resourceprivate MemberDao memberDao;@Resourceprivate MemberService memberService;@Testpublic void selectById(){Member member = memberService.queryById(1l);log.info("member={}",member);}@Testpublic void save(){Member member = new Member(null, "王强", "wangqiang", "13000000000", "wangqiang@soho.cn", 1);int affected = memberService.addMember(member);log.info("affected={}",affected);}
}
  • controller层

@RestController
public class MemberController {@Resourceprivate MemberService memberService;@GetMapping("/member/query/{id}")public Result selectById(@PathVariable("id")Long id){Member member = memberService.queryById(id);if(member != null){return Result.success(member);}else{return Result.error("402","id="+id+"的member不存在");}}//表单方式提交的数据,不需要@RequestBody@PostMapping("/member/add")public Result addMember(Member member){int affected = memberService.addMember(member);if(affected>0){return Result.success(member);}else{return Result.error("401","添加member失败");}}
}

4、完成测试

使用postman进行测试。

注意事项和细节

1、我们的前端如果是以json格式来发送添加信息furn,那么我们需要使用@RequestBody,才能将数据封装到对应的bean,同时保证http的请求头的content-type是对应

2、如果前端是以表单形式或者是以parameters提交,则不需要使用@RequestBody,才会进行对象封装,同时保证http的请求头的content-type是对应的

3、在进行SpringBoot应用程序测试时,引入的JUnit是org.junit.jupiter.api.Test

4、在运行程序时,一定要确保你的XxxxMapper.xml文件被自动放到的target目录的classes指定的目录

相关文章:

springcloud-1环境搭建、service provider

搭建项目环境创建新项目&#xff0c;选择archetype-webapp&#xff0c;创建一个父项目&#xff0c;该父项目会去管理多个微服务模块(module)项目设置Settings->Editor->File Encoding:Global/Project Encoding 改为UTF-8Default encoding for properties files:默认属性文…...

光谱仪工作过程及重要参数定义

标题光谱仪工作过程CCD、PDA薄型背照式BT-CCD狭缝Slit暗电流Dark Current分辨率Resolution色散Dispersion光栅和闪耀波长Grating波长精度、重复性和准确度Precision带宽Band widthF数F/#光谱仪工作过程 CCD、PDA 电荷耦合器件&#xff08;Charger Coupled Device&#xff0c;缩…...

W800|iot|HLK-W800-KIT-PRO|AliOS|阿里云| |官方demo|学习(1):板载AliOS系统快速上手

板载系统简介 HLK-W800-KIT-PRO 是海凌科电子面向开发者&#xff0c;采用了联盛德 w800 方案&#xff0c;带有一个RGB三色灯&#xff0c;集成了 CHT8305C 温湿度传感器的多功能开发板&#xff0c;用户可以在上面学习、研究嵌入式系统和物联网产品的开发&#xff0c;本套设备运行…...

字节终面,一道Linux题难住我了

以下是一道难道系数中高并且高频出现的linux面试题&#xff0c;题目具体要求如下&#xff1a; linux面试题&#xff1a; 某文件有多列数据&#xff0c;空格隔开&#xff0c;统计第n列单词&#xff0c;打印出现频率最高的5个单词。 解答这道面试题需要用到3个linux命令&#xff…...

三、NetworkX工具包实战2——可视化【CS224W】(Datawhale组队学习)

开源内容&#xff1a;https://github.com/TommyZihao/zihao_course/tree/main/CS224W 子豪兄B 站视频&#xff1a;https://space.bilibili.com/1900783/channel/collectiondetail?sid915098 斯坦福官方课程主页&#xff1a;https://web.stanford.edu/class/cs224w NetworkX…...

【MySQL】MySQL 架构

一、MySQL 架构 C/S 架构&#xff0c;即客户端/服务器架构。服务器程序直接和我们存储的数据打交道&#xff0c;多个客户端连接这个服务器程序。客户端发送请求&#xff0c;服务器响应请求。 MySQL 数据库实例 &#xff1a;即 MySQL 服务器的进程 &#xff08;我们使用任务管理…...

Python日期时间模块

Python 提供了 日期和时间模块用来处理日期和时间&#xff0c;还可以用于格式化日期和时间等常见功能。 时间间隔是以秒为单位的浮点小数。每个时间戳都以自从 1970 年 1 月 1 日午夜&#xff08;历元&#xff09;经过了多长时间来表示。 一、time模块使用 Time 模块包含了大…...

学以致用——植物信息录入1.0(selenium+pandas+os+tkinter)

目的 书接上文&#xff0c;学以致用——植物信息录入&#xff08;seleniumpandasostkinter) 更新要点&#xff1a; tkinter界面&#xff1a;自动登录、新增&#xff08;核心功能&#xff09;、文件夹选择、流程台selenium自动化操作&#xff1a;验证码识别excel数据&#xf…...

什么是压敏电阻

下面的这些都是压敏电阻&#xff0c;常常用在一些电源和信号的浪涌防护电路中。这个是它的电路符号&#xff0c;电路中常用RV表示。当压敏电阻两端电压小于压敏电压时&#xff0c;压敏电阻相当于一个阻值非常大的电阻。当压敏电阻两端电压大于压敏电压时&#xff0c;压敏电阻相…...

Leetcode.901 股票价格跨度

题目链接 Leetcode.901 股票价格跨度 Rating &#xff1a; 1709 题目描述 设计一个算法收集某些股票的每日报价&#xff0c;并返回该股票当日价格的 跨度 。 当日股票价格的 跨度 被定义为股票价格小于或等于今天价格的最大连续日数&#xff08;从今天开始往回数&#xff0c;…...

vue入门(四)组件基础,$emits简单用法

上一篇&#xff1a;vue入门&#xff08;三&#xff09;事件&#xff08;方法&#xff09;处理、侦听器、模板引用 1.组件最基础的用法&#xff1a; 首先有一个button.vue的组件&#xff0c;里面只画了一个按钮 button.vue: <script> export default({data(){return{but…...

VBA提高篇_27 OptionBOX_CheckBox_Frame_Image_VBA附加控件

文章目录1.单选按钮OptionBOX:2.复选框CheckBox:3.框架Frame:4.图像Image: (loadPictrue)5. VBA附加控件:6. 适用于很多控件的重要属性:1.单选按钮OptionBOX: 默认时,同一窗体的所有单选按钮均属于同一组,只能选中一个 可通过Frame控件进行分组解决. 2.复选框CheckBox: 一次可以…...

STM32开发(11)----CubeMX配置独立看门狗(IWDG)

CubeMX配置独立看门狗&#xff08;IWDG&#xff09;前言一、独立看门狗的介绍二、实验过程1.STM32CubeMX配置独立看门狗2.代码实现3.硬件连接4.实验结果总结前言 本章介绍使用STM32CubeMX对独立看门狗定时器进行配置的方法。门狗本质上是一个定时器&#xff0c;提供了更高的安…...

医疗方案 | 星辰天合入选“2022智慧新医信优秀解决方案”

近日&#xff0c;由 HC3i数字医疗网主办的《数字化转型驱动下的医院高质量发展论坛》暨 2022 智慧新医信优秀解决方案发布仪式在线上召开。XSKY星辰天合的“智慧医疗软件定义数据基础设施”解决方案成功入选 2022 智慧新医信优秀解决方案&#xff0c;。此次论坛由 HC3i 数字医疗…...

【系统服务实战】tomcat服务的安装实战

未来要更新的专栏&#xff08;此表格后面会继续完善&#xff09; 专栏系列学习路线完成情况云原生系列linux基本功系列-基础命令汇总已更新51个命令云原生系列linux基本功系列-系统服务实战正在更新文章目录前言一. tomcat的概述1.1 什么是tomcat1.2 tomcat的官网二. tomcat单…...

【图文详解】Unity存储游戏数据的几种方法

Unity3D存储游戏数据的方式1 PlayerPrefs: Unity自带的一种简单的键值存储系统2 ScriptableObject: Unity中最灵活的数据管理工具2.1 如何手动创建和修改数据文件2.2 ScriptableObject优缺点总结3 JSON: 轻量级的数据交换格式3.1 序列化与反序列化3.2 用JsonUtility对对象进行序…...

SESAM 安装教程

SESAM &#xff08;Super Element Structure Analysis Module&#xff09;是由挪威船级社&#xff08;DNV-GL&#xff09;开发的一款有限元分析&#xff08;FEA&#xff09;系统&#xff0c;它以 GeniE、HydroD 和 DeepC 等模块为核心&#xff0c;主要用于海工结构的强度评估、…...

语言文件操作

&#x1f331;博客主页&#xff1a;大寄一场. &#x1f331;系列专栏&#xff1a;C语言学习笔记 &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 前言 C语言中的文件打开和关闭 文件指针 文件的打开和关闭 fclose 文件的顺序读写 fseek ftell …...

Java面试题--熔断和降级的区别

熔断和降级都是系统自我保护的一种机制&#xff0c;但二者又有所不同&#xff0c;它们的区别主要体现在以下几点&#xff1a; 概念不同 触发条件不同 归属关系不同 1.概念不同 1.1熔断概念 “熔断”一词早期来自股票市场。熔断&#xff08;Circuit Breaker&#xff09;也…...

阅读笔记5——深度可分离卷积

一、标准卷积 标准卷积在卷积时&#xff0c;同时考虑了特征图的区域和通道信息。 标准卷积的过程如图1-1所示&#xff0c;假设输入特征图的channel3&#xff0c;则每个卷积核的channel都为3&#xff0c;每个卷积核的3个channel对应提取输入特征图的3个channel的特征&#xff08…...

预览pdf(url格式和blob格式)

<template><div class"pdf-container"><div v-if"loading" class"loading-state"><a-spin size"large" /></div><div v-else-if"error" class"loading-state">加载失败&…...

FPGA定点和浮点数学运算-实例对比

在创建 RTL 示例时&#xff0c;经常使用 VHDL 2008 附带的 VHDL 包。它提供了出色的功能&#xff0c;可以高效地处理定点数&#xff0c;当然&#xff0c;它们也是可综合的。该包的一些优点包括&#xff1a; 有符号和无符号&#xff08;后缀和后缀&#xff09;定点向量。轻松将定…...

船舶事故海上搜救VR情景演练全场景 “复刻”,沉浸式救援体验​

船舶事故海上搜救 VR 情景演练系统的一大核心优势&#xff0c;便是能够全场景 “复刻” 海上事故&#xff0c;为使用者带来沉浸式的船舶事故海上搜救 VR 情景演练体验。​ 在船舶事故海上搜救 VR 情景演练的事故场景模拟方面&#xff0c;系统几乎涵盖了所有常见的船舶事故类型。…...

第五篇:Go 并发模型全解析——Channel、Goroutine

第五篇:Go 并发模型全解析——Channel、Goroutine 一、序章:Java 的并发往事 在 Java 世界中,说到“并发”,你可能立马想到以下名词:Thread、Runnable、ExecutorService、synchronized、volatile。再复杂点,ReentrantLock、CountDownLatch、BlockingQueue 纷纷登场,仿…...

人机融合智能 | 可穿戴计算设备的多模态交互

可穿戴计算设备可以对人体以及周围环境进行连续感知和计算,为用户提供随时随地的智能交互服务。本章主要介绍人机智能交互领域中可穿戴计算设备的多模态交互,阐述以人为中心的智能穿戴交互设计目标和原则,为可穿戴技术和智能穿戴交互技术的设计提供指导,进而简述支持智能穿戴交…...

PDF图片和表格等信息提取开源项目

文章目录 综合性工具专门的表格提取工具经典工具 综合性工具 PDF-Extract-Kit - opendatalab开发的综合工具包&#xff0c;包含布局检测、公式检测、公式识别和OCR功能 仓库&#xff1a;opendatalab/PDF-Extract-Kit特点&#xff1a;功能全面&#xff0c;包含表格内容提取的S…...

Bugku-CTF-Web安全最佳刷题路线

曾经的我也是CTF六项全能&#xff0c;Web安全&#xff0c;密码学&#xff0c;杂项&#xff0c;Pwn&#xff0c;逆向&#xff0c;安卓样样都会。明明感觉这样很酷&#xff0c;却为何还是沦为社畜。Bugku-CTF-Web安全最佳刷题路线&#xff0c;我已经整理好了&#xff0c;干就完了…...

C#提取CAN ASC文件时间戳:实现与性能优化

C#提取CAN ASC文件时间戳&#xff1a;实现与性能优化 在汽车电子和工业控制领域&#xff0c;CAN总线是最常用的通信协议之一。而ASC&#xff08;ASCII&#xff09;文件作为CAN总线数据的标准日志格式&#xff0c;广泛应用于数据记录和分析场景。本文将深入探讨如何高效地从CAN…...

QuickJS 如何发送一封邮件 ?

参阅&#xff1a;bellard.org‌ : QuickJS 如何使用 qjs 执行 js 脚本 在 QuickJS 中发送邮件需要依赖外部库或调用系统命令&#xff0c;因为 QuickJS 本身不包含 SMTP 功能。以下是两种实现方法&#xff1a; 方法 1&#xff1a;调用系统命令&#xff08;推荐&#xff09; 使…...

产品经理课程(十一)

&#xff08;一&#xff09;复习 1、用户需求不等于产品需求&#xff0c;挖掘用户的本质需求 2、功能设计的前提&#xff1a;不违背我们的产品的基础定位&#xff08;用一句话阐述我们的产品&#xff1a;工具&#xff1a;产品画布&#xff09; 3、判断设计好坏的标准&#xf…...