SpringCloud第三章(下)微服务工程构建

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>
      

(完)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值