首页 文章 精选 留言 我的

精选列表

搜索[成本控制],共10000篇文章
优秀的个人博客,低调大师

为破除“谷歌控制说”,Istio 重组指导委员会

Istio 近日修订了其指导章程,向更多贡献者和社区成员开放治理角色,意图打造一个全新的Istio 指导委员会。 今年七月初,谷歌未遵守与 IBM 曾定下的协议——待 Istio 项目成熟后将其捐给 CNCF 基金会,而是把它的商标转让给了新成立的Open Usage Commons(OUC),这是一个谷歌自建的”中立“组织。IBM 与 CNCF 均表示失望,另有一些业内人士认为,谷歌此举是想把Istio 紧紧攥在手中,确保自己对该项目掌控权。 新的指导委员会是Istio 对这一说法的回应,他们强调”修订后的章程巩固了对开放治理的承诺,没有任何一家公司拥有对该项目的多数表决权,只有社区能够指导项目的发展方向“;并特别指出:谷歌、IBM 和红帽的席位数量将有所缩减。 根据新的指导章程,重组后的指导委员会共有十三个席位,包括九个按贡献分配的席位和四个社区选举席位。 贡献席位将依照过去十二个月对Istio 的贡献程度来进行分配。贡献程度没有一个完全标准的衡量模式,Istio 每年会对此进行重新考虑,选取不同的判断依据。今年的贡献度衡量指标是合并的 PR 数。九个贡献席位中至少会有三家公司代表。 四个社区席位将在年度选举中由Istio 社区投票产生,任何项目成员均可参加选举,在过去十二个月中保持活跃的所有 Istio 成员都具有投票资格。章程中还提到,这四个社区席位会由来自四个不同组织的代表获得。 可以看出,新的Istio 指导委员会将重心移向了”公司“和”组织“。人们对此并不买账。 比如,亚马逊 AWS 工程师 Matthew S. Wilson 就持反对态度,他不认同这种将贡献都归功给公司而非个人的做法。在Wilson 看来,这是一种用于巩固公司利益的方式罢了,真正应当受到赞许和奖励的,是有奉献精神的贡献者,他们的劳动应该被看到。 Kubernetes 的联合创始人 Joe Beda也表达了同样的观点。他认为,将贡献归功给公司意味着社区就变成由供应商主导,而不是由贡献者来定义了。他进一步设想,若委员中有人从公司离职,那么根据规定,这个人可能不得不放弃席位。 Knative 联合创始人 Matt Moore则抛出社区信任的问题。建立社区信任是一件很重要的事,它的价值却常常被低估。Moore 在担忧,当前的状况就是公司想要玩玩社区,员工却只被当作可以替换的齿轮,社区的信任值也会因此受到影响。 除批评的声音外,也有人指出这次Istio 指导委员会改革的一些进步之处。像是更能够从整体上关注项目,而不仅仅是从 repo 层面;非编码类的贡献也会被鼓励,有助于推进社区多元化等等。 新的Istio 指导委员会主要负责对项目的执行进行监督和管理。此前关于商标转让一事的报道也有提过,Open Usage Commons 将与 Istio 指导委员会一起制定商标使用指南,目前的 Istio 使用指南不会立即更改。

优秀的个人博客,低调大师

Spring Cloud Gateway 扩展支持多版本控制及灰度发布

