【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(二)Rest微服务工程搭建

超、凢脫俗 2023-09-25 22:32 192阅读 0赞

Rest微服务工程搭建—-学习笔记2/9

      • 1、简单架构示意图
      • 2、创建Cloud-provider-payment8001 微服务提供者Module模块
        • 2.1. 建Module
        • 2.2. 改pom
        • 2.3. 写yml
        • 2.4. 主启动
        • 2.5. 业务类
      • 3、创建Cloud-consumer-order80 微服务消费者订单Module模块
        • 3.1. 建Module
        • 3.2. 改pom
        • 3.3. 写yml
        • 3.4. 主启动
        • 3.5. 业务类
      • 4、工程重构
        • 4.1 新建一个 cloud-api-commons 子模块
        • 4.2 mvn跳过test,mvc clean,mvn install

1、简单架构示意图

两个模块,一个是服务提供者模块,另一个是服务消费者模块
在这里插入图片描述

2、创建Cloud-provider-payment8001 微服务提供者Module模块

2.1. 建Module

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
创建完成后回到父工程查看pom文件变化

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.tigerhhzz.springcloud</groupId>
  6. <artifactId>springcloud2023</artifactId>
  7. <version>1.0-SNAPSHOT</version>
  8. <modules>
  9. <module>Cloud-provider-payment8001</module>
  10. </modules>
  11. <packaging>pom</packaging>
  12. <name>Maven</name>
  13. <!-- FIXME change it to the project's website -->
  14. <url>http://maven.apache.org/</url>
  15. <inceptionYear>2001</inceptionYear>
  16. <distributionManagement>
  17. <site>
  18. <id>website</id>
  19. <url>scp://webhost.company.com/www/website</url>
  20. </site>
  21. </distributionManagement>
  22. <!-- 统一管理jar包版本 -->
  23. <properties>
  24. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  25. <maven.compiler.source>1.8</maven.compiler.source>
  26. <maven.compiler.target>1.8</maven.compiler.target>
  27. <junit.version>4.13.2</junit.version>
  28. <log4j.version>1.2.17</log4j.version>
  29. <lombok.version>1.18.26</lombok.version>
  30. <mysql.version>8.0.32</mysql.version>
  31. <druid.version>1.2.16</druid.version>
  32. <mybatis.spring.boot.version>3.0.1</mybatis.spring.boot.version>
  33. </properties>
  34. <!-- 1、只是声明依赖,并不实际引入,子项目按需声明使用的依赖 -->
  35. <!-- 2、子项目可以继承父项目的 version 和 scope -->
  36. <!-- 3、子项目若指定了 version 和 scope,以子项目为准 -->
  37. <dependencyManagement>
  38. <dependencies>
  39. <!--spring boot 2.2.2-->
  40. <dependency>
  41. <groupId>org.springframework.boot</groupId>
  42. <artifactId>spring-boot-dependencies</artifactId>
  43. <version>3.0.5</version>
  44. <type>pom</type>
  45. <scope>import</scope>
  46. </dependency>
  47. <!--spring cloud Hoxton.SR1-->
  48. <dependency>
  49. <groupId>org.springframework.cloud</groupId>
  50. <artifactId>spring-cloud-dependencies</artifactId>
  51. <version>2022.0.2</version>
  52. <type>pom</type>
  53. <scope>import</scope>
  54. </dependency>
  55. <!--spring cloud alibaba 2.1.0.RELEASE-->
  56. <dependency>
  57. <groupId>com.alibaba.cloud</groupId>
  58. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  59. <version>2021.0.4.0</version>
  60. <type>pom</type>
  61. <scope>import</scope>
  62. </dependency>
  63. <dependency>
  64. <groupId>mysql</groupId>
  65. <artifactId>mysql-connector-java</artifactId>
  66. <version>${
  67. mysql.version}</version>
  68. </dependency>
  69. <dependency>
  70. <groupId>com.alibaba</groupId>
  71. <artifactId>druid</artifactId>
  72. <version>${
  73. druid.version}</version>
  74. </dependency>
  75. <dependency>
  76. <groupId>org.mybatis.spring.boot</groupId>
  77. <artifactId>mybatis-spring-boot-starter</artifactId>
  78. <version>${
  79. mybatis.spring.boot.version}</version>
  80. </dependency>
  81. <dependency>
  82. <groupId>junit</groupId>
  83. <artifactId>junit</artifactId>
  84. <version>${
  85. junit.version}</version>
  86. </dependency>
  87. <dependency>
  88. <groupId>log4j</groupId>
  89. <artifactId>log4j</artifactId>
  90. <version>${
  91. log4j.version}</version>
  92. </dependency>
  93. <dependency>
  94. <groupId>org.projectlombok</groupId>
  95. <artifactId>lombok</artifactId>
  96. <version>${
  97. lombok.version}</version>
  98. <optional>true</optional>
  99. </dependency>
  100. </dependencies>
  101. </dependencyManagement>
  102. <build>
  103. <plugins>
  104. <plugin>
  105. <groupId>org.springframework.boot</groupId>
  106. <artifactId>spring-boot-maven-plugin</artifactId>
  107. <configuration>
  108. <fork>true</fork>
  109. <addResources>true</addResources>
  110. </configuration>
  111. </plugin>
  112. </plugins>
  113. </build>
  114. </project>
