SpringCloud学习笔记

SpringCloud学习笔记

文章目录

1、版本选择

springboot版本根据SpringCloud官网:https://docs.spring.io/spring-cloud/docs/current/reference/html/

比如:Release Train Version: 2020.0.3 (springcloud版本)

​ Supported Boot Version: 2.4.6 (对应的springboot版本)

2、创建父工程

2.1、创建空的maven项目
  1. 字符编码 - Settings - File encoding
  2. 注解生效激活 - Settings - Annotation Processors
  3. Java编译版本选8
2.2、修改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>com.ljh</groupId>
  <artifactId>springcloud-study</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>5.7.2</junit.version>
    <log4j.version>1.2.17</log4j.version>
    <lombok.version>1.18.20</lombok.version>
    <mysql.version>8.0.14</mysql.version>
    <druid.version>1.2.5</druid.version>
    <mybatis.spring.boot.version>2.1.4</mybatis.spring.boot.version>
  </properties>

  <!-- 子模块继承之后,提供作用:
  锁定版本+子modlue不用写groupId和version -->
  <dependencyManagement>
    <dependencies>
      <!--spring boot 2.4.6-->
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>2.4.6</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!--spring cloud 2020.0.3-->
      <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-dependencies</artifactId>
        <version>2020.0.3</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <!--spring cloud alibaba 2.1.2.RELEASE-->
      <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-alibaba-dependencies</artifactId>
        <version>2.1.2.RELEASE</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
      </dependency>
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
        <version>${druid.version}</version>
      </dependency>
      <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>${mybatis.spring.boot.version}</version>
      </dependency>
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
      </dependency>
      <dependency>
        <groupId>log4j</groupId>
        <artifactId>log4j</artifactId>
        <version>${log4j.version}</version>
      </dependency>
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>${lombok.version}</version>
        <optional>true</optional>
      </dependency>
    </dependencies>
  </dependencyManagement>

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

</project>

DependencyManagementDependencies 区别:

Maven使用dependencyManagement元素来提供了一种管理依赖版本号的方式。

通常会在一个组织或者项目的最顶层的父POM中看到dependencyManagement元素。

使用pom.xml中的dependencyManagement元素能让所有在子项目中引用个依赖而不用显式的列出版本量。

Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用这个
dependencyManagement元素中指定的版本号。

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

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

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

dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)

另外: IDEA右侧旁的Maven插件有Toggle ' Skip Tests' Mode按钮,这样maven可以跳过单元测试

3、 创建微服务模块

3.1、创建微服务模块套路
  1. 建Module
  2. 改POM
  3. 写YML
  4. 主启动
  5. 业务类
3.2、创建提供者子模块

创建cloud-provider-payment8001微服务提供者支付Module模块

建名为cloud-provider-payment8001的Maven子工程

改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">
  <parent>
    <artifactId>springcloud-study</artifactId>
    <groupId>com.ljh</groupId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <modelVersion>4.0.0</modelVersion>

  <artifactId>cloud-provider-payment8001</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>
    <dependency>
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
    </dependency>
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.2.5</version>
    </dependency>
    <!--mysql-connector-java-->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <!--jdbc-->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

写YML

server:
  port: 8001

spring:
  application:
    name: cloud-payment-service
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
    driver-class-name: com.mysql.cj.jdbc.Driver             # mysql驱动包
    url: jdbc:mysql://localhost:3306/ob?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai&useSSL=false
    username: root
    password: 123456

mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.ljh.entities    # 所有Entity别名类所在包

主启动

package com.ljh;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class PaymentMain001 {
   

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

这里可以设置自定义Spring Boot启动类快捷键,参考:https://blog.csdn.net/weixin_43891448/article/details/104920861

直接建好类后,使用 psvmb 即可快速创建spring boot启动类,记得加上@SpringBootApplication注解。

业务类

新建数据库表 payment 字段为id、serial

编写实体类entities

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment {
   

  private Long id;
  private String serial;
}

JSON封装体 CommonResult :作用是 返回给前端数据

@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);
  }

}

为保证在IDEA中能mapper接口和mapper.xml中互相跳转,可以安装 MybatisX 插件

若IDEA安装不了插件,可以参考:https://blog.csdn.net/qq_37002521/article/details/105845124

编写dao层

@Mapper
public interface PaymentDao {
   
  int create(Payment payment);
  Payment getPaymentById(@Param("id") Long id);
}

注意 :可以在setting->editor->live templates中配置mapper.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="">
 
</mapper>

编写mapper.xml前可以在idea中配置setting -> SQL Dialects为 MySQL

