springcloud(5)Hystrix集群及集群监控turbine

序言

承接上回的内容,这次我们主要是讲Hystrix集群及监控turbine、Feign、Hystrix整合之服务熔断服务降级彻底解耦、集群后超时设置

Hystrix集群及监控turbine

上回我们Dashboard演示的仅仅是单机服务监控,实际项目基本都是集群,所以这里集群监控用的是turbine,而turbine是基于Dashboard的。

我们先弄个集群:

microservice-book-provider-hystrix
这个集群跟上一次的
microservice-book-provider-hystrix-1004差不多,只需要修改一点点内容:
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>com.swx</groupId>
        <artifactId>microservice</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>microservice-book-provider-hystrix</artifactId>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.swx</groupId>
            <artifactId>microservice-common</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
        </dependency>
        <!--  修改后立即生效,热部署  -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>springloaded</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>
        <!--添加注册中心Eureka相关配置-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <!-- actuator监控引入 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!--Hystrix相关依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-hystrix</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

yml配置:

---
server:
  port: 1004
  context-path: /
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8
    username: root
    password: 123
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
  application:
    name: microservice-book
  profiles: provider-hystrix-1004
eureka:
  instance:
    hostname: localhost
    appname: microservice-book
    instance-id: microservice-book:1004
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://eureka2001.swx.com:2001/eureka/,http://eureka2002.swx.com:2002/eureka/,http://eureka2003.swx.com:2003/eureka/
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 3000

info:
  groupId: com.swx.testSpringcloud
  artifactId: microservice-book-provider-1004
  version: 1.0-SNAPSHOT
  userName: http://lentter.com
  phone: 130******
---
server:
  port: 1005
  context-path: /
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8
    username: root
    password: 123
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
  application:
    name: microservice-book
  profiles: provider-hystrix-1005
eureka:
  instance:
    hostname: localhost
    appname: microservice-book
    instance-id: microservice-book:1005
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://eureka2001.swx.com:2001/eureka/,http://eureka2002.swx.com:2002/eureka/,http://eureka2003.swx.com:2003/eureka/
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 1500

info:
  groupId: com.swx.testSpringcloud
  artifactId: microservice-book-provider-1005
  version: 1.0-SNAPSHOT
  userName: http://lentter.com
  phone: 130******
---
server:
  port: 1006
  context-path: /
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf8
    username: root
    password: 123
  jpa:
    hibernate:
      ddl-auto: update
    show-sql: true
  application:
    name: microservice-book
  profiles: provider-hystrix-1006
eureka:
  instance:
    hostname: localhost
    appname: microservice-book
    instance-id: microservice-book:1006
    prefer-ip-address: true
  client:
    service-url:
      defaultZone: http://eureka2001.swx.com:2001/eureka/,http://eureka2002.swx.com:2002/eureka/,http://eureka2003.swx.com:2003/eureka/
hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 1500

info:
  groupId: com.swx.testSpringcloud
  artifactId: microservice-book-provider-1006
  version: 1.0-SNAPSHOT
  userName: http://lentter.com
  phone: 130******


启动类配置

package com.swx.microservicebookproviderhystrix;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableCircuitBreaker
@EntityScan("com.swx.*.*")
@EnableEurekaClient
@SpringBootApplication
public class MicroserviceBookProviderHystrixApplication {

    public static void main(String[] args) {
        SpringApplication.run(MicroserviceBookProviderHystrixApplication.class, args);
    }

}

以上完成就得到了一个hystrix集群
新建项目microservice-book-consumer-hystrix-turbine-91来监测这个集群
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>com.swx</groupId>
        <artifactId>microservice</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <artifactId>microservice-book-consumer-hystrix-turbine-91</artifactId>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--turbine 集群监控依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-turbine</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

yml:

server:
  port: 91
  context-path: /
eureka:
  client:
    service-url:
      defaultZone: http://eureka2001.swx.com:2001/eureka/,http://eureka2002.swx.com:2002/eureka/,http://eureka2003.swx.com:2003/eureka/
turbine:
  app-config: microservice-book   # 指定要监控的应用名称
  clusterNameExpression: "'default'" #表示集群的名字为default
spring:
  application:
    name: turbine

启动类:

package com.swx.microservicebookconsumerhystrixturbine91;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
import org.springframework.cloud.netflix.turbine.EnableTurbine;

