springcloud官方文档(Hoxton SR5):https://cloud.spring.io/spring-cloud-static/Hoxton.SR5/reference/htmlsingle/
springcloud中文文档:https://www.springcloud.cc/
springcloud中国社区文档:http://docs.springcloud.cn/
https://www.bookstack.cn/read/spring-cloud-docs/docs-index.md

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring Cloud并没有重复制造轮子,它只是将各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包。
Spring Cloud专注于为典型的用例和扩展机制提供良好的开箱即用体验,以涵盖其他情况。

京东内部微服务架构


通用微服务技术栈


Spring cloud 官网地址:https://spring.io/projects/spring-cloud


约定>配置>编码


3. 勾选本地maven

4.设置项目编码

5.设置注解激活生效

6.Java编译版本修改

pom

项目所需的所有依赖树
4.0.0 com.zhao.springcloud cloud2020 1.0-SNAPSHOT pom UTF-8 1.8 1.8 4.12 1.18.10 1.2.17 8.0.18 1.1.20 1.3.2 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} runtime com.alibaba druid-spring-boot-starter ${druid.version} org.mybatis.spring.boot mybatis-spring-boot-starter ${mybatis.spring.boot.version} junit junit ${junit.version} log4j log4j ${log4j.version} org.springframework.boot spring-boot-maven-plugin true true
Maven中dependencyManagement与dependencies区别

子项目中,如果不指定,默认和父项目dependencyManagement标签中的版本一致,并且父项目dependencyManagement标签只是规定了版本号,具体引入依赖还是子项目引入。
maven中跳过单元测试:

最简单的支付模块

构建步骤:


填写模块名

创建完成

cloud2020 com.zhao.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 1.2.8 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
server:port: 8001spring:application:name: cloud-payment-service#数据库配置datasource:type: com.alibaba.druid.pool.DruidDataSource#mysql5.x的没有cjdriver-class-name: com.mysql.cj.jdbc.Driver#记得先创建数据库url: jdbc:mysql://localhost:3306/db2020?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: 123456#mybatis配置
mybatis:mapper-locations: classpath:mapper/*.xmltype-aliases-package: com.zhao.springcloud.entities #所有Entity别名类所在包
@SpringBootApplication
public class PaymentMain8001 {public static void main(String[] args) {SpringApplication.run(PaymentMain8001.class);}
}
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;INSERT INTO payment(`serial`)VALUES("xxx");
2.创建实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class PayMent implements Serializable {private Long id;private String serial;}
返回前端的json数据对象
@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 add(Payment payment);// 加上@Param注解,mapper中就可以采用#{}的方式把@Param注解括号内的参数进行引用Payment getPaymentById(@Param("id") Long id);
}
mapper.xml文件
insert into payment(serial) value (#{serial})
4.服务层(service)
服务层接口
public interface PaymentService {int add(Payment payment);Payment getPaymentById(@Param("id") Long id);}
实现类
@Service
public class PaymentServiceImpl implements PaymentService {@Resourceprivate PaymentDao paymentDao;@Overridepublic int add(Payment payment) {return paymentDao.add(payment);}@Overridepublic Payment getPaymentById(Long id) {return paymentDao.getPaymentById(id);}
}
5.控制器(controller)
@RestController
@Slf4j
public class PaymentController {@Resourceprivate PaymentService paymentService;@PostMapping("/payment/add")public CommonResult add(@RequestBody Payment payment){int result = paymentService.add(payment);log.info("******插入结果:"+result);if (result>0){return new CommonResult(200,"插入数据库成功",result);}else {return new CommonResult(444,"插入数据库失败",null);}}@GetMapping("/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/1,查询成功

因为浏览器一般不支持直接发送post请求,所以,需要使用工具apiPost进行测试

输入http://localhost:8001/payment/add发送post请求,往数据库中插入一条数据,需要把数据写到body中。


子工程添加依赖
org.springframework.boot spring-boot-devtools runtime true
父工程添加插件
org.springframework.boot spring-boot-maven-plugin true true
开启自动编译的权限

热键注册开启

重启IDEA即可生效!!
新建模块

添加依赖
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
主启动类
@SpringBootApplication
public class OrderMain80 {public static void main(String[] args) {SpringApplication.run(OrderMain80.class);}
}
业务类
① 复制cloud-provider-payment8001项目里的entities

② 添加配置类
@Configuration
public class ApplicationContextConfig {@Beanpublic RestTemplate getRestTemplate(){return new RestTemplate();}
}
③ 创建controller
@RestController
@Slf4j
public class OrderController {public static final String PAYMENT_URL = "http://localhost:8001";@Resourceprivate RestTemplate restTemplate;@GetMapping("/consumer/payment/add")public CommonResult add(Payment payment){return restTemplate.postForObject(PAYMENT_URL+"/payment/add",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);}
}
测试
启动两个项目进行测试,两个都启动后,右下角会弹出个services提示,点击show。

用户支付订单,服务与服务之间的调用,输入地址http://localhost/consumer/payment/get/1,查询成功

添加操作在页面上显示添加成功,查看数据库数据正常


由于目前构建的两个微服务项目有重复的部分,需要将其提取出来,一次打包,到处运行,所以将项目进行重构。
新建模块

添加依赖
org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true cn.hutool hutool-all 5.8.1
将实体类放入commons模块

本项目进行打包

删除 80 和 8001中的实体,引入自定义的依赖
com.zhao.springcloud cloud-api-commons 1.0-SNAPSHOT

重新启动,并测试

查询数据成功!

插入数据成功!


至此,Spring Cloud框架(原生Hoxton版本与Spring Cloud Alibaba)基础入门篇 就结束了