SpringCloud入门实战之项目(一)

news2024/11/14 22:08:13

一、新建父工程

以“下单”需要调“支付”模块为例,从零开始搭建springcloud-001项目,陆续集成相关组件。
新建服务提供者cloud-payment工程,服务调用者cloud-order工程,完成order对payment的调用。
图片

图片

图片

只留下pom文件,其余src等删掉。修改pom文件,添加依赖,打包方式为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.test.springcloud</groupId>
   <artifactId>springcloud-001</artifactId>
   <version>1.0-SNAPSHOT</version>
   <packaging>pom</packaging>

    <!--统一管理jar包版本-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.12</log4j.version>
        <lombok.version>1.16.20</lombok.version>
        <mysql.version>8.0.29</mysql.version>
        <druid.verison>1.1.10</druid.verison>
        <mybatisplus.version>3.1.1</mybatisplus.version>
        <mybatis.spring.boot.verison>1.3.0</mybatis.spring.boot.verison>
    </properties>
    
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.7.1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>2021.0.3</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-spring-boot-starter</artifactId>
                <version>${druid.verison}</version>
            </dependency>

            <!--lombok-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
            <!--junit-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <!-- log4j -->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
              <!-- mybatis-plus -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus</artifactId>
                <version>${mybatisplus.version}</version>
            </dependency>
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatisplus.version}</version>
            </dependency>
            
        </dependencies>
    </dependencyManagement>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.0.RELEASE</version>
                <configuration>
                    <fork>true</fork>
                    <addResources>true</addResources>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

小回顾:
1)dependencyManagement标签和dependencies标签。
dependencyManagement标签一般用在父工程,声明版本,但是不真正引入,dependencies标签一般用在子工程,真正引入依赖。只有在子项目写了该依赖,并且没有指定具体版本,才会从父项目中继承,并且version和scope都读取自父pom,如果子项目指定了版本号,那么会使用子项目指定的jar版本
2)packaging 共分为pom、jar、war类型。
(1)pom: 父类型都为pom类型;子模块也会用到pom,比如common通用模块。仅仅是一个引用其它maven 项目的POM。
(2)jar: 内部调用或者是作服务使用 packing默认类型jar类型,maven会将该项目打成jar包。
(3)war: 需要部署的项目。(tomcat部署)

https://github.com/alibaba/spring-cloud-alibaba/ 可以查看pom依赖

图片

二、建子项目-服务提供者

1、建module

工程右键->module->maven->选择jdk->下一步完成图片

子module创建完,打开父pom,可以看到新父pom增进来modules系列标签:
图片
子pom中增进了parent标签:
图片

2、改子pom文件

继承了父工程的所以不用写version和scope,只需有 artifactId标签内容即可,添加依赖:

<?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-001</artifactId>
        <groupId>org.test.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-payment</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
   
        <!-- MySql -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!-- Druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus</artifactId>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
        </dependency>
        <!-- log4j -->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
        </dependency>
         <!-- devtools热部署 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
    </dependencies>
</project>

3、写yml文件

resource->右键new file->application.yml 看到创建完的文件是个绿色树叶ok->填写配置内容:

server:
  port: 8001

spring:
  application:
    name: cloud-payment #微服务应用的名字
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource  #当前数据源操作类型
    driver-class-name: com.mysql.jdbc.Driver  #mysql驱动包
    url: jdbc:mysql://localhost:3306/test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false #useSSL安全加固
    username: root
    password: 123456

mybatis-plus:
  mapper-locations: classpath*:mapper/**/*.xml
    #实体扫描,多个package用逗号或者分号分隔
  typeAliasesPackage: com.test.springcloud.entitites

4、数据库环境准备

新建库表模拟数据库环境:

CREATE TABLE `payment` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `serial` varchar(200) DEFAULT NULL COMMENT '流水号',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  COMMENT='测试表';

5、写主启动类、业务类

图片

tip:

  • 注意添加相应注解,如@service等,因为只有加入这些注解spring容器才会接管来自动装配
  • 注入的类是否在application的同级包或者子孙包下面,因为2.X以后只有同级包或者子孙包才可以扫描到(1.X只有子孙包),启动类注意加上Scan相关注解

1)PaymentController.java

@RestController
@RequestMapping("/payment")
@Slf4j
public class PaymentController {
    @Resource
    private PaymentService paymentService;