@SpringBootApplication(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
@EnableTurbine
public class MicroserviceBookConsumerHystrixTurbine91Application {

    public static void main(String[] args) {
        SpringApplication.run(MicroserviceBookConsumerHystrixTurbine91Application.class, args);
    }

}

测试:
先修改一下microservice-book-provider-hystrix的controller层里的睡眠时间:

@ResponseBody
    @GetMapping(value="/hystrix")
    @HystrixCommand(fallbackMethod="hystrixFallback")
    public Map<String,Object> hystrix() throws InterruptedException{
        Thread.sleep(2000);
        Map<String,Object> map=new HashMap<String,Object>();
        map.put("code", 200);
        map.put("info","工号【"+port+"】正在为您服务");
        return map;
    }

顺便也修改一下之前的1004的controller层,由于1004设置的超时时间是3秒,这次集群的超时时间是1.5秒,所以拿来进行一个对比。
启动注册中心:
这里为了方便我就只起2001了;
启动上回的1004
再启动这回创建的集群1005和1006
再启动消费者80
再启动上回的90监测平台
最后启动这回的91监测平台
在这里插入图片描述
先去注册中心看:
在这里插入图片描述
然后访问http://localhost/book/hystrix
顺便把http://localhost:91/turbine.stream也打开
按照我们写的代码,1004是能够正常提供功能的,1005和1006就会超时:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
监控平台
在这里插入图片描述
在这里插入图片描述

Feign、Hystrix整合

前面的代码,用@HystrixCommand fallbackMethod是很不好的,因为和业务代码耦合度太高,不利于维护,所以需要解耦,这里我们就直接Feign Hystrix整合。

1、microservice-book-provider-hystrix项目修改
我们把服务熔断降级的方法向上抽取:
BookService

 /**
     * 测试Hystrix服务降级
     * @return
     */
    public Map<String,Object> hystrix();

BookServiceImpl写具体实现

@Override
    public Map<String, Object> hystrix() {
        Map<String,Object> map=new HashMap<String,Object>();
        map.put("code", 200);
        map.put("info","工号【"+port+"】正在为您服务");
        return map;
    }

在BookController层我们注释掉之前的超时方法,改为调用bookservice的方法:

 /**
     * 测试Hystrix服务降级
     * @return
     * @throws InterruptedException
     */
    @ResponseBody
    @GetMapping(value="/hystrix")
//    @HystrixCommand(fallbackMethod="hystrixFallback")
    public Map<String,Object> hystrix() throws InterruptedException{
        Thread.sleep(200);
//        Map<String,Object> map=new HashMap<String,Object>();
//        map.put("code", 200);
//        map.put("info","工号【"+port+"】正在为您服务");
      return this.bookService.hystrix();
    }

//    public Map<String,Object> hystrixFallback() throws InterruptedException{
//        Map<String,Object> map=new HashMap<String,Object>();
//        map.put("code", 500);
//        map.put("info", "系统【"+port+"】繁忙,稍后重试");
//        return map;
//    }

2、microservice-common项目BookClientService抽取方法:

/**
     * 服务熔断降级
     */
    @GetMapping(value = "/book/hystrix")
    public Map<String,Object> hystrix();

新建 BookClientFallbackFactory 类,实现FallbackFactory< BookClientService >接口,这里就是超时后的内容;

package com.swx.microservicecommon.service;

import com.swx.microservicecommon.entity.Book;
import feign.hystrix.FallbackFactory;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * @author Songwanxi
 * @site www.lentter.club
 * @company
 * @create  2020-01-13 18:48
 */
public class BookClientFallbackFactory implements FallbackFactory<BookClientService> {
    @Override
    public BookClientService create(Throwable throwable) {
        return new BookClientService() {
            @Override
            public Book get(Integer id) {
                return null;
            }

            @Override
            public List<Book> list() {
                return null;
            }

            @Override
            public boolean save(Book book) {
                return false;
            }

            @Override
            public boolean delete(Integer id) {
                return false;
            }

            @Override
            public String ribbon() {
                return null;
            }

            @Override
            public Map<String, Object> hystrix() {
                Map<String,Object> map=new HashMap<String,Object>();
                map.put("code", 500);
                map.put("info", "系统繁忙,稍后重试");
                return map;
            }
        };
    }
}

BookClientService接口的@FeignClient注解加下 fallbackFactory属性

@FeignClient(value="MICROSERVICE-BOOK",fallbackFactory = BookClientFallbackFactory.class)

这样我们就实现了 降级处理方法;

3、microservice-book-consumer-feign-80修改 支持Hystrix
BookConsumerFeignController新增方法调用

/**
 * Feign整合Hystrix服务熔断降级
 * @return
 * @throws InterruptedException
 */
    @GetMapping(value="/hystrix")
    public Map<String,Object> hystrix() throws InterruptedException{
        return bookClientService.hystrix();
    }

4、microservice-book-consumer-feign-80的application.yml加上hystrix支持

feign:
  hystrix:
    enabled: true

5、microservice-book-consumer-feign-80的启动类上添加公共模块

@ComponentScan(basePackages = {"com.swx.microservicecommon","com.swx.microservicebookconsumerfeign80"})

注意:
- 公共子项目与当前子项目的基包都要扫描到;
- 只指定公共子模块为基包会导致本子项目的springmvc功能失效;
- 只指定本子项目为基包会导致feign与Hystrix集成失败,从而导致服务熔断功能失效

测试一下:
这里我们设置的睡眠时间是0.2s,而超时时间是1.5s
在这里插入图片描述
在这里插入图片描述
但是如果我们把睡眠时间改成2s呢?

@ResponseBody
    @GetMapping(value="/hystrix")
//    @HystrixCommand(fallbackMethod="hystrixFallback")
    public Map<String,Object> hystrix() throws InterruptedException{
        Thread.sleep(2000);
//        Map<String,Object> map=new HashMap<String,Object>();
//        map.put("code", 200);
//        map.put("info","工号【"+port+"】正在为您服务");
      return this.bookService.hystrix();
    }

重新启动项目:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可以看到即使是时间超过了设置的超时时间,也依旧是正常服务,这样肯定是不对的,这是因为即使是经过上面的整合,在消费者和注册中心这条路线上我们依旧没有设置超时时间,即还有一个 feign 也有一个超时时间的设置,当然feign底层是 ribbon的封装,所以 直接配置ribbon,ribbon默认超时也是1秒。
所以这里都是强制要求,ribbon的超时时间要大于hystrix的超时时间,否则 hystrix自定义的超时时间毫无意义。所以还得microservice-book-consumer-feign-80上加个 ribbon超时时间设置


feign:
  hystrix:
    enabled: true

ribbon:
  ReadTimeout: 10000
  ConnectTimeout: 9000

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 2000

这里我们为了测试,就设置为2秒超时,同时改变microservicebookproviderhystrix的yml超时时间:

hystrix:
  command:
    default:
      execution:
        isolation:
          thread:
            timeoutInMilliseconds: 2000

改变睡眠时间:

/**
     * 测试Hystrix服务降级
     * @return
     * @throws InterruptedException
     */
    @ResponseBody
    @GetMapping(value="/hystrix")
//    @HystrixCommand(fallbackMethod="hystrixFallback")
    public Map<String,Object> hystrix() throws InterruptedException{
        System.err.println("工号【"+port+"】正在为您服务"+new Date().toLocaleString());
        Thread.sleep(3000);
        System.err.println("工号【"+port+"】正在为您服务"+new Date().toLocaleString());
//        Map<String,Object> map=new HashMap<String,Object>();
//        map.put("code", 200);
//        map.put("info","工号【"+port+"】正在为您服务");
      return bookService.hystrix();
    }

启动测试:
在这里插入图片描述
这里1005和1006都是2s超时,睡眠3秒,所以是无法使用的,而1004没有超时,是能够使用的
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言是一种广泛使用的编程语言,它具有高效、灵活、可移植性强等特点,被广泛应用于操作系统、嵌入式系统、数据库、编译器等领域的开发。C语言的基本语法包括变量、数据类型、运算符、控制结构(如if语句、循环语句等)、函数、指针等。在编写C程序时,需要注意变量的声明和定义、指针的使用、内存的分配与释放等问题。C语言中常用的数据结构包括: 1. 数组:一种存储同类型数据的结构,可以进行索引访问和修改。 2. 链表:一种存储不同类型数据的结构,每个节点包含数据和指向下一个节点的指针。 3. 栈:一种后进先出(LIFO)的数据结构,可以通过压入(push)和弹出(pop)操作进行数据的存储和取出。 4. 队列:一种先进先出(FIFO)的数据结构,可以通过入队(enqueue)和出队(dequeue)操作进行数据的存储和取出。 5. 树:一种存储具有父子关系的数据结构,可以通过中序遍历、前序遍历和后序遍历等方式进行数据的访问和修改。 6. 图:一种存储具有节点和边关系的数据结构,可以通过广度优先搜索、深度优先搜索等方式进行数据的访问和修改。 这些数据结构在C语言中都有相应的实现方式,可以应用于各种不同的场景。C语言中的各种数据结构都有其优缺点,下面列举一些常见的数据结构的优缺点: 数组: 优点:访问和修改元素的速度非常快,适用于需要频繁读取和修改数据的场合。 缺点:数组的长度是固定的,不适合存储大小不固定的动态数据,另外数组在内存中是连续分配的,当数组较大时可能会导致内存碎片化。 链表: 优点:可以方便地插入和删除元素,适用于需要频繁插入和删除数据的场合。 缺点:访问和修改元素的速度相对较慢,因为需要遍历链表找到指定的节点。 栈: 优点:后进先出(LIFO)的特性使得栈在处理递归和括号匹配等问题时非常方便。 缺点:栈的空间有限,当数据量较大时可能会导致栈溢出。 队列: 优点:先进先出(FIFO)的特性使得
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值