二、微服务代码构建

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>
View Code

  通过修改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>
View Code

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>
View Code

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>
View Code

解决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>
View Code

 

  编写配置文件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

  路径:src\main\resources\sqlMapper\PaymentMapper.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>
View Code

  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);
        }
    }
}
View Code

测试

小总结

  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>
View Code

  编写配置文件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>
View Code
  1. 将Payment和CommonResult使用maven打包

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

<dependency>
    <groupId>com.jdy.springcloud</groupId>
    <artifactId>cloud-api-commons</artifactId>
    <version>${project.version}</version>
</dependency>
posted @ 2021-01-20 14:40  jingdy  阅读(453)  评论(0编辑  收藏  举报