00.微服务架构编码构建准备工作


代码编写核心贯穿约定 > 配置 > 编码

1.IDEA新建project工作空间

微服务cloud整体聚合父工程Project

整个springcloud的学习在建立的父工程基础上,新建模块1.New Project 新建立一个maven的父工程其余东西删除,留下一个pom文件,打包模式 改为pom引入依赖如下
    pom

    
    
        UTF-8
        1.8
        1.8
        4.12
        1.2.17
        1.16.18
        5.1.47
        1.1.16
        1.3.0
        3.2.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
                ${druid.version}
            
            
                org.mybatis.spring.boot
                mybatis-spring-boot-starter
                ${mybatis.spring.boot.version}
            
            
                junit
                junit
                ${junit.version}
            
            
                log4j
                log4j
                ${log4j.version}
            
            
                org.projectlombok
                lombok
                ${lombok.version}
                true
            
            
                com.baomidou
                mybatis-plus-boot-starter
                ${mybatis-plus.version}
            
        
    

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

maven的dependencyManagement说明



2.Rest微服务工程构建

本次的springcloud学习围绕着 
  • 订单模块
  • 支付模块
来学习

微服务提供者支付Module模块

新创建cloud-provider-payment8001模块pom
<?xml version="1.0" encoding="UTF-8"?>

    
        springcloud2020
        com.chl.springcloud
        1.0-SNAPSHOT
    
    4.0.0

    cloud-provider-payment8001

     
        
        
            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
            1.1.10
        
        
        
            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-payment-service
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: org.gjt.mm.mysql.Driver
    url: jdbc:mysql://localhost:3306/springcloud2020?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: 123456

mybatis:
  mapperLocations: classpath:mapper/*/*.xml
  type-aliases-package: com.chl.springcloud.entity
主启动
@SpringBootApplication
public class Payment8001 {
    public static void main(String[] args) {
        SpringApplication.run(Payment8001.class,args);
    }
}
业务类1.建表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
2.entitiyPayment
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Payment implements Serializable {

    private Long id;
    private String serial;
}
Json封装体CommonResult
@Data
@AllArgsConstructor
@NoArgsConstructor
public class CommonResult {

    private Integer code;
    private String message;
    private T data;

    public CommonResult(Integer code,String message){
        this(code,message,null);
    }
}
 
3.daoPaymentMapper
@Mapper
public interface PaymentMapper{

    int savePayment(Payment payment);

    Payment getPaymentById(Long id);
}
PaymentMapper.xml    这个位置 src\main\resources\mapper\PaymentMapper.xml
<?xml version="1.0" encoding="UTF-8"?>



    
    
        insert into payment(serial) values(${serial});
    

    
    


4.servicePaymentService
public interface  {

    /**
     * 添加payment
     * @param payment
     * @return
     */
    int savePayment(Payment payment);

    /**
     * 获取payment
     * @param id
     * @return
     */
    Payment getPaymentById(Long id);
}
PaymentServiceImpl
@Service
public class PaymentServiceImpl  implements PaymentService {

    @Autowired
    private PaymentMapper paymentMapper;

    @Override
    public int savePayment(Payment payment) {
      return  paymentMapper.savePayment(payment);
    }

    @Override
    public Payment getPaymentById(Long id) {
        return paymentMapper.getPaymentById(id);
    }
}
5.controllerPaymentController
@RestController
@Slf4j
public class PaymentController {

    @Autowired
    private PaymentService paymentService;

   @PostMapping(value = "/payment/create")
    public CommonResult create(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 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);
        }
    }

}
测试http://localhost:8001/payment/get/31
小总结
  • 1.建module
  • 2.改POM
  • 3.写YML
  • 4.主启动
  • 4.主启动

微服务消费者订单Module模块

建cloud-consumer-order80pom
<?xml version="1.0" encoding="UTF-8"?>

    
        springcloud2020
        com.chl.springcloud
        1.0-SNAPSHOT
    
    4.0.0

    cloud-consumer-order80
    
        
        
            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
server:
  port: 80

spring:
  application:
    name: cloud-order-service
主启动
@SpringBootApplication
public class OrderMain80 {
    public static void main(String[] args) {
        SpringApplication.run(OrderMain80.class,args);
    }

}
业务类创建entity(将cloud-provider-payment8001工程下的entity包下的两个实体类复制过来)

首说RestTemplate

官网地址https://docs.spring.io/spring-framework/docs/5.2.2.RELEASE/javadoc-api/org/springframework/web/client/RestTemplate.html

ApplicationContextConfig

要使用restTemplate,要创建restTemplate,放进spring容器
@Configuration
public class ApplicationContextConfig {

    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}
OrderController
@RestController
@Slf4j
public class OrderController {

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

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/consumer/payment/create")
    public CommonResult   create(Payment payment){
        return restTemplate.postForObject(PAYMENT_URL+"/payment/create",payment,CommonResult.class);  //写操作
    }

    @GetMapping("/consumer/payment/get/{id}")
    public CommonResult getPayment(@PathVariable("id") Long id){
        return restTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);
    }
}
 
 

测试先启动cloud-provider-payment8001再启动cloud-consumer-order80http://localhost/consumer/payment/get/32
创建create方法,不要忘记@RequestBody注解

3.工程重构

由于两个工程entity下面的payment实体类,还有commonResult所以直接抽取出来,作为通用的

新建立模块cloud-api-commons

pom
<?xml version="1.0" encoding="UTF-8"?>

    
        springcloud2020
        com.chl.springcloud
        1.0-SNAPSHOT
    
    4.0.0

    cloud-api-commons
    
        
        
            org.springframework.boot
            spring-boot-devtools
            runtime
            true
        

        
            org.projectlombok
            lombok
            true
        

        
        
            cn.hutool
            hutool-all
            5.1.0
        
    


将这两个实体类搬到这里

支付模块还有订单模块的改造

订单80和支付8001分别删除原来的entity文件夹的两个实体类分别引入通用模块

    com.chl.springcloud
    cloud-api-commons
    1.0-SNAPSHOT

目前工程样图