聊聊Sentinel集群限流探索

最近看了下关于分布式限流的部分,看到Sentinel的分布式限流,也就是集群限流的部分,想搭个环境看看,结果发现网上关于这方面的内容基本可以说没有,你甚至很难跑起来他的demo,就算能跑起来,估计也得自己研究半天,麻烦的要死。

我猜测很重要的原因可能就是Sentinel关于这块做的并不完善,而且从官方的Issue中能看出来,其实官方对于这块后续并没有计划去做的更好。

那么废话不多说,在此之前,肯定要先说下关于Sentinel集群限流方面的原理,没有原理一切都是空中楼阁。

集群限流原理

原理这方面比较好解释,就是在原本的限流规则中加了一个clusterMode参数,如果是true的话,那么会走集群限流的模式,反之就是单机限流。

如果是集群限流,判断身份是限流客户端还是限流服务端,客户端则和服务端建立通信,所有的限流都通过和服务端的交互来达到效果。

对于Sentinel集群限流,包含两种模式,内嵌式和独立式。

内嵌式

什么是内嵌式呢,简单来说,要限流那么必然要有个服务端去处理多个客户端的限流请求,对于内嵌式来说呢,就是整个微服务集群内部选择一台机器节点作为限流服务端(Sentinel把这个叫做token-server),其他的微服务机器节点作为限流的客户端(token-client),这样的做法有缺点也有优点。

限流-嵌入式

首先说优点:这种方式部署不需要独立部署限流服务端,节省独立部署服务端产生的额外服务器开支,降低部署和维护复杂度。

再说缺点,缺点的话也可以说是整个Sentinel在集群限流这方面做得不够好的问题。

先说第一个缺点:无自动故障转移机制。

无论是内嵌式还是独立式的部署方案,都无法做到自动的故障转移。

所有的server和client都需要事先知道IP的请求下做出配置,如果server挂了,需要手动的修改配置,否则集群限流会退化成单机限流。

比如你的交易服务有3台机器A\B\C,其中A被手动设置为server,B\C则是作为client,当A服务器宕机之后,需要手动修改B\C中一台作为server,否则整个集群的机器都将退化回单机限流的模式。

但是,如果client挂了,则是不会影响到整个集群限流的,比如B挂了,那么A和C将会继续组成集群限流。

如果B再次重启成功,那么又会重新加入到整个集群限流当中来,因为会有一个自动重连的机制,默认的时间是N*2秒,逐渐递增的一个时间。

这是想用Sentinel做集群限流并且使用内嵌式需要考虑的问题,要自己去实现自动故障转移的机制,当然,server节点选举也要自己实现了。

对于这个问题,官方提供了可以修改server/client的API接口,另外一个就是可以基于动态的数据源配置方式,这个我们后面再谈。

第二个缺点:适用于单微服务集群内部限流。

这个其实也是显而易见的道理,都内部选举一台作为server去限流了,如果还跨多个微服务的话,显然是不太合理的行为,现实中这种情况肯定也是非常少见的了,当然你非要想跨多个微服务集群也不是不可以,只要你开心就好。

第三个缺点:server节点的机器性能会受到一定程度的影响。

这个肯定也比较好理解的,作为server去限流,那么其他的客户端肯定要和server去通信才能做到集群限流啊,对不对,所以一定程度上肯定会影响到server节点本身服务的性能,但是我觉得问题不大,就当server节点多了一个流量比较大的接口好了。

具体上会有多大的影响,我没有实际对这块做出实际的测试,如果真的流量非常大,需要实际测试一下这方面的问题。

我认为影响还是可控的,本身server和client基于netty通信,通信的内容其实也非常的小。

独立式

说完内嵌式的这些点,然后再说独立式,也非常好理解,就是单独部署一台机器作为限流服务端server,就不在本身微服务集群内部选一台作为server了。

限流-独立式

很明显,优点就是解决了上面的缺点。

  • 不会和内嵌式一样,影响到server节点的本身性能
  • 可以适用于跨多个微服务之间的集群限流

