zoukankan      html  css  js  c++  java
  • 【SpringCloud】第四篇:断路器(Hystrix)

    前言:

    必需学会SpringBoot基础知识

    简介:

    spring cloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。

    工具:

    JDK8

    apache-maven-3.5.2

    IntelliJ IDEA 2017.3 x64

    一、断路器简介

    Netflix开源了Hystrix组件,实现了断路器模式,SpringCloud对这一组件进行了整合。 在微服务架构中,一个请求需要调用多个服务是非常常见的; 参考图片: http://projects.spring.io/spring-cloud/spring-cloud.html#_circuit_breaker_hystrix_clients

    简单来说: 在架构里面那个服务器挂了, 就会返回报错.

    二、准备工作

    本篇是基于第一篇为基础, 首先, 启动 eureka-server:8761 和 eureka-client 项目的dev:8762

    三、在ribbon使用断路器

    3.1 pom.xml 添加依赖

    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-hystrix</artifactId>
    </dependency>

    3.2 启动类追加@EnableHystrix注解开启Hystrix

    package com.lwc;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.netflix.hystrix.EnableHystrix;
    
    /**
     * @author Eddie
     */
    @EnableHystrix
    @EnableDiscoveryClient
    @SpringBootApplication
    public class EurekaRibbonApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(EurekaRibbonApplication.class, args);
        }
    }

    3.3 Service改造, 追加功能

    package com.lwc.service;
    
    /**
     * @author eddie.lee
     * @Package com.lwc.service
     * @ClassName RibbonService
     * @description
     * @date created in 2018-03-26 19:55
     * @modified by
     */
    public interface RibbonService {
    
        String ribbonService(String name);
    
        /**
         * Hystrix 熔断 返回错误信息
         */
        String hystrixError(String name);
    }
    package com.lwc.service.impl;
    
    import com.lwc.service.RibbonService;
    import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.web.client.RestTemplate;
    
    /**
     * @author eddie.lee
     * @Package com.lwc.service.impl
     * @ClassName RibbonServiceImpl
     * @description
     * @date created in 2018-03-26 19:57
     * @modified by
     */
    @Service
    public class RibbonServiceImpl implements RibbonService {
    
        @Autowired
        private RestTemplate restTemplate;
    
        @HystrixCommand(fallbackMethod = "hystrixError")
        @Override
        public String ribbonService(String name) {
            final String url = "http://eureka-client/eureka/client?name=" + name;
            return restTemplate.getForObject(url, String.class);
        }
    
        @Override
        public String hystrixError(String name) {
            return "hi, " + name + " ,sorry, hystrix error!";
        }
    }
    
    

    3.4 浏览器查看 A:成功, B:失败  (先是启动相关服务, 请求一次地址, 然后在关闭client服务器, 在请求一次地址)

    A:  http://localhost:8764/eureka/ribbon?name=eddie

    hi eddie, i am from port:8762

    B: http://localhost:8764/eureka/ribbon?name=eddie

    hi, eddie ,sorry, hystrix error!

    四、Feign中使用断路器

    4.1 pom.xml添加依赖

    <dependency>
    	<groupId>org.springframework.cloud</groupId>
    	<artifactId>spring-cloud-starter-hystrix</artifactId>
    </dependency>

    4.2 *.yml添加开启断路器

    如果是properties文件,请在文件中加入:

    feign.hystrix.enabled=true

    如果是yml文件,请在文件中加入:

    feign:

       hystrix:   

           enabled: true

    4.3 FeignClientService 改造, 添加 fallback 错误返回

    package com.lwc.service;
    
    import com.lwc.config.FeignClientServiceHystric;
    import org.springframework.cloud.netflix.feign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    /**
     * @author eddie.lee
     * @Package com.lwc.service
     * @ClassName FeignClientService
     * @description
     * @date created in 2018-03-27 10:43
     * @modified by
     */
    @FeignClient(value = "eureka-client", fallback = FeignClientServiceHystric.class)
    public interface FeignClientService {
    
        @GetMapping("/eureka/client")
        String feignToClientByName(@RequestParam("name") String name);
    
    }
    package com.lwc.config;
    
    import com.lwc.service.FeignClientService;
    import org.springframework.stereotype.Component;
    
    /**
     * @author eddie.lee
     * @Package com.lwc.config
     * @ClassName FeignClientServiceHystric
     * @description
     * @date created in 2018-03-27 15:21
     * @modified by
     */
    @Component
    public class FeignClientServiceHystric implements FeignClientService {
    
        @Override
        public String feignToClientByName(String name) {
            return "Hystric Error, Sorry " + name;
        }
    
    }

    4.4 浏览器查看 A:成功, B:失败  (先是启动相关服务, 请求一次地址, 然后在关闭client服务器, 在请求一次地址)

    A:  http://localhost:8765/eureka/feign?name=eddie

    hi eddie, i am from port:8762

    B: http://localhost:8765/eureka/feign?name=eddie

    Hystric Error, Sorry eddie

    五、Hystrix Dashboard (断路器:Hystrix 仪表盘)

    eureka-ribbon 或者 eureka-feign 改造, 添加仪表盘

    5.1 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-hystrix-dashboard</artifactId>
    </dependency>

    5.2 启动类添加注解

    @EnableHystrix
    @EnableHystrixDashboard

    5.3 浏览器查看

    地址: http://localhost:8765/hystrix.stream

    输入: http://localhost:8765/hystrix.stream

    Title:{name}

    测试: 请求 http://localhost:8765/eureka/feign?name=eddie 就会在仪表盘出现对应数据, 比如次数

    5.4 错误

    提示: Unable to connect to Command Metric Stream.

    解决: 查看是否缺少依赖,或者注解

    六、参考资料

    eureka-feign
    http://localhost:8765/eureka/feign?name=eddie

    eureka-ribbon
    http://localhost:8764/eureka/ribbon?name=eddie

    
    

    标签

    4-1, 4-2

    源码下载
    https://github.com/eddie-code/SpringCloudDemo#springclouddemo

  • 相关阅读:
    Educational Codeforces Round 10 C. Foe Pairs 水题
    Educational Codeforces Round 10 B. z-sort 构造
    CDOJ 1048 Bob's vector 三分
    Educational Codeforces Round 10 A. Gabriel and Caterpillar 模拟
    第14届电子科大初赛民间盗版部分题目题解
    HDU 5654 xiaoxin and his watermelon candy 离线树状数组 区间不同数的个数
    HDU 5653 Bomber Man wants to bomb an Array. dp
    HDU 5652 India and China Origins 二分+并查集
    HDU 5651 xiaoxin juju needs help 数学
    HDU 5650 so easy 数学
  • 原文地址:https://www.cnblogs.com/EddieBlog/p/8657516.html
Copyright © 2011-2022 走看看