zoukankan      html  css  js  c++  java
  • Hystrix集群及集群监控turbine

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

    turbine是基于Dashboard的。

    先搞个集群;

    microservice-student-provider-hystrix-1004项目的基础上再搞一个microservice-student-provider-hystrix-1005

    代码和配置都复制一份,然后修改几个地方;

    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/mybatis_ssm?useUnicode=true&characterEncoding=utf8
        username: root
        password: 123
      jpa:
        hibernate:
          ddl-auto: update
        show-sql: true
      application:
        name: microservice-student
      profiles: provider-hystrix-1004
    
    eureka:
      instance:
        hostname: localhost
        appname: microservice-student
        instance-id: microservice-student:1004
        prefer-ip-address: true
      client:
        service-url:
          defaultZone: http://eureka2001.lingerqi.com:2001/eureka/,http://eureka2002.lingerqi.com:2002/eureka/,http://eureka2003.lingerqi.com:2003/eureka/
    
    info:
      groupId: com.lingerqi.testSpringcloud
      artifactId: microservice-student-provider-hystrix-1004
      version: 1.0-SNAPSHOT
      userName: http://lingerqi.com
      phone: 123456
    
    hystrix:
      command:
        default:
          execution:
            isolation:
              thread:
                timeoutInMilliseconds: 1500
    
    ---
    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/mybatis_ssm?useUnicode=true&characterEncoding=utf8
        username: root
        password: 123
      jpa:
        hibernate:
          ddl-auto: update
        show-sql: true
      application:
        name: microservice-student
      profiles: provider-hystrix-1005
    
    eureka:
      instance:
        hostname: localhost
        appname: microservice-student
        instance-id: microservice-student:1005
        prefer-ip-address: true
      client:
        service-url:
          defaultZone: http://eureka2001.lingerqi.com:2001/eureka/,http://eureka2002.lingerqi.com:2002/eureka/,http://eureka2003.lingerqi.com:2003/eureka/
    
    info:
      groupId: com.lingerqi.testSpringcloud
      artifactId: microservice-student-provider-hystrix-1005
      version: 1.0-SNAPSHOT
      userName: http://lingerqi.com
      phone: 123456
    
    hystrix:
      command:
        default:
          execution:
            isolation:
              thread:
                timeoutInMilliseconds: 1500
    
    ---
    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/mybatis_ssm?useUnicode=true&characterEncoding=utf8
        username: root
        password: 123
      jpa:
        hibernate:
          ddl-auto: update
        show-sql: true
      application:
        name: microservice-student
      profiles: provider-hystrix-1006
    
    eureka:
      instance:
        hostname: localhost
        appname: microservice-student
        instance-id: microservice-student:1006
        prefer-ip-address: true
      client:
        service-url:
          defaultZone: http://eureka2001.lingerqi.com:2001/eureka/,http://eureka2002.lingerqi.com:2002/eureka/,http://eureka2003.lingerqi.com:2003/eureka/
    
    info:
      groupId: com.lingerqi.testSpringcloud
      artifactId: microservice-student-provider-hystrix-1006
      version: 1.0-SNAPSHOT
      userName: http://lingerqi.com
      phone: 123456
    
    hystrix:
      command:
        default:
          execution:
            isolation:
              thread:
                timeoutInMilliseconds: 1500
    

      启动类配置:

    package com.lingerqi.microservicestudentproviderhystrix;
    
    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.lingerqi.*.*")
    @EnableEurekaClient
    @SpringBootApplication
    public class MicroserviceStudentProviderHystrixApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(MicroserviceStudentProviderHystrixApplication.class, args);
        }
    
    }

    这样的话 就有了 hystrix集群服务;

    我们新建项目microservice-student-consumer-hystrix-turbine-91

    新增pom.xml依赖

    <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>
    

      application.yml:

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

    新建启动类MicroserviceStudentConsumerHystrixTurbine91Application 加注解:@EnableTurbine

    package com.lingerqi.microservicestudentconsumerhystrixturbine91;
    
    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 MicroserviceStudentConsumerHystrixTurbine91Application {
    
        public static void main(String[] args) {
            SpringApplication.run(MicroserviceStudentConsumerHystrixTurbine91Application.class, args);
        }
    
    }

    测试:

    启动三个eureka,然后把1004  1005 hystrix的服务都启动;

     

    microservice-student-consumer-80这个也启动,方便测试;

     

    dashboardturbine启动;

    输入http://localhost:90/hystrix进入仪表盘,输入地址

     

     

    FeignHystrix整合

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

    1、microservice-student-provider-hystrix项目修改

    我们不用原先那套。按照正常的逻辑来写;

    StudentService加新的接口方法:

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

    实现类:

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

    StudentProviderController正常调用service方法:

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

      

    microservice-common项目新建FallbackFactory类,解耦服务熔断服务降级

    StudentClientService接口,新增getInfo方法;

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

    新建 StudentClientFallbackFactory 类,实现FallbackFactory<StudentClientService>接口;

     

    package com.lingerqi.microservicecommon.service;
    
    import com.lingerqi.microservicecommon.entity.Student;
    import feign.hystrix.FallbackFactory;
    import org.springframework.stereotype.Component;
    
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    @Component
    public class StudentClientFallbackFactory implements FallbackFactory<StudentClientService> {
    
        @Override
        public StudentClientService create(Throwable cause) {
            return new StudentClientService() {
    
                @Override
                public boolean save(Student student) {
                    return false;
                }
    
                @Override
                public List<Student> list() {
                    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;
                }
    
                @Override
                public Student get(Integer id) {
                    return null;
                }
    
                @Override
                public boolean delete(Integer id) {
                    return false;
                }
    
                @Override
                public String ribbon() {
                    return null;
                }
            };
        }
    
    }

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

     

    @FeignClient(value="MICROSERVICE-STUDENT",fallbackFactory=StudentClientFallbackFactory.class)

    microservice-student-consumer-feign-80修改 支持Hystrix

    StudentConsumerFeignController新增方法调用

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

    microservice-student-consumer-feign-80application.yml加上hystrix支持

     

    feign:
      hystrix:
        enabled: true
    

     

      

    1、microservice-student-consumer-feign-80启动类上添加公共模块

    @ComponentScan(basePackages = {"com.lingerqi.microservicecommon","com.lingerqi.microservicestudentconsumerfeign80"})

    注意:

    1、公共子项目与当前子项目的基包都要扫描到;

    2、只指定公共子模块为基包会导致本子项目的springmvc功能失效;

    3、只指定本子项目为基包会导致feignHystrix集成失败,从而导致服务熔断功能失效

    package com.lingerqi.microservicestudentconsumerfeign80;
    
    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.eureka.EnableEurekaClient;
    import org.springframework.cloud.netflix.feign.EnableFeignClients;
    import org.springframework.context.annotation.ComponentScan;
    
    @ComponentScan(basePackages = {"com.lingerqi.microservicecommon","com.lingerqi.microservicestudentconsumerfeign80"})//扫描公共模块
    @EnableFeignClients(value = "com.lingerqi.*.*")
    @EnableEurekaClient
    @SpringBootApplication(exclude={DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})
    public class MicroserviceStudentConsumerFeign80Application {
    
        public static void main(String[] args) {
            SpringApplication.run(MicroserviceStudentConsumerFeign80Application.class, args);
        }
    
    }
    

      

    测试开启三个eureka,以及带hystrixprovider,和带feign,hystrixconsummer

     

    集群后超时设置

    这里因为还有一个 feign 也有一个超时时间的设置,当然feign底层是 ribbon的封装,所以 直接配置ribbon,ribbon默认超时也是1秒。

    所以这里都是强制要求,ribbon的超时时间要大于hystrix的超时时间,否则 hystrix自定义的超时时间毫无意义。

    所以还得microservice-student-consumer-feign-80上加个 ribbon超时时间设置

    ribbon:
      ReadTimeout: 10000
      ConnectTimeout: 9000

    这样就完工了

     

     

     

  • 相关阅读:
    C#
    C#
    ssh学习笔记
    (已解决)Could not open '/var/lib/nova/mnt/*/volume-*': Permission denied
    RPCVersionCapError: Requested message version, 4.17 is incompatible. It needs to be equal in major version and less than or equal in minor version as the specified version cap 4.11.
    如何在linux下安装idea
    The system has no LUN copy license
    调整mysql数据库最大连接数
    mysql数据库编码问题
    cinder支持nfs快照
  • 原文地址:https://www.cnblogs.com/omji0030/p/12019887.html
Copyright © 2011-2022 走看看