优点可以说就是解决了内嵌式的两个缺点,那么缺点也来了,这同样也是Sentinel本身并没有帮助我们去解决的问题。

缺点一:需要独立部署,会产生额外的资源(钱)和运维复杂度

缺点二:server默认是单机,需要自己实现高可用方案

缺点二很致命啊,官方的server实现默认就是单机的,单点问题大家懂的都懂,自己实现高可用,我真的是有点服了。

这么说Sentinel这个集群限流就是简单的实现了一下,真正复杂的部分他都没管,你可以这么理解。

run起来

那基本原理大概了解之后,还是要真正跑起来看看效果的,毕竟开头我就说了,网上这方面真的是感觉啥也搜不到,下面以嵌入式集群的方式举例。

无论集群限流还是单机限流的方式,官方都支持写死配置和动态数据源的配置方式,写的话下面的代码中也都有,被我注释掉了,至于动态数据源的配置,会基于Apollo来实现。

理解一下动态数据源的配置方式,基于这个我们可以实现限流规则的动态刷新,还有重点的一点可以做到基于修改配置方式的半自动故障转移。

动态数据源支持推和拉两种方式,比如文件系统和Eureka就是拉取的方式,定时读取文件内容的变更,Eureka则是建立HTTP连接,定时获取元数据的变更。

推送的方式主要是基于事件监听机制,比如Apollo和Nacos,Redis官方则是基于Pub/Sub来实现,默认的实现方式是基于Lettuce,如果想用其他的客户端要自己实现。

限流-集群工作模式

首先,该引入的包还是引入。

<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-annotation-aspectj</artifactId><version>1.8.4</version>
</dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-transport-simple-http</artifactId><version>1.8.4</version>
</dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-cluster-client-default</artifactId><version>1.8.4</version>
</dependency>
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-cluster-server-default</artifactId><version>1.8.4</version>
</dependency>
<dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-apollo</artifactId><version>1.8.4</version>
</dependency>

实现SPI,在resources目录的META-INF/services下新增名为com.alibaba.csp.sentinel.init.InitFunc的文件,内容写上我们自己实现的类名,比如我的com.irving.demo.init.DemoClusterInitFunc。

实现InitFunc接口,重写init方法,代码直接贴出来,这里整体依赖的是Apollo的配置方式,注释的部分是我在测试的时候写死代码的配置方式,也是可以用的。

