SpringCloud学习记录(1)-父工程与子模块创建及子模块调用
2020-08-07 22:53
309 查看
创建父工程,导入依赖
选择创建maven工程,步骤如下:
修改父工程的
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 https://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.atguigu.springcloud</groupId> <artifactId>cloud2020</artifactId> <version>1.0-SNAPSHOT</version> <packaging>pom</packaging> <modules> <module>cloud-provider-payment8001</module> <module>cloud-consumer-order80</module> </modules> <!-- 统一管理jar包版本 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8</maven.compiler.source> <maven.compiler.target>1.8</maven.compiler.target> <junit.version>4.12</junit.version> <log4j.version>1.2.17</log4j.version> <lombok.version>1.16.18</lombok.version> <mysql.version>8.0.16</mysql.version> <druid.version>1.1.16</druid.version> <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version> </properties> <!-- 子模块继承之后,提供作用:锁定版本+子module不用写groupId和version --> <dependencyManagement> <dependencies> <!--spring boot 2.2.2--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>2.2.2.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <!--spring cloud Hoxton.SR1--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Hoxton.SR1</version> <type>pom</type> <scope>import</scope> </dependency> <!--spring cloud alibaba 2.1.0.RELEASE--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.1.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql.version}</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>${druid.version}</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis.spring.boot.version}</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j.version}</version> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> <optional>true</optional> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <addResources>true</addResources> </configuration> </plugin> </plugins> </build> </project>
- 关于
SpringCloud
版本问题,根据官方文档推荐,SpringCloud H版
,SpringBoot 2.2.2.RELEASE
,其他依赖例如MySQL请根据自己需要,导入合适的
创建支付子Module,配置pom.xml,创建yml,修改配置
创建module步骤,后不再重复
导入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"> <parent> <artifactId>cloud2020</artifactId> <groupId>com.atguigu.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-provider-payment8001</artifactId> <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.16</version> </dependency> <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-jdbc --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
- 注:关于子工程的依赖版本问题,项目运行中,会先解析父工程的
pom.xml
,读取<dependencyManagement>
中的依赖版本,然后再解析子工程的pom.xml
,如果子工程的<dependency>
有写<version>
,就按父工程的依赖版本,如果有写,则按子工程所写的版本
创建yml配置文件,添加配置
-
在resources目录下创建
application.yml
文件,修改配置,数据库连接请按自己需要修改,热部署开启方法自行百度,目前使用的是实体类,后看能否使用Map代替实体类,请注意关注版本更新server: port: 8001 spring: application: name: cloud-payment-service devtools: restart: enabled: true datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/cloudtest?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: jy20wyx. mybatis: mapperLocations: classpath:mapper/*.xml type-aliases-package: com.atguigu.springcloud.entities
创建业务类类
- 完成创建后,工程目录
-
创建主启动类
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); } }
-
创建Payment实体类,其中
@AllArgsConstructor
为引入全参构造,@NoArgsConstructor
为无参构造,@Date
为引入get/set/toString
等方法package com.atguigu.springcloud.domain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class Payment { private Long id; private String serial; }
-
创建
CommonResult
类,其中,code为返回的状态,200 – 成功,444 – 失败,与前端开发人员约定,message为返回前端信息,data为返回数据package com.atguigu.springcloud.domain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @Data @AllArgsConstructor @NoArgsConstructor public class CommonResult<T> { private Integer code; private String message; private T data; public CommonResult(Integer code, String message) { this(code, message, null); } }
-
在resources目录下创建mapper文件夹,在文件夹里创建
paymentMapper.xml
,具体类位置等信息请按自己实际情况来<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.atguigu.springcloud.mapper.PaymentMapper"> <insert id="create" parameterType="com.atguigu.springcloud.domain.Payment" useGeneratedKeys="true" keyProperty="id"> insert into payment(serial) values(${serial}); </insert> <resultMap id="BaseResultMap" type="com.atguigu.springcloud.domain.Payment"> <id column="id" property="id" jdbcType="BIGINT"></id> <id column="serial" property="serial" jdbcType="VARCHAR"></id> </resultMap> <select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap"> select * from payment where id=#{id} </select> </mapper>
-
数据库创建,就一张表,表名payment,数据库名与yml文件连接名字一致
-
创建
paymentMapper
接口类package com.atguigu.springcloud.mapper; import com.atguigu.springcloud.domain.Payment; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; @Mapper public interface PaymentMapper { public int create(Payment payment); public Payment getPaymentById(@Param("id") Long id); }
-
创建
paymentService
服务类接口以及其实体类paymentServiceImpl
package com.atguigu.springcloud.service; import com.atguigu.springcloud.domain.Payment; public interface PaymentService { public int create(Payment payment); public Payment getPaymentById(Long id); }
package com.atguigu.springcloud.service.impl; import com.atguigu.springcloud.domain.Payment; import com.atguigu.springcloud.mapper.PaymentMapper; import com.atguigu.springcloud.service.PaymentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class PaymentServiceImpl implements PaymentService { @Autowired private PaymentMapper paymentMapper; @Override public int create(Payment payment) { return paymentMapper.create(payment); } @Override public Payment getPaymentById(Long id) { return paymentMapper.getPaymentById(id); } }
-
控制层
paymentController
创建package com.atguigu.springcloud.controller; import com.atguigu.springcloud.domain.CommonResult; import com.atguigu.springcloud.domain.Payment; import com.atguigu.springcloud.service.PaymentService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; @Slf4j @RestController public class PaymentController { @Autowired private PaymentService paymentService; @PostMapping("/payment/create") public CommonResult create(@RequestBody Payment payment) { int result = paymentService.create(payment); log.info("******插入结果:"+result); if (result > 0) { return new CommonResult(200,"插入数据库成功!", result); } else { return new CommonResult(444,"插入数据库失败!"); } } @GetMapping("/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); } } }
创建订单子工程,用于调用支付子工程
-
同样操作建立cloud-consumer-order80子工程,因只做调用,所以只有控制层,其项目目录如下:
-
pox.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"> <parent> <artifactId>cloud2020</artifactId> <groupId>com.atguigu.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-consumer-order80</artifactId> <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-devtools --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
-
ApplicationContextConfig类,传统情况下在java代码里访问restful服务,一般使用
Apache
的HttpClient
。不过此种方法使用起来太过繁琐。spring提供了一种简单便捷的模板类来进行操作,这就是RestTemplate
。package com.atguigu.springcloud.config; 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(); } }
-
package com.atguigu.springcloud.config; 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(); } }
-
将cloud-privoder-payment8001中的两个实体类复制到本子模块中
-
新建
OrderController
类,使用RestTemplate
发送请求到8001
端口,调用方法package com.atguigu.springcloud.controller; import com.atguigu.springcloud.domain.CommonResult; import com.atguigu.springcloud.domain.Payment; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController @Slf4j public class OrderController { public static final String PAYMENT_URL = "http://localhost:8001"; @Autowired private RestTemplate restTemplate; @GetMapping("/consumer/payment/create") public CommonResult<Payment> create(Payment payment) { return restTemplate.postForObject(PAYMENT_URL+"/payment/create", payment, CommonResult.class); } @GetMapping("/consumer/payment/get/{id}") public CommonResult<Payment> getPayment(@PathVariable("id") Long id) { log.info("id:"+id); return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id, CommonResult.class); } }
-
使用8001端口访问效果
- 使用80端口(自动隐藏),端口访问
创建子Module,重构工程
- 观察项目结构,两个子Module有重复代码——domain实体类,所以需要整合到一个新的Module,在其他Module中使用pom.xml依赖直接引入,步骤如下(建Module步骤不重复):
项目结构
-
将
CommonResult
和Payment
复制到此Module,在其他Module中删除domain包,进入Maven页,选择此Module,将其clean
再install
,再其余Module中的pom.xml
中添加依赖,具体如下:<dependency> <groupId>com.atguigu.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency>
创建子Module,重构工程
-
观察项目结构,两个子Module有重复代码——domain实体类,所以需要整合到一个新的Module,在其他Module中使用pom.xml依赖直接引入,步骤如下(建Module步骤不重复):
项目结构
-
将
CommonResult
和Payment
复制到此Module,在其他Module中删除domain包,进入Maven页,选择此Module,将其clean
再install
,再其余Module中的pom.xml
中添加依赖,具体如下:<dependency> <groupId>com.atguigu.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency>
- 将项目重启即可
相关文章推荐
- SpringAOP注解方式记录操作日志(操作模块,操作功能,调用方法,主键信息等)支持多笔操作时记录
- SpringCloud 学习记录(二):断路器(hystrix)
- Spring入门学习——调用一个实例工厂方法创建Bean
- springcloud学习记录,第一篇Eureka
- SpringCloud 学习记录(一):服务注册与发现(eureka+feign)
- Spring Cloud 2天速学学习记录
- Springcloud_公用模块(业务层)service工程下ad-common
- Spring Cloud 学习记录及实践(1)-DS 服务注册中心
- Spring Boot学习之旅创建第一个工程
- spring cloud学习第一步:创建一个可运行的spring boot项目
- Spring cloud踩坑记录之使用feignclient远程调用服务404的方法
- Spring----学习(8)----调用静态工厂方法创建 Bean && 调用实例工厂方法创建 Bean
- Spring Cloud Gateway 部分学习记录
- Kite的学习历程SpringCloud之OpenFeign的客户端的创建使用
- 学习Spring(二) 调用静态工厂方法创建Bean
- Spring-Cloud学习之路-问题记录
- cocos2d-x学习记录C++,环境搭建,创建第一个工程
- TI-TM4C123GXL Launchpad学习记录(二):CCS创建工程及相关设置
- Spring Cloud-STS创建工程 Maven报错
- 代码学习与实践 (一):Spring Boot 多模块项目创建与配置 注册 登录