第2章 微服务架构的构建

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测试

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

    访问测试:

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
CSDN系统架构设计师教程第二版》是一本关于系统架构设计的书籍,它是对第一版的改进和更新。这本书主要介绍了系统架构设计师的角色定位、所需知识和技能、常见的架构设计模式和方法等内容。 首先,这本书明确了系统架构设计师的角色定位。作为一名架构设计师,不仅需要具备扎实的技术功底,还需要具备良好的沟通和团队协作能力。这本书对于架构设计师应该具备的核心能力和职责进行了详细讲解,帮助读者建立正确的职业导向。 其次,该书详细介绍了系统架构设计的基本知识和技能。系统架构设计是指根据需求和目标,将一个系统分解为多个模块或子系统,并定义它们之间的接口和交互方式,以达到系统高效运行的目的。这本书从需求分析、架构设计、性能优化等方面进行了全面的介绍,帮助读者掌握系统架构设计的全过程。 此外,《CSDN系统架构设计师教程第二版》还介绍了常见的架构设计模式和方法。架构设计模式是指在构建系统架构中,经过实践总结出来的可复用的解决方案。这本书通过讲解常见的设计模式,如分层、微服务、事件驱动等,帮助读者理解并掌握如何将这些模式应用到实际的系统架构设计中。 总而言之,这本书对系统架构设计师的角色定位、知识和技能以及常见的设计模式等内容进行了全面而深入的介绍。通过学习这本书,读者可以提升自己在系统架构设计领域的水平,成为一名优秀的系统架构设计师。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

桃桃tao

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

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

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

打赏作者

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

抵扣说明:

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

余额充值