首页 > 其他分享 >线程池实现服务隔离

线程池实现服务隔离

时间:2022-10-27 09:36:45浏览次数:85  
标签:product 服务 隔离 restTemplate 线程 id Setter

线程池实现服务隔离

 

问题分析#

在微服务架构中,我们将业务拆分成一个个的服务,服务与服务之间可以相互调用,由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题,调用这个服务就会出现网络延迟,此时若有大量的网络涌入,会形成任务累计,导致服务瘫痪。 在SpringBoot程序中,默认使用内置tomcat作为web服务器。单tomcat支持最大的并发请求是有限的,如果某一接口阻塞,待执行的任务积压越来越多,那么势必会影响其他接口的调用。

线程池的形式实现服务隔离#

(1) 配置坐标#

为了方便实现线以线程池的形式完成资源隔离,需要引入如下依赖 复制代码
<dependency>
  <groupId>com.netflix.hystrix</groupId>
  <artifactId>hystrix-metrics-event-stream</artifactId>
  <version>1.5.12</version>
</dependency>
<dependency>
  <groupId>com.netflix.hystrix</groupId>
  <artifactId>hystrix-javanica</artifactId>
  <version>1.5.12</version>
</dependency>
复制代码

(2) 配置线程池#

配置HystrixCommand接口的实现类,再实现类中可以对线程池进行配置 复制代码
public class OrderCommand extends HystrixCommand<String> {

  private RestTemplate restTemplate;
  private Long id;

  public OrderCommand(RestTemplate restTemplate, Long id) {
      super(setter());
      this.restTemplate = restTemplate;
      this.id = id;
  }

  private static Setter setter() {


      // 服务分组
      HystrixCommandGroupKey groupKey =
HystrixCommandGroupKey.Factory.asKey("order_product");
      // 服务标识
      HystrixCommandKey commandKey =
HystrixCommandKey.Factory.asKey("product");
      // 线程池名称
      HystrixThreadPoolKey threadPoolKey =
HystrixThreadPoolKey.Factory.asKey("order_product_pool");
      /**
       * 线程池配置
       *     withCoreSize :  线程池大小为10
       *     withKeepAliveTimeMinutes:  线程存活时间15秒
       *     withQueueSizeRejectionThreshold  :队列等待的阈值为100,超过100执行拒绝
策略
       */
      HystrixThreadPoolProperties.Setter threadPoolProperties =
HystrixThreadPoolProperties.Setter().withCoreSize(50)

.withKeepAliveTimeMinutes(15).withQueueSizeRejectionThreshold(100);

      // 命令属性配置Hystrix 开启超时
      HystrixCommandProperties.Setter commandProperties =
HystrixCommandProperties.Setter()
              // 采用线程池方式实现服务隔离
.withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrat
egy.THREAD)
              // 禁止
              .withExecutionTimeoutEnabled(false);
      return
HystrixCommand.Setter.withGroupKey(groupKey).andCommandKey(commandKey).andThread
PoolKey(threadPoolKey)

.andThreadPoolPropertiesDefaults(threadPoolProperties).andCommandPropertiesDefau
lts(commandProperties);

  }


  @Override
  protected String run() throws Exception {
      return restTemplate.getForObject("http://shop-service-
product/product/"+id, String.class);
  }


  @Override
  protected String getFallback(){
      return "熔断降级";
  }
}
复制代码

(3) 配置调用#

修改 OrderController ,使用自定义的OrderCommand完成调用 复制代码
@Autowired
private RestTemplate restTemplate;

@GetMapping("/buy/{id}")
public String order(@PathVariable Long id) throws ExecutionException,
InterruptedException, TimeoutException {
  return new OrderCommand(restTemplate,id).execute();
}
复制代码

 

标签:product,服务,隔离,restTemplate,线程,id,Setter
From: https://www.cnblogs.com/smallfa/p/16830965.html

相关文章

  • Linux 搭建 rsync 后台服务
    步骤1:安装:yuminstallrsync-y步骤2:编辑/etc/rsyncd.conf  特别注意:1、这是安装后默认带的,如果你其他另建一个,默认先搜索到这个位置配置文件2、配置文件内,参数后......
  • 北京博奥智源浅谈门户网站云监测深度监测服务内容
    1日常监测服务连通性监测首页+指定栏目不可用链接扫描首页逾期不更新监测首页+指定栏目首页错敏信息扫描每日新增稿件更新量监......
  • Java多线程(4):ThreadLocal
    您好,我是湘王,这是我的博客园,欢迎您来,欢迎您再来~ 为了提高CPU的利用率,工程师们创造了多线程。但是线程们说:要有光!(为了减少线程创建(T1启动)和销毁(T3切换)的时间),于是工程师们......
  • 微服务组件---- Spring Cloud Alibaba 链路追踪 skywalking 详解
    skywalking是什么【1】skywalking是分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。SkyWalking是观察性分析平台和应......
  • Node原生开发Web服务器介绍
     1.  使用Node创建一个HTTP的服务器,并能够接收到客服端发来的请求获取到客服端具体的请求数据,并根据不同的请求数据进行处理将处理之后的结果,响应回客户端,并断......
  • spdlog日志库源码:线程池thread_pool
    目录线程池thread_pool简介多生产者-多消费者阻塞队列模型阻塞与非阻塞方式插入数据取出数据overrun异常处理机制其他接口环形队列circular_qthreadpool模型threadpool实......
  • 存储交换机 服务器的组网
    存储的两个控制框冗余。。a控,b控连接同一个交换机 。。再来a控b控连接另外一个。。。。服务器再连接交换机。。  ......
  • 记录一次sshd服务启动失败
    记录一次sshd服务启动失败问题描述:服务器开机之后发现无法通过远程连接服务器终端,但是服务器并未宕机,于是考虑到sshd服务出现异常解决思路:查看服务器sshd服务运行情......
  • day21 线程终止与休眠
    线程停止让线程正常停止利用循环不能死循环使用标志位设置标志位不用stop函数和destroy1publicclassTestStopimplementsRunnable{2​3//1......
  • Java基础__学习笔记__线程
    =-=b又让我想起了以前操作系统的线程 --进程是执行中的一段程序,而一个进程中执行中的每个任务即为一个线程--一个线程只可以属于一个进程,但一个进程能包含多个线程-......