然后再idea中配置MySQL数据库,配置好后会有代码提示

MyBatis映射文件PaymentMapper.xml,路径:resources/mapper/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.ljh.dao.PaymentDao">
  <insert id="create" parameterType="Payment" useGeneratedKeys="true" keyProperty="id">
    insert into payment(serial)  values(#{serial});
  </insert>

  <resultMap id="BaseResultMap" type="com.ljh.entities.Payment">
    <id column="id" property="id" jdbcType="BIGINT"/>
    <id column="serial" property="serial" jdbcType="VARCHAR"/>
  </resultMap>

  <select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap">
    select * from payment where id = #{id}
  </select>
</mapper>

编写service

public interface PaymentService {
   
  int create(Payment payment);
  Payment getPaymentById(Long id);
}

编写service 实现类

@Service
public class PaymentImpl implements PaymentService {
   

  @Resource
  private PaymentDao paymentDao;

  @Override
  public int create(Payment payment) {
   
    return paymentDao.create(payment);
  }

  @Override
  public Payment getPaymentById(Long id) {
   
    return paymentDao.getPaymentById(id);
  }
}

用@Autowired注解可能会爆红,但运行正常,这里用 @Resource 代替

解决IntelliJ IDEA使用@AutoWired注解出现Could not autowire. No beans of ‘xxxx’ type found 的错误提示:(1)在注解上加上:@Autowired(required = false)
(2)使用 @Resource 替换 @Autowired

(3)在 MyBatis 接口上加上 @Repository 注解

(4)使用 Lombok,@RequireArgsContructor

(5)降低 Autowired 检测的级别,将 Severity 的级别由之前的 error 改成 warning 或其它可以忽略的级别。

(6)安装 MyBatis 插件

(7)使用构造器注入

编写controller

@RestController
@Slf4j
public class PaymentController {
   

  @Resource
  private PaymentService paymentService;

  @PostMapping(value = "/payment/create")
  public CommonResult create(Payment payment) {
   
    int result = paymentService.create(payment);
    log.info("*****插入结果:" + result);

    if (result > 0) {
   
      return new CommonResult(200, "插入数据库成功", result);
    } else {
   
      return new CommonResult(444, "插入数据库失败");
    }
  }

  @GetMapping(value = "/payment/get/{id}")
  public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id) {
   
    Payment payment = paymentService.getPaymentById(id);

    if (payment != null) {
   
      return new CommonResult(200, "查询成功", payment);
    } else {
   
      return new CommonResult(444, "没有对应记录,查询ID: " + id);
    }
  }
}

测试

查询操作:http://localhost:8001/payment/get/1(直接浏览器测试)

插入操作:http://localhost:8001/payment/create?serial=lll (这里需要在postman中测试)

4、热部署Devtools

开发时使用,生产环境关闭

根据下面的步骤即可。

添加依赖到子模块

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
    <optional>true</optional>
</dependency>

下段配置复制到聚合父类总工程的pom.xml

<build>
    <!--
	<finalName>你的工程名</finalName>(单一工程时添加)
    -->
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <fork>true</fork>
                <addResources>true</addResources>
            </configuration>
        </plugin>
    </plugins>
</build>

File -> Settings ->Complier

下面项勾选

  • Automatically show first error in editor
  • Display notification on build completion
  • Build project automatically
  • Compile independent modules in parallel

键入Ctrl + Shift + Alt + / ,打开Registry,勾选:

  • compiler.automake.allow.when.app.running
  • actionSystem.assertFocusAccessFromEdt

重启IDEA!

5、消费者子模块

建Module

创建名为cloud-consumer-order80的maven工程。

改POM

<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>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-devtools</artifactId>
      <scope>runtime</scope>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
</dependencies>

写YML

server:
  port: 80

主启动

//直接psvmb快速生成代码
@SpringBootApplication
public class OrderMain80 {
   
   public static void main(String[] args) {
   
         SpringApplication.run(OrderMain80.class, args);
    }
}

业务类

编写entities,这里实现了 Serializable 接口,用于序列化

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

CommonResult

@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);
  }
}

编写controller

@RestController
@Slf4j
public class OrderController {
   

  public static final String PAYMENT_URL = "http://localhost:8001";

  @Resource
  private RestTemplate restTemplate;

  @PostMapping("/consumer/payment/create")
  public CommonResult<Payment> create(Payment payment) {
   

    return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment,CommonResult.class);
  }

  @GetMapping("/consumer/payment/get/{id}")
  public CommonResult<Payment> get(@PathVariable("id") Long id) {
   

    return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
  }
}

编写config,ApplicationContextConfig

@Config
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值