    @PostMapping(value = "")
    public CommonResult create(@RequestBody Payment payment) {
        try {
            paymentService.save(payment);
            log.info("插入完成");
            return new CommonResult(200, "插入成功", payment);
        } catch (Exception e) {
            return new CommonResult(500, "插入失败", null);
        }
    }

    @GetMapping(value = "/{id}")
    public CommonResult query(@PathVariable("id") Long id) {
        Payment payment = paymentService.getById(id);
        if (payment != null) {
            return new CommonResult(200, "查询成功", payment);
        }
        return new CommonResult(500, "查询失败", null);
    }
}

tip:Restful风格编写Controller:
@PostMapping增、 @DeleteMapping删、
@PutMapping改、@GetMapping查

2)PaymentService.java、PaymentServiceImpl.java、PaymentMapper.java

Mybatias-plus service层以及mapper层封装好了一些基本的增删改查方法,直接按照规范继承或实现即可,mapper里也可以少写很多。

public interface PaymentService extends IService<Payment> {
}

@Service
public class PaymentServiceImpl extends ServiceImpl<PaymentMapper, Payment> implements PaymentService {

}
public interface PaymentMapper extends BaseMapper<Payment> {

}

3)PaymentMapper.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">
<mapper namespace="com.test.springcloud.dao.PaymentMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.test.springcloud.entities.Payment">
        <id column="id" property="id"/>
        <result column="serial" property="serial"/>
    </resultMap>

    <!-- 通用查询结果列 -->
    <sql id="Base_Column_List">
      id ,serial
      </sql>
</mapper>

4)Payment实体类、CommonResult实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable {
    private Long id;
    private String serial;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult<T> {
    private Integer code;
    private String message;
    private T data;

    public CommonResult(Integer code, String message) {
        this(code, message, null);
    }
}

6、测试子模块cloud-payment

测试插入POST:http://localhost:8001/payment
body入参:{“serial”:“test1”}
图片

测试查询GET:http://localhost:8001/payment/1547406499788144642
图片

7、热部署

后期微服务增多,开启热部署,方便调试:
图片

上文子pom中已经引入依赖:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6HTKatBn-1683626577340)(data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='1px' height='1px' viewBox='0 0 1 1' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' fill-opacity='0'%3E%3Cg transform='translate(-249.000000, -126.000000)]' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

上文父pom中已经添加插件:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NFiLwQf8-1683626577341)(data:image/svg+xml,%3C%3Fxml version='1.0' encoding='UTF-8'%3F%3E%3Csvg width='1px' height='1px' viewBox='0 0 1 1' version='1.1' xmlns='http://www.w3.org/2000/svg' xmlns:xlink='http://www.w3.org/1999/xlink'%3E%3Ctitle%3E%3C/title%3E%3Cg stroke='none' stroke-width='1' fill='none' fill-rule='evenodd' fill-opacity='0'%3E%3Cg transform='translate(-249.000000, -126.000000)]' fill='%23FFFFFF'%3E%3Crect x='249' y='126' width='1' height='1'%3E%3C/rect%3E%3C/g%3E%3C/g%3E%3C/svg%3E)

ctrl+alt+shift+/ 选择Registry->找到compiler.automake.allow.when.app.running、actionSystem.assertFocusAccessFromEdt两个勾选即可,如果没成功,重启IDEA,上线需关闭热部署

三、建子项目-服务消费者

同上步骤建立cloud-order工程:
图片

注:SpringBoot启动时会自动注入数据源,消费者工程目前不需要数据源,可通过在启动类注解上使用exclude 排除,同时将pom中数据源相关的注释掉,mybatis和mysql相关的,不然会启动报错。

OrderController .java、ApplicationContextConfig.java

@RestController
@RequestMapping("/consumer")
@Slf4j
public class OrderController {
    public static final String PAYMENT_URL = "http://localhost:8001";
    @Resource
    private RestTemplate restTemplate;

    @PostMapping("/order")
    public CommonResult<Payment> createOrder(@RequestBody Payment payment) {
        return restTemplate.postForObject(PAYMENT_URL + "/payment", payment, CommonResult.class);
    }

    @GetMapping("/order/{id}")
    public CommonResult<Payment> getOrderPayment(@PathVariable("id") Long id) {
        return restTemplate.getForObject(PAYMENT_URL + "/payment/" + id, CommonResult.class);
    }
}
@Configuration
public class ApplicationContextConfig {
    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

RestTemplate:RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,但是还是需要写一些代码,后面后讲到Feign通过注解就可以搞定。

四、代码优化

微服务项目一般子模块会越来越多,公共的东西也就越来越多,所以一般我们抽取公共包处理:
同上新建module:cloud-common,将pom文件依赖粘贴进来,将order、payment工程中entities中相同内容剪切到common包中,将common工程maven clean->install到仓库,然后在order、payment工程中引入自定义的common包依赖:
图片

五、测试调用

测试插入POST:http://localhost:consumer/order
测试查询GET:http://localhost:consumer/order/1547406499788144642
不过多赘述
至此实现了order模块调用payment模块,最基础版的SpringCloud项目,后续陆续添加SpringCloud组件。

六 总结

今日份实战到此结束,明天继续,关注我,关注的本专栏,收获多多,等你一起学习!!!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于人工智能AI视频分析的智慧安监解决方案

方案背景 为了保证对园区环境风险进行有效识别&#xff0c;传统视频监控存在视频结构化利用率低的问题&#xff0c;在实际使用过程中&#xff0c;安全管理人员工作效率低下&#xff0c;依靠人工肉眼查看灵活度低&#xff0c;风险漏报概率高&#xff0c;出现异常情况跟踪不及时&…

中文润色神器-中文润色软件

中文写作润色软件 中文写作润色软件是一种基于自然语言处理技术和人工智能算法的工具&#xff0c;旨在提高中文文本的语言风格、表达能力和可读性。它可以自动检测文本中出现的语法、拼写、标点符号等语言问题&#xff0c;并给出相应的修正和修改建议。 中文写作润色软件的主…

paddleLite在Android部署初体验(环境问题)

paddleLite初体验&#xff08;环境问题&#xff09; Android Studio下载Paddle Lite Demo打开项目环境配置下载到手机 Paddle Lite是百度开发的一种方便部署的深度学习推理框架&#xff0c;笔者最近想接触一些模型部署相关项目&#xff0c;就先接触了一下Paddle Lite&#xff0…

手术麻醉信息系统源码 php + mysql + vue2,覆盖患者就诊全过程,体征数据自动采集绘制

手术麻醉信息系统源码 php mysql vue2 B/S网页版 麻醉信息系统是HIS产品的中的一个组成部分&#xff0c;主要应用于医院的麻醉科&#xff0c;属于电子病历类产品。医院麻醉监护的功能覆盖整个手术与麻醉的全过程&#xff0c;包括手术申请与排班、审批、安排、术前、术中和术…

list_for_each_entry()函数分析

在Linux内核源码中&#xff0c;经常要对链表进行操作&#xff0c;其中一个很重要的宏是list_for_each_entry&#xff1a; /*** list_for_each_entry - iterate over list of given type* pos: the type * to use as a loop cursor.* head: the head for your list.* member: t…

9个已开源的GPT4平替分享(附开源代码+论文)

资料整理自网络&#xff0c;有误欢迎指正 对于想要研究大模型的同学来说&#xff0c;目前ChatGPT无疑是最好的学习对象&#xff0c;但等它开源估计是不太可能了&#xff0c;所以学姐今天整理了一些开源的类GPT模型&#xff0c;帮助大家更好的理解大模型背后的机理。 PS&#x…

io,nio,aio区别

文章目录 前言io类型介绍同步阻塞io同步非阻塞ioio多路复用异步io 普通ionioChannelChannel实现基本的 Channel代码 示例 BufferBuffer的基本用法Buffer的capacity,position和limitcapacitypositionlimit Buffer的类型Buffer的分配向Buffer中写数据从Buffer中读取数据 Selector…

CSS 实现任意角度圆环

参考链接&#xff1a; css 制作圆环 - 掘金 主要思路&#xff1a; 利用 CSS 的 clip-path 属性进行裁剪 clip-path 具体信息参考 polygon() - MDN (mozilla.org) 该属性原理是&#xff1a;利用多边形进行对图形的裁剪。 根据具体代码&#xff0c;去分析 clip-path: polyg…

JavaWeb:Servlet、ServletContext、HttpServletResponse、HttpServletRequest 的详细内容

文章目录 JavaWeb - 02一、Servlet1. 简介2. HelloServlet3. Servlet 原理4. Mapping 原理 二、ServletContext1. 共享数据2. 获取初始化参数3. 请求转发4. 读取资源文件 三、HttpServletResponse1. 方法介绍2. 应用&#xff1a;下载文件3. 应用&#xff1a;创建验证码4. 应用&…

office web apps在线office文件预览部署及问题处理

文件下载链接网盘&#xff1a; 链接: https://pan.baidu.com/s/1OmWM5END0jyWESGzFCniEw 提取码: ejpg 基本环境需要两台机&#xff0c;1台为域控&#xff0c;1台为 &#xff08;office web apps &#xff0c;需要加入到域&#xff09; 主机1&#xff1a;添加域控服务 安装完…

设备树简介

设备树 设备树简介 设备树是一种描述硬件的数据结构&#xff0c;它起源于OpenFirmware&#xff08;OF&#xff09;。 在Linux 2.6中&#xff0c; ARM架构的板极硬件细节过多地被硬编码在arch/arm/plat-xxx和arch/arm/mach-xxx中&#xff0c;采用设备树后&#xff0c;许多硬件…

python操作字典

# 字典 score{"张三":"23","王五":"45"} print(score) dctdict(name张三,age20) print(dict) print(type(score)) # 字典元素的获取 print(score[张三]) print(score.get(张三)) # 判断是否是字典中的元素 print(王五 in score) # 为字…

浅析AI视频智能识别技术如何助力智慧平安校园建设

校园安全一直是学生健康成长、全面发展的前提与保障。校园门口伤害事件的频发与校园内应急事件的突发&#xff0c;让建设平安校园的任务愈加急迫。校园人流量大、监控点多&#xff0c;安保人员无法同时盯住上百个视频画面&#xff0c;亦无法保证24小时有效监控。传统的校园安防…

软件测试简历项目经验怎么写?一篇足矣解决

一、前言&#xff1a;浅谈面试 面试是我们进入一个公司的门槛&#xff0c;通过了面试才能进入公司&#xff0c;你的面试结果和你的薪资是息息相关的。那如何才能顺利的通过面试&#xff0c;得到公司的认可呢?面试软件测试要注意哪些问题呢?下面和笔者一起来看看吧。这里分享一…

OpenGL(十一)——材质

目录 一、前言 二、物体材质 三、光源材质 一、前言 OpenGL材质是模拟现实世界中不同材质物体表面&#xff0c;如木制箱子和钢制箱子对光的反射程度不同。物体材质对接受光散射程度不同&#xff0c;较少散射产生较小高光点&#xff0c;较多散射则会产生较大高光点。前面章节…

如何节约ChatGPT消耗的token

如何节约GPT的token.md 原文链接&#xff1a;小回博客 如何节约GPT的token 一、模拟一下携带上下文的流程&#xff1a; 第1次问答&#xff1a; 你&#xff1a;帮我写一个1000字的文案&#xff08;13&#xff09; gpt: xxxxxx (1000)第2次问答&#xff1a; 你&#xff1a;谢…

《我命由我不由天》蔡志忠——笔记三

目录 经典摘录 1、大脑是用来思考的 2、养生主 3、自己的问题&#xff0c;自己找答案 4、42岁自学英文 5、终身阅读 6、打不垮我们的终究使我们更强大 7、大环境下失业 8、生命只能兑现此刻 经典摘录 1、大脑是用来思考的 罗素非常反对制式教育&#xff0c;他说&#…

有哪些比较好的测试用例管理工具?

“新入职小型创业公司&#xff0c;想要一个比Excel高效且好用的工具。”我预料很多人会提TestLink、Jira、PingCode 等一堆平台&#xff0c;都2023年了&#xff0c;若还是复制粘贴的10年前这一套&#xff0c;那就让人看不下去了。为了让大家少走弯路&#xff0c;所以我写了这篇…

【自用】配置minGW、vscode配置ESP-IDF环境

步骤总览 1.配置minGW 2.下载安装esp-idf软件 3.将vscode esp-idf插件 和 esp-idf软件进行关联 一、配置minGW 1.下载 链接&#xff1a;https://pan.baidu.com/s/1j6ITlNDDyivKwpWNBjASvg?pwd0108 提取码&#xff1a;0108 2.解压 解压上面下载的压缩包即可 3.配置环境变…