微服务demo

目录

1、父工程

1.1、项目创建

1.2、依赖配置

2、微服务模块

2.1、创建微服务提供者

2.1.1、搭建Module模块

2.1.2、修改微服务POM依赖

2.1.3、修改yaml配置文件

2.1.4、主启动

2.1.5、业务类

2.1.6、测试

2.2、创建微服务提供者 

2.2.1、创建module模块,与2.1.1一致

2.2.2、修改POM文件

2.2.3、写application.yaml配置文件

2.2.4、主启动

2.2.5、业务类

2.2.6、测试(同2.1.6)

3、工程重构

3.1、创建 api-common module 用于收录重复代码

3.2、在api-common中加入重复代码

3.3、将api-common打包存入本地仓库

 3.4、在需要调用的微服务模块中的POM文件,引入依赖

3.5、在微服务中使用


1、父工程

1.1、项目创建

1、创建maven工程

 2、删除src等多余目录

1.2、依赖配置

 1)父工程打包方式 <packaging>pom</packaging>

 2)<dependencyManagement>标签:

  • 锁定版本+子module不用写groupId和version
  • dependencyManagement只声明依赖,并不是引入,子项目需要显式的声明需要引用的依赖
  • 当子项目中写了该依赖项,不指定具体的版本信息时,才会从父项目中继承该项
<?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">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.uclass.springcloud</groupId>
  <artifactId>cloud</artifactId>
  <version>1.0-SNAPSHOT</version>
  <modules>
    <module>Provider-Payment8001</module>
    <module>Consumer-Order80</module>
      <module>Api-Commons</module>
  </modules>
  <packaging>pom</packaging>

  <!--统一管理jar包版本-->
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
    <junit.version>4.12</junit.version>
    <lombok.version>1.18.10</lombok.version>
    <log4j.version>1.2.17</log4j.version>
    <mysql.version>8.0.28</mysql.version>
    <druid.version>1.1.16</druid.version>
    <mybatis.spring.boot.version>2.3.7.RELEASE</mybatis.spring.boot.version>
  </properties>

  <!-- 父工程,子模块继承,作用:锁定版本+子module不用写groupId和version
       dependencyManagement只是声明依赖,并不是引入,子项目需要显式的声明需要引用的依赖
       同时,只有当子项目中写了该依赖项,不指定具体的版本信息时,才会从父项目中继承该项-->
  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-project-info-reports-plugin</artifactId>
        <version>3.2.2</version>
      </dependency>

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

      <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>
      <!--mysql-->
      <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
      </dependency>
      <!-- druid-->
      <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>2.1.4</version>
      </dependency>
      <!--junit-->
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>${junit.version}</version>
      </dependency>
      <!--log4j-->
      <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>
        <version>2.3.12.RELEASE</version>
        <configuration>
          <fork>true</fork>
          <addResources>true</addResources>
        </configuration>
      </plugin>
    </plugins>
  </build>

</project>

2、微服务模块

2.1、创建微服务提供者

2.1.1、搭建Module模块

 在父工程下创建module

2.1.2、修改微服务POM依赖

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

2.1.3、修改yaml配置文件

server:
 port: 8001 #微服务端口号


spring:
 application:
  name: cloud-payment-service #微服务名称

 datasource:
  druid:
   test-while-idle: false
  # 当前数据源操作类型
  type: com.alibaba.druid.pool.DruidDataSource
  # mysql驱动包
  driver-class-name: com.mysql.cj.jdbc.Driver
  url: jdbc:mysql://localhost:3306/mydb1
  username: root
  password: 123

