约定 > 配置 > 编码
1.1 IDEA新建project工作空间 1.1.1 微服务cloud整体聚合父工程Project- New Project
- 聚合总父工程名字+项目名称
- Maven选版本
- 字符编码
- 注解生效激活
- java编译版本选8
- File Type过滤
过滤掉无用的文件(处理后只是没有显示,但实际存在.)
1.1.2 父工程POM1.1.3 Maven工程落地细节复习4.0.0 com.rg.springcloud cloud2021 1.0-SNAPSHOT pom UTF-8 1.8 1.8 4.13 1.2.17 1.18.20 5.1.47 1.1.17 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 ${druid.version} org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis.spring.boot.version} junit junit ${junit.version} log4j log4j ${log4j.version} org.projectlombok lombok 1.18.20 true org.springframework.boot spring-boot-maven-plugin true true
- Maven中的DependencyManagement和Dependencies区别
DependencyManagement
Maven 使用dependencyManagement 元素来提供了一种管理依赖版本号的方式。
通常会在一个组织或者项目的最顶层的父POM 中看到dependencyManagement 元素。
使用pom.xml 中的dependencyManagement 元素能让所有在子项目中引用一个依赖而不用显式的列出版本号。
Maven 会沿着父子层次向上走,直到找到一个拥有dependencyManagement 元素的项目,然后它就会使用这个dependencyManagement 元素中指定的版本号。
这样做的好处就是:如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要一个一个子项目的修改 ;另外如果某个子项目需要另外的一个版本,只需要声明version就可。
-
**dependencyManagement里只是声明依赖,并不实现引入**,因此子项目需要显示的声明需要用的依赖。
-
如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本, 才会从父项目中继承该项,并且version和scope都读取自父pom;
-
如果**子项目中指定了版本号,那么会使用子项目中指定的jar版本**。
- maven中跳过单元测试
1.配置
org.apache.maven.plugins maven-surefire-plugin true
2 IDEA工具支持(推荐)
1.2 Rest微服务工程构建 1.2.1 cloud-provider-payment8001微服务生产者支付Module模块- 建cloud-provider-payment8001
创建完成后请回到父工程查看pom文件变化:
- 改POM
cloud2021 com.rg.springcloud 1.0-SNAPSHOT 4.0.0 cloud-provider-payment8001 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.17 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-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 186259
mybatis:
mapperLocations: classpath:mapper/*.xml # 配置Mapper所有接口配置文件的位置.
type-aliases-package: com.rg.springcloud.entities # 所有Entity别名类所在包
- 主启动
@SpringBootApplication
public class PaymentMain8001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain8001.class,args);
}
}
-
业务类
-
- 建表
CREATE TABLE `payment` ( `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID', `serial` varchar(200) DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
- pojo实体类
主实体Payment
@Data @AllArgsConstructor @NoArgsConstructor public class Payment implements Serializable { private Long id; private String serial; }Json封装体CommonResult
@Data @AllArgsConstructor @NoArgsConstructor public class CommonResult
{ private Integer code;//状态码 private String message;//状态信息 private T data;//返回的json数据 public CommonResult(Integer code,String message){//失败时调用的方法. this(code,message,null); } } - DAO层
PaymentDao
@Mapper @Repository public interface PaymentDao { public int create(Payment payment); public Payment getPaymentById(@Param("id") Long id); }PaymentMapper.xml
INSERT INTO payment(serial) VALUES(#{serial}) SELECT * FROM payment WHERe id = #{id} - service层
public interface PaymentService { public int create(Payment payment); public Payment getPaymentById(@Param("id") Long id); }@Service public class PaymentServiceImpl implements PaymentService { @Autowired private PaymentDao paymentDao; @Override public int create(Payment payment) { return paymentDao.create(payment); } @Override public Payment getPaymentById(Long id) { return paymentDao.getPaymentById(id); } }- controller层
@Slf4j @RestController public class PaymentController { @Resource private PaymentService paymentService; @PostMapping(value = "/payment/create") public CommonResult create(Payment payment){ // ??? 为啥这里不需要@RequestBody呢?? 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 getPaymentById(@PathVariable("id") Long id) { Payment payment = paymentService.getPaymentById(id); log.info("*****查询结构:{}", payment); if(payment!=null){ return new CommonResult(200, "查询成功", payment); }else{ return new CommonResult(444, "没有对应记录,查询ID:" + id); } } } -
测试
- 小结
SpringBoot创建模块的五个步骤:
1.建module
2.改POM
3.写YML
4.主启动
5.业务类
1.2.2 热部署Devtools1.Adding devtools to your project
org.springframework.boot spring-boot-devtools runtime true
2.Adding plugin to your pom.xml
下段配置我们粘贴进聚合父类总工程的pom.xml里
cloud2021 org.springframework.boot spring-boot-maven-plugin true true
3.Enabling automatic build
4.Update the value of
5.重启IDEA
6.进行测试
1.2.3 cloud-consumer-order80:微服务消费者订单Module模块- 建cloud-consumer-order80
- 改POM
cloud2021 com.rg.springcloud 1.0-SNAPSHOT 4.0.0 cloud-consumer-order80 com.rg.springcloud cloud-api-commons ${project.version} 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
server: port: 80
- 主启动
@SpringBootApplication
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class,args);
}
}
-
业务类
- pojo
同cloud-provider-payment8001模块的pojo
- 首说RestTemplate
RestTemplate提供了多种便捷访问远程Http服务的方法,
是一种简单便捷的访问restful服务模板类,是Spring提供的==用于访问Rest服务==的客户端模板工具集官网:https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html
使用:
使用restTemplate访问restful接口非常的简单粗暴无脑。
(url, requestMap, ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。- config配置类
@Configuration public class ApplicationContextConfig { //向SpringBoot容器中加入该组件 @Bean public RestTemplate restTemplate(){ return new RestTemplate(); } }4.controller
@RestController
@Slf4j
public class OrderController {
public static final String PAYMENT_URL = "http://localhost:8001";
@Resource
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/create")客户端用浏览器是get请求,但是底层实质发送post调用服务端8001
public CommonResult create(Payment payment){
return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment,CommonResult.class);
}
@GetMapping("/consumer/payment/get/{id}")
public CommonResult getPayment(@PathVariable("id") Long id){
return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
}
}
- 测试
备注:
使用postman或者rest client测试报出Required request body is missing 错误(而在其他场合发送post请求时根据需要进行添加该注解.)
解决:把 @RequestBody去掉
- 观察问题
系统中有重复部分,所以应该重构
- 新建 cloud-api-commons
- 改POM
cloud2021 com.rg.springcloud 1.0-SNAPSHOT 4.0.0 cloud-api-commons org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true cn.hutool hutool-all 5.1.0
- pojo
添加Payment实体和CommonResult通用封装类
- maven命令clean install
- 订单80和支付8001分别改造
删除各自的原先有过的entities文件夹==>各自粘贴POM内容
1.2.5 目前工程样图com.rg.springcloud cloud-api-commons ${project.version}



