c++ 设计模式_Spring Cloud 采用RabbitMQ收集数据监控、微服务设计模式 项目实战一...

训练大纲(第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微服务中有几种常见的设计模式?

答:微服务中有六种常见的设计模式,分别为:

  1. 代理设计模式
  2. 聚合设计模式
  3. 链条设计模式
  4. 聚合链条设计模式
  5. 数据共享设计模式
  6. 异步消息设计模式

5.2每种设计模式的的特点是什么?

答:

代理设计模式:

55843f4389d26f76cdb529eac2c27791.png

统一入口,鉴权校验,请求过滤,在这种情况下,客户端并不聚合数据,但会根据业务需求的差别调用不同的微服务。代理可以仅仅委派请求,也可以进行数据转换工作

聚合设计模式

eeda9e3287bd2cd49e6f5c10ecd93ef1.png

聚合器调用多个服务实现应用程序所需的功能。它可以是一个简单的Web页面,将检索到的数据进行处理展示。它也可以是一个更高层次的组合微服务,对检索到的数据增加业务逻辑后进一步发布成一个新的微服务,这符合DRY原则。另外,每个服务都有自己的缓存和数据库。如果聚合器是一个组合服务,那么它也有自己的缓存和数据库。聚合器可以沿X轴和Z轴独立扩展。

链条设计模式:

0274788b663b07c458c43a9e19cc3685.png

在这种情况下,服务A接收到请求后会与服务B进行通信,类似地,服务B会同服务C进行通信。所有服务都使用同步消息传递。在整个链式调用完成之前,客户端会一直阻塞。因此,服务调用链不宜过长,以免客户端长时间等待。

聚合链条设计模式:

1a88344876561f78696a3f2658169269.png

聚合设计模式和链条设计模式的综合,在很多应用场景中,都需要在使用聚合设计模式的同时需要使用链条设计模式。

数据共享数据模式:

c7afa52456a46bb1b01b583950e02f85.png

在这种情况下,部分微服务可能会共享缓存和数据库存储。不过,这只有在两个服务之间存在强耦合关系时才可以。对于基于微服务的新建应用程序而言,这是一种反模式。

异步消息设计模式:

4ca60b2ea869f4400323f5b983c0a6e5.png

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 访问服务,测试结果。

0e81c8952c43d509fd56eb380e8306c5.png

分享/讲解/扩展思考

点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值