这篇可以结合上一篇博客《手把手搭建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随便,初始化进入页面 没有任何东西,是因为没有服务请求,测试几个接口