手把手搭建SpringCloud,第四篇——Hystrix(断路器) + 使用Hystrix Dashboard可视化监控数据

本文介绍如何在SpringCloud项目中利用Hystrix实现服务降级和服务熔断,防止因单个服务故障引起整个系统的雪崩效应。通过具体步骤演示如何配置Hystrix,并提供代码实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这篇可以结合上一篇博客《手把手搭建SpringCloud,第三篇——使用Feign实现声明式REST调用》,本章就不新建那么多项目了,只针对Hystrix在原来项目上更改,如有不明白的地方可以在评论区留言或者百度一下,你就知道。


前言介绍:

雪崩效应:

在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应,可采用断路器来解决。

Hystrix断路器具备服务降级、服务熔断、线程和信号隔离、请求缓存、请求合并以及服务监控等强大功能。

pom.xml 添加依赖,别忘了Eureka Clien feign等依赖,在这里就不一一列举了,详情参考其他篇章

        <!-- 断路器 -->
	  	<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-hystrix</artifactId>
		</dependency>
	<!-- 断路器仪表盘 actuator -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		<!-- hystrix-dashboard -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-hystrix-dashboard</artifactId>
		</dependency>

application.yml

server:
  port: 2003
  
eureka:
  client:
    service-url:
      #配置Eureka Server的地址,因为是要注册服务到Eureka Server
      defaultZone: http://xiaobei:xiaobei@localhost:1001/eureka/
  instance:
    #将自己的ip注册到EurekaServer,建议此处配置加上,在进行Jenkins/Docker构建部署项目会需要。
    prefer-ip-address: true
    #指明ip
    instance-id: 10.8.65.38:dev-feign-server-test:2003
    #告诉服务端,如果我2s以内没有给你发送心跳,代表我“死”了,将我踢掉
    lease-expiration-duration-in-seconds: 2
    #每间隔1s向服务器发送一次心跳,证明自己还活着
    lease-renewal-interval-in-seconds: 1
    
spring:
  application:
    name: dev-feign-server-test
    
#断路器配置启用,注意:要配置在请求端      
feign: 
  hystrix: 
    enabled: true

启动类

package com.portal;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.circuitbreaker.EnableCircuitBreaker;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;

@SpringBootApplication
@EnableEurekaClient //开启服务注册
@EnableFeignClients//开启Feign功能
@EnableHystrix //开启断路器
@EnableHystrixDashboard  //开启Hystrix Dashborad仪表盘
@EnableCircuitBreaker
public class SpringcloudFeignServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(SpringcloudFeignServerApplication.class, args);
	}

}

 FeignMapper.java

package com.portal.mapper;

import java.util.Map;

import org.springframework.cloud.netflix.feign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient(value = "dev-feign-server",fallback = HaveError.class) //方法一
//@FeignClient(value ="dev-feign-server",url="http://localhost:2001/") //方法二
public interface FeignMapper {
	
	/**
	 * Feign实现声明式调用
	 * @return
	 */
	@RequestMapping("/feign/getMap") //这里的地址必须是和调用的 “dev-feign-server”中接口地址一致
	public Map<String, Object> getMap2();
	
	/**
	 * 实现负载均衡
	 * @return
	 */
	@RequestMapping("/feign/getPort")//这里的地址必须是和调用的 “dev-feign-server”中接口地址一致
	public String getPort();

}

接口的实现 HaveError.java

package com.portal.mapper;

import java.util.HashMap;
import java.util.Map;

import org.springframework.stereotype.Component;

@Component
public class HaveError implements FeignMapper{

	@Override
	public Map<String, Object> getMap2() {
		Map<String, Object> map = new HashMap<>();
		map.put("STATUS", "Error");
		map.put("MESSAGE", "服务请求不到啦,开启断路器报警");
		return map;
	}

	@Override
	public String getPort() {
		return "STATUS = Error,MESSAGE = 服务请求不到啦,开启断路器报警";
	}

}

测试类 FeignController.java

package com.portal.controller;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import com.portal.mapper.FeignMapper;

@RestController
public class FeignController {
	
	@Autowired
	FeignMapper feignMapper;
	
	/**
	 * Feign 声明式调用
	 * @return
	 */
	@GetMapping("/feign/getMap2")
	public Map<String, Object> MapWhereParam()
	{
		return feignMapper.getMap2();
	}
	
	/**
	 * 实现负载均衡
	 * @return
	 */
	@GetMapping("/feign/getPort")
	public String getPort()
	{
		return feignMapper.getPort();
	}

}

开始测试,启动相关项目,访问http://localhost:1001/  服务正常

 测试接口正常

 这时把Eureka中的两个服务关停,访问http://localhost:1001/  已经没有这两个服务了,再次调用接口

 

到此,断路器功能实现,来看一下Hystrix DashBorad 实现

根据ip 端口 访问 http://localhost:2003/hystrix

 

 链接按照指示填写,Title随便,初始化进入页面 没有任何东西,是因为没有服务请求,测试几个接口


总结:笔者写博客不仅仅是为了分享,也是为了给自己做笔记。

以上方法亲测有效,如果问题可下方回复,

不当之处,请多指教

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值