SpringCloud五大组件Hystrix
分布式系统环境下,服务间类似依赖非常常见,一个业务调用通常依赖多个基础服务。如下图,对于同步调用,当库存服务不可用时,商品服务请求线程被阻塞,当有大批量请求调用库存服务时,最终可能导致整个商品服务资源耗尽,无法继续对外提供服务。并且这种不可用可能沿请求调用链向上传递,这种现象被称为雪崩效应。
一、在原有的user服务上进行改造,添加Hystrix断路器,pom配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache/POM/4.0.0"
xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache/POM/4.0.0 http://maven.apache/xsd/maven-4.0.0.xsd">
<parent>
<groupId>父GroupId</groupId>
<artifactId>父ArtifactId</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.lezhu.cloud</groupId>
<artifactId>user</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>user</name>
<packaging>pom</packaging>
<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-zipkin</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
</project>
二、user服务yml配置,配置如下:
spring:
application:
name: user
server:
port: 28666
eureka:
instance:
#开启IP注册
prefer-ip-address: true
#地址名称
instance-id: ${spring.cloud.client.ip-address}:${server.port}
#心跳
lease-renewal-interval-in-seconds: 5
#无心跳,十秒踢出
lease-expiration-duration-in-seconds: 10
#获取此实例的相对健康检查URL路径。 健康检查页面URL,然后构造出主机名和通信的类型 - 安全或不安全,如securePort和nonSecurePort规定。 它通常用于制造基于实例的健康做出明智的决策 - 例如,它可以被用来确定是否进行部署到整个服务器场或停止部署,而不会造成进一步的损害。
health-check-url-path: /actuator/health
#获取与此实例相关联的元数据名称/值对。 该信息被发送到服务器eureka,可以通过其他情况下使用。
metadata-map:
user.name: ${spring.security.user.name}
user.password: ${spring.security.user.password}
client:
#表示的频率(以秒为单位)来从eureka服务器注册表的信息
registryFetchIntervalSeconds: 5
service-url:
defaultZone: ${EUREKA_SERVICE_URL:http://127.0.0.1:28001}/eureka/
### Feign 配置
feign:
compression:
request:
# 开启请求压缩
enabled: true
# 配置压缩的 MIME TYPE
mime-types: text/xml,application/xml,application/json
# 配置压缩数据大小的下限
min-request-size: 2048
response:
# 开启响应压缩
enabled: true
hystrix:
#断路器打开 feign开启熔断器必须加这句话,不然无法使用,直接报500状态码
enabled: true
三、我们使用Feign来断路,User服务Feign接口改造,代码如下:
只需要在FeignClient的MemberServiceFeign接口的注解中加上fallback的指定类就行了
@FeignClient(value = "member",fallback = MemberServiceFeignHystric.class)
public interface MemberServiceFeign {
/**
* 远程调用会员接口
*
* @param name
* @return
*/
@GetMapping("/member/sayHiMember")
String sayHiMember(@RequestParam(value = "name") String name);
/**
* 远程调用接口
*
* @param name
* @return
*/
@GetMapping("/member/port")
String port(@RequestParam(value = "name") String name);
}
四、我们接下来创建一个接口实现类,代码如下:
我们在这里需要实现MemberServiceFeign接口并注入到Ioc容器中
@Component
public class MemberServiceFeignHystric implements MemberServiceFeign {
@Override
public String sayHiMember(String name) {
return "FeignSayHiMember使用了断路器【熔断器】,限制服务处于熔断状态,运行了类似于抛出异常的方法,时间=" + new Date();
}
@Override
public String port(String name) {
return "FeignPort使用了断路器【熔断器】,限制服务处于熔断状态,运行了类似于抛出异常的方法,时间=" + new Date();
}
}
五、启动类添加@EnableHystrix注解,进行开启断路器,代码如下:
@EnableEurekaClient
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
@EnableHystrix
public class ServiceUserApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceUserApplication.class, args);
}
@Bean
@LoadBalanced
RestTemplate restTemplate() {
return new RestTemplate();
}
}
六、我们先启动User服务,然后不去启动Member服务,现在我们在网址上输入这个地址:http://127.0.0.1:28666/user/userInfo?name=张三,显示如下图,就证明断路器已经启动
我们在启动Member服务再看下返回结果:
SpringCloud五大组件之一Hystrix断路器已到此结束
更多推荐
SpringCloud五大组件Hystrix
发布评论