精华内容
下载资源
问答
  • 说明:本文仅作为本人学习&...一.Turbine能解决什么问题    在使用Hystrix Dashboard组件监控服务的熔断情况时,每个服务都有一个Hystrix Dashboard主页,当服务数量很多时,监控非常不方便.为了同时监控多...

    说明:本文仅作为本人学习<<深入理解Spring Cloud与微服务构建>>一书的学习笔记,所有代码案例及文字描述均参考该书,不足之处,请留言指正,不胜感激.
    一.Turbine能解决什么问题
       在使用Hystrix Dashboard组件监控服务的熔断情况时,每个服务都有一个Hystrix Dashboard主页,当服务数量很多时,监控非常不方便.为了同时监控多个服务的熔断器的状况,Netflix开源了Hystrix的另一个组件Turbine.Turbine用于聚合多个Hystrix Dashboard,将多个Hystrix Dashboard组件的数据放在一个页面上展示,进行集中监控.
    二.单独搭建一个Turbine服务.
    1.新建一个module工程,取名turbine-server.
    2.pom文件引入相关依赖,包括eureka,turbine,acturtor的起步依赖,如下:
    这里写图片描述
    3.然后在配置文件application.yml加上相关配置,具体配置代码如下:

    spring:
      application:
        name: turbine-server
    server:
      port: 8769
    turbine:
      appConfig: producer-server,customer-server  #配置需要监控的服务名
      clusterNameExpression: new String("default") #默认为服务名的集群,此时用默认即可
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:8761/eureka/

    4.在启动类上加上@EnableTurbine,开启Turbine功能.

    /**
     * Turbine服务
     *
     * @author zhyu
     * @version v1.0
     * @date 2018年06月28日 19:09:03
     */
    @SpringBootApplication
    @EnableEurekaClient
    @EnableTurbine
    public class TurbineServerApplication {
        public static void main(String[] args) {
            SpringApplication.run(TurbineServerApplication.class, args);
        }
    }

    这里我在生产者服务中也启用了Feign和Hystrix,让生产者服务和消费者服务互相调用,并对Feign做了熔断,并且这两个服务都开启了Hystrix Dashboard监控.接着,我们依次启动eureka-server,producer-server,customer-server,turbine-server,并访问生产者和消费者服务相互调用的接口,然后在浏览器打开消费者服务的Hystrix Dashboard页面:http://localhost:8764/hystrix ,输入以下信息:
    这里写图片描述
    这里写图片描述
    可见,生产者和消费者服务的熔断器状态都显示到了一个页面上,最基本的Turbine服务配置成功.

    展开全文
  • 想要聚合所有服务熔断器的监控页面需要spring-cloud-starter-netflix-turbine。 第一步 还是跟以前一样,我们准备一个父项目,还有一个eureka-server,代码在上文已经贴出来过,没有什么变化。 第二步 ...

    前言

    前面文章提到了使用了Feign集成的Hystrix做了一个简单的实战练习,成功的进行了服务降级和失败快速返回。下面我要对熔断器监控进行页面化,并将多个服务的的熔断器监控页面进行聚合,方便管理,也是实际生产最典型的例子。当然这种做法最系统最合理,但是我个人以及周围的朋友在平时讨论的结果看,熔断器的聚合以及页面化管理应用概率并不多,即使在生产环境也很少使用,下面我边讲解边解释原因。

    正文

    首先,大家都知道一个服务需要依赖spring-cloud-starter-netflix-hystrix才可以实现熔断器功能,需要依赖spring-cloud-starter-netflix-hystrix-dashboard才可以使用熔断器监控页面。想要聚合所有服务熔断器的监控页面需要spring-cloud-starter-netflix-turbine。

    第一步

    还是跟以前一样,我们准备一个父项目,还有一个eureka-server,代码在上文已经贴出来过,没有什么变化。

    第二步

    准备两个客户端一个叫sc-hello-service,另一个叫sc-provider-service

    下面贴出sc-hello-service项目的代码,首先我把项目的目录给大家,下面贴的代码比较多,每块代码都有类名,大家对照着类名把代码块对号入座(截图中的配置文件的代码我合成了一个代码块贴出来的)。

     

    @RestController
    public class HelloController {
    
    	@Autowired
    	private IHelloService userService;
        
        @GetMapping("/getProviderData")
        public List<String> getProviderData(){
            return userService.getProviderData();
        }
        
        /**
         * 
         * @return
         */
        @RequestMapping(value = "/helloService", method = RequestMethod.GET)
        public String getHelloServiceData() {
        	return "hello Service";
        }
    }
    @FeignClient(name = "sc-provider-service")
    public interface ProviderService {
    	
    	@RequestMapping(value = "/getDashboard", method = RequestMethod.GET)
        public List<String> getProviderData();
    
    }
    @Component
    public class HelloService implements IHelloService{
    	
        @Autowired
        private ProviderService dataService;
    
    	@Override
    	public List<String> getProviderData() {
    		return dataService.getProviderData();
    	}
    
    }
    public interface IHelloService {
        public List<String> getProviderData();
    }
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableHystrix
    @EnableFeignClients
    public class HelloServiceApplication {
    	
        public static void main(String[] args) {
            SpringApplication.run(HelloServiceApplication.class, args);
        }
       
    }
    server:
      port: 9091
    spring:
      application:
        name: sc-hello-service
    eureka:
      client:
        serviceUrl:
          defaultZone: http://${eureka.host:127.0.0.1}:${eureka.port:8761}/eureka/
      instance:
        prefer-ip-address: true
    management:
      security:
        enabled: false
      endpoints:
        web:
          exposure:
            include: hystrix.stream
    feign:
      hystrix:
        enabled: true
    ribbon:
      ConnectTimeout: 6000
      ReadTimeout: 6000
      MaxAutoRetries: 0
      MaxAutoRetriesNextServer: 0
    hystrix:
      command:
        default:
          execution:
            timeout:
            isolation:
              thread:
                timeoutInMilliseconds: 15000
    <dependencies>
            <dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    		</dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
            <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
        </dependency>
    </dependencies>

    下面贴出sc-provider-service项目的代码,首先我把项目的目录给大家,下面贴的代码比较多,每块代码都有类名,大家对照着类名把代码块对号入座(截图中的配置文件的代码我合成了一个代码块贴出来的)。

    @RestController
    public class ProviderController {
    	@Autowired
    	private ConsumerService consumerService;
    
        @GetMapping("/getDashboard")
        public List<String> getProviderData(){
        	List<String> provider = new ArrayList<String>();
        	provider.add("hystrix dashboard");
            return provider;
        }
    @GetMapping("/getHelloService")
        public String getHelloService(){
            return consumerService.getHelloServiceData();
        }
    }
    
    @FeignClient(name = "sc-hello-service")
    public interface ConsumerService {
    	
    	@RequestMapping(value = "/helloService", method = RequestMethod.GET)
        public String getHelloServiceData();
    }

     

    server:
      port: 8099
    spring:
      application:
        name: sc-provider-service
    eureka:
      client:
        serviceUrl:
          defaultZone: http://${eureka.host:127.0.0.1}:${eureka.port:8761}/eureka/
      instance:
        prefer-ip-address: true
    feign:
      hystrix:
        enabled: true
    management:
      security:
        enabled: false
      endpoints:
        web:
          exposure:
            include: hystrix.stream
    
        <dependencies>
            <dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    		</dependency>
    		<dependency>
    			<groupId>org.springframework.cloud</groupId>
    			<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    		</dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
            </dependency>
        </dependencies>
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableHystrix
    public class ProviderServiceApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ProviderServiceApplication.class, args);
        }
        
    }

    第三步

    创建一个聚合工程sc-turbine-dashboard,代码很简单除了一个启动类就是一个配置文件

    下面依次贴出来,重点就是启动类加入类加入@EnableTurbine,

    turbine:
      appConfig: sc-hello-service,sc-provider-service的意思是把这两个应用的服务聚合在一起,在一个页面显示。
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableTurbine
    @EnableHystrixDashboard
    public class TurbineApplication {
        public static void main(String[] args) {
            SpringApplication.run(TurbineApplication.class, args);
        }
    }
    server:
      port: 9088
    spring:
      application:
        name: sc-turbine-dashboard
    eureka:
      client:
        serviceUrl:
          defaultZone: http://${eureka.host:127.0.0.1}:${eureka.port:8761}/eureka/
      instance:
        prefer-ip-address: true
    management:
      security:
        enabled: false
      endpoints:
        web:
          exposure:
            include: hystrix.stream
    turbine:
      appConfig: sc-hello-service,sc-provider-service
      clusterNameExpression: "'default'"

    第四步

    依次启动eureka-service,两个客户端sc-hello-service,sc-provider-service最后启动sc-turbine-dashboard,

    然后在浏览器输入http://localhost:9088/hystrix显示如图,屏幕中间有三个地址,分别是监控方式:

    第一个是默认集群监控,第二个是指定的集群,第三个是单个应用监控。

    这里我们在下面的地址栏选择第一种方法,输入http://localhost:9088/turbine.stream

     

     

    这时你进入的页面应该是loading中,这是你访问一下http://localhost:9091/getProviderDatahttp://localhost:8099/getHelloService

    ,这回再回头看你的聚合监控页面

    这里面有很多参数,我不做讲解了,有时间我会单独发文说明这些参数代表说明意思。

    下面我们来色是一下被调用的服务宕掉的 情况,可以发现页面参数的变化

    在你访问http://localhost:9091/getProviderDatahttp://localhost:8099/getHelloService时,由于注册中心的定时任务,服务还没有注册在eureka上,或者两个都启动后,手动停掉一个服务,你访问的时候会看到有点方法出现100%,然后前面有一个1,说明失败请求这个方法1次。反复请求,1会增加到2……,但是停止访问,过一会又变回0和0.0%。这里告诉大家这里记录的都是失败的请求和最近10秒内的错误比率,曲线是2分钟内流量的变化趋势,所以前言我们说,很多时候这个聚合监控页面很少使用的原因:

    1.错误信息保留时间短,甚至有的时候没来得及反应就消失了。

    2.即使出现错误也不能自己修复和解决,hystrix已经有修复功能了,要你何用,用来看吗?

     

    注:对本文有异议或不明白的地方微信探讨,wx:15524579896

     

    展开全文
  • springCloud第三课(Hystrix监控平台、DashBoard、Turbine监控、熔断器的状态、微服务网关Zuul)) 上文回顾 上文我们实现了hystrix的熔断降级,我们知道,当请求失败,被拒绝,超时的时候,都会进入到降级方法中。...

    springCloud第三课(Hystrix监控平台、DashBoard、Turbine监控、熔断器的状态、微服务网关Zuul))

    上文回顾

    上文我们实现了hystrix的熔断降级,我们知道,当请求失败,被拒绝,超时的时候,都会进入到降级方法中。但进入降级方法并不意味着断路器已经被打开。那么如何才能了解断路器中的状态呢?
    上文链接
    项目源码gitee:gitee地址


    本文目录

    一、Hystrix的监控平台

    除了实现容错功能,Hystrix还提供了近乎实时的监控,HystrixCommand和HystrixObservableCommand在执行时,会生成执行结果和运行指标。比如每秒的请求数量,成功数量等。这些状态会暴露在Actuator提供的/health端点中。
    只需为项目添加 spring-boot-actuator 依赖,重启项目,访问http://localhost:9013/actuator/hystrix.stream ,即可看到实时的监控数据。


    搭建Hystrix监控平台

    引入jar包

    在这里插入图片描述


    这个不出意外的话,在之前健康检查时就已经引入了。

    重启服务

    访问测试一下
    在这里插入图片描述
    发现根本访问不到,这里其实有个坑,要在yml文件中配置一下如下


    配置yml文件

    management:
      endpoints:
        web:
          exposure:
            include: '*'
    

    在这里插入图片描述


    再次重启服务

    再次请求
    在这里插入图片描述

    发现它一直ping,然后请求一个服务
    在这里插入图片描述


    搭建Hystrix DashBoard监控

    刚刚讨论了Hystrix的监控,但访问/hystrix.stream接口获取的都是以文字形式展示的信息。很难通过文字直观的展示系统的运行状态,所以Hystrix官方还提供了基于图形化的DashBoard(仪表板)监控平台。Hystrix仪表板可以显示每个断路器(被@HystrixCommand注解的方法)的状态。


    导入依赖
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <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>
    
    添加注解

    在启动类使用@EnableHystrixDashboard注解激活仪表盘项目

    重启服务

    重启服务,访问测试
    在这里插入图片描述


    将之前的访问的连接输入到监控连接里面,如下图
    在这里插入图片描述

    然后点击按钮进入
    在这里插入图片描述


    然后访问服务一个测试
    在这里插入图片描述


    注意:Hystrix仪表板可以显示每个断路器(被@HystrixCommand注解的方法)的状态,未被添加注解的方法无法监控。

    二、断路器聚合监控Turbine

    在微服务架构体系中,每个服务都需要配置Hystrix DashBoard监控。如果每次只能查看单个实例的监控数据,就需要不断切换监控地址,这显然很不方便。要想看这个系统的Hystrix Dashboard数据就需要用到Hystrix
    Turbine。Turbine是一个聚合Hystrix 监控数据的工具,他可以将所有相关微服务的 Hystrix监控数据聚合到一起,方便使用。引入Turbine后,整个监控系统架构如下:
    在这里插入图片描述


    搭建ebuy-turbine

    新建一个springboot项目

    过程略

    引入jar包

    <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
    <!--turbine监控平台-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-turbine</artifactId>
            </dependency>
            <!--hystrix熔断 (因为监控平台只监控hystrix监控的方法)-->
            <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>
    

    配置多个微服务的hystrix监控

    在application.yml的配置文件中开启turbine并进行相关配置
    在这里插入图片描述

    server:
      port: 8031 #端口
    spring:
      application:
        name: ebuy-turbine #服务名称
    logging:
      level:
        cn.ebuy: DEBUG
    eureka:
      client:
        service-url:
          # 集群配置多个,单机配置一个
          defaultZone: http://127.0.0.1:9880/eureka/,http://127.0.0.1:9890/eureka/
      instance:
        prefer-ip-address: true #使用ip地址注册
        lease-expiration-duration-in-seconds: 10 #eureka client 发送心跳给server端,续约到期时间(默认90秒)
        lease-renewal-interval-in-seconds: 5 #发送心跳续约时间间隔
    turbine:
      cluster-name-expression: "'default'"
      app-config: ebuy-order
    

    注:# 要监控的微服务列表,多个用,分隔

    • eureka相关配置 : 指定注册中心地址
    • turbine相关配置:指定需要监控的微服务列表
      turbine会自动的从注册中心中获取需要监控的微服务,并聚合所有微服务中的 /hystrix.stream 数据

    配置启动类

    在这里插入图片描述

    • 作为一个独立的监控项目,需要配置启动类,开启HystrixDashboard监控平台,并激活Turbine

    测试

    浏览器访问 http://localhost:8031/hystrix 展示HystrixDashboard。
    并在url位置输入 http://localhost:8031/turbine.stream(文本数据),http://localhost:8031/hystrix(监控平台),动态根据turbine.stream数据展示多个微服务的监控数据


    输入需要监控的微服务地址

    在这里插入图片描述
    在这里插入图片描述


    这样turbine监控微服务平台便是搭建完成了。


    三、熔断器的状态

    回顾一下

    回顾一下上面的情况,当product停止服务时,请求order服务,order由于请求不到product而熔断,如下图

    正常未停止product微服务时:
    在这里插入图片描述
    停止product微服务:
    在这里插入图片描述
    请求order服务,发生熔断
    在这里插入图片描述


    上图可以看出监控平台显示服务状态是failure失败,而非Short-Circuited熔断,那这是为什么呢???


    熔断器状态

    熔断器有三个状态 CLOSEDOPENHALF_OPEN 熔断器默认关闭状态,当触发熔断后状态变更为OPEN ,在等待到指定的时间,Hystrix会放请求检测服务是否开启,这期间熔断器会变为 HALF_OPEN 半开启状态,熔断探测服务可用则继续变更为 CLOSED 关闭熔断器。
    熔断器流程图


    Closed:关闭状态(断路器关闭),所有请求都正常访问。代理类维护了最近调用失败的次数,如果某次调用失败,则使失败次数加1。如果最近失败次数超过了在给定时间内允许失败的阈值,则代理类切换到断开(Open)状态。此时代理开启了一个超时时钟,当该时钟超过了该时间,则切换到半断开(Half-Open)状态。该超时时间的设定是给了系统一次机会来修正导致调用失败的错误。

    Open:打开状态(断路器打开),所有请求都会被降级(熔断兜底)。Hystix会对请求情况计数,当一定时间
    内失败请求百分比达到阈值,则触发熔断,断路器会完全关闭。默认失败比例的阈值是50%,请求次数最少不低于20次。

    Half Open:半开状态,open状态不是永久的,打开后会进入休眠时间(默认是5S)。随后断路器会自动进入半开状态。此时会释放1次请求通过,若这个请求是健康的,则会关闭断路器,否则继续保持打开,再次进行5秒休眠计时。


    测试之前的准备

    为了能够精确控制请求的成功或失败,我们在一下代码做调整
    在这里插入图片描述
    注:这样如果参数是id为816753,一定成功,其它情况都失败。

    我们准备两个请求窗口:

    • 成功请求:http://localhost:9013/order/hystrix/816753
    • 不成功请求:http://localhost:9013/order/hystrix/1

    熔断器的默认触发阈值是20次请求,不好触发。休眠时间时5秒,时间太短,不易观察,为了测试方便,我们可以通过配置修改熔断策略:

    circuitBreaker.requestVolumeThreshold=5
    circuitBreaker.sleepWindowInMilliseconds=10000
    circuitBreaker.errorThresholdPercentage=50
    
    

    在这里插入图片描述

    • requestVolumeThreshold:触发熔断的最小请求次数,默认20
    • errorThresholdPercentage:触发熔断的失败请求最小占比,默认50%
    • sleepWindowInMilliseconds:熔断多少秒后去尝试请求
    • 然后重启服务

    开始测试

    熔断器处于关闭状态

    • 请求正确的服务

    在这里插入图片描述

    • 服务仍是关闭状态
    • 请求错误的服务,但是请求次数小于5次
      在这里插入图片描述
    • 服务仍是关闭状态
    • 请求错误的服务,次数大于5次 在这里插入图片描述- 此时熔断器的状态变为开启状态,进入休眠时间(5秒)

    熔断器处于打开状态

    • 在熔断器进入开启状态之后不到5s内请求正确的服务 在这里插入图片描述

    • 发现正确的服务也被熔断处理

    • 在熔断器进入开启状态之后不到5s内请求错误的服务 在这里插入图片描述

    总结:熔断器处于开启状态下,所有服务都会被降级处理

    熔断器处于半开状态

    • 熔断器进入开启状态之后5s,进入半开状态
    • 此时请求正确的服务 在这里插入图片描述- 服务正常返回,并且熔断器状态变为关闭
    • 熔断器进入开启状态之后5s,进入半开状态
    • 此时请求错误的服务 在这里插入图片描述
    • 熔断器状态变为开启状态,进入5秒休眠期

    注意:为了方便理解,可以根据上述的熔断器状态流程图来分析


    四、微服务网关

    在学习完前面的知识后,微服务架构已经初具雏形。但还有一些问题:不同的微服务一般会有不同的网络地址,客户端在访问这些微服务时必须记住几十甚至几百个地址,这对于客户端方来说太复杂也难以维护。如下图:
    在这里插入图片描述


    如果让客户端直接与各个微服务通讯,可能会有很多问题:

    • 客户端会请求多个不同的服务,需要维护不同的请求地址,增加开发难度
    • 在某些场景下存在跨域请求的问题
    • 加大身份认证的难度,每个微服务需要独立认证

    因此,我们需要一个微服务网关,介于客户端与服务器之间的中间层,所有的外部请求都会先经过微服务网关。客户端只需要与网关交互,只知道一个网关地址即可,这样简化了开发还有以下优点:

    • 易于监控
    • 易于认证
    • 减少了客户端与各个微服务之间的交互次数

    在这里插入图片描述


    服务网关的概念

    什么是微服务网关

    API网关是一个服务器,是系统对外的唯一入口。API网关封装了系统内部架构,为每个客户端提供一个定制的API。API网关方式的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。通常,网关也是提供REST/HTTP的访问API。服务端通过API-GW注册和 管理服务。

    作用和应用情景

    网关具有的职责,如身份验证、监控、负载均衡、缓存、请求分片与管理、静态响应处理。当然,最主要的职责还是与“外界联系”。


    常见的API网关实现方式

    • Kong

    基于Nginx+Lua开发,性能高,稳定,有多个可用的插件(限流、鉴权等等)可以开箱即用。问题:只支持Http协议;二次开发,自由扩展困难;提供管理API,缺乏更易用的管控、配置方式。

    • Zuul

    Netflix开源,功能丰富,使用JAVA开发,易于二次开发;需要运行在web容器中,如Tomcat。问题:缺乏管控,无法动态配置;依赖组件较多;处理Http请求依赖的是Web容器,性能不如Nginx

    • Traefik

    Go语言开发;轻量易用;提供大多数的功能:服务路由,负载均衡等等;提供WebUI 问题:二进制文件部署,二次开发难度大;UI更多的是监控,缺乏配置、管理能力;

    • Spring Cloud Gateway

    SpringCloud提供的网关服务

    • Nginx+lua实现

    使用Nginx的反向代理和负载均衡可实现对api服务器的负载均衡及高可用 问题:自注册的问题和网关本身的扩展性


    基于Nginx的网关实现

    Nginx介绍

    在这里插入图片描述


    正向/反向代理

    正向代理

    在这里插入图片描述

    正向代理,“它代理的是客户端,代客户端发出请求”,是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。

    反向代理

    在这里插入图片描述

    多个客户端给服务器发送的请求,Nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时~请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,Nginx扮演的就是一个反向代理角色。客户端是无感知代理的存在的,反向代理对外都是透明的,访问者并不知道自己访问的是一个代理。因为客户端不需要任何配置就可以访问。反向代理,“它代理的是服务端,代服务端接收请求”,主要用于服务器集群分布式部署的情况下,反向代理隐 藏了服务器的信息,如果只是单纯的需要一个最基础的具备转发功能的网关,那么使用Ngnix是一个不错的选择


    微服务网关Zuul

    Zuul简介

    ZUUL是Netflix开源的微服务网关,它可以和Eureka、Ribbon、Hystrix等组件配合使用,Zuul组件的核心是一系列的过滤器,这些过滤器可以完成以下功能:

    • 动态路由:动态将请求路由到不同后端集群
    • 压力测试:逐渐增加指向集群的流量,以了解性能
    • 负载分配:为每一种负载类型分配对应容量,并弃用超出限定值的请求
    • 静态响应处理:边缘位置进行响应,避免转发到内部集群
    • 身份认证和安全: 识别每一个资源的验证要求,并拒绝那些不符的请求。Spring Cloud对Zuul进行
      了整合和增强。

    搭建Zuul网关服务器

    创建工程导入依赖
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Greenwich.RELEASE</version>
                    <type>pom</type>
                    <scope>import</scope>
                </dependency>
            <!--zuul网关的jar-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
                <version>2.1.0.RELEASE</version>
            </dependency>
    

    编写启动类

    在这里插入图片描述

    • @EnableZuulProxy : 通过 @EnableZuulProxy 注解开启Zuul网管功能

    编写配置
    • 创建配置文件 application.yml ,并添加相应配置
    server:
      port: 9090 #端口
    spring:
      application:
        name:  ebuy-zuul #服务名称
    logging:
      level:
        cn.ebuy: DEBUG
    

    Zuul中的路由转发

    最直观的理解:“路由”是指根据请求URL,将请求分配到对应的处理程序。在微服务体系中,Zuul负责接收所有的请求。根据不同的URL匹配规则,将不同的请求转发到不同的微服务处理。

    对应的配置
    zuul:
      routes:
        ebuy-order: #只是个在这个配置文件中的节点名字这里是路由id,随意写
          path: /ebuy-order/** # 映射路径 
          url: http://127.0.0.1:9013/ # 映射路径对应的实际url地址
          sensitive-Headers: #默认zuul会屏蔽cookie,cookie不会传到下游服务,这里设置为空则取
    消默认的黑名单,如果设置了具体的头信息则不会传到下游服务
    
        ebuy-product:
          path: /ebuy-product/**
          url: http://127.0.0.1:9015/
          sensitive-Headers:
    

    例子: path: /ebuy-order001/** # 映射路径
    地址栏访问 :http://localhost:9090/ebuy-order001/order/hystrix/816753

    启动测试
    • 启动服务 在这里插入图片描述

    • 访问测试 在这里插入图片描述


    面向服务的路由

    微服务一般是由几十、上百个服务组成,对于一个URL请求,最终会确认一个服务实例进行处理。如果对每个服务实例手动指定一个唯一访问地址,然后根据URL去手动实现请求匹配,这样做显然就不合理

    Zuul支持与Eureka整合开发,根据ServiceID自动的从注册中心中获取服务地址并转发请求,这样做的好处不仅可以通过单个端点来访问应用的所有服务,而且在添加或移除服务实例的时候不用修改Zuul的路由配置。

    添加Eureka客户端依赖

    改造上述的项目
    添加依赖

    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
    
    添加Eureka客户端发现功能

    在这里插入图片描述


    添加Eureka配置,获取服务信息
    • Eureka配置
    # Eureka配置
    eureka:
      client:
        service-url:
          defaultZone: http://127.0.0.1:9890/eureka/,http://127.0.0.1:9880/eureka
          lease-expiration-duration-in-seconds: 10 #eureka client发送心跳给server端后,续约到期时间(默认90秒)
          lease-renewal-interval-in-seconds: 5 #发送心跳续约时间间隔
          registry-fetch-interval-seconds: 5 # 获取服务列表的周期:5s
      instance:
        prefer-ip-address: true   # 使用ip地址註冊
    
    • zuul面向服务的路由配置

    因为已经有了Eureka客户端,我们可以从Eureka获取服务的地址信息,因此映射时无需指定IP地址,而是通过服务名称来访问,而且Zuul已经集成了Ribbon的负载均衡功能。

    zuul:
      routes:
        ebuy-order:
          path: /ebuy-order/**
          serviceId: ebuy-order #配置转发的微服务名称
        ebuy-product:
          path: /ebuy-product/**
          serviceId: ebuy-product #配置转发的微服务名称
    

    注:serviceId: 指定需要转发的微服务实例名称

    访问测试
    • 重启服务,开始测试 在这里插入图片描述
      在这里插入图片描述
    • 可以看出zuul已经实现了负载均衡

    简化的路由配置

    在刚才的配置中,我们的规则是这样的:

    • zuul.routes.<route>.path=/xxx/** : 来指定映射路径。 <route> 是自定义的路由名。
    • zuul.routes.<route>.serviceId=/product-service :来指定服务名。
      而大多数情况下,我们的 <route> 路由名称往往和服务名会写成一样的。因此Zuul就提供了一种简化的配置语法: zuul.routes.<serviceId>=<path>
      上面的配置可以简化为一条:
    zuul:
      routes:
        ebuy-product: /ebuy-product/** #第一个ebuy-product是指服务名,第二个是地址栏要输入的映射路径
        ebuy-order: /ebuy-order/**
    

    重启服务测试

    不再截图展示

    发现问题

    • 模拟高并发情况下的问题 在这里插入图片描述
    • 重启,然后再次使用zuul的路径访问服务 在这里插入图片描述
    • 发现提示com.netflix.zuul.exception.ZuulException: Hystrix Readed time out

    回顾之前我们配置,可以给zuul配置如下(注意是ebuy-zuul项目)

    ebuy-product:
      ribbon:
        #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
        ConnectTimeout: 2500 # Ribbon的连接超时时间(创建连接时间:毫秒)
        ReadTimeout: 5000 # Ribbon的数据读取超时时间 (得到数据的时间)
        OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
        MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
        MaxAutoRetries: 1 # 对当前实例的重试次数 (1表示不重试自己)
    ebuy-order:
      ribbon:
        #NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
        ConnectTimeout: 2500 # Ribbon的连接超时时间(创建连接时间:毫秒)
        ReadTimeout: 5000 # Ribbon的数据读取超时时间 (得到数据的时间)
        OkToRetryOnAllOperations: true # 是否对所有操作都进行重试
        MaxAutoRetriesNextServer: 1 # 切换实例的重试次数
        MaxAutoRetries: 1 # 对当前实例的重试次数 (1表示不重试自己)
    

    在这里插入图片描述

    • 然后重启配置
    • 重新访问测试 在这里插入图片描述
    • 问题解决(可以把ebuy-product的模拟所写的线程休眠注释掉了)

    默认的路由规则

    在使用Zuul的过程中,上面讲述的规则已经大大的简化了配置项。但是当服务较多时,配置也是比较繁琐的。因此Zuul就指定了默认的路由规则:

    • 默认情况下,一切服务的映射路径就是服务名本身。
      • 例如服务名为: ebuy-product ,则默认的映射路径就是: /ebuy-product/**

    那么到底是什么意思呢?
    意思就是说上述的路由配置是完全不需要的(当然前提是你的访问路径想要和应用名同名)

    • 注释掉路由相关的配置 在这里插入图片描述
    • 访问服务测试 在这里插入图片描述
    • 访问完全没问题

    展开全文
  • 大概意思就是如果查看默认集群使用第一个url,查看指定集群使用第二个url,单个应用的监控使用最后一个,我们暂时只演示单个应用的所以在输入框中输入: http://localhost:9001/hystrix.stream ,输入之后点击 ...

    Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功率等数据。但是只使用Hystrix Dashboard的话, 你只能看到单个应用内的服务信息, 这明显不够. 我们需要一个工具能让我们汇总系统内多个服务的数据并显示到Hystrix Dashboard上, 这个工具就是Turbine.

    Hystrix Dashboard

    1、添加依赖

    <properties>        
        <spring-cloud.version>Finchley.M9</spring-cloud.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <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>
    </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>
    

    2、启动类

    启动类添加启用Hystrix Dashboard和熔断器

    @SpringBootApplication
    @EnableHystrixDashboard
    public class HystrixDashboardApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(HystrixDashboardApplication.class, args);
        }
    }
    

    3、application.properties

    spring boot 2.0 下需要添加如下配置:

    management.endpoints.web.exposure.include=hystrix.stream
    management.endpoints.web.base-path=/
    

    4、测试

    启动工程后访问 http://localhost:9001/hystrix,将会看到如下界面:

    hystrix dashboard

    图中会有一些提示:

    Cluster via Turbine (default cluster): http://turbine-hostname:port/turbine.stream 
    Cluster via Turbine (custom cluster): http://turbine-hostname:port/turbine.stream?cluster=[clusterName]
    Single Hystrix App: http://hystrix-app:port/hystrix.stream
    

    大概意思就是如果查看默认集群使用第一个url,查看指定集群使用第二个url,单个应用的监控使用最后一个,我们暂时只演示单个应用的所以在输入框中输入: http://localhost:9001/hystrix.stream ,输入之后点击 monitor,进入页面。

    如果没有请求会先显示Loading …,访问http://localhost:9001/hystrix.stream 也会不断的显示ping。

    请求服务http://localhost:9001/hello/neo,就可以看到监控的效果了,首先访问http://localhost:9001/hystrix.stream,显示如下:

    ping: 
    
    data: {"type":...}
    
    data: {"type":...}
    

    说明已经返回了监控的各项结果

    到监控页面就会显示如下图:

    hystrix stream

    其实就是http://localhost:9001/hystrix.stream返回结果的图形化显示,Hystrix Dashboard Wiki上详细说明了图上每个指标的含义,如下图:

    hystrix stream 2

    到此单个应用的熔断监控已经完成。

    Turbine

    在复杂的分布式系统中,相同服务的节点经常需要部署上百甚至上千个,很多时候,运维人员希望能够把相同服务的节点状态以一个整体集群的形式展现出来,这样可以更好的把握整个系统的状态。 为此,Netflix提供了一个开源项目(Turbine)来提供把多个hystrix.stream的内容聚合为一个数据源供Dashboard展示。

    1、添加依赖

    <properties>        
        <spring-cloud.version>Finchley.M9</spring-cloud.version>
    </properties>
    
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
        <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.cloud</groupId>
            <artifactId>spring-cloud-netflix-turbine</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </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>
    

    2、配置文件

    spring.application.name=hystrix-dashboard-turbine
    server.port=8001
    turbine.appConfig=node01,node02
    turbine.aggregator.clusterConfig=default
    turbine.clusterNameExpression=new String("default")
    turbine.instanceUrlSuffix=/hystrix.stream
    
    management.endpoints.web.exposure.include=hystrix.stream
    management.endpoints.web.base-path=/
    
    eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
    
    • turbine.appConfig :配置Eureka中的serviceId列表,表明监控哪些服务
    • turbine.aggregator.clusterConfig :指定聚合哪些集群,多个使用”,”分割,默认为default。可使用http://…/turbine.stream?cluster={clusterConfig之一}访问
    • turbine.clusterNameExpression : 1. clusterNameExpression指定集群名称,默认表达式appName;此时:turbine.aggregator.clusterConfig需要配置想要监控的应用名称;2. 当clusterNameExpression: default时,turbine.aggregator.clusterConfig可以不写,因为默认就是default;3. 当clusterNameExpression: metadata[‘cluster’]时,假设想要监控的应用配置了eureka.instance.metadata-map.cluster: ABC,则需要配置,同时turbine.aggregator.clusterConfig: ABC
      1. springboot 2.0.0 版本默认的路径不是 /hystrix.stream,如果需要继续使用这个路径,可以使用 turbine.instanceUrlSuffix=/hystrix.stream 进修改

    3、启动类

    启动类添加@EnableTurbine,激活对Turbine的支持

    @SpringBootApplication
    @EnableHystrixDashboard
    @EnableTurbine
    public class DashboardApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(DashboardApplication.class, args);
        }
    
    }
    

    到此Turbine(hystrix-dashboard-turbine)配置完成

    将上面的hystrix-dashboard服务部署两份(可以使用 java -jar xxx.jar --spring.application.name=nodex --server.port=xxxx 的方式),分别启动。

    访问 turbine 服务, http://localhost:8001/turbine.stream

    返回:

    : ping
    data: {"reportingHostsLast10Seconds":1,"name":"meta","type":"meta","timestamp":1494921985839}
    

    并且会不断刷新以获取实时的监控数据,说明和单个的监控类似,返回监控项目的信息。进行图形化监控查看,输入:http://localhost:8001/hystrix,返回酷酷的小熊界面,输入: http://localhost:8001/turbine.stream,然后点击 Monitor Stream ,可以看到出现了俩个监控列表。

    turbine界面

    turbine 配置监控的一些问题可以参考(springcloud的Turbine配置监控多个服务的一些坑)

    本文转自:springcloud(五):熔断监控Hystrix Dashboard和Turbine

    作者:纯洁的微笑

    出处:http://www.ityouknow.com/

    版权归作者所有,转载请注明出处

    展开全文
  • springcloud2.0 --turbine

    千次阅读 2019-06-10 12:48:31
    第三段是什么意思呢,为什么有一个8989端口。 这里是一个要注意的点,当我们的项目也就是turbine没有web依赖的时候(spring-boot-starter-web),我们指定的 server.port就是流量收集的端口,我们访问这个端口,例如: ...
  • 大概意思就是如果查看默认集群使用第一个url,查看指定集群使用第二个url,单个应用的监控使用最后一个,我们暂时只演示单个应用的所以在输入框中输入: http://localhost:9001/hystrix.stream ,输入之后点击 monitor...
  • 大概意思就是如果查看默认集群使用第一个url,查看指定集群使用第二个url,单个应用的监控使用最后一个,我们暂时只演示单个应用的所以在输入框中输入: http://localhost:9001/hystrix.stream ,输入之后点击 monitor...
  • 待完善。
  • 上一篇涨介绍了Hystrix的Dashboard来展示单个...对于老司机而言,Turbine这个单词不会陌生,中文意思为涡轮机,所以顾名思义,用来描述聚合很形象。 (一)创建一个hystrix-turbine监控数据聚合 新建工程后,子pom....
  • 大概意思就是如果查看默认集群使用第一个url,查看指定集群使用第二个url,单个应用的监控使用最后一个,我们暂时只演示单个应用的所以在输入框中输入: http://localhost:9001/hystrix.stream ,输入之后点击 monitor...
  • 大概意思就是如果查看默认集群使用第一个url,查看指定集群使用第二个url,单个应用的监控使用最后一个,我们暂时只演示单个应用的所以在输入框中输入: http://localhost:8765/hystrix.stream ,输入之后点击 ...
  • Hystrix-dashboard是一款针对Hystrix进行实时监控的...我们需要一个工具能让我们汇总系统内多个服务的数据并显示到Hystrix Dashboard上, 这个工具就是Turbine。 Hystrix Dashboard 创建一个新的项目hystrix-dashbo
  • 之前在spring for all社区看到这样一个问题:当actuator端点设置了context-path之后,turbine如何聚合数据?首先,我们要知道actuator端点设置了context-path是什么意思?也就是说,此时spring boot actuator的端点...
  • Turbine里使用Velocity

    2014-06-09 15:03:15
    ttp://jakarta.apache.org/ builds/jakarta-turbine/release/ 在这个地址,你可以找到所有 TDK 的 released 版本。写本书的时候,最新版为 2.1 。进行最新版的 Turbine 目录,你将看到 TAR.GZ ( Unix/Linux ...
  • 跟我学SpringCloud | 第五篇:熔断监控Hystrix Dashboard和Turbine Hystrix-dashboard是一款针对Hystrix进行实时监控的工具,通过Hystrix Dashboard我们可以在直观地看到各Hystrix Command的请求响应时间, 请求成功...
  • 大概意思就是如果查看默认集群使用第一个url,查看指定集群使用第二个url,单个应用的监控使用最后一个,我们暂时只演示单个应用的所以在输入框中输入: http://localhost:9001/hystrix.stream  ,输入之后点击 ...
  • Webx-webx turbine

    2016-10-13 10:20:08
    整个webx框架分成三个层次,webx turbine建立在webx framework的基础上,实现页面渲染、布局、数据验证、数据提交等一系列工作。 设计理念   页面驱动 约定胜于配置 页面驱动 创建一个web应用,一般会经历三个...
  • 上一篇文章讲述了如何利用Hystrix Dashboard去监控断路器...这就需要用到Spring Cloud的另一个组件了,即Hystrix Turbine。 一、Hystrix Turbine简介看单个的Hystrix Dashboard的数据并没有什么多大的价值,要想看...
  • OK,仪表盘已经显示出来了,那么仪表盘上的各项数据都是什么意思呢?我们来看下面一张图: Turbine集群监控 OK,上文我们看了一个监控单体应用的例子,在实际应用中,我们要监控的应用往往是一个集群,这个时候我们...
  • 大概意思就是如果查看默认集群使用第一个url,查看指定集群使用第二个url,单个应用的监控使用最后一个,我们暂时只演示单个应用的所以在输入框中输入: http://localhost:9001/hystrix.stream ,输入之后点击 monitor...
  • turbine.clusterNameExpression这个的意思大概是2个服务node1,node2从元数据映射,他们两个有一个或者两个会在MAIN集群中。当然,我们这里是两个都是。 最后在Main主程序中增加@EnableTurbine @...
  • 前一节,我们已经成功的配置了熔断器,但是在实际应用中,单纯的熔断不能满足我们的...Hystrix Dashboard和Turbine 完成这个功能。 Hystrix Dashboard 和 Turbine Hystrix-dashboard是一款针对Hystrix进行实时监控的...
  • 大概意思就是如果查看默认集群使用第一个url,查看指定集群使用第二个url,单个应用的监控使用最后一个,我们暂时只演示单个应用的所以在输入框中输入: http://localhost:9001/hystrix.stream ,输入之后点击 ...
  • OK,仪表盘已经显示出来了,那么仪表盘上的各项数据都是什么意思呢?我们来看下面一张图: Turbine集群监控 OK,上文我们看了一个监控单体应用的例子,在实际应用中,我们要监控的应用往往是一个集群,这个...
  • Turbine

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,723
精华内容 689
关键字:

turbine的意思