1. 项目搭建
1.1 父工程
- New Project - maven工程 - create from archetype: maven-archetype-site
- 聚合总父工程名字
- Maven选版本
- 工程名字
- 字符编码 - Settings - File encoding

- 注解生效激活 - Settings - Annotation Processors

- Java编译版本选8

File Type过滤 - Settings - File Type
1.2 父工程pom
删除srv目录
- pom文件中packaging设为pom
- 统一管理jar包版本 ```xml <?xml version=”1.0” encoding=”UTF-8”?>
<a name="V5osu"></a>## 1.3 maven工程细节<a name="e0pwi"></a>### (1) Maven中的DependencyManagement和DependenciesMaven使用dependencyManagement元素来提供了一种管理依赖版本号的方式。<br />通常会在一个组织或者项目的最顶层的父POM中看到dependencyManagement元素。<br />使用pom.xml中的dependencyManagement元素能让所有在子项目中引用个依赖而不用显式的列出版本量。a<br />Maven会沿着父子层次向上走,直到找到一个拥有dependencyManagement元素的项目,然后它就会使用这个dependencyManagement元素中指定的版本号。```xml<dependencyManagement><dependencies><dependency><groupId>mysq1</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.2</version></dependency><dependencies></dependencyManagement>
然后在子项目里就可以添加mysql-connector时可以不指定版本号,例如:
<dependencies>
<dependency>
<groupId>mysq1</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
这样做的好处就是:如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要一个一个子项目的修改;另外如果某个子项目需要另外的一个版本,只需要声明version就可。
注意:
- dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。
- 如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且version和scope都读取自父pom。
如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
(2) maven工程跳过单元测试
(3)maven工程发布
父工程创建完成执行mvn:insall将父工程发布到仓库方便子工程继承
2. Rest微服务工程搭建
2.1 构建步骤
(1) Cloud-provider-payment8001 微服务提供者Module模块
1.建module>创建完成后回到父工程查看pom文件变化

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.业务类
- 建表
- entity
- Dao
推荐使用Mapper注解 - Service
- Controller
(2) 热部署
1.添加依赖到模块pom文件
2.添加插件到父工程pom<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency>
3.开启自动编译<plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <addResources>true</addResources> </configuration> </plugin>
4.更新值
键入Ctrl + Shift + Alt + / ,打开Registry,勾选:
- compiler.automake.allow.when.app.running
- actionSystem.assertFocusAccessFromEdt
(3) cloud-consumer-order80
(4) cloud-api-commons
观察cloud-consumer-order80与cloud-provider-payment8001两工程有重复代码(entities包下的实体),重构
- 创建模块后,将相同的代码(entities)移至commons
- common项目执行maven命令clean,install打包
- 将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);
}
}