public class DemoClusterInitFunc implements InitFunc {private final String namespace = "application";private final String ruleKey = "demo_sentinel";private final String ruleServerKey = "demo_cluster";private final String defaultRuleValue = "[]";@Overridepublic void init() throws Exception {// 初始化 限流规则initDynamicRuleProperty();//初始化 客户端配置initClientConfigProperty();// 初始化 服务端配置信息initClientServerAssignProperty();registerClusterRuleSupplier();// token-server的传输规则initServerTransportConfigProperty();// 初始化 客户端和服务端状态initStateProperty();}/*** 限流规则和热点限流规则配置*/private void initDynamicRuleProperty() {ReadableDataSource<String, List<FlowRule>> ruleSource = new ApolloDataSource<>(namespace, ruleKey,defaultRuleValue, source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));FlowRuleManager.register2Property(ruleSource.getProperty());ReadableDataSource<String, List<ParamFlowRule>> paramRuleSource = new ApolloDataSource<>(namespace, ruleKey,defaultRuleValue, source -> JSON.parseObject(source, new TypeReference<List<ParamFlowRule>>() {}));ParamFlowRuleManager.register2Property(paramRuleSource.getProperty());}/*** 客户端配置,注释的部分是通过Apollo配置,只有一个配置我就省略了*/private void initClientConfigProperty() {
//        ReadableDataSource<String, ClusterClientConfig> clientConfigDs = new ApolloDataSource<>(namespace, ruleKey,
//                defaultRuleValue, source -> JSON.parseObject(source, new TypeReference<ClusterClientConfig>() {
//        }));
//        ClusterClientConfigManager.registerClientConfigProperty(clientConfigDs.getProperty());ClusterClientConfig clientConfig = new ClusterClientConfig();clientConfig.setRequestTimeout(1000);ClusterClientConfigManager.applyNewConfig(clientConfig);}/*** client->server 传输配置,设置端口号,注释的部分是写死的配置方式*/private void initServerTransportConfigProperty() {ReadableDataSource<String, ServerTransportConfig> serverTransportDs = new ApolloDataSource<>(namespace, ruleServerKey,defaultRuleValue, source -> {List<ClusterGroupEntity> groupList = JSON.parseObject(source, new TypeReference<List<ClusterGroupEntity>>() {});ServerTransportConfig serverTransportConfig = Optional.ofNullable(groupList).flatMap(this::extractServerTransportConfig).orElse(null);return serverTransportConfig;});ClusterServerConfigManager.registerServerTransportProperty(serverTransportDs.getProperty());
//        ClusterServerConfigManager.loadGlobalTransportConfig(new ServerTransportConfig().setIdleSeconds(600).setPort(transPort));}private void registerClusterRuleSupplier() {ClusterFlowRuleManager.setPropertySupplier(namespace -> {ReadableDataSource<String, List<FlowRule>> ds = new ApolloDataSource<>(this.namespace, ruleKey,defaultRuleValue, source -> JSON.parseObject(source, new TypeReference<List<FlowRule>>() {}));return ds.getProperty();});ClusterParamFlowRuleManager.setPropertySupplier(namespace -> {ReadableDataSource<String, List<ParamFlowRule>> ds = new ApolloDataSource<>(this.namespace, ruleKey,defaultRuleValue, source -> JSON.parseObject(source, new TypeReference<List<ParamFlowRule>>() {}));return ds.getProperty();});}/*** 服务端配置,设置server端口和IP,注释的配置是写死的方式,这个在服务端是不用配置的,只有客户端需要配置用来连接服务端*/private void initClientServerAssignProperty() {ReadableDataSource<String, ClusterClientAssignConfig> clientAssignDs = new ApolloDataSource<>(namespace, ruleServerKey,defaultRuleValue, source -> {List<ClusterGroupEntity> groupList = JSON.parseObject(source, new TypeReference<List<ClusterGroupEntity>>() {});ClusterClientAssignConfig clusterClientAssignConfig = Optional.ofNullable(groupList).flatMap(this::extractClientAssignment).orElse(null);return clusterClientAssignConfig;});ClusterClientConfigManager.registerServerAssignProperty(clientAssignDs.getProperty());//        ClusterClientAssignConfig serverConfig = new ClusterClientAssignConfig();
//        serverConfig.setServerHost("127.0.0.1");
//        serverConfig.setServerPort(transPort);
//        ConfigSupplierRegistry.setNamespaceSupplier(() -> "trade-center");
//        ClusterClientConfigManager.applyNewAssignConfig(serverConfig);}private Optional<ClusterClientAssignConfig> extractClientAssignment(List<ClusterGroupEntity> groupList) {ClusterGroupEntity tokenServer = groupList.stream().filter(x -> x.getState().equals(ClusterStateManager.CLUSTER_SERVER)).findFirst().get();Integer currentMachineState = Optional.ofNullable(groupList).map(s -> groupList.stream().filter(this::machineEqual).findFirst().get().getState()).orElse(ClusterStateManager.CLUSTER_NOT_STARTED);if (currentMachineState.equals(ClusterStateManager.CLUSTER_CLIENT)) {String ip = tokenServer.getIp();Integer port = tokenServer.getPort();return Optional.of(new ClusterClientAssignConfig(ip, port));}return Optional.empty();}/*** 初始化客户端和服务端状态,注释的也是写死的配置方式*/private void initStateProperty() {ReadableDataSource<String, Integer> clusterModeDs = new ApolloDataSource<>(namespace, ruleServerKey,defaultRuleValue, source -> {List<ClusterGroupEntity> groupList = JSON.parseObject(source, new TypeReference<List<ClusterGroupEntity>>() {});Integer state = Optional.ofNullable(groupList).map(s -> groupList.stream().filter(this::machineEqual).findFirst().get().getState()).orElse(ClusterStateManager.CLUSTER_NOT_STARTED);return state;});ClusterStateManager.registerProperty(clusterModeDs.getProperty());//            ClusterStateManager.applyState(ClusterStateManager.CLUSTER_SERVER);}private Optional<ServerTransportConfig> extractServerTransportConfig(List<ClusterGroupEntity> groupList) {return groupList.stream().filter(x -> x.getMachineId().equalsIgnoreCase(getCurrentMachineId()) && x.getState().equals(ClusterStateManager.CLUSTER_SERVER)).findAny().map(e -> new ServerTransportConfig().setPort(e.getPort()).setIdleSeconds(600));}private boolean machineEqual(/*@Valid*/ ClusterGroupEntity group) {return getCurrentMachineId().equals(group.getMachineId());}private String getCurrentMachineId() {// 通过-Dcsp.sentinel.api.port=8719 配置, 默认8719,随后递增return HostNameUtil.getIp() + SEPARATOR + TransportConfig.getPort();}private static final String SEPARATOR = "@";
}

基础类,定义配置的基础信息。

@Data
public class ClusterGroupEntity {private String machineId;private String ip;private Integer port;private Integer state;
}

然后是Apollo中的限流规则的配置和server/client集群关系的配置。

需要说明一下的就是flowId,这个是区分限流规则的全局唯一ID,必须要有,否则集群限流会有问题。

thresholdType代表限流模式,默认是0,代表单机均摊,比如这里count限流QPS=20,有3台机器,那么集群限流阈值就是60,如果是1代表全局阈值,也就是count配置的值就是集群限流的上限。

demo_sentinel=[{"resource": "test_res", //限流资源名"count": 20, //集群限流QPS"clusterMode": true, //true为集群限流模式"clusterConfig": {"flowId": 111, //这个必须得有,否则会有问题"thresholdType": 1 //限流模式,默认为0单机均摊,1是全局阈值}}
]
demo_cluster=[{"ip": "192.168.3.20","machineId": "192.168.3.20@8720","port": 9999, //server和client通信接口"state": 1 //指定为server},{"ip": "192.168.3.20","machineId": "192.168.3.20@8721","state": 0},{"ip": "192.168.3.20","machineId": "192.168.3.20@8722","state": 0}
]

OK,到这里代码和配置都已经OK,还需要跑起来Sentinel控制台,这个不用教,还有启动参数。

本地可以直接跑多个客户端,注意修改端口号:-Dserver.port=9100 -Dcsp.sentinel.api.port=8720这两个一块改,至于怎么连Apollo这块我就省略了,自己整吧,公司应该都有,不行的话用代码里的写死的方式也可以用。

-Dserver.port=9100 -Dcsp.sentinel.api.port=8720 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dcsp.sentinel.log.use.pid=true

因为有流量之后控制台才能看到限流的情况,所以用官方给的限流测试代码修改一下,放到Springboot启动类中,触发限流规则的初始化。

@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);new FlowQpsDemo();}
}