2.2. 改pom

修改本模块的pom文件如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>springcloud2023</artifactId>
  7. <groupId>com.tigerhhzz.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>Cloud-provider-payment8001</artifactId>
  12. <properties>
  13. <maven.compiler.source>8</maven.compiler.source>
  14. <maven.compiler.target>8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <!--这个和web要写到一块-->
  24. <artifactId>spring-boot-starter-actuator</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.mybatis.spring.boot</groupId>
  28. <artifactId>mybatis-spring-boot-starter</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>com.alibaba</groupId>
  32. <artifactId>druid-spring-boot-starter</artifactId>
  33. <version>1.1.10</version>
  34. </dependency>
  35. <!--mysql-connector-java-->
  36. <dependency>
  37. <groupId>mysql</groupId>
  38. <artifactId>mysql-connector-java</artifactId>
  39. </dependency>
  40. <!--jdbc-->
  41. <dependency>
  42. <groupId>org.springframework.boot</groupId>
  43. <artifactId>spring-boot-starter-jdbc</artifactId>
  44. </dependency>
  45. <dependency>
  46. <groupId>org.projectlombok</groupId>
  47. <artifactId>lombok</artifactId>
  48. <optional>true</optional>
  49. </dependency>
  50. <dependency>
  51. <groupId>org.springframework.boot</groupId>
  52. <artifactId>spring-boot-starter-test</artifactId>
  53. <scope>test</scope>
  54. </dependency>
  55. </dependencies>
  56. </project>
2.3. 写yml

编写application.yml配置文件

  1. server:
  2. port: 8001
  3. spring:
  4. application:
  5. name: cloud-provider-payment8001
  6. datasource:
  7. type: com.alibaba.druid.pool.DruidDataSource
  8. driver-class-name: com.mysql.jdbc.Driver
  9. url: jdbc:mysql://localhost:3306/springcloud-tigerhhzz?useUnicode=true&characterEncoding=utf-8&useSSL=false
  10. username: root
  11. password: 123456
  12. mybatis:
  13. mapper-locations: classpath:mapper/*.xml
  14. type-aliases-package: com.dkf.springcloud.entities # 所有Entity 别名类所在包

热部署:这里我使用的Jrebel插件。

2.4. 主启动
  1. package com.tigerhhzz.springcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. /**
  5. * @author Administrator
  6. */
  7. @SpringBootApplication
  8. public class PaymentMain8001 {
  9. public static void main(String[] args){
  10. SpringApplication.run(PaymentMain8001.class, args);
  11. }
  12. }
2.5. 业务类

下面的常规操作:

  1. 建表SQL

    create table payment(

    1. `id` bigint(20) not null auto_increment comment 'ID',
    2. `serial` varchar(200) default '',
    3. PRIMARY KEY (`id`)

    )ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8

    select * from payment;

entities

  1. import lombok.AllArgsConstructor;
  2. import lombok.Data;
  3. import lombok.NoArgsConstructor;
  4. import java.io.Serializable;
  5. @Data //set/get方法
  6. @AllArgsConstructor //有参构造器
  7. @NoArgsConstructor //无参构造器
  8. public class Payment implements Serializable {
  9. private long id;//数据库是bigint
  10. private String serial;
  11. }

通用结果返回类实体:

  1. import lombok.AllArgsConstructor;
  2. import lombok.Data;
  3. import lombok.NoArgsConstructor;
  4. //返回给前端的通用json数据串
  5. @Data //set/get方法
  6. @AllArgsConstructor //有参构造器
  7. @NoArgsConstructor //无参构造器
  8. public class CommonResult<T> {
  9. private Integer code;
  10. private String message;
  11. private T data; //泛型,对应类型的json数据
  12. //自定义两个参数的构造方法
  13. public CommonResult(Integer code, String message){
  14. this(code, message, null);
  15. }
  16. }

dao

  1. @Mapper // 是ibatis下面的注解 //@Repositoty有时候会有问题
  2. public interface PaymentDao {
  3. int create(Payment payment);
  4. Payment getPaymentById(@Param("id") Long id);
  5. }

