第2章 微服务架构的构建

本章节详细介绍了如何构建微服务架构,从搭建父工程开始,逐步创建支付和订单模块,实现Rest微服务,包括编写pom文件、配置yml、编写主启动类和业务类。同时,还涉及了热部署的配置以及工程重构,将重复部分抽离到新的api-commons模块中,最后进行了测试。
摘要由CSDN通过智能技术生成

2.1搭建父工程

第一步:新建maven工程,java8

 第二步:设置字符编码

 

第三步:注解激活生效

 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">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.taotao.springcloud</groupId>
    <artifactId>cloudtest</artifactId>
    <version>1.0-SNAPSHOT</version>
    <!--表示当前pom是总的父工程-->
    <packaging>pom</packaging>
    <!--统一管理jar包版本-->
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <!--用于子模块继承,子模块不用写groupId和version-->
    <dependencyManagement>
        <dependencies>
            <!--springboot 2.2.2.RELEASE-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.2.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--springcloud H.SR12-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR12</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--springcloud 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>
        </dependencies>
    </dependencyManagement>
</project>

2.3Rest微服务工程构建

2.3.1支付模块

第一步:在父工程下建模块,查看父工程的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>cloudtest</artifactId>
        <groupId>com.taotao.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>provider-payment8001</artifactId>

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

    <dependencies>
        <!--web-->
        <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>
        <!--mybatis-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.1.1</version>
        </dependency>
        <!--druid-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.16</version>
        </dependency>
        <!--mysql-connection-->
        <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>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>
</project>

第三步:写yml文件

   在子module的resources下新建application.yml

 

server:
  port: 8001
spring:
  application:
    name: payment-service #微服务名称
  datasource:
    username: root
    password: "taotao"
    url: jdbc:mysql://localhost:3306/cloud
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.taotao.springcloud.entities

第四步:写主启动类

   在子module的java包下新建包com.taotao.springcloud,新建类PaymentMain8001

第五步:业务类

   (1)建表

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

   (2)建payment表的实体类

   (3)新建返回结果Result和返回结果的枚举类ResultCodeEnum

   (4)Service、ServiceImpl、Mapper

   (5)Controller

package com.taotao.springcloud.controller;
import com.taotao.springcloud.common.ResultCodeEnum;
import com.taotao.springcloud.entities.Payment;
import com.taotao.springcloud.service.PaymentService;
import com.taotao.springcloud.utils.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@Slf4j
public class PaymentController {
    @Autowired
    PaymentService paymentService;
    @PostMapping("/payment/insert")
    public Result insert(@RequestBody Payment payment){
        int insert = paymentService.insert(payment);
        log.info("****插入一条数据****"+insert);
        if(insert>0){
            return Result.ok(insert);
        }else {
            return Result.fail(ResultCodeEnum.INSERTFAIL.getMessage());
        }
    }
    @GetMapping("/payment/selectById")
    public Result selectById(@RequestParam(value = "id") String id){
        Payment payment = paymentService.selectById(Long.valueOf(id));
        log.info("****查找一条数据****"+payment+"*****");
        if(payment!=null){
            return Result.ok(payment);
        }else {
            return Result.fail(ResultCodeEnum.NOUSER.getMessage());
        }
    }
}

2.3.2热部署

第一步:在子module的pom里添加devtool依赖(前面已经添加好了)

第二步:在父pom里添加plugin

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.7.1</version>
            <configuration>
                <fork>true</fork>
                <addResources>true</addResources>
            </configuration>
        </plugin>
    </plugins>
</build>

第三步:启用自动生成

第四步:ctrl+shift+alt+/ (操作完下面的步骤后重启idea)

 

 

 

2.3.3订单模块

第一步:新建子module,写子module的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>cloudtest</artifactId>
        <groupId>com.taotao.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>consumer-order80</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <!--web-->
        <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>
        <!--lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--test-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
    </dependencies>

</project>

第二步:写yml

 第三步:写主启动类

第四步:写业务类

   (1)写实体类Payment、新建返回结果Result和返回结果的枚举类ResultCodeEnum

   (2)写配置类,注册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

使用

 (url, requestMap, ResponseBean.class)这三个参数分别代表 REST请求地址请求参数HTTP响应转换被转换成的对象类型。

package com.taotao.springcloud.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ApplicationContextConfig
{
    @Bean
    public RestTemplate restTemplate()
    {
        return new RestTemplate();
    }
}

        (3)controller

package com.taotao.springcloud.controller;
import com.taotao.springcloud.entities.Payment;
import com.taotao.springcloud.utils.Result;
import org.springframework.beans.factory.annotation.Autowired;
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;
@RestController
public class OrderController {
    public static final String PaymentSrv_URL = "http://localhost:8001";
    @Autowired
    private RestTemplate restTemplate;
    @GetMapping("/consumer/payment/insert") //客户端用浏览器是get请求
    public Result create(Payment payment) {
        return restTemplate.postForObject(PaymentSrv_URL + "/payment/insert",payment,Result.class);
    }
    @GetMapping("/consumer/payment/selectById/{id}")
    public Result getPayment(@PathVariable Long id) {
        return restTemplate.getForObject(PaymentSrv_URL + "/payment/selectById?id="+id, Result.class, id);
    }
}

2.3.4工程重构

   观察两个子module,发现两者子模块之间有一些重复部分,例如entities、utils和commons,接下来把重复的部分进行重构

第一步:新建api-commons模块

第二步:写该模块的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>cloudtest</artifactId>
        <groupId>com.taotao.springcloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>api-commons</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <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>

</project>

第三步:把两个子模块重复的内容写到api-commons模块中

第四步:对当前子模块执行maven中的clean和install

第五步:删除两个子模块中重复的内容,在两个子模块的pom中添加以下依赖

<!--api-commons-->
<dependency>
    <groupId>com.taotao.springcloud</groupId>
    <artifactId>api-commons</artifactId>
    <version>${project.version}</version>
</dependency>

2.3.5测试

分别启动两个子模块的主程序

    访问测试:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

桃桃tao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值