尚硅谷—Cloud—微服务架构编码构建(5~14)

一:约定 > 配置 > 编码

尚硅谷—Cloud—微服务架构编码构建(5~14)_第1张图片

二:IDEA 新建 Project 工作空间

             1)微服务 cloud 整体聚合父工程 Project(构建步骤)
尚硅谷—Cloud—微服务架构编码构建(5~14)_第2张图片尚硅谷—Cloud—微服务架构编码构建(5~14)_第3张图片尚硅谷—Cloud—微服务架构编码构建(5~14)_第4张图片

                      a:New Project
                      b:聚合总父工程名字
                      c:Maven 选版本
                      d:工程名字
                      e:字符编码
                      f:注解生效激活
                      g:java 编译版本选择 8
                      h:File type 过滤(清爽的菜单)


             2)父工程 POM()
                      a:添加 聚合项目的标识。
尚硅谷—Cloud—微服务架构编码构建(5~14)_第5张图片
                      b:删掉 自己创建的 SRC 工作目录。
                      c:pom




    4.0.0

    
    com.atguigu.springcloud
    cloud2020
    1.0-SNAPSHOT

    
        cloud-provider-payment-8001
    

    pom

    
        UTF-8
        1.8
        1.8
        4.12
        1.2.17
        1.16.18
        8.0.18
        1.1.16
        1.3.0
    

    
    
    
        
            
            
            
                org.springframework.boot
                spring-boot-dependencies
                2.2.2.RELEASE
                pom
                import
            
            
            
                org.springframework.cloud
                spring-cloud-dependencies
                Hoxton.SR1
                pom
                import
            
            
            
                com.alibaba.cloud
                spring-cloud-alibaba-dependencies
                2.1.0.RELEASE
                pom
                import
            


            
            
                mysql
                mysql-connector-java
                ${mysql.version}
            
            
            
                com.alibaba
                druid-spring-boot-starter
                ${druid.verison}
            
            
            
                org.mybatis.spring.boot
                mybatis-spring-boot-starter
                ${mybatis.spring.boot.verison}
            
            
            
                org.projectlombok
                lombok
                ${lombok.version}
            
            
            
                junit
                junit
                ${junit.version}
            
            
            
                log4j
                log4j
                ${log4j.version}
            
        
    

    
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    true
                    true
                
            
        

    



             3)Maven 工程落地 细节复习
                      a:Maven 中的 DependencyManagement 和 Dependencies。
                       
        - 这两个都很常见,尤其是 pom 父工程中。
                                - DependencyManagement:
                                           1. 通常会在 最顶层 父POM 中看到。
                                           2. 此元素 能让所有在子项目中,引用某个依赖时,不用显式的列出版本号。
                                           3. 好处:一次修改,处处生效。在 父 pom 文件里修改。 

                                           4. 只是声明依赖,定义,并不实现引入,因此:子项目需要显式的声明需要用到依赖,才会被真正的引用进来。
                                - Dependencies:
                                           1. 相对于dependencyManagement,所有生命在dependencies里的依赖都会自动引入,并默认被所有的子项目继承。
                                           2. dependencies即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)
                      b:Maven 中,跳过单元测试:
尚硅谷—Cloud—微服务架构编码构建(5~14)_第6张图片

             4)父工程创建完成,执行 mvn:install ,将父工程发布到仓库,方便子工程继承。

 

三:Rest 微服务工程构件

             1)口诀(5步):建module、改POM、写YML、主启动、业务类。
             1)构建步骤:
                      a:cloud-provider-payment8001:微服务提供者支付 Model 模块:
                       
        - 建 module:
尚硅谷—Cloud—微服务架构编码构建(5~14)_第7张图片尚硅谷—Cloud—微服务架构编码构建(5~14)_第8张图片
                                - POM 变化:

    //父 POM 里面引入了 子 module
    
        cloud-provider-payment-8001
    

    pom


    //子 module 引入了 父 的依赖
    
        cloud2020
        com.atguigu.springcloud
        1.0-SNAPSHOT
    

                                - 改 POM:

    
        cloud2020
        com.atguigu.springcloud
        1.0-SNAPSHOT
    

    4.0.0

    
    cloud-provider-payment-8001

    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-actuator
        
        
            org.mybatis.spring.boot
            mybatis-spring-boot-starter
        
        
            com.alibaba
            druid-spring-boot-starter
        
        
            mysql
            mysql-connector-java
        
        
            org.springframework.boot
            spring-boot-starter-jdbc
        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

                                - 写 YML

