SpringCloud|SpringCloud-Rest微服务工程的构建


目录
一、微服务架构总览
二、创建Rest风格的微服务工程
2.1 创建微服务父工程
2.1.1 使用maven新建父工程
2.1.2 字符编码设置
2.1.3 修改注解设置
2.1.4 确保java编译版本为8
2.1.5 POM设置
2.1.6 maven设置
2.2 创建微服务提供者支付模块
2.2.1 创建maven子工程
2.2.2 改POM
2.2.3 创建YML
2.2.4 主启动类
2.2.5 业务类
2.2.6 测试
2.3 创建微服务消费者订单模块
2.3.1 创建maven子工程
2.3.2 改POM
2.3.3 写YML
2.3.4 主启动类
2.3.5 业务类
2.3.6 测试
2.4 重构项目-公共类的抽取
2.4.1 新建一个maven项目
2.4.2 改POM
2.4.3 entities
2.4.4 执行maven命令-clean、install
2.4.5 Order、Payment模块的简化

一、微服务架构总览 SpringCloud|SpringCloud-Rest微服务工程的构建
文章图片

上面是几年前的微服务常用的组件,最近几年springcloudAlibaba正逐渐成为主流。下面列出了最近较流行的微服务架构,其亮点是新增加了若干Alibaba的微服务组件,如nacos、sentinel。
SpringCloud|SpringCloud-Rest微服务工程的构建
文章图片

二、创建Rest风格的微服务工程 2.1 创建微服务父工程 2.1.1 使用maven新建父工程
SpringCloud|SpringCloud-Rest微服务工程的构建
文章图片

SpringCloud|SpringCloud-Rest微服务工程的构建
文章图片

2.1.2 字符编码设置
SpringCloud|SpringCloud-Rest微服务工程的构建
文章图片

2.1.3 修改注解设置
SpringCloud|SpringCloud-Rest微服务工程的构建
文章图片

2.1.4 确保java编译版本为8
SpringCloud|SpringCloud-Rest微服务工程的构建
文章图片

2.1.5 POM设置
这里有些参数会报错,不用理会。

com.atguigu.springcloud mscloud03 1.0-SNAPSHOTpom UTF-8 8 8 4.12 1.18.10 1.2.17 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 2.5.12 true true

2.1.6 maven设置
关闭 test 操作
SpringCloud|SpringCloud-Rest微服务工程的构建
文章图片

最后执行 install 操作,将父工程发布到仓库方便子工程继承
2.2 创建微服务提供者支付模块 2.2.1 创建maven子工程
【SpringCloud|SpringCloud-Rest微服务工程的构建】在父工程的基础上创建一个maven子工程,名字:cloud-provider-payment8001
SpringCloud|SpringCloud-Rest微服务工程的构建
文章图片

2.2.2 改POM
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

2.2.3 创建YML
注意修改数据库名字、用户名、密码
# 端口号 server: port: 8001spring: 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/db2019?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: 123456mybatis: mapperLocations: classpath:mapper/*.xml type-aliases-package: com.atguigu.springcloud.entities# 所有Entity别名类所在包

2.2.4 主启动类
@SpringBootApplication public class PaymentMain8001 { public static void main(String[] args) { SpringApplication.run(PaymentMain8001.class,args); } }

注意:我的idea默认不会识别出springboot的配置和配置文件。自定义主启动类时类名上会有波浪线提示,按照提示在工程中添加Spring的module即可。
2.2.5 业务类
1. 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

2.entities
@Data @AllArgsConstructor @NoArgsConstructor public class Payment implements Serializable { private Long id; private String serial; }

@Data @AllArgsConstructor @NoArgsConstructor public class CommonResult { private Integer code; private Stringmessage; private T data; public CommonResult(Integer code, String message) { this(code,message,null); } }

Payment是订单实体类,CommonResult是用于统一响应请求的。
3. mapper接口
@Mapper//import org.apache.ibatis.annotations.Mapper; public interface PaymentDao { public int create(Payment payment); public Payment getPaymentById(@Param("id") Long id); }

4. mapper映射文件
insert into payment(serial) values (#{serial}); select *from payment where id=#{id}

5. Service接口与实现类
public interface PaymentService { int create(Payment payment); 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); } }

