官网地址https://spring.io/projects/spring-cloud,因为我们要学习的是SpringCloud项目,可以通过下图的菜单点击进入到这个地址。
进入后的页面就是SpringCloud的项目概述页,找到下面这段话
简单翻译一下,标题Release Trains:发布系列。Spring Cloud是一个伞形项目,由独立项目组成,原则上具有不同的发布节奏。为了管理维护各个子项目的版本号,spring cloud发布时会附带一组对单个项目的依赖关系(见下文)。Spring cloud发布的version用的是英文名称,而不是版本号,以避免与子项目混淆。Version的这个英文名字是一个字母顺序(所以你可以按时间顺序排序)与伦敦地铁站的名字(“Angel”是第一个版本,“Brixton”是第二个)。当单个项目的点发布累积到一个临界质量时,或者如果其中一个项目中有一个需要向所有人提供的关键bug,则将推出名称以“.SRX”结尾的版本,其中“X”是一个数字。
通过这段话,我们就知道了spring cloud各个版本号的起名来历,是按照字母顺序,并且取自伦敦地铁站的名称,例如Dalston、Edgware、Finchley(spring官方用完26个字母,估计就得还一种命名规则了),而且当还用.SR+版本号结尾,比如最新的spring cloud版本依赖
org.springframework.cloud
spring-cloud-dependencies
Hoxton.SR4
也可以从maven中央仓库上看出这个规律https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies
那么如何选择对应的spring boot的版本呢?第一张图上已经给出了对应关系表,其中Boot Version中的2.2.x就是我们maven中央仓库里面的下图所示,这些是都可以的。(https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-dependencies)
Spring cloud alibaba的版本如何选择呢?还是看官网
拖到下面
这里也给出了对应的关系图,图上的“x”也就是对应的版本号了。现在maven仓库上的最新版本如下(https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-alibaba-dependencies)
虽然官网上没有明说,spring cloud alibaba的2.2.x版本对应的springcloud、springboot版本号是多少,但是阿里巴巴的小伙子们还是不错的,还是在github(https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-zh.md)上指明了他们的对应关系
所以,spring cloud alibaba的2.2.x版本对应springcloud的Hoxton版,对应springboot的2.2.x版。
由上面的讨论,我选择了springcloud的Hoxton版、springboot的2.2.x版和spring cloud alibaba的2.2.x版。下面我们就能创建一个工程了。
2.maven创建父子工程
因为项目比较多,所以使用父子工程来统一管理spring cloud、spring boot、spring cloud alibaba等这些依赖的版本号。Maven使用dependencyManagement元素能让所有在子项目中引用一个依赖而不用显示的列出版本。Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用这个dependencyManagement元素指定的版本号。
这样做的好处就是: 如果有多个子项目都引用同一样的依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样想升级或切换到另一个版本时,只需在顶层父容器里更新,而不需要一个一个子项目的修改;另外如果某个子项目需要另外的一个版本,只需声单独在子项目的pom文件中声明version版本 。
注意:dependencyManagement只是声明依赖,并不实现引入,因此子项目需要在pom文件中显示的声明需要使用的依赖。
3. 创建父工程和子工程cloud-provider-payment8001
父工程名称cloud2020,子工程cloud-provider-payment8001。
父工程的pom文件
org.springframework.boot
spring-boot-dependencies
2.2.2.RELEASE
pom
import
org.springframework.cloud
spring-cloud-dependencies
Hoxton.SR1
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
2.2.1.RELEASE
pom
import
mysql
mysql-connector-java
${mysql.version}
子工程pom文件
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.mybatis.spring.boot
mybatis-spring-boot-starter
com.alibaba
druid-spring-boot-starter
1.1.10
// ...忽略其他等
使用spring boot在子模块开发两个接口,简单的单表的增删改查接口。
package com.wuqinghai.springcloud.controller;
import com.wuqinghai.springcloud.entities.CommonResult;
import com.wuqinghai.springcloud.entities.Payment;
import com.wuqinghai.springcloud.service.PaymentService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
/**
* @ClassName PaymentController
* @Description 支付相关接口类
* @Author wuqinghai01
* @Date 2020/5/27 12:49
* Version 1.0
*/
@RestController
@Slf4j
public class PaymentController
{
@Resource
private PaymentService paymentService;
@PostMapping(value = "/payment/create")
public CommonResult create(@RequestBody Payment payment)
{
int result = paymentService.create(payment);
log.info("*****插入结果:"+result);
if(result > 0)
{
return new CommonResult(200,"插入数据库成功");
}else{
return new CommonResult(444,"插入数据库失败",null);
}
}
@GetMapping(value = "/payment/get/{id}")
public CommonResult 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,null);
}
}
}
具体的代码可以参考github:https://github.com/wuqinghai/cloud2020。项目逻辑:cloud-provider-payment8001服务作为生产者,提供了上面的两个http接口,cloud-consumer-order80服务作为消费者,使用RestTemplate相关api发送http请求去调用cloud-provider-payment8001服务提供的两个接口。为了优化代码将,接口入参和出参类封装到cloud-api-commons模块。
对应的sql
CREATE TABLE `payment` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`serial` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
项目初始化完毕,有一个insert类型的接口和一个查询接口,为下面的学习准备好了材料。掌握了spring cloud、spring boot、spring cloud alibaba的命名规则和对应的依赖关系,dependencyManager元素的作用。