当前位置: 首页 > news >正文

可视化网站建设999网站免费

可视化网站建设,999网站免费,wordpress动态导航侧边栏,大学生电商创业项目目录资源隔离使用资源隔离的好处基于Hystrix实现微服务中资源隔离基于Hystrix线程池隔离实现资源隔离利用 HystrixCommand 获取单条数据利用 HystrixObservableCommand 批量获取数据基于 Hystrix 信号量机制实现资源隔离资源隔离 资源隔离是什么#xff1f; 资源隔离是指把对… 目录资源隔离使用资源隔离的好处基于Hystrix实现微服务中资源隔离基于Hystrix线程池隔离实现资源隔离利用 HystrixCommand 获取单条数据利用 HystrixObservableCommand 批量获取数据基于 Hystrix 信号量机制实现资源隔离资源隔离 资源隔离是什么 资源隔离是指把对某一个依赖服务的所有调用请求全部隔离在同一份资源池内不会去用其它资源了。哪怕对这个依赖服务比如说商品服务现在同时发起的调用量已经到了 1000但是分配给商品服务线程池内就 10 个线程最多就只会用这 10 个线程去执行。不会因为对商品服务调用的延迟将 Tomcat 内部所有的线程资源全部耗尽。   使用资源隔离的好处 合理分配资源把给资源分配的控制权交给用户。多个微服务之间进行调用的时候假设服务A调用服务B和服务C服务B和服务C又调用其他微服务这就是所谓的扇出如果扇出的链路上某个微服务的调用响应时间过长如线程阻塞了容器中的线程数量就则会持续增加这个时候服务A占用的线程资源越来越多进而引起系统奔溃这就是“雪崩效应”资源隔离能够在一定程度上防止微服务的雪崩效应。对依赖调用进行封装有利于对调用的监控和分析类似于hystrix-dashboard的使用。 基于Hystrix实现微服务中资源隔离 Hystrix是Netflix开源的一款容错框架包含常用的容错方法线程隔离、信号量隔离、服务降级、服务熔断。 Hystrix有一项比较核心的功能就是所谓的资源隔离资源隔离要解决的核心问题就是将多个依赖服务的调用分别隔离到各自的资源池中避免某一个依赖服务的调用因为依赖服务的接口调用的延迟或者失败导致所有的线程资源全部耗费在这个服务的接口调用上一旦某个服务的线程资源全部耗尽就可能导致雪崩效应。 Hystrix实现资源隔离主要有两种隔离方式 线程池隔离信号量隔离 基于Hystrix线程池隔离实现资源隔离 Hystrix进行资源隔离其实是提供了一个抽象叫做Command。这个也是Hystrix最基本的资源隔离技术。   利用 HystrixCommand 获取单条数据 我们通过将调用商品的服务操作封装在HystrixCommand中并限定一个key比如下面的GetProductInfoCommandGroup,在这里我们可以简单认为是一个线程池每次调用商品服务就只会用该线程池中的资源不会再去用其他的资源了。 public class GetProductInfoCommand extends HystrixCommandProductInfo {private Long productId;public GetProductInfoCommand(Long productId) {super(HystrixCommandGroupKey.Factory.asKey(GetProductInfoCommandGroup));this.productId productId;}Overrideprotected ProductInfo run() {String url http://localhost:8081/getProductInfo?productId productId;// 调用商品服务接口String response HttpClientUtils.sendGetRequest(url);return JSONObject.parseObject(response, ProductInfo.class);} } 我们在接口中根据 productId 创建 Command 并执行获取到商品数据。 RequestMapping(/getProductInfo) ResponseBody public String getProductInfo(Long productId) {HystrixCommandProductInfo getProductInfoCommand new GetProductInfoCommand(productId);// 通过command执行获取最新商品数据ProductInfo productInfo getProductInfoCommand.execute();System.out.println(productInfo);return success; }上面执行的方法是execute()方法这个方法是同步的。 我们也可以调用command.queue()方法它将command放入线程池的一个等待队列中然后理解返回后面可以继续做其他一些事情然后过一段时间对Future调用get方法获取数据这是异步的。     利用 HystrixObservableCommand 批量获取数据 只要是获取商品数据全部都绑定到同一个线程池里面去我们通过 HystrixObservableCommand 的一个线程去执行而在这个线程里面批量把多个 productId 的 productInfo 拉回来。 public class GetProductInfosCommand extends HystrixObservableCommandProductInfo {private String[] productIds;public GetProductInfosCommand(String[] productIds) {// 还是绑定在同一个线程池super(HystrixCommandGroupKey.Factory.asKey(GetProductInfoGroup));this.productIds productIds;}Overrideprotected ObservableProductInfo construct() {return Observable.unsafeCreate((Observable.OnSubscribeProductInfo) subscriber - {for (String productId : productIds) {// 批量获取商品数据String url http://localhost:8081/getProductInfo?productId productId;String response HttpClientUtils.sendGetRequest(url);ProductInfo productInfo JSONObject.parseObject(response, ProductInfo.class);subscriber.onNext(productInfo);}subscriber.onCompleted();}).subscribeOn(Schedulers.io());} } 在缓存服务接口中根据传来的 id 列表比如是以 , 分隔的 id 串通过上面的 HystrixObservableCommand执行 Hystrix 的一些 API 方法获取到所有商品数据。 public String getProductInfos(String productIds) {String[] productIdArray productIds.split(,);HystrixObservableCommandProductInfo getProductInfosCommand new GetProductInfosCommand(productIdArray);ObservableProductInfo observable getProductInfosCommand.observe();observable.subscribe(new ObserverProductInfo() {Overridepublic void onCompleted() {System.out.println(获取完了所有的商品数据);}Overridepublic void onError(Throwable e) {e.printStackTrace();}/*** 获取完一条数据就回调一次这个方法* param productInfo*/Overridepublic void onNext(ProductInfo productInfo) {System.out.println(productInfo);}});return success; }基于 Hystrix 信号量机制实现资源隔离 信号量的资源隔离只是起到一个开关的作用比如服务 A 的信号量大小为 10那么就是说它同时只允许有 10 个 tomcat 线程来访问服务 A其它的请求都会被拒绝从而达到资源隔离和限流保护的作用。 线程池隔离技术是用 Hystrix 自己的线程去执行调用并不是去控制tomcat容器的线程Hystrix线程池满后Tomcat的线程不会因为依赖服务的接口调用延迟或者故障而被阻塞不会卡死在哪里可以去做其他事情。 Hystrix信号量隔离是控制Tomcat容器中的线程数信号量有多少就允许多少个Tomcat线程通过它然后去执行。 信号量的是什么场景呢 举个栗子。一般我们在获取到商品数据之后都要去获取商品是属于哪个地理位置、省、市、卖家等可能在自己的纯内存中比如就一个 Map 去获取。对于这种直接访问本地内存的逻辑比较适合用信号量做一下简单的隔离。 优点在于不用自己管理线程池啦不用 care timeout 超时啦也不需要进行线程的上下文切换啦。信号量做隔离的话性能相对来说会高一些。 假如这是本地缓存我们可以通过 cityId拿到 cityName。 public class LocationCache {private static MapLong, String cityMap new HashMap();static {cityMap.put(1L, 北京);}/*** 通过cityId 获取 cityName** param cityId 城市id* return 城市名*/public static String getCityName(Long cityId) {return cityMap.get(cityId);} } 写一个 GetCityNameCommand策略设置为信号量。run () 方法中获取本地缓存。我们目的就是对获取本地缓存的代码进行资源隔离。 public class GetCityNameCommand extends HystrixCommandString {private Long cityId;public GetCityNameCommand(Long cityId) {// 设置信号量隔离策略super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey(GetCityNameGroup)).andCommandPropertiesDefaults(HystrixCommandProperties.Setter().withExecutionIsolationStrategy(HystrixCommandProperties.ExecutionIsolationStrategy.SEMAPHORE)));this.cityId cityId;}Overrideprotected String run() {// 需要进行信号量隔离的代码return LocationCache.getCityName(cityId);} }在接口层通过创建 GetCityNameCommand传入 cityId执行 execute () 方法那么获取本地 cityName 缓存的代码将会进行信号量的资源隔离。 RequestMapping(/getProductInfo) ResponseBody public String getProductInfo(Long productId) {HystrixCommandProductInfo getProductInfoCommand new GetProductInfoCommand(productId);// 通过command执行获取最新商品数据ProductInfo productInfo getProductInfoCommand.execute();Long cityId productInfo.getCityId();GetCityNameCommand getCityNameCommand new GetCityNameCommand(cityId);// 获取本地内存(cityName)的代码会被信号量进行资源隔离String cityName getCityNameCommand.execute();productInfo.setCityName(cityName);System.out.println(productInfo);return success; }
http://www.hkea.cn/news/14521114/