server:
  port: 8001

spring:
  application:
    name: cloud-provider-payment-8001

  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://114.215.173.88:3306/my_database?Unicode=true&characterEncoding=UTF-8&userSSL=false
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource

mybatis:
  mapper-locations: classpath:mybatis/mapper/*.xml
  type-aliases-package: com.cloud

                                - 主启动

@MapperScan(basePackages = {"com.cloud.dao"})
@SpringBootApplication
public class MySpringBootStater {

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

}

                                - 业务类
                                           1. 建库、建表 SQL:

CREATE TABLE `payment` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT 'id',
  `serial` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

                                           2. entities:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable {
    private Long id;
    private String serial;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult {
    private Integer code;
    private String message;
    private T data;

    public CommonResult(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

                                           3. dao:

@Mapper
public interface PaymentDao {

    int create(Payment payment);

    Payment getPayment(@Param(value = "id") Long id);

}





    
        INSERT INTO payment (serial)
        VALUES (#{serial});
    

    
        
        
    
    

server:
  port: 8001

spring:
  application:
    name: cloud-provider-payment-8001

  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://114.215.173.88:3306/my_database?Unicode=true&characterEncoding=UTF-8&userSSL=false
    username: root
    password: 123456
    type: com.alibaba.druid.pool.DruidDataSource

mybatis:
  mapper-locations: classpath:mybatis/mapper/*.xml
  type-aliases-package: com.cloud

 

                                            4. service:

//粘 dao 的方法头,放到 service 接口中

public interface PaymentService {

    public int create(Payment payment);

    public Payment getPayment(Long id);

}

@Service
public class PaymentServiceImpl implements PaymentService {

    @Autowired
    private PaymentDao paymentDao;

    @Override
    public int create(Payment payment) {
        int i = paymentDao.create(payment);
        return i;
    }

    @Override
    public Payment getPayment(Long id) {
        Payment payment = paymentDao.getPayment(id);
        return payment;
    }
}

                                           5. controller:

@Slf4j
@RestController
public class PaymentController {

    @Autowired
    private PaymentService paymentService;

    @PostMapping(value = "/create")
    public CommonResult create(@RequestBody Payment payment) {
        log.info("传入的数据为 :" + payment);
        int i = paymentService.create(payment);
        if (i > 0) {
            log.info("新增成功");
            return new CommonResult(200, "成功了", i);
        } else {
            log.info("新增失败");
            return new CommonResult(400, "插入数据失败");
        }
    }

    @GetMapping(value = "/getPayment")
    public CommonResult getPayment(@RequestParam(value = "id") Long id) {
        log.info("传入的数据为:" + id);
        Payment payment = paymentService.getPayment(id);
        if (payment != null) {
            log.info("查询成功");
            return new CommonResult(200, "成功:", payment.toString());
        } else {
            log.info("查询失败");
            return new CommonResult(400, id + "没找到");
        }
    }

}

                                - 测试(项目多了之后用 Run Dashboard 界面操作程序)

//测试 1
localhost:8001/getPayment?id=1. get
{
    "code": 200,
    "message": "成功:",
    "data": "Payment(id=1, serial=方法)"
}
------------------------------------
//测试 2
localhost:8001/create. post
{
    "serial":"李四"
}
{
    "code": 200,
    "message": "成功了",
    "data": 1
}

                                - 小总结(建Module、改POM、写YML、主启动、业务类)

                      b:热部署 Devtools:(代码修改,自动重启,只可以开发阶段使用,生产删掉)
                       
        - 添加 devtools 

        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        

                                - 添加 plugin 到 pom.xml

    
        
        cloud2020
        
            
                org.springframework.boot
                spring-boot-maven-plugin
                
                    true
                    true
                
            
        
    

                                - 开启自动编译的选项
尚硅谷—Cloud—微服务架构编码构建(5~14)_第9张图片

                                - 更新:build (绿的锤子)
ctrl + atl + shift + /:尚硅谷—Cloud—微服务架构编码构建(5~14)_第10张图片
                                - 重启 IDEA

                      c:cloud-consumer-order80:微服务消费者订单 Model 模块:
                       
        - 建module(cloud-consumer-order-80)
尚硅谷—Cloud—微服务架构编码构建(5~14)_第11张图片
                                - 改 pom:




    
        cloud2020
        com.atguigu.springcloud
        1.0-SNAPSHOT
    

    4.0.0

    cloud-consumer-order-80

    
        
            org.springframework.boot
            spring-boot-starter-web
        
        
            org.springframework.boot
            spring-boot-starter-actuator
        
        
        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            org.projectlombok
            lombok
            true
        
        
            org.springframework.boot
            spring-boot-starter-test
            test
        
    

                                - 写 yml:

spring:
  application:
    name: cloud-consumer-order-80

  redis:
    port: 80

                                - 主启动:

@SpringBootApplication
public class MySpringBootApplication {

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

                                - 业务类:
             
                                 1. entities(PayEntiry、CommotResult)

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable {

    private Long id;
    private String serial;
}

@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult {
    private Integer code;
    private String message;
    private T data;

    public CommonResult(Integer code, String message) {
        this.code = code;
        this.message = message;
    }
}

                                              2.首说 RestTemplate (封装 调用接口方式的 工具类 )

/**
  * 1 是什么:
  *   RestTemplate 提供了多种,便捷访问远程 HTTP 服务的方法。
  *    是一种,简单快捷的访问 restful 服务模版类,
  *    是 Spring 提供的 用于访问 Rest 服务的 客户端模版工具集。
  */