mybatis:
  mapperLocations: classpath:mapper/*.xml
  # 所有Entity别名类所在包
  type-aliases-package: com.uclass.springCloud.entities

2.1.4、主启动

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

2.1.5、业务类

 1)建表:

 2)entitles(包括主实体类和给前端返回的Json封装类)

        a.主实体        

@Data
@AllArgsConstructor
@NoArgsConstructor
//继承序列化,便于后续分布式部署
public class Payment implements Serializable {
    private Long id;
    private String serial;
}

        b.Json封装体

@Data
@AllArgsConstructor
@NoArgsConstructor
//加泛型,返回前端的通用实体串
public class CommonResult<T> {
    //404 not_found
    private Integer code;
    private String  message;
    private T       data;

    public CommonResult(Integer code, String message){
        //调用本身的构造方法
        this(code, message, null);
    }
}

 3)dao(数据持久化层):定义数据库操作接口,并在spring配置文件中进行实现

         a.操作接口

@Mapper
public interface PaymentDao {
    //新增数据
    public int create(Payment payment);

    //读操作
    public Payment getPaymentById(@Param("id") Long id);
}

        b.数据库操作映射文件

<?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.uclass.springCloud.dao.PaymentDao">
    <insert id="create" parameterType="com.uclass.springCloud.entities.Payment" useGeneratedKeys="true" keyProperty="id">
        insert into payment(serial) values(#{serial});
    </insert>
    
    <resultMap id="BaseResultMap" type="com.uclass.springCloud.entities.Payment">
        <id column="id" property="id" jdbcType="BIGINT"/>
        <id column="serial" property="serial" jdbcType="VARCHAR"/>
    </resultMap>

    <select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap">
        select * from payment where id=#{id};
    </select>
</mapper>

 4)service(业务逻辑层):定义业务逻辑接口及其实现类,并调用dao层接口实现业务逻辑

         a.服务接口

                定义两个方法:新增数据和根据id查询数据

public interface PaymentService {
    //新增数据
    public int create(Payment payment);

    //读操作
    public Payment getPaymentById(@Param("id") Long id);
}

        b. 实现类

            1. @Resource dao层依赖注入

            2. 定义接口实现方式,并引用dao层依赖方法

@Service
public class PaymentServiceImpl implements PaymentService {

    @Resource
    private PaymentDao paymentDao;

    //新增数据
    public int create(Payment payment){
        return paymentDao.create(payment);
    }

    //读操作
    public Payment getPaymentById(@Param("id") Long id){
        return paymentDao.getPaymentById(id);
    }
}

 5)controller(控制层):负责业务模块流程控制,进行url映射

        定义了两个url映射:

         1. /payment/create 负责数据库中新增数据

         2. /payment/get/{id} 负责数据库中查询数据

@Slf4j
@RestController
public class PaymentController {

    @Resource
    private PaymentService paymentService;

    @PostMapping(value = "/payment/create")
    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, "插入数据库失败");
        }
    }

    @GetMapping(value = "/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);
        }
    }
}

2.1.6、测试

 1) 在浏览器中输入 url:

        浏览器中输入url时,只能对get方法进行测试。

 2)idea模拟post请求

        1. 打开测试界面

         2. 输入测试url及请求方式,得到测试结果

2.2、创建微服务提供者 

2.2.1、创建module模块,与2.1.1一致

2.2.2、修改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>cloud</artifactId>
        <groupId>com.uclass.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>Consumer-Order80</artifactId>

    <properties>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.uclass.springcloud</groupId>
            <artifactId>Api-Commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <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>
</project>

2.2.3、写application.yaml配置文件

    此处,如果在POM文件中配置了jdbc等数据库依赖项,则需要添加数据库连接信息

server:
  port: 80

2.2.4、主启动

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

2.2.5、业务类

由于是服务的消费者,故只需要创建entities和controller,同时由于需要调用其他微服务模块,故创建config配置类

 a)entities同2.2.5中entities

 b)config(配置类):新建 RestTemplate 用于调用其他微服务模块

@Configuration
public class ApplicationContextConfig {

    @Bean
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

 b)controller(控制层)

        1. RestTemplate依赖注入

        2. 调用 restTemplate 中的方法对服务提供者进行调用

@Slf4j
@RestController
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.2.6、测试(同2.1.6)

3、工程重构

由于服务消费者和服务提供者中部分代码重复,故可以将重复代码做成依赖包,导入POM文件中,减少项目中的冗余代码

3.1、创建 api-common module 用于收录重复代码

3.2、在api-common中加入重复代码

@Data
@AllArgsConstructor
@NoArgsConstructor
//加泛型,返回前端的通用实体串
public class CommonResult<T> {
    //404 not_found
    private Integer code;
    private String  message;
    private T       data;

    public CommonResult(Integer code, String message){
        //调用本身的构造方法
        this(code, message, null);
    }
}

3.3、将api-common打包存入本地仓库

        1. maven-clean

        2.maven-install

 3.4、在需要调用的微服务模块中的POM文件,引入依赖

        <dependency>
            <groupId>com.uclass.springcloud</groupId>
            <artifactId>Api-Commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        groupId和artifactId:创建收录重复代码时填写

3.5、在微服务中使用

 


版权声明:本文为weixin_44302046原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。