2、Rest微服务工程构建
2.1、构建步骤
2.1.1、cloud-provider-payment8001微服务提供者支付Module模块
-
建cloud-provider-payment8001
创建完成后请回到父工程查看pom文件变化
-
改POM
<?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.likun.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-provider-payment8001</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!--mysql-connector-java--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <!--jdbc--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
-
写YML
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驱动包 com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/db2021?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: 123 mybatis: mapperLocations: classpath:mapper/*.xml type-aliases-package: com.likun.springcloud.entities # 所有Entity别名类所在包
-
主启动
package com.likun.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @author likun * @create 2021-04-25 23:44 */ @SpringBootApplication public class PaymentMain8001 { public static void main(String[] args) { SpringApplication.run(PaymentMain8001.class, args); } }
-
业务类
-
建表SQL
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
-
entities
CommonResult类:
package com.likun.springcloud.entities; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; /** * @author likun * @create 2021-04-26 0:09 */ @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); } }
Payment类:
package com.likun.springcloud.entities; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; /** * @author likun * @create 2021-04-26 0:04 */ @Data @AllArgsConstructor @NoArgsConstructor public class Payment implements Serializable { private long id; private String serial; }
-
dao
package com.likun.springcloud.dao; import com.likun.springcloud.entities.Payment; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * @author likun * @create 2021-04-26 0:18 */ @Mapper public interface PaymentDao { int creat(Payment payment); Payment getPaymentById(@Param("id")long id); }
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.likun.springcloud.dao.PaymentDao"> <resultMap id="BaseResultMap" type="com.likun.springcloud.entities.Payment"> <id column="id" property="id" jdbcType="BIGINT"/> <result column="serial" property="serial" jdbcType="VARCHAR"/> </resultMap> <insert id="creat" parameterType="Payment" useGeneratedKeys="true" keyProperty="id"> insert into payment(serial) values (#{serial}); </insert> <select id="getPaymentById" parameterType="long" resultMap="BaseResultMap"> select * from payment where id = #{id}; </select> </mapper>
-
service
PaymentService接口:
package com.likun.springcloud.service; import com.likun.springcloud.entities.Payment; import org.apache.ibatis.annotations.Param; /** * @author likun * @create 2021-04-26 0:55 */ public interface PaymentService { int creat(Payment payment); Payment getPaymentById(@Param("id")long id); }
PaymentServiceImpl实现类:
package com.likun.springcloud.service.impl; import com.likun.springcloud.dao.PaymentDao; import com.likun.springcloud.entities.Payment; import com.likun.springcloud.service.PaymentService; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * @author likun * @create 2021-04-26 0:58 */ @Service public class PaymentServiceImpl implements PaymentService { @Resource private PaymentDao paymentDao; @Override public int creat(Payment payment) { return paymentDao.creat(payment); } @Override public Payment getPaymentById(long id) { return paymentDao.getPaymentById(id); } }
-
-
controller
package com.likun.springcloud.controller; import com.likun.springcloud.entities.CommonResult; import com.likun.springcloud.entities.Payment; import com.likun.springcloud.service.PaymentService; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; /** * @author likun * @create 2021-04-26 1:12 */ @RestController @Slf4j public class PaymentController { @Resource private PaymentService paymentService; @PostMapping("/creat/payment") public CommonResult creat(Payment payment) { int result = paymentService.creat(payment); log.info("*******插入的结果:" + result); if (result > 0) { return new CommonResult(200, "插入成功", result); } else { return new CommonResult(444, "插入失败", result); } } @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, "查询失败", null); } } }
-
-
测试
- postman模拟post
-
浏览器模拟get
-
运行(坑,后面填)
通过修改idea的workspace.xml的方式来快速打开Run Dashboard窗口
开启Run DashBoard
-
工程目录下.idea文件
<option name="configurationTypes"> <set> <option value="SpringBootApplicationConfigurationType" /> </set> </option>
可能由于idea版本不同,需要关闭重启
-
-
小总结
- 建module
- 改POM
- 写YML
- 主启动
- 业务类
2.1.2、热部署Devtools
(个人不建议开,比较考验电脑性能,会卡死)
-
Adding devtools to your project
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency>
-
Adding plugin to your pom.xml
下段配置粘贴进聚合父类总工程的pom.xml里
<build> <finalName>你自己的工程名字</finalName> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <fork>true</fork> <addResources>true</addResources> </configuration> </plugin> </plugins> </build>
-
Enabling automatic build
-
Update the value of
- 重启IDEA
2.1.3、cloud-consumer-order80微服务消费者订单Module模块
建cloud-consumer-order80
-
改POM(注掉与数据库相关的依赖)
<?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.likun.springcloud</groupId> <version>1.0-SNAPSHOT</version> </parent> <modelVersion>4.0.0</modelVersion> <artifactId>cloud-consumer-order80</artifactId> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- <dependency>--> <!-- <groupId>org.mybatis.spring.boot</groupId>--> <!-- <artifactId>mybatis-spring-boot-starter</artifactId>--> <!-- </dependency>--> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.10</version> </dependency> <!--mysql-connector-java--> <!-- <dependency>--> <!-- <groupId>mysql</groupId>--> <!-- <artifactId>mysql-connector-java</artifactId>--> <!-- </dependency>--> <!--jdbc--> <!-- <dependency>--> <!-- <groupId>org.springframework.boot</groupId>--> <!-- <artifactId>spring-boot-starter-jdbc</artifactId>--> <!-- </dependency>--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> </project>
-
写YML
server: port: 80
-
主启动(注:父pom中有druid-spring-boot-starter 会再次扫描数据源,所以也要排除druid)
package com.springcloud; import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; /** * @author likun * @create 2021-04-26 17:26 */ @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class, DruidDataSourceAutoConfigure.class,}) public class OrderMain80 { public static void main(String[] args) { SpringApplication.run(OrderMain80.class, args); } }
-
业务类
-
entities 同cloud-provider-payment8001的entities
-
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配置类
ApplicationContextConfig
package com.springcloud.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.web.client.RestTemplate; /** * @author likun * @create 2021-04-26 17:34 */ @Configuration public class ApplicationContextConfig { @Bean public RestTemplate getRestTemplate() { return new RestTemplate(); } } //@Bean相当于applicationContext.xml的<bean id="" class="">
-
controller
package com.springcloud.controller; import com.springcloud.entities.CommonResult; import com.springcloud.entities.Payment; import lombok.extern.slf4j.Slf4j; 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; import javax.annotation.Resource; /** * @author likun * @create 2021-04-26 17:27 */ @RestController @Slf4j public class OderController { public static final String PAYMENT_URL = "http://localhost:8001"; @Resource RestTemplate restTemplate; @GetMapping("/consumer/payment/creat") public CommonResult<Payment> creatPayment(Payment payment) { return restTemplate.postForObject(PAYMENT_URL + "/payment/creat", 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); } }
-
-
测试
查询
添加
但是!!!
不要忘记@RequestBody注解
@PostMapping("/payment/creat") public CommonResult creat(@RequestBody Payment payment) { int result = paymentService.creat(payment); log.info("*******插入的结果:" + result); if (result > 0) { return new CommonResult(200, "插入成功", result); } else { return new CommonResult(444, "插入失败", result); } }
测试
结果:
(^-^)V
2.1.4、工程重构
-
观察问题
系统中有重复部分,重构
-
新建
cloud-api-commons
-
POM
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.1.0</version> </dependency> </dependencies>
-
maven命令clean install
-
订单80和支付8001分别改造
-
删除各自的原先有过的entities文件夹
-
80和8001的pom中引入自定义jar包
<dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity --> <groupId>com.likun.springcloud</groupId> <artifactId>cloud-api-commons</artifactId> <version>${project.version}</version> </dependency>
-
(完)