灰度发布 什么是灰度发布,概念请参考,我们来简单的通过下图来看下,通俗的讲: 为了保证服务升级过程的平滑过渡提高客户体验,会一部分用户 一部分用户递进更新,这样生产中会同时出现多个版本的客户端,为了保证多个版本客户端的可用需要对应的多个版本的服务端版本。灰度发布就是通过一定策略保证 多个版本客户端、服务端间能够正确对应。 所谓灰度发布,即某个服务存在多个实例时,并且实例版本间的版本并不一致,通过 实现方案 nginx + lua (openresty) Netflix Zuul 只需要自定义ribbon 的断言即可,核心是通过TTL 获取上下请求header中的版本号 @Slf4j public class MetadataCanaryRuleHandler extends ZoneAvoidanceRule { @Override public AbstractServerPredicate getPredicate() { return new AbstractServerPredicate() { @Override public boolean apply(PredicateKey predicateKey) { String targetVersion = RibbonVersionHolder.getContext(); RibbonVersionHolder.clearContext(); if (StrUtil.isBlank(targetVersion)) { log.debug("客户端未配置目标版本直接路由"); return true; } DiscoveryEnabledServer server = (DiscoveryEnabledServer) predicateKey.getServer(); final Map<String, String> metadata = server.getInstanceInfo().getMetadata(); if (StrUtil.isBlank(metadata.get(SecurityConstants.VERSION))) { log.debug("当前微服务{} 未配置版本直接路由"); return true; } if (metadata.get(SecurityConstants.VERSION).equals(targetVersion)) { return true; } else { log.debug("当前微服务{} 版本为{},目标版本{} 匹配失败", server.getInstanceInfo().getAppName() , metadata.get(SecurityConstants.VERSION), targetVersion); return false; } } }; } } 维护请求中的版本号 public class RibbonVersionHolder { private static final ThreadLocal<String> context = new TransmittableThreadLocal<>(); public static String getContext() { return context.get(); } public static void setContext(String value) { context.set(value); } public static void clearContext() { context.remove(); } } Spring Cloud Gateway 中实现 第一反应,参考zuul 的实现,自定义断言,然后从上下中获取版本信息即可。但由于 spring cloud gateway 是基于webflux 的反应式编程,所以传统的TTL或者 RequestContextHolder 都不能正确的维护上下文请求。 先来看 spring clou的 gateway 默认的lb 策略实现 LoadBalancerClientFilter public class LoadBalancerClientFilter implements GlobalFilter, Ordered { @Override public int getOrder() { return LOAD_BALANCER_CLIENT_FILTER_ORDER; } @Override @SuppressWarnings("Duplicates") public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { return chain.filter(exchange); } protected ServiceInstance choose(ServerWebExchange exchange) { return loadBalancer.choose( ((URI) exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR)).getHost()); } } 我们只需要重写 choose 方法,把上下文请求传递到路由断言中即可,如下 @Override protected ServiceInstance choose(ServerWebExchange exchange) { HttpHeaders headers = exchange.getRequest().getHeaders(); return loadBalancer.choose(((URI) exchange.getAttribute(GATEWAY_REQUEST_URL_ATTR)).getHost(), headers); } 然后在路由断言中通过 PredicateKey获取到即可 public abstract class AbstractDiscoveryEnabledPredicate extends AbstractServerPredicate { /** * {@inheritDoc} */ @Override public boolean apply(@Nullable PredicateKey input) { return input != null && input.getServer() instanceof NacosServer && apply((NacosServer) input.getServer(), (HttpHeaders) input.getLoadBalancerKey()); } } 最后根据版本来计算 public class GrayMetadataAwarePredicate extends AbstractDiscoveryEnabledPredicate { @Override protected boolean apply(NacosServer server, HttpHeaders headers) { PigxRibbonRuleProperties ribbonProperties = SpringContextHolder.getBean(PigxRibbonRuleProperties.class); if (!ribbonProperties.isGrayEnabled()) { log.debug("gray closed,GrayMetadataAwarePredicate return true"); return true; } final Map<String, String> metadata = server.getMetadata(); String version = metadata.get(CommonConstants.VERSION); // 判断Nacos服务是否有版本标签 if (StrUtil.isBlank(version)) { log.debug("nacos server tag is blank ,GrayMetadataAwarePredicate return true"); return true; } // 判断请求中是否有版本 String target = headers.getFirst(CommonConstants.VERSION); if (StrUtil.isBlank(target)) { log.debug("request headers version is blank,GrayMetadataAwarePredicate return true"); return true; } log.debug("请求版本:{} ,当前服务版本:{}", target, version); return target.equals(version); } } 整合nacos 结合nacos的动态配置可以非常方便的实现灰度

优秀的个人博客,低调大师

阿里云移动端播放器高级功能---画面控制

基本介绍 经常遇到一些开发者问: 1.我们播放的时候,会有黑边怎么处理?尤其是在类似于抖音,直播这样的场景下,如果视频有黑边,很影响画面的视觉效果。而阿里云播放器提供了缩放功能,用来去除黑边,达到视频全屏的效果。 2.直播时摄像头采集经常会遇到反向的问题,就是采集出来的视频画面中的字是反的,对于这种情况怎么处理呢?阿里云播放器提供了镜像的功能,可以水平和垂直镜像,让画面变成你想要的样子。 3.对一些横屏拍摄的视频同时我们提供了旋转功能,可以选择90、270度,旋转之后就可以实现全屏渲染了。 渲染模式设置 Android接口 播放器提供了setVideoScalingMode方法提供去改变画面的大小。它可以设置两种方式: 1. VIDEO_SCALING_MODE_SCALE_TO_FIT 按照视频的宽高比,放到SurfaceView(Te

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

用户登录
用户注册