1. 项目搭建

1.1 父工程

  1. New Project - maven工程 - create from archetype: maven-archetype-site
  2. 聚合总父工程名字
  3. Maven选版本
  4. 工程名字
  5. 字符编码 - Settings - File encoding
    image.png
  6. 注解生效激活 - Settings - Annotation Processors
    image.png
  7. Java编译版本选8
    image.png
  8. File Type过滤 - Settings - File Type
    image.png

    1.2 父工程pom

  9. 删除srv目录

  10. pom文件中packaging设为pom
  11. 统一管理jar包版本 ```xml <?xml version=”1.0” encoding=”UTF-8”?>
4.0.0
com.lun LearnCloud 1.0.0-SNAPSHOT pom UTF-8 1.8 1.8 4.12 1.2.17 1.16.18 5.1.47 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 ${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 ${lombok.version} true org.springframework.boot spring-boot-maven-plugin true true
  1. <a name="V5osu"></a>
  2. ## 1.3 maven工程细节
  3. <a name="e0pwi"></a>
  4. ### (1) Maven中的DependencyManagement和Dependencies
  5. Maven使用dependencyManagement元素来提供了一种管理依赖版本号的方式。<br />通常会在一个组织或者项目的最顶层的父POM中看到dependencyManagement元素。<br />使用pom.xml中的dependencyManagement元素能让所有在子项目中引用个依赖而不用显式的列出版本量。a<br />Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用这个dependencyManagement元素中指定的版本号。
  6. ```xml
  7. <dependencyManagement>
  8. <dependencies>
  9. <dependency>
  10. <groupId>mysq1</groupId>
  11. <artifactId>mysql-connector-java</artifactId>
  12. <version>5.1.2</version>
  13. </dependency>
  14. <dependencies>
  15. </dependencyManagement>

然后在子项目里就可以添加mysql-connector时可以不指定版本号,例如:

<dependencies>
    <dependency>
    <groupId>mysq1</groupId>
    <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

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

  1. dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。
  2. 如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom。
  3. 如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。

    (2) maven工程跳过单元测试

    image.png

    (3)maven工程发布

    父工程创建完成执行mvn:insall将父工程发布到仓库方便子工程继承

    2. Rest微服务工程搭建

    2.1 构建步骤

    (1) Cloud-provider-payment8001 微服务提供者Module模块

    1.建module>创建完成后回到父工程查看pom文件变化
    image.png
    2.改pom ```xml <?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">
    

     <artifactId>cloud2021</artifactId>
     <groupId>com.atguigu.springcloud</groupId>
     <version>1.0-SNAPSHOT</version>
    

    4.0.0 cloud-provider-payment8001 org.springframework.cloud spring-cloud-starter-zipkin org.springframework.cloud spring-cloud-starter-netflix-eureka-client 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 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

**3.添加配置文件application.yml**
```yaml
server:
  port: 8001

spring:
  application:
    name: cloud-payment-service
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
    driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包
    url: jdbc:mysql://localhost:3306/my?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: root

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

4.创建主启动类

package com.atguigu.springcloud;

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

@SpringBootApplication
public class PaymentMain8001 {

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

5.业务类

  1. 建表
  2. entity
  3. Dao
    推荐使用Mapper注解
  4. Service
  5. Controller

    (2) 热部署

    1.添加依赖到模块pom文件
    <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-devtools</artifactId>
     <scope>runtime</scope>
     <optional>true</optional>
    </dependency>
    
    2.添加插件到父工程pom
    <plugin>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-maven-plugin</artifactId>
     <configuration>
         <fork>true</fork>
         <addResources>true</addResources>
     </configuration>
    </plugin>
    
    3.开启自动编译
    image.png
    4.更新值
    键入Ctrl + Shift + Alt + / ,打开Registry,勾选:
  • compiler.automake.allow.when.app.running
  • actionSystem.assertFocusAccessFromEdt

image.png
5.重启idea

(3) cloud-consumer-order80

如(1)

(4) cloud-api-commons

观察cloud-consumer-order80与cloud-provider-payment8001两工程有重复代码(entities包下的实体),重构

  1. 创建模块后,将相同的代码(entities)移至commons
  2. common项目执行maven命令clean,install打包
  3. 将common依赖导入两工程 ```xml com.lun.springcloud cloud-api-commons ${project.version}

4. 将两工程共同代码(entities)移除
4. 测试
<a name="1nMjM"></a>
## 2.2 RestTemplate
两个工程之间互相调用使用RestTemplate
<a name="DqAdL"></a>
### (1)配置
```java
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ApplicationContextConfig {

    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

(2)使用

import org.springframework.web.client.RestTemplate;

@RestController
@Slf4j
public class OrderController {

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

    @Autowired
    private RestTemplate restTemplate;

    @PostMapping(value = "/consumer/payment/create")
    public CommonResult<Payment> create(Payment payment){
        return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment, CommonResult.class);
    }

}

3. 完整工程