6. controller
@RestController @Slf4j public class PaymentController { @Resource private PaymentService paymentService; @PostMapping(value = "https://www.it610.com/payment/create") //一定要使用@RequestBody注解,否则插入的数据异常 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,"插入数据库失败",null); } }@GetMapping(value = "https://www.it610.com/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,null); } } }

2.2.6 测试
输入:http://localhost:8001/payment/get/31响应: { "code": 200, "message": "查询成功!", "data": { "id": 31, "serial": "wzwzwz" } }

对于Post请求,可以使用PostMan软件实现请求的发送。
2.3 创建微服务消费者订单模块 2.3.1 创建maven子工程
在父工程下建子工程,名字:cloud-consumer-order80
SpringCloud|SpringCloud-Rest微服务工程的构建
文章图片

2.3.2 改POM
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

2.3.3 写YML
#指定端口 server: port: 80spring: application: name: cloud-order-service

2.3.4 主启动类
@SpringBootApplication public class MainApp80 { public static void main(String[] args) { SpringApplication.run(MainApp80.class,args); } }

2.3.5 业务类
1. entities
@Data @AllArgsConstructor @NoArgsConstructor public class Payment implements Serializable { private Long id; private String serial; }

@Data @AllArgsConstructor @NoArgsConstructor public class CommonResult { private Integer code; private String message; private T data; public CommonResult(Integer code, String message) { this.code = code; this.message = message; this.data = https://www.it610.com/article/null; } }

2.配置类(RestTemplate)
RestTemplate提供了多种便捷访问远程Http服务的方法, 是一种简单便捷的访问restful服务模板类,是Spring提供的用于访问Rest服务的客户端模板工具集
使用:
(url ,requestMap ,ResponseBean.class)
这三个参数分别代表 REST请求地址、请求参数、HTTP响应被转换成的对象类型。
@Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate getRestTemplate(){return new RestTemplate(); } }

3. controller
@RestController public class OrderController {public static final String PaymentSrv_URL = "http://localhost:8001"; @Autowired private RestTemplate restTemplate; @GetMapping("/consumer/payment/create") //客户端用浏览器是get请求,但是底层实质发送post调用服务端8001 public CommonResult create(Payment payment) { return restTemplate.postForObject(PaymentSrv_URL + "/payment/create",payment,CommonResult.class); }@GetMapping("/consumer/payment/get/{id}") public CommonResult getPayment(@PathVariable Long id) { return restTemplate.getForObject(PaymentSrv_URL + "/payment/get/"+id, CommonResult.class, id); } }

2.3.6 测试
输入: http://localhost/consumer/payment/get/31响应: { "code": 200, "message": "查询成功!", "data": { "id": 31, "serial": "wzwzwz" } }

实际上相当于Order模块将请求转发给了Payment模块,对数据库进行操作,然后Payment模块将查询结果以JSON的形式返回给Order模块,响应给客户端。
2.4 重构项目-公共类的抽取 我们可以注意到,Order、Payment模块的实体类是完全相同的,为了减少冗余,我们可以将重复的类抽取出来作为公共类,同时供多个模块使用。
SpringCloud|SpringCloud-Rest微服务工程的构建
文章图片

2.4.1 新建一个maven项目
名字为:cloud-api-commons
SpringCloud|SpringCloud-Rest微服务工程的构建
文章图片

2.4.2 改POM
org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true cn.hutool hutool-all 5.1.0

2.4.3 entities
public class CommonResult { private Integer code; private String message; private T data; public CommonResult() { }public CommonResult(Integer code, String message, T data) { this.code = code; this.message = message; this.data = https://www.it610.com/article/data; } public CommonResult( Integer code,String message) { this( code, message,null); }public CommonResult(T data) { this(200,"操作成功", data); }//setter--getter public T getData() { return data; }public void setData(T data) { this.data = https://www.it610.com/article/data; }public String getMessage() { return message; }public void setMessage(String message) { this.message = message; }public Integer getCode() { return code; }public void setCode(Integer code) { this.code = code; } }

@Data @AllArgsConstructor @NoArgsConstructor public class Payment implements Serializable { private Long id; private String serial; }

2.4.4 执行maven命令-clean、install
这样就可以将这个模块存到maven仓库,供其他模块引用了。
SpringCloud|SpringCloud-Rest微服务工程的构建
文章图片

2.4.5 Order、Payment模块的简化
将entities包全部删掉,然后各自添加依赖
com.atguigu.springcloud cloud-api-commons ${project.version}

这样一来,我们建立了三个子模块,可以实现基本的业务。
1. cloud-api-commons
2. cloud-consumer-order80
3. cloud-provider-payment8001

    推荐阅读