相关文章:

  • 免费空间建站网站推荐一个商城
  • 网站建设 甲方欠款 如何处理网站开发的技术可行性
  • 杭州网站建设做维修家具广告在哪个网站好
  • 176网站入口网站开发为什么不用cgi了
  • 万网的网站代码怎么看html5软件下载官网
  • wordpress做企业站网站 排版模板
  • 苏州网站创建wordpress get term
  • 专业商城网站搭建费用云浮东莞网站建设
  • 怎么给自己的网站做域名wordpress 数据库 备份
  • 南京seo建站dw2019怎么做网站
  • 网站开发项目描述怎么做网站服务器吗
  • wordpress空间 腾讯seo标题关键词优化
  • 自助建站上建的网站免费吗wordpress按条件搜索功能
  • 团购网站 网上 收费 系统wordpress更好后台登录logo
  • 承德百度网站建设wordpress 网银支付宝
  • 网站关键字设置汉川网页设计
  • 网站的运营与维护苏州做企业网站公司
  • 手机免费网站建设哪家公司好jquery 显示 wordpress
  • 购物网站代码模板祖庙网站开发
  • 网站解析需要什么wordpress post是什么
  • python大型网站开发wordpress主题快速
  • 网站产品内容在数据库网站HTML怎么做链接
  • iis7 添加网站注册网站会不会有问题
  • 外贸阿里巴巴国际站许昌做网站联系电话
  • 眉山做网站浙江seo技术培训
  • 定州住房和城乡建设局网站冷门缺人却高薪的职业
  • 哪个网站的品牌特卖做的好九江网站建设优化
  • 辽宁省营商环境建设监督局网站科技有限公司 翻译
  • 淘宝优惠券网站怎么做网店推广的目的是什么
  • 拖拽式网站开发企腾网