resource下创建mapper文件夹,新建PaymentMapper.xml。在yml里有所有entity别名类所在包,所有payment不用写全类名

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.tigerhhzz.springcloud.dao.PaymentDao">
  4. <resultMap id="BaseResultMap" type="com.tigerhhzz.springcloud.entities.Payment">
  5. <id column="id" property="id" jdbcType="BIGINT"/>
  6. <id column="serial" property="serial" jdbcType="VARCHAR"/>
  7. </resultMap>
  8. <insert id="create" parameterType="Payment" useGeneratedKeys="true" keyProperty="id">
  9. insert into payment(serial) values (#{
  10. serial})
  11. </insert>
  12. <select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap">
  13. select * from payment where id = #{
  14. id}
  15. </select>
  16. </mapper>

@Param注解

service

  1. public interface PaymentService {
  2. int create(Payment payment);
  3. Payment getPaymentById(@Param("id") Long id);
  4. }
  5. @Service
  6. public class PaymentServiceImpl implements PaymentService {
  7. @Autowired
  8. private PaymentDao paymentDao;
  9. @Override
  10. public int create(Payment payment) {
  11. return paymentDao.create(payment);
  12. }
  13. @Override
  14. public Payment getPaymentById(Long id) {
  15. return paymentDao.getPaymentById(id);
  16. }
  17. }

controller

  1. @RestController //必须是这个注解,因为是模拟前后端分离的restful风格的请求,要求每个方法返回 json
  2. @Slf4j
  3. public class PaymentController {
  4. @Resource
  5. private PaymentService paymentService;
  6. @PostMapping(value = "/payment/create")
  7. // 注意这里的 @RequestBody 是必须要写的,虽然 MVC可以自动封装参数成为对象,
  8. // 但是当消费者项目调用,它传参是 payment 整个实例对象传过来的, 即Json数据,因此需要写这个注解
  9. public CommonResult create(@RequestBody Payment payment){
  10. int result = paymentService.create(payment);
  11. log.info("****插入结果:" + result);
  12. if(result > 0){
  13. return new CommonResult(200, "插入数据库成功", result);
  14. }
  15. return new CommonResult(444, "插入数据库失败", null);
  16. }
  17. @GetMapping(value = "/payment/{id}")
  18. public CommonResult getPaymentById(@PathVariable("id")Long id){
  19. Payment result = paymentService.getPaymentById(id);
  20. log.info("****查询结果:" + result);
  21. if(result != null){
  22. return new CommonResult(200, "查询成功", result);
  23. }
  24. return new CommonResult(444, "没有对应id的记录", null);
  25. }
  26. }

启动8001模块
在这里插入图片描述
在这里插入图片描述

对应POST方式的请求,要学会用POSTMAN工具
测试插入一条数据
在这里插入图片描述

微服务多了之后就使用run dashboard

不但编译有个别地方会报错,启动也会报错,但是测试两个接口都是没问题的,推测启动报错是因为引入了下面才会引入的jar包,目前不影响。

3、创建Cloud-consumer-order80 微服务消费者订单Module模块

3.1. 建Module

在这里插入图片描述

3.2. 改pom

修改本模块的pom文件如下:

3.3. 写yml

编写application.yml配置文件

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>springcloud2023</artifactId>
  7. <groupId>com.tigerhhzz.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>Cloud-consumer-order80</artifactId>
  12. <properties>
  13. <maven.compiler.source>8</maven.compiler.source>
  14. <maven.compiler.target>8</maven.compiler.target>
  15. </properties>
  16. <dependencies>
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-starter-web</artifactId>
  20. </dependency>
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-starter-actuator</artifactId>
  24. </dependency>
  25. <dependency>
  26. <groupId>org.springframework.boot</groupId>
  27. <artifactId>spring-boot-devtools</artifactId>
  28. <scope>runtime</scope>
  29. <optional>true</optional>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.projectlombok</groupId>
  33. <artifactId>lombok</artifactId>
  34. <optional>true</optional>
  35. </dependency>
  36. <dependency>
  37. <groupId>org.springframework.boot</groupId>
  38. <artifactId>spring-boot-starter-test</artifactId>
  39. <scope>test</scope>
  40. </dependency>
  41. </dependencies>
  42. </project>
3.4. 主启动

OrderMain80.java

  1. package com.tigerhhzz.springcloud;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class OrderMain80{
  6. public static void main(String[] args){
  7. SpringApplication.run(OrderMain80.class,args);
  8. }
  9. }
3.5. 业务类

entites包中的类也拷贝到本项目中

entities/CommonResult.java
entities/Payment.java

