zoukankan      html  css  js  c++  java
  • 二、微服务代码构建

    Spring Cloud的编程是约定 > 配置 > 编码

    一、创建微服务父工程

        创建微服务cloud整体聚合父工程Project

    • New Project

    • 聚合总工程名字

    • 字符编码

    • 注解生效激活

    • java编译版本选8

    1.1、项目设置

    ①、启动run dashboard

      进入项目,找到 .idea/workspace.xml 文件找到component 标签添加如下组件,重启IDEA

    <component name="RunDashboard">
      <option name="configurationTypes">
        <set>
          <option value="SpringBootApplicationConfigurationType" />
        </set>
      </option>
      <option name="ruleStates">
        <list>
          <RuleState>
            <option name="name" value="ConfigurationTypeDashboardGroupingRule" />
          </RuleState>
          <RuleState>
            <option name="name" value="StatusDashboardGroupingRule" />
          </RuleState>
        </list>
      </option>
    </component>

      通过修改idea的workpace.xml的方式来快速打开Run DashBoard窗口 https://www.cnblogs.com/xiaostudy/p/11404562.html

    ②、热部署Devtools

    1.Adding devtools to your project

    <!-- 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>

    2.Adding plugin to your pom.xml

     <!--下一段配置黏贴到父工程当中的pom里-->
    <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>

    3.Enabling automatic build

    4.Update the valu+e of

      组合键 ctrl+shift+alt+/

    5.重启IDEA

    1.2、父工程的pom.xml

    <package>pom</package>  
    <!-- 统一管理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>5.1.47</mysql.version>
      <druid.version>1.1.16</druid.version>
      <mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
    </properties>
    
    <!-- 子模块继承之后,提供作用:锁定版本+子modlue不用写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>

    解决maven下载不了jar的问题请复制这个链接到浏览器自行解决:

    https://blog.csdn.net/HeyWeCome/article/details/104543411

    1.3、Maven的复习

      dependencyManagement
      Maven 使用dependencyManagement元素来提供一种管理依赖版本号的方式。通过会在一个组织或者项目的最顶层的父POM中看到dependencyManagement元素。
      使用pom.xml中的dependencyManagement元素让所有所在项目中引用一个引来而不用显示的列出版本号。Maven会沿着父子层向上走,知道找到一个拥有dependencyManagement元素的项目,然后就会使用dependencyManagement元素中的版本号。
      这样做的好处就是:如果有多个子项目都引用同样一个依赖,则可以避免在每个使用子项目里面都声明一个版本号,这样当想升级或切换到另一个版本时,只需要在顶层父容器里面更新,而不需要一个一个子项目修改,另外如果某个子项目需要另一个版本,只需要声明version就可以。
      dependencyManagement里之声明依赖,并不对实现县引入,因此子项目需要显示的声明需要的用的依赖
      如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了依赖,并且没有指定具体版本,才会从父项目中继承该项目,并且version和scop都读取自父pom
    如果子项目中指定了版本号,那么会使用子项目中指定的jar版本

      maven中跳过单元测试

      父工程创建完成执行mvn:install将父工程发布到仓库方便子工程继承

    二、Rest微服务工程构建

    2.1、微服务提供者

      新建Spring Boot Model名称:cloud-provider-payment8001

      pom.xml添加如下依赖

    <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>
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
      </dependency>
      <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>
    </dependencies>

      编写配置文件application.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
        url: jdbc:mysql://localhost:3306/db1022?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: root
    
    mybatis:
      mapperLocations: classpath:sqlMapper/*.xml
      type-aliases-package: com.jdy.springcloud.entities

      主启动类

    @SpringBootApplication
    public class Cloud_Provider_Payment8001 {
        public static void main(String[] args) {
            SpringApplication.run(Cloud_Provider_Payment8001.class, args);
        }
    }

      建表SQL

    CREATE TABLE `payment` (
      `id` BIGINT(20)  COMMENT 'ID',
      `serial` VARCHAR(200) DEFAULT ''
    ) ENGINE=INNODB DEFAULT CHARSET=utf8

      entitles

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Payment implements Serializable {
        private Long id;
        private String serial;
    }
    //Json封装体CommonResult
    @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);
        }
    }

      mybatis的映射文件PaymentMapper.xml

      路径:srcmain esourcessqlMapperPaymentMapper.xml

      idea 添加Mapper文件头: https://blog.csdn.net/zhangxl123liang/article/details/80968400

    @Mapper
    public interface PaymentDao {
    
        public Payment getPaymentById(Long id);
    
        public int addPayment(Payment payment);
    }
    <?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.jdy.springcloud.dao.PaymentDao">
    
        <insert id="create" parameterType="Payment" useGeneratedKeys="true" keyProperty="id">
                insert into payment(id,serial) values(#{id},#{serial});
        </insert>
    
        <resultMap id="BaseResultMap" type="com.jdy.springcloud.entities.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>

      controller

    @RestController
    @Slf4j
    public class PaymentController {
    
        @Resource
        private PaymentDao mapper;
    
        @PostMapping(value = "/payment/create")
        public CommonResult create(Payment payment){
            log.info("*****插入payment:"+payment);
            int result = mapper.addPayment(payment);
            log.info("*****插入结果:"+result);
            if (result>0){  //成功
                return new CommonResult(200,"插入数据库成功",result);
            }else {
                return new CommonResult(444,"插入数据库失败",null);
            }
        }
    
    
        @GetMapping(value = "/payment/get/{id}")
        public CommonResult getPaymentById(@PathVariable("id") Long id){
            Payment payment = mapper.getPaymentById(id);
            log.info("*****查询结果:"+payment);
            if (payment!=null){  //说明有数据,能查询成功
                return new CommonResult(200,"查询成功",payment);
            }else {
                return new CommonResult(444,"没有对应记录,查询ID:"+id,null);
            }
        }
    }

    测试

    小总结

    1. 建module

    2. 改POM

    3. 写YML

    4. 主启动

    5. 业务类

    2.2、微服务消费者

      新建Spring Boot Model名称:cloud-consumer-order80

      pom.xml添加如下依赖

    <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.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>

      编写配置文件application.yml

    server:
      port: 80

      主启动类

    @SpringBootApplication
    public class OrderMain80 {
        public static void main(String[] args) {
            SpringApplication.run(OrderMain80.class,args);
        }
    }

      业务类

      • 创建entities(将cloud-provider-payment8001工程下的entities包下的两个实体类复制过来)

      RestTemplate

    <T> T    postForObject(URI url, Object request, Class<T> responseType)
    <T> T    getForObject(URI url, Class<T> responseType)

      使用RestTemplate访问restful接口非常简单(url,requestMap,ResponseBean.class)这三个参数分别代表REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。

    //让Spring管理RestTemplate
    @Configuration
    public class ApplicationContextConfig {
    
        @Bean
        public RestTemplate getRestTemplate(){
            return new RestTemplate();
        }
    }

      创建controller

    @RestController
    @Slf4j
    public class OrderController {
    
      public static final String PAYMENT_URL = "http://localhost:8001";
    
      @Resource
      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){
        return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
      }
    }

      测试

    2.3、工程重构

      观察问题,系统中Payment和CommonResult重复部分,重构

      新建maven项目Model: cloud-api-commons

    <dependencies>
      <!-- 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>
    
      <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
      </dependency>
    
      <!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
      <dependency>
        <groupId>cn.hutool</groupId>
        <artifactId>hutool-all</artifactId>
        <version>5.1.0</version>
      </dependency>
    </dependencies>
    </project>
    1. 将Payment和CommonResult使用maven打包

    2. 订单80和支付8001分别改造。删除各自的原先有过的entities文件夹。各自黏贴一下依赖内容

    <dependency>
        <groupId>com.jdy.springcloud</groupId>
        <artifactId>cloud-api-commons</artifactId>
        <version>${project.version}</version>
    </dependency>
  • 相关阅读:
    [刷题] 1016 部分A+B (15分)
    [刷题] 1022 D进制的A+B (20分)
    [刷题] 1021 个位数统计 (15分)
    [刷题] 1020 月饼 (25分)
    洛谷&BZOJ [POI2016]Korale
    反演魔术---二项式反演
    毒瘤养成记1: 如何卡hash
    多项式全家桶
    [CQOI]排序机械臂
    后缀自动机感性理解
  • 原文地址:https://www.cnblogs.com/jdy1022/p/14302779.html
Copyright © 2011-2022 走看看