/**
  *  2 官网及使用:
  * 
  *    使用:( url,requestMap,ResponseBean.class ) 这三个参数分别代表:
  *        REST 请求地址、请求参数、HTTP响应转换 被转换成的类型对象。
  * /

                                               3.Config 配置 RestTemplate

@Configuration
public class ApplicationContextConfig {

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

                                               4.Controller 

@Slf4j
@RestController
public class OrderController {

    public static final String PAYMENT_URL = "http://localhost:8001";

    @Autowired
    private RestTemplate restTemplate;

    /**
     * 调用 8001 ,进行支付
     */
    @PostMapping(value = "/payment/create")
    public CommonResult create(@RequestBody Payment payment) {

        log.info("传入的数据为 :" + payment);
        CommonResult commonResult
                = restTemplate.postForObject(PAYMENT_URL + "/create", payment, CommonResult.class);

        log.info("远程调用 得到的数据为 : " + commonResult);
        
        return commonResult;
    }

    @GetMapping(value = "/getPayment/get")
    public CommonResult getPayment(@RequestParam(value = "id") Long id) {

        log.info("传入的数据为 :" + id);
        CommonResult paymentCommonResult
                = restTemplate.getForObject(PAYMENT_URL + "/getPayment?id=" + id, CommonResult.class);
        log.info("远程调用 得到的数据为 : " + paymentCommonResult);
        
        return paymentCommonResult;
    }

}

                                - 测试:
                                           1.多项目启动,调整出 Run Dashboard(service):

                      d:工程重构:
                       
        - 观察问题:系统中有重复的部分,进行重构。
                                - 新建module:cloud-api-commons
                                - POM:

    
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        
        
            org.projectlombok
            lombok
            true
        
        
        
            cn.hutool
            hutool-all
            5.1.0
        

    

                                - entities:
                                           1.将 entities.Payment 和 result.Common.Result 移动到 Common module 中。
                                - maven 命令 clean install:
                                - 订单 80 和 支付 8001 分别改造:然后测试
                                           1.将子 module 中的删除。
                                           2.改各自的 pom 文件,引入依赖。

        // 在 总 pom 中引入 common ,规定版本
        // 规定 引入 common 文件 的版本
        
            com.atguigu.springcloud
            cloud-api-commons
            1.0-SNAPSHOT
        

        // 子 module 引入 common 依赖(就不用写版本号了)
        
            com.atguigu.springcloud
            cloud-api-commons
        



             2)目前工程详图:

 

你可能感兴趣的:(maven,java,spring,spring,boot,mysql)