01 基础环境准备
02 一文读懂Eureka
03 Zookeeper注册中心
04 Consule注册中心
05 Ribbon
06 OpenFegin
07 Hystrix全面解析
08 Gateway全面解析
09 Config配置中心
10 Bus消息总线
1 引言
记2020年3月8日 SpringCloud 最新版为Hoxton SR3。
2 创建父工程
(1) spring-cloud
(2) pom文件
<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>
<hutool.version>5.1.0</hutool.version>
<commons.version>3.4</commons.version>
<javax.version>2.1.0</javax.version>
<log4j.version>1.2.17</log4j.version>
<lombok.version>1.18.6</lombok.version>
<mysql.version>8.0.11</mysql.version>
<druid.verison>1.1.16</druid.verison>
<mybatis.spring.boot.verison>1.3.1</mybatis.spring.boot.verison>
<tk.mybatis.verison>2.1.5</tk.mybatis.verison>
<pagehelper.verison>1.2.10</pagehelper.verison>
<spring-cloud.version>Hoxton.SR3</spring-cloud.version>
<spring-boot.version>2.2.5.RELEASE</spring-boot.version>
<spring-cloud-alibaba.version>2.1.0.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<!--spring boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</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>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.verison}</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<!--日志-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.verison}</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>${tk.mybatis.verison}</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.verison}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons.version}</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>javax.persistence</artifactId>
<version>${javax.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>${hutool.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
<!--spring boot 插件-->
<build>
<finalName>springcloud-hoxton</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
(3) 安装
3 场景模拟
模拟【订单微服务】调用 【支付微服务】
3.1 创建微服务provider-payment
(1) provider-payment
SQL建表脚本:
CREATE TABLE `t_payment` (
`n_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
`c_serial` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '流水号',
`c_name` varchar(255) DEFAULT NULL COMMENT '支付名',
`n_money` decimal(10,2) DEFAULT NULL COMMENT '支付金额',
PRIMARY KEY (`n_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
(2) 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.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<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>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
(3) application.yml
server:
port: 9000
spring:
application:
name: provider-payment-service
datasource:
url: jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&serverTimezone=UTC
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
(4) consts
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ResponseResultConsts {
private Integer code;
private String msg;
private Object data;
/**
* 响应成功
*/
public static ResponseResultConsts success(Object data,String msg){
return new ResponseResultConsts(200, msg,data);
}
/**
* 响应失败
*/
public static ResponseResultConsts fail(Integer code,String msg){
return new ResponseResultConsts(code, msg,null);
}
}
(5) po
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "t_payment")
public class PaymentPo {
/**
* id
*/
@Id
@Column(name = "n_id")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private Integer id;
/**
* 流水号
*/
@Column(name = "c_serial")
private String serial;
/**
* 支付名
*/
@Column(name = "c_name")
private String name;
/**
* 金额
*/
@Column(name = "n_money")
private float money;
}
(6) Mapper
@Mapper
public interface PaymentMapper extends BaseMapper<PaymentPo> {
}
(7) Service
@Service
public class PaymentService {
@Autowired
private PaymentMapper paymentMapper;
public PaymentPo selectById(String id){
return paymentMapper.selectByPrimaryKey(id);
}
@Transactional
public PaymentPo insert(PaymentPo payment){
paymentMapper.insertSelective(payment);
return payment;
}
}
(8) Controller
@RestController
@RequestMapping("/payment")
public class PaymentController {
@Autowired
private PaymentService paymentService;
/**
* 根据ID查
*/
@GetMapping("/{id}")
public ResponseResultConsts selectPayment(@PathVariable("id") String id){
PaymentPo paymentPo = paymentService.selectById(id);
if (paymentPo==null){
return ResponseResultConsts.fail(500,"查询失败");
}
return ResponseResultConsts.success(paymentPo,"查询成功");
}
/**
* 根据流水号添加
*/
@PostMapping("/payment")
public ResponseResultConsts insertPayment(@RequestBody PaymentPo payment){
PaymentPo paymentPo = paymentService.insert(payment);
if (paymentPo==null){
return ResponseResultConsts.fail(500,"插入失败");
}
return ResponseResultConsts.success(paymentPo,"添加成功");
}
}
(9) 启动类
@SpringBootApplication
@MapperScan("com.payment.mapper")
public class PaymentApplication {
public static void main(String[] args) {
SpringApplication.run(PaymentApplication.class);
}
}
(10) 测试
{
"serial": "82181a8a-5d8b40ca96e2ebcca730837c",
"name": "postman",
"money": "18.81"
}
5 建立customer-order工程
5.1 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>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>javax.persistence</artifactId>
</dependency>
</dependencies>
5.2 application.yml
server:
port: 8000
5.3 ResponseResultConsts
@AllArgsConstructor
@NoArgsConstructor
@Data
public class ResponseResultConsts {
private Integer code;
private String msg;
private Object data;
/**
* 响应成功
*/
public static ResponseResultConsts success(Object data,String msg){
return new ResponseResultConsts(200, msg,data);
}
/**
* 响应失败
*/
public static ResponseResultConsts fail(Integer code,String msg){
return new ResponseResultConsts(code, msg,null);
}
}
5.4 po
@Data
@AllArgsConstructor
@NoArgsConstructor
@Table(name = "t_payment")
public class PaymentPo {
/**
* id
*/
@Id
@Column(name = "n_id")
@GeneratedValue(strategy= GenerationType.IDENTITY)
private Integer id;
/**
* 流水号
*/
@Column(name = "c_serial")
private String serial;
/**
* 支付名
*/
@Column(name = "c_name")
private String name;
/**
* 金额
*/
@Column(name = "n_money")
private float money;
}
5.5 RestTemplate
(1) 作用
RestTemplate提供了多种便捷访问远程Http服务的方法,是一种简单便捷的访问 restful服务模板类,是 Spring提供的用于访问Rest服务的客户端模板工具集
(2) 使用
使用 resttemplate访 restful接口非常的简单粗暴无脑。(ur, requestmap, ResponseBean. class)这三个参数分别代表REST请求地址、请求参数、HTP响应转换被转换成的时象类型。
(3) 建立配置文件
@Configuration
public class ApplicationConfig {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
5.6 Controller
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
private static final String BASE_PAYMENT_URL="http://localhost:9000/";
@GetMapping("/{id}")
public ResponseResultConsts selectPayment(@PathVariable("id") String id){
ResponseEntity<ResponseResultConsts> forEntity =
restTemplate.getForEntity(BASE_PAYMENT_URL+id, ResponseResultConsts.class, id);
return forEntity.getBody();
}
@PostMapping("/payment")
public ResponseResultConsts insertPayment(@RequestBody PaymentPo payment){
ResponseEntity<ResponseResultConsts> response = restTemplate.postForEntity(BASE_PAYMENT_URL + "payment", payment, ResponseResultConsts.class);
return response.getBody();
}
}
5.7 测试
(1) 启动provider-payment服务和customer-order服务
(2) 测试
6 重构
6.1 创建common工程
6.2 pom
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>javax.persistence</artifactId>
</dependency>
</dependencies>
6.3 把po和consts提取出来
6.4 安装commons
6.5 修改provider-payment
(1) 添加坐标
<dependency>
<groupId>com.zrs.springcloud</groupId>
<artifactId>commons</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
(2) 删除相关包
(3) 修改controller、service、mapper文件
(4) 修改后启动程序
6.6 同理修改customer-order微服务
7 github地址
#分支base-environment-release-v1.0
https://github.com/zhurongsheng666/spring-cloud-hoxton