训练大纲(第123天)
大家如果想快速有效的学习,思想核心是“以建立知识体系为核心”,具体方法是“守破离”。确保老师课堂上做的操作,反复练习直到熟练。
第243次(Hystrix)
学习主题:Hystrix
学习目标:
对应视频:
http://www.itbaizhan.cn/course/id/85.html
对应文档:
无
对应作业
采用RebbitMQ收集数据监控-设计原理与服务搭建
1.使用RebbitMQ收集数据的原理是什么?
答:由于使用Turbine直接与服务连接是紧耦合关系,并且配置文件中需要配置大量的信息,而程序的设计原则是松耦合关系,所以引入了RabbitMQ,解除了服务于Turbine的耦合度,并且减少了配置文件的配置信息,使Turbine变得非常简单,使用RabbitMQ与服务进行耦合,然后Turbine只需要与RabbitMQ进行关联即可
2.1创建Consumer服务。
2.2修改POM文件添加相关坐标。
2.3修改POM文件,添加actuator启动器,添加hystrix启动器、hystrix-dashboard启动器、hystrix-stream启动器、stream-rabbit启动器。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>
<!--健康检查-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-hystrix-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
2.4修改全局配文件,添加RabbitMQ配置。
spring.application.name=gl-consumer-ribbon-dashboard-rabbitmq
server.port=9015
#设置服务注册中心地址,指向另一个注册中心
eureka.client.service-url.defaultZone=http://admin:1234@192.168.41.242:5050/eureka/,http://admin:1234@192.168.41.242:5051/eureka/
#Feign 默认是不开启 Hystrix 的。默认为:false
feign.hystrix.enabled=true
#RabbitMQ
spring.rabbitmq.host=192.168.170.128
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.virtual-host=/
#消息发送者使用的交换器名称,默认hystrixStreamOutput
spring.cloud.stream.bindings.hystrixStreamOutput.destination=turbine
2.5修改启动类,开始HystrixDashboard。
@EnableFeignClients
@EnableDiscoveryClient
@EnableCircuitBreaker //开启熔断器
@EnableEurekaClient
@SpringBootApplication
@EnableHystrix
@EnableHystrixDashboard //开启Hystrix控制面板
public class Application extends SpringBootServletInitializer {
//更换负载均衡策略,使用哪个策略,就返回哪个类型
/*@Bean
public RandomRule createRule(){
return new RandomRule();
}*/
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {
return builder.sources(Application.class);
}
}
采用RebbitMQ收集数据监控-测试服务
3.1 @EnableTurbineStream注解的作用是什么?
答:@EnableTurbineStream注解的作用是开启Turbine服务
4.1创建Turbine服务。
4.2修改POM文件添加hystrix-stream启动器、stream-rabbit启动器。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-turbine-stream</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-stream-rabbit</artifactId>
4.3修改全局配置文件,添加RabbitMQ配置。
spring.application.name=gl-consumer-ribbon-hystrix-turbine-mq
server.port=1002
#设置服务注册中心地址,指向另一个注册中心
eureka.client.service-url.defaultZone=http://admin:1234@192.168.41.242:5050/eureka/,http://admin:1234@192.168.41.242:5051/eureka/
# 暴露监控端点
management.endpoints.web.exposure.include=*
#RabbitMQ
spring.rabbitmq.host=192.168.170.128
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=admin
spring.rabbitmq.virtual-host=/
turbine.instanceUrlSuffix=/hystrix.stream
#消息接收者使用的交换器名称,默认turbineStreamInput
spring.cloud.stream.bindings.turbineStreamInput.destination=turbine
4.4修改启动类,开启TurbineStream。
@EnableDiscoveryClient
@SpringBootApplication
@EnableTurbineStream
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
如何设计微服务作业题
5.1微服务中有几种常见的设计模式?
答:微服务中有六种常见的设计模式,分别为:
- 代理设计模式
- 聚合设计模式
- 链条设计模式
- 聚合链条设计模式
- 数据共享设计模式
- 异步消息设计模式
5.2每种设计模式的的特点是什么?
答:
代理设计模式:
统一入口,鉴权校验,请求过滤,在这种情况下,客户端并不聚合数据,但会根据业务需求的差别调用不同的微服务。代理可以仅仅委派请求,也可以进行数据转换工作
聚合设计模式
聚合器调用多个服务实现应用程序所需的功能。它可以是一个简单的Web页面,将检索到的数据进行处理展示。它也可以是一个更高层次的组合微服务,对检索到的数据增加业务逻辑后进一步发布成一个新的微服务,这符合DRY原则。另外,每个服务都有自己的缓存和数据库。如果聚合器是一个组合服务,那么它也有自己的缓存和数据库。聚合器可以沿X轴和Z轴独立扩展。
链条设计模式:
在这种情况下,服务A接收到请求后会与服务B进行通信,类似地,服务B会同服务C进行通信。所有服务都使用同步消息传递。在整个链式调用完成之前,客户端会一直阻塞。因此,服务调用链不宜过长,以免客户端长时间等待。
聚合链条设计模式:
聚合设计模式和链条设计模式的综合,在很多应用场景中,都需要在使用聚合设计模式的同时需要使用链条设计模式。
数据共享数据模式:
在这种情况下,部分微服务可能会共享缓存和数据库存储。不过,这只有在两个服务之间存在强耦合关系时才可以。对于基于微服务的新建应用程序而言,这是一种反模式。
异步消息设计模式:
REST设计模式非常流行,但它是同步的,会造成阻塞。因此部分基于微服务的架构可能会选择使用消息队列代替REST请求/响应
代理链条设计模式-数据库设计
6.1创建Users表。
CREATE TABLE `user` (
`id` INT(10) NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`user_name` VARCHAR(50) DEFAULT NULL COMMENT '用户名',
`password` VARCHAR(50) NOT NULL COMMENT '密码',
`email` VARCHAR(50) NOT NULL COMMENT 'email',
`deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT ' 删除标志,默认 0 不删除,1 删除',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户表';
6.2创建product表。
CREATE TABLE `product` (
`id` INT(10) NOT NULL AUTO_INCREMENT, `name` VARCHAR(100) DEFAULT NULL COMMENT '产品名称',
`status` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '产品状态:0 待 审,1 上架,2 下架,3 停售,4 测试',
`price` INT(10) NOT NULL COMMENT '产品价格 单位分', `detail` TEXT COMMENT '产品详情',
`deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT ' 删除标志,默认 0 不删除,1 删除',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`)) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='产品信息';
6.3创建Orders表。
CREATE TABLE `orders` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`product_id` INT(10) NOT NULL DEFAULT '0' COMMENT '产品ID',
`price` INT(10) DEFAULT '0' COMMENT '价格',
`user_id` INT(10) DEFAULT '0' COMMENT '用户账号 ID',
`trade_id` INT(10) DEFAULT '0' COMMENT '交易号 ID',
`trade_status` TINYINT(1) DEFAULT '0' COMMENT '支付状态 0=未支付 1=已支付',
`deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT ' 删除标志,默认 0 不删除,1 删除',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
6.4创建Trade表。
CREATE TABLE `trade` (
`id` INT(10) NOT NULL AUTO_INCREMENT COMMENT 'IID',
`order_id` INT(10) NOT NULL COMMENT '订单 ID',
`user_id` INT(10) NOT NULL COMMENT '用户 ID',
`price` INT(10) NOT NULL COMMENT '支付价',
`pay_status` TINYINT(4) NOT NULL COMMENT '1 未付款 2 付款中 3 付款失败 4 付款完成',
`pay_type` TINYINT(4) NOT NULL COMMENT '支付类型:1-支付宝支付, 2-网银在线,3-银联,4-微信支付',
`gateway_pay_num` VARCHAR(30) DEFAULT NULL COMMENT '网关支 付流水号',
`gateway_pay_time` DATETIME DEFAULT NULL COMMENT '网关支付时间',
`gateway_pay_price` INT(10) NOT NULL DEFAULT '0' COMMENT '网关实际支付金额',
`deleted` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0' COMMENT ' 删除标志,默认 0 不删除,1 删除',
`create_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`) ) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='交易';
generatorSqlmapCustom工具使用
7.1通过generatorSqlmapCustom工具生成MyBatis的映射配置文件,接口,实体类。
创建product服务-创建项目
8.1创建Product服务。
8.2需改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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bjsxt</groupId>
<artifactId>17springcloud-ego-book-product-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>17springcloud-ego-book-product-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR4</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>com.bjsxt</groupId>
<artifactId>12springcloud-eureka-service-ribbon-hystrix</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-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-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
8.3修改全局配置文件,添加相关配置。
spring.application.name=gl-ego-book-product-provider
server.port=9001
#设置服务注册中心地址,指向另一个注册中心
eureka.client.service-url.defaultZone=http://admin:1234@192.168.41.242:5050/eureka/,http://admin:1234@192.168.41.242:5051/eureka/
mybatis.type-aliases-package=com.book.product.pojo
mybaits.mapper-locations=classpath:/com/book/product/mapper/*.xml
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
spring.datasource.data-username=root
spring.datasource.data-password=root
8.4创建Product-Service服务。
创建product服务-添加mybaits组件
9.1将generatorSqlmapCustom工具生成的接口、映射配置文件、实体类,添加到项目中。
创建product服务-添加查询所有商品业务
10.1在Product-Service项目中添加一个ProductService接口。
@RequestMapping("/product")
public interface ProductService {
//查询所有商品
@RequestMapping(value = "/findAll",method = RequestMethod.GET)
public List<Product> findAll();
}
10.2 Product-Provider服务中添加ProductServiceImpl类。
@Service
public class ProductServiceImpl {
@Autowired
private ProductMapper productMapper;
//查询所有商品
public List<Product> findProductAll(){
ProductExample example = new ProductExample();
return this.productMapper.selectByExampleWithBLOBs(example);
}
}
10.3修改Product-provider启动类。
@EnableEurekaClient
@SpringBootApplication
@MapperScan("com.book.product.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
10.4访问服务查看结果。
创建user服务-创建项目
11.1创建User-Provider服务。
11.2 修改User-Provider服务的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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.bjsxt</groupId>
<artifactId>17springcloud-ego-book-user-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>17springcloud-ego-book-user-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR4</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>com.bjsxt</groupId>
<artifactId>17springcloud-ego-book-user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>com.bjsxt</groupId>
<artifactId>12springcloud-eureka-service-ribbon-hystrix</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<!--配置Generator插件-->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.40</version>
</dependency>
</dependencies>
<!--指定配置文件的路径-->
<configuration>
<configurationFile>${project.basedir}/src/main/resources/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
11.3 修改User-Provider服务的配置文件添加服务相关配置。
spring.application.name=gl-ego-book-user-provider
server.port=9002
#设置服务注册中心地址,指向另一个注册中心
eureka.client.service-url.defaultZone=http://admin:1234@192.168.41.242:5050/eureka/,http://admin:1234@192.168.41.242:5051/eureka/
mybatis.type-aliases-package=com.book.user.pojo
mybaits.mapper-locations=classpath:/com/book/user/mapper/*.xml
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springcloud?useUnicode=true&characterEncoding=UTF-8&useSSL=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
创建user服务-添加mybaits组件
12.1创建User-Service服务。
12.2 将工具生成Pojo、Mpper、映射配置文件,添加到相关项目当中。
创建user服务-添加用户登录业务
13.1在User-service项目中添加一个UserService接口。
@RequestMapping("/user")
public interface UserService {
//用户登陆
@RequestMapping(value = "/login",method = RequestMethod.GET)
public User Login(@RequestParam("userName") String userName,@RequestParam("password") String password);
}
13.2在User-provider服务中添加UserServiceImpl类。
@Service
public class UserServiceImpl {
@Autowired
private UserMapper userMapper;
//用户登陆
public User userLogin(String userName,String password){
UserExample example = new UserExample();
Criteria criteria = example.createCriteria();
criteria.andUserNameEqualTo(userName);
criteria.andPasswordEqualTo(password);
List<User> list = this.userMapper.selectByExample(example);
if(list != null && list.size()>0){
return list.get(0);
}else{
return null;
}
}
}
13.3在User-Provider服务中添加controller。
@RestController
public class UserServieController implements UserService {
@Autowired
private UserServiceImpl userServiceImpl;
@Override
public User Login(String userName, String password) {
return this.userServiceImpl.userLogin(userName,password);
}
}
13.4修改User-Provider启动类。
@EnableEurekaClient
@SpringBootApplication
@MapperScan("com.book.user.mapper")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
13.5 访问服务,测试结果。
分享/讲解/扩展思考
点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。