精华内容
下载资源
问答
  • 上一篇涨介绍了HystrixDashboard来展示单个实例监测数据,但实际情况中,我们会部署N个微服务,那么不可能再用这种方式一个接着一个输入查看,基于这种场景,Hystrix可以利用Turbine实现数据聚合。对于老司机而...

    上一篇涨介绍了Hystrix的Dashboard来展示单个实例的监测数据,但实际情况中,我们会部署N个微服务,那么不可能再用这种方式一个接着一个输入查看,基于这种场景,Hystrix可以利用Turbine实现数据聚合。对于老司机而言,Turbine这个单词不会陌生,中文意思为涡轮机,所以顾名思义,用来描述聚合很形象。

    (一)创建一个hystrix-turbine监控数据聚合
    新建工程后,子pom.xml文件添加以下依赖:

    <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-turbine</artifactId>
            </dependency>
        </dependencies>
    

    然后创建一个application启动类(需要添加注解@EnableDiscoveryClient查看注册中心的注册服务):

    package com.ningmeng.turbine;
    
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
    import org.springframework.cloud.netflix.turbine.EnableTurbine;
    
    @EnableTurbine // 开启turbine监控数据聚合
    @EnableHystrixDashboard // 开启hystrix仪表盘
    @EnableDiscoveryClient
    @SpringBootApplication
    public class HystrixTurbineApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(HystrixTurbineApplication.class, args);
        }
    }
    
    

    最后配置application.yml文件:

    #工程端口号
    server:
      port: 5002
    
    spring:
      application:
        name: hystrix-turbine #工程名,后面各个服务间调用接口要用到
      rabbitmq:
        host: localhost
        port: 5672
        username: guest
        password: guest
    #eureka注册中心地址
    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/ #eureka服务器所在的地址
    
    #聚合的工程  这里演示聚合ribbon-consumer,feign-consumer这两个消费工程
    turbine:
      aggregator:
        cluster-config: default
      app-config: ribbon-consumer,feign-consumer
      cluster-name-expression: new String("default")
    

    注意:new String(“default”)必须这么写,否则启动的时候会抛出异常org.springframework.expression.spel.SpelEvaluationException: EL1008E: Property or field ‘default‘ cannot be found on object of type ‘com.netflix.appinfo.InstanceInfo‘ - maybe not public or not valid?

    参数说明:
    turbine.aggregator.cluster-config参数设定cluster名字,当使用default,默认聚合turbine.appConfig中设定的所有服务名的数据;
    turbine.app-config参数设定需要收集监控信息的服务名;
    turbine.cluster-name-expression 参数指定了集群名称为 default,当我们服务数量非常多的时候,可以启动多个 Turbine 服务来构建不同的聚合集群,而该参数可以用来区分这些不同的聚合集群,同时该参数值可以在 Hystrix 仪表盘中用来定位不同的聚合集群,只需要在 Hystrix Stream 的 URL 中通过 cluster 参数来指定。

    最后依次启动eureka-server、service-provider(两个实例)、feign-consumer、ribbon-consumer以及hystrix-turbine工程,然后访问http://localhost:5002/hystrix,可看到页面:
    在这里插入图片描述
    我们能通过红色框中的两种方式查看监控聚合数据(注意与bashboard监控面板的区别,turbine拼接的是turbine-hostname:port(即hystrix-turbine的ip以及端口号),bashboard拼接的是hystrix-app:port(即调用服务的消费工程的ip以及端口号,比如ribbon-consumer或者feign-consumer))

    第一种方式:直接输入http://localhost:5002/turbine.stream,然后假如处于loading状态,我们先调用服务,之后能看到以下内容:
    在这里插入图片描述

    第二种方式在输入url后拼接cluster(即turbine.aggregator.cluster-config的值):
    修改application.yml配置文件:

    #工程端口号
    server:
      port: 5002
    
    spring:
      application:
        name: hystrix-turbine #工程名,后面各个服务间调用接口要用到
      rabbitmq:
        host: localhost
        port: 5672
        username: guest
        password: guest
    #eureka注册中心地址
    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:8761/eureka/ #eureka服务器所在的地址
    
    #聚合的工程  这里演示聚合ribbon-consumer,feign-consumer这两个消费工程
    turbine:
      aggregator:
        cluster-config: FEIGN-CONSUMER
      app-config: feign-consumer
    #  cluster-name-expression: new String("default")
    

    参数说明:cluster-config配置的名称必须为eureka注册中心上已经注册的服务名,且为大写。

    然后访问http://localhost:5002/turbine.stream?cluster=FEIGN-CONSUMER,cluster参数必须与turbine.aggregator.cluster-config中的条目匹配,只能看到feign-consumer服务的监控数据:
    在这里插入图片描述

    本篇完结!

    github代码地址:https://github.com/huijunzeng/springCloudDemo.git

    展开全文
  • Webx-webx turbine

    2016-10-13 10:20:08
    整个webx框架分成三个层次,webx turbine建立在webx framework的基础上,实现页面渲染、布局、数据验证、数据提交等一系列工作。...页面驱动的意思是,在程序员介入以前,让界面设计师可以直接创建模...

    整个webx框架分成三个层次,webx turbine建立在webx framework的基础上,实现页面渲染、布局、数据验证、数据提交等一系列工作。

    设计理念

     

    • 页面驱动
    • 约定胜于配置

    页面驱动

    创建一个web应用,一般会经历三个阶段:产品设计、用户界面设计、功能实现。分别由产品设计师、用户界面设计师和程序员协作完成。

    页面驱动的意思是,在程序员介入以前,让界面设计师可以直接创建模板,并展示模板的效果。在webx turbine中,界面设计师可以通过pull tools工具来实现页面跳转、简单的表单验证、字符串操作等,这是因为pull tool服务预先准备了很多模板中可用的工具。

     

    约定胜于配置

    规则是预先定义的,工程师只需要按着规则来做事,就不需要额外的“配置”。

    只需要将模板放在指定的目录、按照预定的方式命名module(也就是screen、action、control等),就不需要额外的配置。

     

     

    • screen代表页面的主体。
    • layout代表页面的布局。
    • control代表嵌在screen和layout中的页面片段。

    处理页面的基本流程

    webx turbine的处理流程被定义在pipeline中,下面是一个推荐的pipline配置

    <services:pipeline xmlns="http://www.alibaba.com/schema/services/pipeline/valves">
    <!-- 初始化turbine rundata,并在pipelineContext中设置可能会用到的对象(如rundata、utils),以便valve取得。 -->
    <prepareForTurbine />
    <!-- 设置日志系统的上下文,支持把当前请求的详情打印在日志中。 -->
    <setLoggingContext />
    <!-- 分析URL,取得target。 -->
    <analyzeURL homepage="homepage" />
    <!-- 检查csrf token,防止csrf攻击和重复提交。假如request和session中的token不匹配,则出错,或显示expired页
    面。 -->
    <checkCsrfToken />
    <loop>
    <choose>
    <when>
    <!-- 执行带模板的screen,默认有layout。 -->
    <pl-conditions:target-extension-condition extension="null, vm, jsp" />
    <performAction />
    <performTemplateScreen />
    <renderTemplate />
    </when>
    <when>
    <!-- 执行不带模板的screen,默认无layout。 -->
    <pl-conditions:target-extension-condition extension="do" />
    <performAction />
    <performScreen />
    </when>
    <otherwise>
    <!-- 将控制交还给servlet engine。 -->
    <exit />
    </otherwise>
    </choose>
    <!-- 假如rundata.setRedirectTarget()被设置,则循环,否则退出循环。 -->
    <breakUnlessTargetRedirected />
    </loop>
    </services:pipeline>


    webx framework的处理流程,从webxframeworkfilter接收请求,并且一路顺利到达pipeline,然后pipeline开始依次执行它的valves。

    1.<analyzeURL>-分析URL

    分析URL的目的是取得target,有一个可选的参数homepage,在用户访问的URL中没有提供path信息时,会被使用。

    2.<choose>-多重分支

    target-extension-condition extension="null, vm, jsp"的意思是target的后缀不存在(null)或为“jsp”或为“vm”。

    3.<performAction>-执行action

    和其它框架中的action概念不同,在webx turbine中,action是用来处理用户提交的表单的。

    4.<performTemplateScreen>-查找并执行screen

    假设target为xxx/yyy/zzz,那么webx turbine会依次查找下面的screen模块:

    • screen.xxx.yyy.Zzz
    • screen.xxx.yyy.Default
    • screen.xxx.Default
    • screen.Default

    Screen类的功能,通常是读取数据库,然后把模板所需要的对象放到context中。

    5.<renderTemplate>-渲染模板

    这里会用到两个规则:target映射成screen template,以及target映射成layout template。

    假设target为xxx/yyy/zzz,那么webx turbine会查找下面的screen模板:/templates/screen/xxx/yyy/zzz。如果未找到,就会报404 not found错误,找到screen模板以后,webx turbine还会试着查找下面的layout模板:

    • /template/layout/xxx/yyy/zzz
    • /template/layout/xxx/yyy/default
    • /template/layout/xxx/default
    • /template/layout/default

    layout模板如果找不到,就直接渲染screen模板,如果存在,则把渲染screen模板后的结果,嵌入到layout模板中。layout模板和screnn模板中,都可以调用control,每个页面只有一个screen,却可以有任意多个controls。

    6.<breadUnlessTargetRedirected>-内部重定向 

    在screen和action中,可以进行“内部重定向”,内部重定向实质上就是由<breakUnlessTargetRedirected>实施的,如果没有重定向标记,就退出;否则循环到<loop>标签。

    和外部重定向不同,外部重定向是向浏览器返回一个302或303 response,其中包含Location header,浏览器看到这样的response以后,就会发出第二个请求。而内部重
    定向发生在pipeline内部,浏览器并不了解内部重定向。
     

    依赖注入

     

    1.Spring原生注入手段

    webx既然建立在spring基础上,当然支持spring原有的依赖流入。但需要注意,你只能注入相同scope或较大的scope的bean。

    2.参数注入

    有一些对象,是无法通过Spring的bean来注入,但webx turbine提供了一个可扩展的机制(DataResolver service)注入。

    最后欢迎大家访问我的个人网站:1024s

     

    展开全文
  • 之前在spring for all社区看到这样一个问题:当actuator端点设置了context-path之后,turbine如何聚合数据?首先,我们要知道actuator端点设置了context-path是什么意思?也就是说,此时spring boot actuator端点...

    之前在spring for all社区看到这样一个问题:当actuator端点设置了context-path之后,turbine如何聚合数据?首先,我们要知道actuator端点设置了context-path是什么意思?也就是说,此时spring boot actuator的端点都有了一个前缀,比如:

    management.context-path=/xxx
    

    如果设置了上面的参数,那个对于收集hystrix数据的端点将变为:/xxx/hystrix.stream,如果我们还是拿上一篇Spring Cloud构建微服务架构:Hystrix监控数据聚合【Dalston版】中构建你的turbine应用,那么将会看到如下错误:

    INFO 7812 --- [        Timer-0] c.n.t.monitor.instance.InstanceMonitor   : Url for host: http://172.15.0.18:9020/hystrix.stream default
    ERROR 7812 --- [InstanceMonitor] c.n.t.monitor.instance.InstanceMonitor   : Could not initiate connection to host, giving up: [{"timestamp":1499941336284,"status":404,"error":"Not Found","message":"No message available","path":"/hystrix.stream"}]
    WARN 7812 --- [InstanceMonitor] c.n.t.monitor.instance.InstanceMonitor   : Stopping InstanceMonitor for: 172.15.0.18:9020 default
    
    com.netflix.turbine.monitor.instance.InstanceMonitor$MisconfiguredHostException: [{"timestamp":1499941336284,"status":404,"error":"Not Found","message":"No message available","path":"/hystrix.stream"}]
    	at com.netflix.turbine.monitor.instance.InstanceMonitor.init(InstanceMonitor.java:318) ~[turbine-core-1.0.0.jar:na]
    	at com.netflix.turbine.monitor.instance.InstanceMonitor.access$100(InstanceMonitor.java:103) ~[turbine-core-1.0.0.jar:na]
    	at com.netflix.turbine.monitor.instance.InstanceMonitor$2.call(InstanceMonitor.java:235) [turbine-core-1.0.0.jar:na]
    	at com.netflix.turbine.monitor.instance.InstanceMonitor$2.call(InstanceMonitor.java:229) [turbine-core-1.0.0.jar:na]
    	at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_91]
    	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_91]
    	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_91]
    	at java.lang.Thread.run(Thread.java:745) [na:1.8.0_91]
    

    从上述错误中我们可以知道,turbine在收集的时候由于访问的是/hystrix.stream,而此时收集端点却是/xxx/hystrix.stream,所以报了404错误。

    那么我们要如何解决呢?通过之前的配置内容,我们可能找不到相关的配置信息,所以只能遍历一下源码,最后找到这个类:org.springframework.cloud.netflix.turbine.SpringClusterMonitor。它的具体内容如下:

    public static InstanceUrlClosure ClusterConfigBasedUrlClosure = new InstanceUrlClosure() {
    
    	private final DynamicStringProperty defaultUrlClosureConfig = DynamicPropertyFactory
    			    .getInstance().getStringProperty("turbine.instanceUrlSuffix",
    				    	"hystrix.stream");
    	private final DynamicBooleanProperty instanceInsertPort = DynamicPropertyFactory
    				.getInstance().getBooleanProperty("turbine.instanceInsertPort", true);
    
    	@Override
    	public String getUrlPath(Instance host) {
    		if (host.getCluster() == null) {
    			throw new RuntimeException(
    					"Host must have cluster name in order to use ClusterConfigBasedUrlClosure");
    		}
    
    		// find url
    		String key = "turbine.instanceUrlSuffix." + host.getCluster();
    		DynamicStringProperty urlClosureConfig = DynamicPropertyFactory.getInstance()
    					.getStringProperty(key, null);
    		String url = urlClosureConfig.get();
    		if (url == null) {
    			url = this.defaultUrlClosureConfig.get();
    		}
    		if (url == null) {
    			throw new RuntimeException("Config property: "
    					+ urlClosureConfig.getName() + " or "
    					+ this.defaultUrlClosureConfig.getName() + " must be set");
    		}
    
    		// find port and scheme
    		String port;
    		String scheme;
    		if (host.getAttributes().containsKey("securePort")) {
    			port = host.getAttributes().get("securePort");
    			scheme = "https";
    		} else {
    			port = host.getAttributes().get("port");
    			scheme = "http";
    		}
    		if (host.getAttributes().containsKey("fusedHostPort")) {
    			return String.format("%s://%s/%s", scheme, host.getAttributes().get("fusedHostPort"), url);
    		}
    
    		// determine if to insert port
    		String insertPortKey = "turbine.instanceInsertPort." + host.getCluster();
    		DynamicStringProperty insertPortProp = DynamicPropertyFactory.getInstance()
    					.getStringProperty(insertPortKey, null);
    		boolean insertPort;
    		if (insertPortProp.get() == null) {
    			insertPort = this.instanceInsertPort.get();
    		}
    		else {
    			insertPort = Boolean.parseBoolean(insertPortProp.get());
    		}
    
    		// format url with port
    		if (insertPort) {
    			if (url.startsWith("/")) {
    				url = url.substring(1);
    			}
    			if (port == null) {
    				throw new RuntimeException(
    						"Configured to use port, but port or securePort is not in host attributes");
    			}
    
    			return String.format("%s://%s:%s/%s", scheme, host.getHostname(), port, url);
    		}
    
    		//format url without port
    		return scheme + "://" + host.getHostname() + url;
    	}
    };
    

    从上述源码中,我们可以找到这个参数turbine.instanceUrlSuffix,由此该问题就迎刃而解了,我们只需要在turbine应用的配置文件中增加如下配置信息,就能正确的收集之前配置了management.context-path=/xxx的微服务的hystrix数据了。

    turbine.instanceUrlSuffix=/xxx/hystrix.stream
    
    展开全文
  • 解决方案1采用是在rabbitmq中进行配置 将两个交换器绑定到一起 解决信息互通问题(点击链接可进行跳转)。...#hystrixStreamOutput终点是 sixfly 交换器 意思是 将信息发送到sixfly 交换器 spring....

    解决方案1采用的是在rabbitmq中进行配置 将两个交换器绑定到一起 解决信息互通问题(点击链接可进行跳转)。

    思考:如果消息的生产者和消费者 使用一个交换器 那么就不需要在 rabbitmq中进行配置了。

    如何操作: 在信息的提供者配置文件内添加一条配置信息

    #hystrixStreamOutput的终点是 sixfly 交换器 意思是 将信息发送到sixfly 交换器
    spring.cloud.stream.bindings.hystrixStreamOutput.destination=sixfly

     

       在turbine的配置文件内添加一条配置信息

    #turbineStreamInput的终点是 sixfly  意思是:从 sixfly 交换器 获取信息
    spring.cloud.stream.bindings.turbineStreamInput.destination=sixfly

    展开全文
  • Struts跟Tomcat、Turbine等诸 多Apache项目一样,是开源软件,这是它一大优点。使开发者能更深入了解其内部实现机制。 Struts开放源码框架创建是为了使开发者在构建基于Java Servlet和JavaServer Pages(JSP)...
  • Maven是什么

    2020-09-30 11:09:39
    Maven是意第绪语词汇,意思是“知识积累”,最初是在Jakarta Turbine项目中尝试使项目构建过程简化,期望有一种标准项目构建方式,能清晰表达项目构成、简单方式发布项目、能够在不同项目中分享JAR。...
  • Maven 学习-入门

    2019-09-24 16:09:18
    Maven,在依地语中的意思是知识的积累,Maven在最初的时候,是作为Jakarta的Turbine项目的构建工具。在Maven出现之前,不同的Java项目使用不同的Ant配置进行构建,并且将jar包包含在版本控制系统(CVS)中,没有一套...
  •  Maven是意第绪语,意思是“知识积累者”,最初是为了简化Jakarta Turbine项目中构建过程。有几个项目,每个项目都有自己Ant构建文件,所有项目都略有不同。JAR已检入CVS。我们想要一种标准方式来构建项目...
  • Maven 学习 - 入门

    2015-10-06 21:55:45
    在进行Java开发的过程中,我接触到了Maven这套构建工具。所以,花费了点时间学习了一下这套构建工具...Maven,在依地语中的意思是知识的积累,Maven在最初的时候,是作为Jakarta的Turbine项目的构建工具。在Maven出现之
  • 一、简介Maven是意第绪语,意思是“知识积累者”,最初是为了简化Jakarta Turbine项目中构建过程。有几个项目,每个项目都有自己Ant构建文件,所有项目都略有不同。JAR已检入CVS。我们想要一种标准方式来...
  • 2020-12-13

    2020-12-13 22:26:46
    Maven 一个易第绪语单词,意思是“知识积累”,最开始时候是尝试用来简化构建过程工具(在Jakarta Turbine项目中) 1 那时候有几个项目,每个项目都有自己Ant构建文件,而且每个文件都略有差异 2 JARS were ...
  • 什么是Maven?

    2018-09-06 17:45:00
    Maven原是一个意第绪语单词,意思是知识累加器,最初是为了简化Jakarta Turbine项目中构建过程而开始。这个工程有几个项目组成,并且每个项目都有自己Ant构建文件,这些文件都略有不同,当时JAR都是通过签入...
  • 【maven】maven入门

    2018-12-25 22:51:40
    maven这个词的来源于Yiddish语言,是“知识累加器”的意思,最初是用来简化Jakarta Turbine项目的构建过程。后来发展为由Apache软件基金会主持的独立Apache项目,用来管理和构建Java类项目。 为什么需要maven ...
  • maven开篇

    2014-06-16 09:41:45
    根据官网介绍,maven在犹太词里的意思是知识的仓库,这个创意源于Jakarta Turbine这个项目,由于多个project都需要用ant来bulid,并且把jar包check into到CVS,他们需要有一个标准的方法去构建,编译,组合,发布...
  • 转载自从零开始用好 Maven : 从 Hello World 到日常使用 ...Maven 是一个意第绪语(犹太人使用国际语)单词,意思是知识累加器。它最开始是被用来简化 Jakarta Turbine 项目构建过程。在 Jak...
  • Spring Cloud Netflix项目进入维护模式

    千次阅读 2018-12-26 10:51:16
    大概意思就是Spring Cloud Netflix 大部分项目将进入维护模式。 我们知道Netflix是Spring Cloud 微服务架构核心组件,它包含了服务注册与发现(Eureka),服务高可用(Archaius、Hystrix、Ribbon、Zuul、Turbine等)...
  • 配置中心 Spring Cloud Config Api网关 Zuul 客户负载均衡 Ribbon ...SaaS,是Software-as-a-Service缩写名称,意思为软件即服务,即通过网络提供软件服务。 PaaS是(Platform as a Servi..
  • Maven 介绍(What is Maven?)

    2007-11-27 00:18:11
     Maven这个词在犹太语中的意思是“学问渊博的人”(accumulator of knowledge ),它开始于Jakarta Turbine这个项目中想要简化对项目管理的尝试。因为在这个项目中有很多的子项目,在每个子项目中都有各自的Ant脚本...
  • 该文档为官方webx框架文档,对webx进行了全面讲解,非常实用,并附学习Demo 为什么要用Webx而不是其它开源框架? 现在有很多JavaWeb框架可供选择,并且它们也都是免费。例如: • Struts • Webwork • ...

空空如也

空空如也

1 2
收藏数 26
精华内容 10
关键字:

turbine的意思