-
Notifications
You must be signed in to change notification settings - Fork 3.8k
2019 11 05 Spring Cloud(五)《Turbine 监控信息聚合展示 Hystrix》
作者:小傅哥
博客:https://bugstack.cn - 原创系列专题
沉淀、分享、成长,让自己和他人都能有所收获!
Hystrix Dashboard 可以定时收集接口调用信息;时长、次数、性能、熔断等各项指标来进行监控展示,但是我们每次监控都需要输入一个Hystrix 的链接例如:http://localhost:9001/actuator/hystrix.stream,但是这样并不利于我们去做整体服务的监控,并且在实际使用的过程中如果是几十到几百个接口那么这样的监控几乎达不到监控效果,就累死在监控路上了。因此我们需要使用到 Turbine 来进行监控信息聚合,可以按业务组定义配置方便监控。
案例通过添加itstack-demo-springcloud-turbine工程模块,将单体监控汇总在统一页面进行管理,此时的监控模型,如图;
- jdk 1.8、idea2018、Maven3
- Spring Boot 2.0.6.RELEASE
- Spring Cloud Finchley.SR2
itstack-demo-springcloud-05
├── itstack-demo-springcloud-eureka-client
│ └── src
│ └── main
│ ├── java
│ │ └── org.itstack.demo
│ │ ├── web
│ │ │ └── EurekaClientController.java
│ │ └── EurekaClientApplication.java
│ └── resources
│ └── application.yml
├── itstack-demo-springcloud-eureka-server
│ └── src
│ └── main
│ ├── java
│ │ └── org.itstack.demo
│ │ └── EurekaServerApplication.java
│ └── resources
│ └── application.yml
├── itstack-demo-springcloud-hystrix-dashboard
│ └── src
│ └── main
│ ├── java
│ │ └── org.itstack.demo
│ │ └── DashboardApplication.java
│ └── resources
│ └── application.yml
├── itstack-demo-springcloud-hystrix-feign
│ └── src
│ └── main
│ ├── java
│ │ └── org.itstack.demo
│ │ ├── service
│ │ │ ├── hystrix
│ │ │ │ └── FeignServiceHystrix.java
│ │ │ └── FeignService.java
│ │ ├── web
│ │ │ └── FeignController.java
│ │ └── FeignApplication.java
│ └── resources
│ └── application.yml
├── itstack-demo-springcloud-hystrix-ribbon
│ └── src
│ └── main
│ ├── java
│ │ └── org.itstack.demo
│ │ ├── service
│ │ │ └── RibbonService.java
│ │ ├── web
│ │ │ └── RibbonController.java
│ │ └── RibbonApplication.java
│ └── resources
│ └── application.yml
└── itstack-demo-springcloud-turbine
└── src
└── main
├── java
│ └── org.itstack.demo
│ └── TurbineApplication.java
└── resources
└── application.yml
完整代码欢迎关注公众号:bugstack虫洞栈 | 回复“SpringCloud专题”进行下载
提供一个查询用户信息的简单方法,在配置文件中通过修改端口启动2次,模拟双实例应用,为调用方负载做准备。
web/EurekaClientController.java | 注意@EnableEurekaClient用于向注册中心提供服务
/**
* 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例
* 论坛:http://bugstack.cn
* Create by 付政委 on @2019
*/
@EnableEurekaClient
@RestController
public class EurekaClientController {
@Value("${server.port}")
private int port;
@RequestMapping(path = "/api/queryUserInfo", method = RequestMethod.GET)
public String queryUserInfo(@RequestParam String userId) {
return "Hi 微信公众号:bugstack虫洞栈 | " + userId + " >: from eureka client port: " + port;
}
}
EurekaClientApplication.java | 服务启动类
/**
* 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例
* 论坛:http://bugstack.cn
* Create by 付政委 on @2019
*/
@SpringBootApplication
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
application.yml | 配置文件链接服务注册中心,8001\8002分别配置启动
server:
port: 8001 / 8002
spring:
application:
name: itstack-demo-springcloud-eureka-client
eureka:
client:
serviceUrl:
defaultZone: http://localhost:7397/eureka/
服务注册中心用于承载接口提供方向上注册,同时正在调用方链接后可以获取指定应用的服务实例。
EurekaServerApplication.java | 通过注解@EnableEurekaServer启动服务注册与发现中心
/**
* 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例
* 论坛:http://bugstack.cn
* Create by 付政委 on @2019
*/
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run( EurekaServerApplication.class, args );
}
}
application.yml | 服务注册中心配置文件,端口7397和我们之前写netty的服务的端口一致
server:
port: 7397
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
spring:
application:
name: itstack-demo-springcloud-eureka-server
Spring Cloud Hystrix Dashboard只是spring cloud基于Hystrix Dashboard,将实时监控数据通过页面呈现出来。Spring Cloud Hystrix Dashboard的底层原理是间隔一定时间去“Ping”目标服务,返回的结果是最新的监控数据,最后将数据显示出来。
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/actuator/hystrix.stream
DashboardApplication.java | 配置@EnableHystrixDashboard启动服务
/**
* 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例
* 论坛:http://bugstack.cn
* Create by 付政委 on @2019
*/
@EnableHystrixDashboard
@SpringBootApplication
public class DashboardApplication {
public static void main(String[] args) {
SpringApplication.run(DashboardApplication.class, args);
}
}
application.yml | 通用配置信息
server:
port: 8989
spring:
application:
name: itstack-demo-springcloud-hystrix-dashboard
Feign 是一个声明式的 Web Service 客户端,它的目的就是让 Web Service 调用更加简单。它整合了 Ribbon 和 Hystrix,从而让我们不再需要显式地使用这两个组件。Feign 还提供了 HTTP 请求的模板,通过编写简单的接口和插入注解,我们就可以定义好 HTTP 请求的参数、格式、地址等信息。接下来,Feign 会完全代理 HTTP 的请求,我们只需要像调用方法一样调用它就可以完成服务请求。
Feign 具有如下特性:
可插拔的注解支持,包括 Feign 注解和 JAX-RS 注解 支持可插拔的 HTTP 编码器和解码器 支持 Hystrix 和它的 Fallback 支持 Ribbon 的负载均衡 支持 HTTP 请求和响应的压缩
service/FeignService.java | 注解方式调用,方便易用。@FeignClient会在调用时进行解析服务到具体的http://ip:port/
/**
* 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例
* 论坛:http://bugstack.cn
* Create by 付政委 on @2019
*/
@FeignClient(value = "itstack-demo-springcloud-eureka-client", fallback = FeignServiceHystrix.class)
public interface FeignService {
@RequestMapping(value = "/api/queryUserInfo", method = RequestMethod.GET)
String queryUserInfo(@RequestParam String userId);
}
service/hystrix/FeignServiceHystrix.java | 提供熔断服务,当发生异常时主动返回预定结果
/**
* 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例
* 论坛:http://bugstack.cn
* Create by 付政委 on @2019
*/
@Component
public class FeignServiceHystrix implements FeignService {
@Override
public String queryUserInfo(String userId) {
return "queryUserInfo by userId:" + userId + " err!from feign hystrix";
}
}
web/FeignController.java | 使用接口提供服务 From Feign
/**
* 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例
* 论坛:http://bugstack.cn
* Create by 付政委 on @2019
*/
@RestController
public class FeignController {
@Resource
private FeignService ribbonService;
@RequestMapping(path = "/api/queryUserInfo", method = RequestMethod.GET)
public String queryUserInfo(@RequestParam String userId) {
return ribbonService.queryUserInfo(userId) + " From Feign";
}
}
FeignApplication.java | 注解@EnableEurekaClient、@EnableFeignClients、@EnableDiscoveryClient获取调用注册中心服务
/**
* 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例
* 论坛:http://bugstack.cn
* Create by 付政委 on @2019
*/
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
@EnableHystrix
public class FeignApplication {
public static void main(String[] args) {
SpringApplication.run(FeignApplication.class, args);
}
}
application.yml | eureka服务配置,从注册中心获取可用服务。开启hystrix=true,并设置hystrix.stream
server:
port: 9001
spring:
application:
name: itstack-demo-springcloud-feign
eureka:
client:
serviceUrl:
defaultZone: http://localhost:7397/eureka/
feign.hystrix.enabled: true
management:
endpoints:
web:
exposure:
include: hystrix.stream
Ribbon是一个基于 HTTP 和 TCP 的客户端负载均衡器。它可以通过在客户端中配置 ribbonServerList 来设置服务端列表去轮询访问以达到均衡负载的作用。
当 Ribbon 与 Eureka 联合使用时,ribbonServerList 会被 DiscoveryEnabledNIWSServerList 重写,扩展成从 Eureka 注册中心中获取服务实例列表。同时它也会用 NIWSDiscoveryPing 来取代 IPing,它将职责委托给 Eureka 来确定服务端是否已经启动。
service/RibbonService.java | 接口式硬编码调用不太易于维护,因此也是比较少用的方式。hystrix实际通过getFallback()返回熔断结果
/**
* 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例
* 论坛:http://bugstack.cn
* Create by 付政委 on @2019
*/
@Service
public class RibbonService {
@Autowired
private RestTemplate restTemplate;
@HystrixCommand(fallbackMethod = "queryUserInfoFallback")
public String queryUserInfo(String userId) {
return restTemplate.getForObject("http://ITSTACK-DEMO-SPRINGCLOUD-EUREKA-CLIENT/api/queryUserInfo?userId=" + userId, String.class);
}
/**
* Specifies a method to process fallback logic.
* A fallback method should be defined in the same class where is HystrixCommand.
* Also a fallback method should have same signature to a method which was invoked as hystrix command.
* for example:
* <code>
* @HystrixCommand(fallbackMethod = "getByIdFallback")
* public String getById(String id) {...}
*
* private String getByIdFallback(String id) {...}
* </code>
* Also a fallback method can be annotated with {@link HystrixCommand}
* <p/>
* default => see {@link com.netflix.hystrix.contrib.javanica.command.GenericCommand#getFallback()}
*
* @return method name
*
* getFallback()
*
* @Override
* protected Object getFallback() {
* final CommandAction commandAction = getFallbackAction();
* if (commandAction != null) {
* try {
* return process(new Action() {
* @Override
* Object execute() {
* MetaHolder metaHolder = commandAction.getMetaHolder();
* Object[] args = createArgsForFallback(metaHolder, getExecutionException());
* return commandAction.executeWithArgs(metaHolder.getFallbackExecutionType(), args);
* }
* });
* } catch (Throwable e) {
* LOGGER.error(FallbackErrorMessageBuilder.create()
* .append(commandAction, e).build());
* throw new FallbackInvocationException(unwrapCause(e));
* }
* } else {
* return super.getFallback();
* }
* }
*/
public String queryUserInfoFallback(String userId) {
return "queryUserInfo by userId:" + userId + " err!from ribbon hystrix";
}
}
web/RibbonController.java | 使用接口提供服务 From Ribbon
/**
* 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例
* 论坛:http://bugstack.cn
* Create by 付政委 on @2019
*/
@RestController
public class RibbonController {
@Resource
private RibbonService ribbonService;
@RequestMapping(path = "/api/queryUserInfo", method = RequestMethod.GET)
public String queryUserInfo(@RequestParam String userId) {
return ribbonService.queryUserInfo(userId) + " From Ribbon";
}
}
RibbonApplication.java | 通过注解@LoadBalanced注册rest模版,用于Ribbon接口调用。并启动@EnableHystrix
/**
* 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例
* 论坛:http://bugstack.cn
* Create by 付政委 on @2019
*/
@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
@EnableHystrix
public class RibbonApplication {
public static void main(String[] args) {
SpringApplication.run(RibbonApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
application.yml | eureka服务配置,从注册中心获取可用服务
server:
port: 9002
spring:
application:
name: itstack-demo-springcloud-ribbon
eureka:
client:
serviceUrl:
defaultZone: http://localhost:7397/eureka/
通过配置汇总,将应用itstack-demo-springcloud-feign,itstack-demo-springcloud-ribbon,汇总监控。
TurbineApplication.java | 通过注解@EnableTurbine配置启动Ribbon
/**
* 微信公众号:bugstack虫洞栈 | 沉淀、分享、成长,专注于原创专题案例
* 论坛:http://bugstack.cn
* Create by 付政委 on @2019
*/
@EnableTurbine
@SpringBootApplication
public class TurbineApplication {
public static void main(String[] args) {
SpringApplication.run(TurbineApplication.class, args);
}
}
application.yml | eureka服务配置,从注册中心获取可用服务
spring:
application:
name: itstack-demo-springcloud-turbine
server:
port: 8080
management:
port: 8081
## 服务注册中心
eureka:
client:
service-url:
defaultZone: http://localhost:7397/eureka
## 监控汇总配置,这里配置2个应用逗号隔开
turbine:
app-config: itstack-demo-springcloud-feign,itstack-demo-springcloud-ribbon
cluster-name-expression: new String("default")
combine-host-port: true
-
启动itstack-demo-springcloud-hystrix-dashboard,访问;http://localhost:8989/hystrix
-
分别启动如下系统模拟;
- itstack-demo-springcloud-eureka-server 服务注册发现中心
- itstack-demo-springcloud-eureka-client 测试接口提供方
- itstack-demo-springcloud-hystrix-feign 接口调用方Feign
- itstack-demo-springcloud-hystrix-ribbon 接口调用方Ribbon
- itstack-demo-springcloud-turbine 监控信息汇总
-
测试监控
- 在hystrix-dashboard监控页面{http://localhost:8989/hystrix},输入;http://localhost:8080/turbine.stream
- 刷新访问两个调用方接口;http://localhost:9001/api/queryUserInfo?userId=111、http://localhost:9002/api/queryUserInfo?userId=111
- 回看刚才的监控页面;http://localhost:8989/hystrix/monitor?stream=http%3A%2F%2Flocalhost%3A8080%2Fturbine.stream,已经可以看到监控信息汇总,如图;
- 通过Turbine服务我们可以将监控信息汇总到一起进行查看,这样更加方便实际应用。
- SpringCloud 到现在的案例已经使用到了很多服务模块,它确实是一套有序集合框架,将各家优秀功能服务集成,方便使用。
- SpringBoot 、 SpringCloud,在开发一些中小型独立服务非常边界,对于一些超大型以外的公司非常合适。当然并不是一线互联网就不使用,因为这里面还牵扯到很多对应的替代产品,比如Dubbo、网关、全链路监控、路由等等,所以需要根据不同业务进行技术选型,不要被技术限制。
上一篇:Spring Cloud(四)《服务响应性能成功率监控 Hystrix》
下一篇:Spring Cloud(六)《基于github webhook动态刷新服务配置》
微信搜索「bugstack虫洞栈」公众号,关注后回复「SpringCloud专题」获取本文源码&更多原创专题案例!
小傅哥(微信:fustack),公众号:bugstack虫洞栈
| bugstack.cn - 沉淀、分享、成长,让自己和他人都能有所收获!
🌏 知识星球:码农会锁
实战项目:「DDD+RPC分布式抽奖系统
」、专属小册、问题解答、简历指导、架构图稿、视频课程
🐲 头条
-
💥
🎁 Lottery 抽奖系统
- 基于领域驱动设计的四层架构的互联网分布式开发实践 -
小傅哥的《重学 Java 设计模式》
- 全书彩印、重绘类图、添加内容 -
⭐小傅哥的《Java 面经手册》
- 全书5章29节,417页11.5万字,完稿&发版 -
小傅哥的《手撸 Spring》
- 通过带着读者手写简化版 Spring 框架,了解 Spring 核心原理 -
🌈小傅哥的《SpringBoot 中间件设计和开发》
- 小册16个中间件开发30个代码库
⛳ 目录
💋 精选
🐾 友链
建立本开源项目的初衷是基于个人学习与工作中对 Java 相关技术栈的总结记录,在这里也希望能帮助一些在学习 Java 过程中遇到问题的小伙伴,如果您需要转载本仓库的一些文章到自己的博客,请按照以下格式注明出处,谢谢合作。
作者:小傅哥
链接:https://bugstack.cn
来源:bugstack虫洞栈
2021年10月24日,小傅哥
的文章全部开源到代码库 CodeGuide
中,与同好同行,一起进步,共同维护。
这里我提供 3 种方式:
-
提出
Issue
:在 Issue 中指出你觉得需要改进/完善的地方(能够独立解决的话,可以在提出 Issue 后再提交PR
)。 -
处理
Issue
: 帮忙处理一些待处理的Issue
。 -
提交
PR
: 对于错别字/笔误这类问题可以直接提交PR
,无需提交Issue
确认。
详细参考:CodeGuide 贡献指南 - 非常感谢你的支持,这里会留下你的足迹
- 加群交流 本群的宗旨是给大家提供一个良好的技术学习交流平台,所以杜绝一切广告!由于微信群人满 100 之后无法加入,请扫描下方二维码先添加作者 “小傅哥” 微信(fustack),备注:加群。
- 公众号(bugstack虫洞栈) - 沉淀、分享、成长,专注于原创专题案例,以最易学习编程的方式分享知识,让自己和他人都能有所收获。
感谢以下人员对本仓库做出的贡献或者对小傅哥的赞赏,当然不仅仅只有这些贡献者,这里就不一一列举了。如果你希望被添加到这个名单中,并且提交过 Issue 或者 PR,请与我联系。