1)微服务 cloud 整体聚合父工程 Project(构建步骤)
a:New Project
b:聚合总父工程名字
c:Maven 选版本
d:工程名字
e:字符编码
f:注解生效激活
g:java 编译版本选择 8
h:File type 过滤(清爽的菜单)
2)父工程 POM()
a:添加 聚合项目的标识。
b:删掉 自己创建的 SRC 工作目录。
c:pom
4.0.0
com.atguigu.springcloud
cloud2020
1.0-SNAPSHOT
cloud-provider-payment-8001
pom
UTF-8
1.8
1.8
4.12
1.2.17
1.16.18
8.0.18
1.1.16
1.3.0
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.1.0.RELEASE
pom
import
mysql
mysql-connector-java
${mysql.version}
com.alibaba
druid-spring-boot-starter
${druid.verison}
org.mybatis.spring.boot
mybatis-spring-boot-starter
${mybatis.spring.boot.verison}
org.projectlombok
lombok
${lombok.version}
junit
junit
${junit.version}
log4j
log4j
${log4j.version}
org.springframework.boot
spring-boot-maven-plugin
true
true
3)Maven 工程落地 细节复习
a:Maven 中的 DependencyManagement 和 Dependencies。
- 这两个都很常见,尤其是 pom 父工程中。
- DependencyManagement:
1. 通常会在 最顶层 父POM 中看到。
2. 此元素 能让所有在子项目中,引用某个依赖时,不用显式的列出版本号。
3. 好处:一次修改,处处生效。在 父 pom 文件里修改。
4. 只是声明依赖,定义,并不实现引入,因此:子项目需要显式的声明需要用到依赖,才会被真正的引用进来。
- Dependencies:
1. 相对于dependencyManagement,所有生命在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。
2. dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
b:Maven 中,跳过单元测试:
4)父工程创建完成,执行 mvn:install ,将父工程发布到仓库,方便子工程继承。
1)口诀(5步):建module、改POM、写YML、主启动、业务类。
1)构建步骤:
a:cloud-provider-payment8001:微服务提供者支付 Model 模块:
- 建 module:
- POM 变化:
//父 POM 里面引入了 子 module
cloud-provider-payment-8001
pom
//子 module 引入了 父 的依赖
cloud2020
com.atguigu.springcloud
1.0-SNAPSHOT
- 改 POM:
cloud2020
com.atguigu.springcloud
1.0-SNAPSHOT
4.0.0
cloud-provider-payment-8001
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
mysql
mysql-connector-java
org.springframework.boot
spring-boot-starter-jdbc
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
- 写 YML
server:
port: 8001
spring:
application:
name: cloud-provider-payment-8001
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://114.215.173.88:3306/my_database?Unicode=true&characterEncoding=UTF-8&userSSL=false
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
mybatis:
mapper-locations: classpath:mybatis/mapper/*.xml
type-aliases-package: com.cloud
- 主启动
@MapperScan(basePackages = {"com.cloud.dao"})
@SpringBootApplication
public class MySpringBootStater {
public static void main(String[] args) {
SpringApplication.run(MySpringBootStater.class, args);
}
}
- 业务类
1. 建库、建表 SQL:
CREATE TABLE `payment` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
`serial` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
2. entities:
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable {
private Long id;
private String serial;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult {
private Integer code;
private String message;
private T data;
public CommonResult(Integer code, String message) {
this.code = code;
this.message = message;
}
}
3. dao:
@Mapper
public interface PaymentDao {
int create(Payment payment);
Payment getPayment(@Param(value = "id") Long id);
}
INSERT INTO payment (serial)
VALUES (#{serial});
server:
port: 8001
spring:
application:
name: cloud-provider-payment-8001
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://114.215.173.88:3306/my_database?Unicode=true&characterEncoding=UTF-8&userSSL=false
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
mybatis:
mapper-locations: classpath:mybatis/mapper/*.xml
type-aliases-package: com.cloud
4. service:
//粘 dao 的方法头,放到 service 接口中
public interface PaymentService {
public int create(Payment payment);
public Payment getPayment(Long id);
}
@Service
public class PaymentServiceImpl implements PaymentService {
@Autowired
private PaymentDao paymentDao;
@Override
public int create(Payment payment) {
int i = paymentDao.create(payment);
return i;
}
@Override
public Payment getPayment(Long id) {
Payment payment = paymentDao.getPayment(id);
return payment;
}
}
5. controller:
@Slf4j
@RestController
public class PaymentController {
@Autowired
private PaymentService paymentService;
@PostMapping(value = "/create")
public CommonResult create(@RequestBody Payment payment) {
log.info("传入的数据为 :" + payment);
int i = paymentService.create(payment);
if (i > 0) {
log.info("新增成功");
return new CommonResult(200, "成功了", i);
} else {
log.info("新增失败");
return new CommonResult(400, "插入数据失败");
}
}
@GetMapping(value = "/getPayment")
public CommonResult getPayment(@RequestParam(value = "id") Long id) {
log.info("传入的数据为:" + id);
Payment payment = paymentService.getPayment(id);
if (payment != null) {
log.info("查询成功");
return new CommonResult(200, "成功:", payment.toString());
} else {
log.info("查询失败");
return new CommonResult(400, id + "没找到");
}
}
}
- 测试(项目多了之后用 Run Dashboard 界面操作程序)
//测试 1
localhost:8001/getPayment?id=1. get
{
"code": 200,
"message": "成功:",
"data": "Payment(id=1, serial=方法)"
}
------------------------------------
//测试 2
localhost:8001/create. post
{
"serial":"李四"
}
{
"code": 200,
"message": "成功了",
"data": 1
}
- 小总结(建Module、改POM、写YML、主启动、业务类)
b:热部署 Devtools:(代码修改,自动重启,只可以开发阶段使用,生产删掉)
- 添加 devtools
org.springframework.boot
spring-boot-devtools
runtime
true
- 添加 plugin 到 pom.xml
cloud2020
org.springframework.boot
spring-boot-maven-plugin
true
true
- 更新:build (绿的锤子)
ctrl + atl + shift + /:
- 重启 IDEA
c:cloud-consumer-order80:微服务消费者订单 Model 模块:
- 建module(cloud-consumer-order-80)
- 改 pom:
cloud2020
com.atguigu.springcloud
1.0-SNAPSHOT
4.0.0
cloud-consumer-order-80
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
- 写 yml:
spring:
application:
name: cloud-consumer-order-80
redis:
port: 80
- 主启动:
@SpringBootApplication
public class MySpringBootApplication {
public static void main(String[] args) {
SpringApplication.run(MySpringBootApplication.class, args);
}
}
- 业务类:
1. entities(PayEntiry、CommotResult)
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable {
private Long id;
private String serial;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult {
private Integer code;
private String message;
private T data;
public CommonResult(Integer code, String message) {
this.code = code;
this.message = message;
}
}
2.首说 RestTemplate (封装 调用接口方式的 工具类 )
/**
* 1 是什么:
* RestTemplate 提供了多种,便捷访问远程 HTTP 服务的方法。
* 是一种,简单快捷的访问 restful 服务模版类,
* 是 Spring 提供的 用于访问 Rest 服务的 客户端模版工具集。
*/
/**
* 2 官网及使用:
*
* 使用:( url,requestMap,ResponseBean.class ) 这三个参数分别代表:
* REST 请求地址、请求参数、HTTP响应转换 被转换成的类型对象。
* /
3.Config 配置 RestTemplate
@Configuration
public class ApplicationContextConfig {
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}
4.Controller
@Slf4j
@RestController
public class OrderController {
public static final String PAYMENT_URL = "http://localhost:8001";
@Autowired
private RestTemplate restTemplate;
/**
* 调用 8001 ,进行支付
*/
@PostMapping(value = "/payment/create")
public CommonResult create(@RequestBody Payment payment) {
log.info("传入的数据为 :" + payment);
CommonResult commonResult
= restTemplate.postForObject(PAYMENT_URL + "/create", payment, CommonResult.class);
log.info("远程调用 得到的数据为 : " + commonResult);
return commonResult;
}
@GetMapping(value = "/getPayment/get")
public CommonResult getPayment(@RequestParam(value = "id") Long id) {
log.info("传入的数据为 :" + id);
CommonResult paymentCommonResult
= restTemplate.getForObject(PAYMENT_URL + "/getPayment?id=" + id, CommonResult.class);
log.info("远程调用 得到的数据为 : " + paymentCommonResult);
return paymentCommonResult;
}
}
- 测试:
1.多项目启动,调整出 Run Dashboard(service):
d:工程重构:
- 观察问题:系统中有重复的部分,进行重构。
- 新建module:cloud-api-commons
- POM:
org.springframework.boot
spring-boot-devtools
runtime
true
org.projectlombok
lombok
true
cn.hutool
hutool-all
5.1.0
- entities:
1.将 entities.Payment 和 result.Common.Result 移动到 Common module 中。
- maven 命令 clean install:
- 订单 80 和 支付 8001 分别改造:然后测试
1.将子 module 中的删除。
2.改各自的 pom 文件,引入依赖。
// 在 总 pom 中引入 common ,规定版本
// 规定 引入 common 文件 的版本
com.atguigu.springcloud
cloud-api-commons
1.0-SNAPSHOT
// 子 module 引入 common 依赖(就不用写版本号了)
com.atguigu.springcloud
cloud-api-commons
2)目前工程详图: