微服务架构编码构建 环境配置 热部署配置

下面有每一步详细步骤:
不懂的可以留言评论。

全部笔记

1、约定 > 配置 > 编码

2、IDEA新建project工作空间

2.1、微服务cloud整体聚合父工程Project
  • 父工程步骤

    1. New Project

      在这里插入图片描述

    2. 聚合总父工程名字

      在这里插入图片描述

    3. Maven选版本 这里选择自己的就可以了。

      在这里插入图片描述

    4. 工程名字

      在这里插入图片描述

    5. 字符编码

      在这里插入图片描述

    6. 注解生效激活

      在这里插入图片描述

    7. java 编译版本 选择自己的就可以了。

    8. File Type过滤 可有可不有

      在这里插入图片描述

2.2、父工程POM

个人建议: 除了之前说明要统一的版本 其余的东西可以试一下把版本调到现在用的版本上来,cloud学习思想,其他的还是要跟随主流丫。仅限于个人建议。

<?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.atguigu.springcloud</groupId>
    <artifactId>mscloud03</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <!-- 统一管理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>
</project>
2.3、Maven工程落地细节复习

2.3.1、Maven中的DependencyManagement和Dependencies

dependencyManagement

Maven 使用dependencyManagement 元素来提供了一种管理依赖版本号的方式。
通常会在一个组织或者项目的最顶层的父POM 中看到dependencyManagement 元素。

使用pom.xml 中的dependencyManagement 元素能让所有在子项目中引用一个依赖而不用显式的列出版本号。
Maven 会沿着父子层次向上走,直到找到一个拥有dependencyManagement 元素的项目,然后它就会使用这个
dependencyManagement 元素中指定的版本号。

在这里插入图片描述

这样做的好处就是:如果有多个子项目都引用同一样依赖,则可以避免在每个使用的子项目里都声明一个版本号,这样当想升级或切换到另一个版本时,只需要在顶层父容器里更新,而不需要一个一个子项目的修改 ;另外如果某个子项目需要另外的一个版本,只需要声明version就可。

  • dependencyManagement里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。
    
  • 如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,
     才会从父项目中继承该项,并且version和scope都读取自父pom;
    
  • 如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。
    

2.3.2、maven中跳过单元测试

  • 配置

    <build><!-- maven中跳过单元测试 -->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

- IDEA工具支持(推荐)

在这里插入图片描述

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

3.3、Rest微服务工程构建

3.3.1、cloud-provider-payment8001 -微服务提供者支付Module模块
  • 建cloud-provider-payment8001

  • 改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>mscloud03</artifactId>
            <groupId>com.atguigu.springcloud</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
        <modelVersion>4.0.0</modelVersion>
        <artifactId>cloud-provider-payment8001</artifactId>
        <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>
            <!--mysql-connector-java-->
            <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>
            <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>
    
  • 写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              # mysql驱动包 com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=utf-8&useSSL=false
        username: root
        password: 123456
    
    
    mybatis:
      mapperLocations: classpath:mapper/*.xml
      type-aliases-package: com.atguigu.springcloud.entities    # 所有Entity别名类所在包
    
  • 业务类

    • 建表SQL

      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
      
    • entities

      1. 主实体Payment

        import lombok.AllArgsConstructor;
        import lombok.Data;
        import lombok.NoArgsConstructor;
        
        import java.io.Serializable;
        
        /**
         * @auther zzyy
         * @create 2020-01-27 20:01
         */
        @Data
        @AllArgsConstructor
        @NoArgsConstructor
        public class Payment implements Serializable
        {
            private Long id;
            private String serial;
        }
         
        
      2. Json封装体CommonResult

        import lombok.AllArgsConstructor;
        import lombok.Data;
        import lombok.NoArgsConstructor;
        @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);
            }
        }
        
    • dao

      1. 接口PaymentDao 用注解就可以了。

        import com.atguigu.springcloud.entities.Payment;
        import org.apache.ibatis.annotations.Mapper;
        
        /**
         * @Author: crush
         * @Date: 2021-05-19 20:44
         * version 1.0
         */
        @Mapper
        public interface PaymentDao {
            @Insert("insert into payment(serial) values(#{serial})")
            int create(Payment payment);
            @Select("select * from payment where id=#{id}")
            Payment getPaymentById(@Param("id") Long id);
        }
        
    • service

      1. 接口PaymentService

        public interface PaymentService
        {
            public int create(Payment payment);
        
            public Payment getPaymentById(@Param("id") Long id);
        
        }
        
      2. 实现类

        @Service
        public class PaymentServiceImpl implements PaymentService
        {
            @Resource
            private PaymentDao paymentDao;
        
        
            @Override
            public int create(Payment payment)
            {
                return paymentDao.create(payment);
            }
        
            @Override
            public Payment getPaymentById(Long id)
            {
                return paymentDao.getPaymentById(id);
            }
        }
        
      3. controller

        @RestController
        @Slf4j
        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,"插入数据库失败",null);
                }
            }
        
            @GetMapping(value = "/payment/get/{id}")
            public CommonResult<Payment> 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,null);
                }
            }
        }
        
    • 测试

      1. http://localhost:8001/payment/get/31
      2. postman模拟post
      3. 运行
        • 通过修改idea的workspace.xml的方式来快速打开Run Dashboard窗口 (这个看不到可以搜一下 应该是在view 那个菜单中 )
        • 开启Run DashBoard
        • 部分同学可能由于idea版本不同,需要关闭重启
    • 小总结

      在这里插入图片描述

3.3.2、热部署Devtools
  1. Adding devtools to your project

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

    <build>
        <finalName>你自己的工程名字</finalName>
        <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 value of

    在这里插入图片描述

    在这里插入图片描述

  5. 重启IDEA

3.3.3、cloud-consumer-order80 —微服务消费者订单Module模块
  • 建cloud-consumer-order80

  • 改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.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>
    
  • 写YML

    server:
      port: 80 #服务端口
    spring:
      application:
        name: cloud-order-service #服务名
      datasource:
        type: com.alibaba.druid.pool.DruidDataSource  #当前数据源操作类型
        driver-class-name: com.mysql.jdbc.Driver #数据库驱动包
        url: jdbc:mysql://localhost:3306/springcloud_2021?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true
        username: root
        password: 123456
    
    mybatis:
      mapper-locations:
        classpath: mapper/*.xml
      type-aliases-package:
        com:
          crush:
            springcloud: entities  #所有entity别名所在包
    
  • 主启动

    @SpringBootApplication
    public class MainApp80
    {
        public static void main(String[] args)
        {
            SpringApplication.run(MainApp80.class,args);
        }
    }
    
  • 业务类

    entities 主实体Payment Json封装体CommonResult 和服务提供者中都是一样的。

  • 首说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

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

  • config配置类 ApplicationContextConfig

    @Configuration
    public class ApplicationContextConfig
    {
        @Bean
        public RestTemplate restTemplate()
        {
            return new RestTemplate();
        }
    }
    
  • controller

    import com.atguigu.springcloud.entities.CommonResult;
    import com.atguigu.springcloud.entities.Payment;
    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/create") //客户端用浏览器是get请求,但是底层实质发送post调用服务端8001
        public CommonResult create(@RequestBody Payment payment)
        {
            return restTemplate.postForObject(PaymentSrv_URL + "/payment/create",payment,CommonResult.class);
        }
    
    
        @GetMapping("/consumer/payment/get/{id}")
        public CommonResult getPayment(@PathVariable Long id)
        {
            return restTemplate.getForObject(PaymentSrv_URL + "/payment/get/"+id, CommonResult.class, id);
        }
    }
    
  • 测试

    http://localhost/consumer/payment/get/1

    http://localhost/consumer/payment/create?serial=aaaaa1

3.3.4、工程重构
  1. 观察问题 系统中有重复部分,重构

    在这里插入图片描述

  2. 新建 cloud-api-commons

  3. POM

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

    • Payment实体

      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class Payment implements Serializable
      {
          private Long id;
          private String serial;
      }
       
      
    • CommonResult通用封装类

      public class CommonResult<T>
      {
          private Integer code;
          private String message;
          private T data;
      
          public CommonResult()
          {
          }
      
          public CommonResult(Integer code, String message, T data)
          {
              this.code = code;
              this.message = message;
              this.data = data;
          }
          public CommonResult( Integer code,String message) {
              this( code, message,null);
          }
      
          public CommonResult(T data) {
              this(200, "操作成功", data);
          }
      
          //setter--getter
          public T getData() {
              return data;
          }
      
          public void setData(T data) {
              this.data = data;
          }
      
          public String getMessage() {
              return message;
          }
      
          public void setMessage(String message) {
              this.message = message;
          }
      
          public Integer getCode() {
              return code;
          }
      
          public void setCode(Integer code) {
              this.code = code;
          }
      }
       
      
  5. maven命令clean install

    在这里插入图片描述

  6. 订单80和支付8001分别改造

    删除各自的原先有过的entities文件夹

    各自粘贴POM内容

    • 80 8001 都是一样

      <dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
          <groupId>com.atguigu.springcloud</groupId>
          <artifactId>cloud-api-commons</artifactId>
          <version>${project.version}</version>
      </dependency>
      

3.4、目前工程样式图

在这里插入图片描述

自言自语

如果在学习过程中,有什么错误,大家也可以一起交流。
有什么不懂,也可以留言评论,欢迎来访。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值