配置RestTemplate
ApplicationContextConfig 内容:

  1. package com.tigerhhzz.springcloud.config;
  2. import org.springframework.context.annotation.Bean;
  3. import org.springframework.context.annotation.Configuration;
  4. import org.springframework.web.client.RestTemplate;
  5. /**
  6. * @author tigerhhzz
  7. * @date 2023/4/8 22:52
  8. */
  9. @Configuration
  10. public class ApplicationContextConfig {
  11. @Bean
  12. public RestTemplate getRestTemplate(){
  13. return new RestTemplate();
  14. /*
  15. RestTemplate提供了多种便捷访问远程http服务的方法,
  16. 是一种简单便捷的访问restful服务模板类,是spring提供的用于rest服务的客户端模板工具集
  17. */
  18. }
  19. }

controller

  1. package com.tigerhhzz.springcloud.controller;
  2. import com.tigerhhzz.springcloud.entities.CommonResult;
  3. import com.tigerhhzz.springcloud.entities.Payment;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.web.bind.annotation.GetMapping;
  6. import org.springframework.web.bind.annotation.PathVariable;
  7. import org.springframework.web.bind.annotation.PostMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import org.springframework.web.client.RestTemplate;
  10. import javax.annotation.Resource;
  11. @RestController
  12. @Slf4j
  13. public class OrderController {
  14. //远程调用的 地址
  15. public static final String PAYMENY_URL = "http://localhost:8001";
  16. @Resource
  17. private RestTemplate restTemplate;
  18. @PostMapping("customer/payment/create")
  19. public CommonResult<Payment> create (Payment payment){
  20. return restTemplate.postForObject(PAYMENY_URL + "/payment/create",//请求地址
  21. payment,//请求参数
  22. CommonResult.class);//返回类型
  23. }
  24. @GetMapping("customer/payment/{id}")
  25. public CommonResult<Payment> getPaymentById(@PathVariable("id")Long id){
  26. return restTemplate.getForObject(PAYMENY_URL + "/payment/" + id,//请求地址
  27. CommonResult.class);//返回类型
  28. }
  29. }

如果 runDashboard 控制台没有出来,右上角搜索 即可

运用spring cloud框架基于spring boot构建微服务,一般需要启动多个应用程序,在idea开发工具中,多个同时启动的应用

需要在RunDashboard运行仪表盘中可以更好的管理,但有时候idea中的RunDashboard窗口没有显示出来,也找不到直接的开启按钮

80调用8001服务测试成功:

在这里插入图片描述

4、工程重构

将两个微服务模块中公共的部分,例如实体类等放到新建的微服务公共模块中

上面 两个子项目,有多次重复的 导入 jar,和重复的 Entity 实体类。可以把 多余的部分,加入到一个独立的模块中,将这个模块打包,并提供给需要使用的 module

4.1 新建一个 cloud-api-commons 子模块

将 entities 包里面的实体类放到这个子模块中,也将 pom 文件中,重复导入的 jar包放到这个新建的 模块的 pom 文件中。如下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <parent>
  6. <artifactId>springcloud2023</artifactId>
  7. <groupId>com.tigerhhzz.springcloud</groupId>
  8. <version>1.0-SNAPSHOT</version>
  9. </parent>
  10. <modelVersion>4.0.0</modelVersion>
  11. <artifactId>Cloud-api-commons</artifactId>
  12. <dependencies>
  13. <dependency>
  14. <groupId>org.projectlombok</groupId>
  15. <artifactId>lombok</artifactId>
  16. <optional>true</optional>
  17. </dependency>
  18. <!-- 这个是新添加的,之前没用到,后面会用到。关于这个hutool 是个功能强大的工具包,官网:https://hutool.cn/ -->
  19. <dependency>
  20. <groupId>cn.hutool</groupId>
  21. <artifactId>hutool-all</artifactId>
  22. <version>5.1.0</version>
  23. </dependency>
  24. </dependencies>
  25. </project>
4.2 mvn跳过test,mvc clean,mvn install

将此项目打包 install 到 maven仓库。

将 提供者 和 消费者 两个项目中的 entities 包删除,并删除掉加入到 cloud-api-commons 模块的 依赖配置。
将 打包到 maven 仓库的 cloud-api-commons 模块,引入到 提供者 和 消费者的 pom 文件中,如下所示

  1. <!-- 引入自己定义的api通用包 -->
  2. <dependency>
  3. <groupId>com.tigerhhzz.springcloud</groupId>
  4. <artifactId>Cloud-api-commons</artifactId>
  5. <version>1.0-SNAPSHOT</version>
  6. <scope>compile</scope>
  7. </dependency>

post测试插入数据成功
在这里插入图片描述

发表评论

表情:
评论列表 (有 0 条评论,192人围观)

还没有评论,来说两句吧...

相关阅读