测试限流代码:

public class FlowQpsDemo {private static final String KEY = "test_res";private static AtomicInteger pass = new AtomicInteger();private static AtomicInteger block = new AtomicInteger();private static AtomicInteger total = new AtomicInteger();private static volatile boolean stop = false;private static final int threadCount = 32;private static int seconds = 60 + 40;public FlowQpsDemo() {tick();simulateTraffic();}private static void simulateTraffic() {for (int i = 0; i < threadCount; i++) {Thread t = new Thread(new RunTask());t.setName("simulate-traffic-Task");t.start();}}private static void tick() {Thread timer = new Thread(new TimerTask());timer.setName("sentinel-timer-task");timer.start();}static class TimerTask implements Runnable {@Overridepublic void run() {long start = System.currentTimeMillis();System.out.println("begin to statistic!!!");long oldTotal = 0;long oldPass = 0;long oldBlock = 0;while (!stop) {try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {}long globalTotal = total.get();long oneSecondTotal = globalTotal - oldTotal;oldTotal = globalTotal;long globalPass = pass.get();long oneSecondPass = globalPass - oldPass;oldPass = globalPass;long globalBlock = block.get();long oneSecondBlock = globalBlock - oldBlock;oldBlock = globalBlock;System.out.println(seconds + " send qps is: " + oneSecondTotal);System.out.println(TimeUtil.currentTimeMillis() + ", total:" + oneSecondTotal+ ", pass:" + oneSecondPass+ ", block:" + oneSecondBlock);if (seconds-- <= 0) {
//                    stop = true;}}long cost = System.currentTimeMillis() - start;System.out.println("time cost: " + cost + " ms");System.out.println("total:" + total.get() + ", pass:" + pass.get()+ ", block:" + block.get());System.exit(0);}}static class RunTask implements Runnable {@Overridepublic void run() {while (!stop) {Entry entry = null;try {entry = SphU.entry(KEY);// token acquired, means passpass.addAndGet(1);} catch (BlockException e1) {block.incrementAndGet();} catch (Exception e2) {// biz exception} finally {total.incrementAndGet();if (entry != null) {entry.exit();}}Random random2 = new Random();try {TimeUnit.MILLISECONDS.sleep(random2.nextInt(50));} catch (InterruptedException e) {// ignore}}}}
}

启动之后查看控制台,可以看到嵌入式的集群服务端已经启动好。

查看限流的情况:

最后为了测试效果,再启动一个客户端,修改端口号为9200和8721,可以看到新的客户端已经连接到了服务端,不过这里显示的总QPS 30000和我们配置的不符,这个不用管他。

好了,这个就是集群限流原理和使用配置方式,当然了,你可以启动多台服务,然后手动修改Apollo中的state参数修改服务端,验证修改配置的方式是否能实现故障转移机制,另外就是关闭client或者server验证是否回退到单机限流的情况,这里就不一一测试了,因为我已经测试过了呀。

对于独立式的部署方式基本也是一样的,只是单独启动一个服务端的服务,需要手动配置server,而嵌入式的则不需要,loadServerNamespaceSet配置为自己的服务名称即可。

ClusterTokenServer tokenServer = new SentinelDefaultTokenServer();ClusterServerConfigManager.loadGlobalTransportConfig(new ServerTransportConfig()
.setIdleSeconds(600)
.setPort(11111));
ClusterServerConfigManager.loadServerNamespaceSet(Collections.singleton(DemoConstants.APP_NAME));tokenServer.start();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/13128.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT专业应用:生成生日主题

正文共 925 字&#xff0c;阅读大约需要 4 分钟 人力资源等必备技巧&#xff0c;您将在4分钟后获得以下超能力&#xff1a; 生成生日主题 Beezy评级 &#xff1a;A级 *经过寻找和一段时间的学习&#xff0c;一部分人能掌握。主要提升效率并增强自身技能。 推荐人 | Kim 编辑者…

UI设计如何结合AIGC工具?轻松设计出彩的UI界面

大家好。我是不知名设计师 l1m0_&#xff0c;今天分享内容为&#xff1a;UI设计如何结合AIGC工具发挥“奇”效。文中我会针对UI设计的流程和几款人工智能AI工具的功能&#xff0c;来向大家进行介绍AIGC如何在这个过程中发挥作用。对UI设计和AI工具感兴趣的朋友一定不能错过&…

chatgpt赋能python:Python声音处理入门指南

Python声音处理入门指南 如果你是一个音乐爱好者或者处理声音的工程师&#xff0c;Python语言是值得你考虑的一种工具&#xff0c;它拥有丰富的库&#xff0c;可以帮助你在声音分析、编辑、压缩和转换等方面做出成果。 Python声音处理库 Python语言拥有一个大量的声音处理库…

【回答问题】ChatGPT上线了!给我推荐比较流行的音频处理算法模型

给我推荐比较流行的音频处理算法模型 音频处理算法模型有很多种,我给你列举一些比较流行的: 声音分类:用于将声音信号分成不同的类别,比如人声、自然声、机器声等。 声音分离:用于从混合的声音信号中分离出单独的声音源。 语音识别:用于将语音转换成文本。 语音合成…

AIGC领域优秀的资源汇总(应用、论文、开源项目)

AIGC领域介绍&#xff0c;及一些比较优秀的应用&#xff0c;和论文&#xff0c;开源项目汇总。 AIGC大纲 一、AIGC概念 ​ AIGC&#xff0c;全名“AI generated content”&#xff0c;又称生成式AI&#xff0c;意为人工智能生成内容。例如AI文本续写&#xff0c;文字转图像的…

白嫖GPT-4最强竞品!20秒速通92页论文,不怕跟不上技术进展了

梦晨 发自 凹非寺量子位 | 公众号 QbitAI GPT-4最强竞品Claude前两天来了个史诗升级&#xff0c;支持十万token上下文&#xff0c;可以一次输入一本书&#xff0c;把大模型卷到新高度。 可惜的是&#xff0c;从Anthropic官网申请试用要收费&#xff0c;不少感兴趣的读者表示想玩…

将springboot单体项目部署到腾讯云服务器上

前言 在服务器上运行springboot项目&#xff0c;需要有jdk环境&#xff0c;而此文的项目案例使用的数据库是mysql&#xff0c;所以也需要安装mysql&#xff0c;教程如下&#xff1a; CentOS7安装jdk8CentOS7快速安装mysql 1.打包springboot单体项目 1.springboot单体小项目…

【干货贴】当人工智能与艺术碰撞 | AI写诗

生成式人工智能产品&#xff08;AIGC&#xff09; ​前几天&#xff0c;扎克伯格称&#xff1a;Meta 将组建顶级 AI 团队&#xff0c;专注生成式人工智能产品&#xff0c;在短期内&#xff0c;公司将专注于构建创造性和表现力的工具。 说到富有创造力和表现力的艺术行为&#…

ChatGPT被广泛应用,潜在的法律风险有哪些?

ChatGPT由OpenAI开发&#xff0c;2022年11月一经面世便引发热烈讨论&#xff0c;用户数持续暴涨。2023年初&#xff0c;微软成功将ChatGPT接入其搜索引擎Bing中&#xff0c;市场影响力迅速提升&#xff0c;几乎同一时间&#xff0c;谷歌宣布其研发的一款类似人工智能应用Bard上…

张峥、小白谈GPT与人工智能:可能是好事,也可能不是

张峥、小白&#xff08;章静绘&#xff09; 最近几个月&#xff0c;以ChatGPT为代表的聊天机器人引起全世界的广泛关注。GPT是如何工作的&#xff1f;它会有自我意识吗&#xff1f;人工智能将对我们的社会、文化、知识系统造成何种冲击和重构&#xff1f;奇点到了吗&#xff1f…

我们现在怎样做父亲

离开了中学的课本后再没读过鲁迅的文章&#xff0c;今年想再读鲁迅。《我们现在怎样做父亲》这个题目本是鲁迅《坟》杂文集中的一篇&#xff0c;怎样做父亲是个人生大命题&#xff0c;毕竟一生中在这件事上不太能靠积累经验来熟练。所以&#xff0c;在做父亲这件事上不是一个技…

获英伟达和Accel9000万美金投资,AI视频Synthesia要对标Runway?

AI的狂欢已不再仅仅属于ChatGPT&#xff0c;下一个风口将剑指AI视频生成。 制作出高质量的专业视频内容耗时且昂贵&#xff0c;但人工智能的技术进步促使企业掌握了更多筹码和选择。一家总部位于英国伦敦的AI视频创作平台Sunthesia正在AI视频生成的路上摸索。Synthesia历经七年…

巴比特 | 元宇宙每日必读:OpenAI CEO称短期内不会训练GPT5,公司正通过外部审计等措施评估潜在危险...

摘要&#xff1a;据财联社报道&#xff0c;OpenAI首席执行官Sam Altman周三&#xff08;6月7日&#xff09;在印度《经济时报》主办的一次会议上称&#xff0c;目前OpenAI仍然没有培训GPT-5。Altmam还反驳了一些对人工智能最直言不讳的担忧声&#xff0c;称该公司已经在通过外部…

未来已来,大模型无处不在。音视频技术人,你准备好了吗?

“音视频领域正面临着一场人机交互体验的革命&#xff0c;是算力、连接、显示整个端到端革命的升级&#xff0c;市场也在呼唤着颠覆式的终端&#xff0c;现象级的内容以及全新的产业生态。” 技术是从什么时候开始改变我们的生活的&#xff1f; 打开电视&#xff0c;电影《瞬息…

阿里CTO线退出历史舞台/ AI视频公司Runway估值破百亿/ OpenAI确认不用API数据训练…今日更多新鲜事在此...

日报君 发自 凹非寺量子位 | 公众号 QbitAI 大家好&#xff0c;今天是5月6日&#xff0c;又一个“星期五”。 科技圈更多新鲜事儿&#xff0c;下滑走起&#xff5e; 阿里CTO线退出历史舞台 据雪豹财经社独家消息&#xff0c;充当各业务技术中台的阿里CTO线近日完成了组织架构的…

快影内测多款AIGC新功能,短视频智能创作时代即将到来?

AIGC作为AI细分之下的重要赛道&#xff0c;迅速在短视频、绘画、音乐创作等领域出圈&#xff0c;吸引了如阿里、字节、百度、美团等多个互联网大厂&#xff0c;并纷纷布局和计划推出AI类的产品。 特别是百度旗下生成式AI产品“文心一言”&#xff0c;已成为不少文字创作者的辅助…

一天搞定50条视频!AI替你打工的流程有人已经跑出来了

梦晨 金磊 发自 凹非寺量子位&#xff5c; 公众号 QbitAI 最近的AI狂欢属于ChatGPT&#xff0c;接下来该轮到AI生成视频了。 想做UP主但又不知道怎么剪视频的人&#xff0c;这下真的可以放开手脚&#xff0c;专心管内容创作&#xff0c;剩下的工作完全丢给AI来生成了。 最重磅的…

免费体验Stable Diffusion deforum文转视频插件,还有deforum API 接口部署介绍!

如何使用 Serverless Devs 和函数计算快速体验部署 Stable Diffusion&#xff0c;这个是小白也能简单体验安装部署的教程.有电脑就能操作,依托阿里云原生服务.不用考虑硬件问题 本篇主要讲解怎么安装跟部署自定义安装插件跟模型.以deforum文转视频插件举例.deforum api 接口 自…

华人团队颠覆CV!SEEM完美分割一切爆火,一键分割「瞬息全宇宙」

作者 | 新智元 编辑 | 自动驾驶与AI 点击下方卡片&#xff0c;关注“自动驾驶与AI”公众号 ADAS巨卷干货&#xff0c;即可获取 点击进入→自动驾驶之心【语义分割】技术交流群 后台回复【领域综述】获取自动驾驶全栈近80篇综述论文&#xff01; Meta的「分割一切」的横空出世&…

SEEM:微软基于 CV 大模型新作,分割“瞬息全宇宙”

文 | 智商掉了一地 交互式视觉分割新作&#xff0c;具有语义感知的新模型~ 自从 Meta 发布了“分割一切”的 SAM 之后&#xff0c;各种二创如雨后春笋般冒出&#xff0c;昨天微软的一篇论文又在推特上引起讨论&#xff0c;虽然最开始吸引小编的是它的名字——分割“瞬息全宇宙”…