微服务-Hystrix服务保护

服务雪崩效应:

在微服务架构中,我们把每个业务都拆成了单个服务模块,然后当有业务需求时,服务间可互相调用,但是,由于网络原因或者其他一些因素,有可能出现服务不可用的情况,当某个服务出现问题时,其他服务如果继续调用这个服务,就有可能出现线程阻塞,但如果同时有大量的请求,就会造成线程资源被用完,这样就可能会导致服务瘫痪,由于服务间会相互调用,很容易造成蝴蝶效应导致整个系统宕掉。因此,就有人提出来断路器来解决这一问题。

服务降级:

当高并发的情况下,防止用户一直等待,在tomcat中没有线程进行处理客户端请求的时候,不应该让用户转圈等待,调用本地fallback方法,返回一个友好的提示直接给用户(类似于商城抢东西,当前请求人数过多,请稍后再试)(目的是为了客户友好体验)

服务熔断:

用于保护服务,类似保险丝,高并发情况下,请求达到一定极限,(可以自己设置阈值),如果流量超过一定的阈值,自动开启服务保护功能,使用服务降级的方式返回一个友好提示,服务熔断,服务降级是一起使用的

服务隔离:

线程池隔离,信号量隔离(高并发情况下线程池隔离)
每个服务接口都有自己独立的线程池,每个线程池互不影响,缺点:CPU占用率非常高,不是所有的接口都去采用线程池隔离,核心关键接口(比如如果不添加hystrix 100个请求同时调用订单服务的a接口,10个请求调用订单服务的b接口,此时比如tomcat服务器线程池为20,服务会因为前100个请求导致阻塞,导致剩下的80个调用a接口的请求,与10个调用b接口的请求无法正常调用。如果采用服务隔离机制,线程池隔离,每一个接口请求都会有自己独立的线程池,每个线程池互不影响,缺点就是CPU占用率非常高)

Hystrix环境搭建:

比如有订单服务 会员服务
目录架构为:

springcloud-member-service-impl
springcloud-order-service-impl
springcloud-api-service
~~springcloud-api-member-service
~~springcloud-api-order-service
springcloud-common

在springcloud-parent 父级项目添加 hystrix断路器依赖

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

比如现在订单服务需要开启断路器

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
@EnableHystrix
@EnableCircuitBreaker
public class AppOrder {
	public static void main(String[] args) {
		SpringApplication.run(AppOrder.class, args);
	}
}

@EnableHystrix 开启Hystrix
@EnableCircuitBreaker 开启熔断

application.yml文件

###服务启动端口号
server:
  port: 8020
###服务名称(服务注册到eureka名称)  
spring:
    application:
        name: app-itmayiedu-order
###服务注册到eureka地址
eureka:
  client:
    service-url:
           defaultZone: http://localhost:8100/eureka

           
###因为该应用为注册中心,不会注册自己
    register-with-eureka: true
###是否需要从eureka上获取注册信息
    fetch-registry: true
###设置feign客户端超时时间
###SpringCloud feign 默认开启支持ribbon
ribbon:
###指的是建立连接所用的时间,适用于网络状况正常的情况下,两端连接所用的时间。
  ReadTimeout: 5000
###指的是建立连接后从服务器读取到可用资源所用的时间。
  ConnectTimeout: 5000
 
###开启Hystrix断路器 
feign:
  hystrix:
    enabled: true


##### hystrix禁止服务超时时间   如果没设置这个,当hystrix超时一秒钟就会调取fallback接口
hystrix:
 command:
   default:
     execution:
#       isolation:
#         thread:
#           timeoutInMilliseconds: 2000
       timeout:
         enabled: false

 ##### 并发执行的最大线程数,默认10
 threadpool:
   default:
     coreSize: 10

订单服务的Feigin客户端 继承会员服务提供出来的会员接口

@FeignClient(value = "app-itmayiedu-member")
public interface MemberServiceFeigin extends IMemberService {
	
}
@RestController
public class OrderServiceImpl extends BaseApiService implements IOrderService {
	// 订单服务继承会员服务接口,用来实现feign客户端 减少重复接口代码
	@Autowired
	private MemberServiceFeigin memberServiceFeigin;

	// 解决服务雪崩效应
	// fallbackMethod 方法的作用:服务降级执行
	// @HystrixCommand 默认开启线程池隔离方式,服务降级,服务熔断
	// 设置Hystrix服务超时时间
	/**
	 * @HystrixCommand<br>
	 * 	默认开启服务隔离方式 以线程池方式<br>
	 *    默认开启服务降级执行方法orderToMemberUserInfoHystrixFallback<br>
	 *    默认开启服务熔断机制<br>
	 */
	//@HystrixCommand(fallbackMethod = "orderToMemberUserInfoHystrixFallback")
	@HystrixCommand(fallbackMethod = "orderToMemberUserInfoHystrixFallback",
			commandProperties = {
					//默认 20 个;10s 内请求数大于 20 个时就启动熔断器,当请求符合熔断条件时将触发 getFallback()。
					@HystrixProperty(name= HystrixPropertiesManager.CIRCUIT_BREAKER_REQUEST_VOLUME_THRESHOLD,
							value="10"),
					//请求错误率大于 50%时就熔断,然后 for 循环发起请求,当请求符合熔断条件时将触发 getFallback()。
					@HystrixProperty(name=HystrixPropertiesManager.CIRCUIT_BREAKER_ERROR_THRESHOLD_PERCENTAGE,
							value="50"),
					//默认 5 秒;熔断多少秒后去尝试请求
					@HystrixProperty(name=HystrixPropertiesManager.CIRCUIT_BREAKER_SLEEP_WINDOW_IN_MILLISECONDS,
							value="5000"),
			}
	)
	@RequestMapping("/orderToMemberUserInfoHystrix")
	public ResponseBase orderToMemberUserInfoHystrix() {
		System.out.println("orderToMemberUserInfoHystrix:" + "线程池名称:" + Thread.currentThread().getName());
		return memberServiceFeigin.getUserInfo();
	}

	public ResponseBase orderToMemberUserInfoHystrixFallback() {
		return setResultSuccess("返回一个友好的提示:服务降级,服务器忙,请稍后重试!");
	}
}

对Hystrix的配置可以写在@HystrixCommand下面 也可以统一配置在application.yml文件里面

以上是在每一个需要开启断路的功能上添加@HystrixCommand
可以统一处理,服务熔断降级后的返回数据

@FeignClient(value = "app-itmayiedu-member",fallback = MemberServiceFallback.class)
public interface MemberServiceFeigin extends IMemberService {
	
}

一旦调用的接口 例如:/getUserInfo 开启服务熔断降级,就会统一调用MemberServiceFallback里面的功能

@Component
public class MemberServiceFallback extends BaseApiService implements MemberServiceFeigin {
    @Override
    public UserEntity getMember(String name) {
        return null;
    }

    @Override
    public ResponseBase getUserInfo() {
        return setResultError("系统错误回调方法");
    }
}

实现类里面方法就不需要添加@HystrixCommand该注解

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值