SpringCloud学习-实用篇04

news2025/1/8 18:27:31

以下内容的代码可见:SpringCloud_learn/day04


1.初始MQ


同步通讯和异步通讯

微服务间通讯有同步和异步两种方式,同步通讯就像打电话需要实时响应,异步通讯就像发邮件不需要马上回复。两种方式各有优劣,比如打电话能立即得到响应,但不能跟多人同时通话,而发送邮件可同时与多个人收发,但往往响应会有延迟

  • 同步调用:

    • Feign调用属于同步方式,虽然调用可以实时得到结果,但存在下面问题:

    在这里插入图片描述

    • 优点和缺点:

      • 时效性较强,可以立即得到结果

      • 耦合度高

      • 性能和吞吐能力下降

      • 有额外的资源消耗

      • 有级联失败问题

  • 异步调用:

    • 常见实现即事件驱动模式。以购买商品为例,用户支付后需要调用订单服务完成订单状态修改,并且调用物流服务从仓库分配响应的库存并准备发货
      • 在事件模式中,支付服务是事件发布者(publisher),在支付完成后只需要发布一个支付成功的事件(event),且该事件带上订单id
      • 订单服务和物流服务是事件订阅者(Consumer),订阅支付成功的事件,监听到事件后完成自己业务即可
      • 为解除事件发布者与订阅者之间的耦合,两者并不是直接通信,而是有中间人(Broker)
        • 发布者发布事件到Broker,不关心谁来订阅事件,而订阅者从Broker订阅事件,不关心谁发来的消息
        • 它就像数据总线,所有的服务要接收数据和发送数据都发到这个总线上,该总线就像协议一样让服务间的通讯变得标准和可控

    在这里插入图片描述

    • 优缺点:
      • 吞吐量提升:无需等待订阅者处理完成,响应更快速(支付服务发布后无需等待其他服务,可以去发布其他事件)
      • 故障隔离:服务没有直接调用,不存在级联失败问题(其他服务挂了也不会影响支付服务继续工作)
      • 调用间没有阻塞,不会造成无效的资源占用
      • 耦合度极低,每个服务都可以灵活插拔,可替换(其他服务可以通过取消/增加订阅来决定是否继续处理事件)
      • 流量削峰:不管发布事件的流量波动多大都由Broker接收,订阅者可以按照自己的速度去处理事件
      • 架构复杂,业务没有明显的流程线,不好管理
      • 需要依赖于Broker的可靠、安全、性能

    在这里插入图片描述

tips:

  • 大多数情况下对并发没有很大要求,但对时效性要求高,所以使用同步;如果不需要立即知道结果,同时对并发、吞吐量要求较高,且需要解除服务间的耦合关系,则使用异步

什么是MQ

  • MQ:消息队列(MessageQueue),即存放消息的队列,也就是事件驱动架构中的Broker

  • 比较常见的MQ实现:

RabbitMQActiveMQRocketMQKafka
公司/社区RabbitApache阿里Apache
开发语言ErlangJavaJavaScala&Java
协议支持AMQP,XMPP,SMTP,STOMPOpenWire,STOMP,REST,XMPP,AMQP自定义协议自定义协议
可用性一般
单机吞吐量一般非常高
消息延迟微秒级毫秒级毫秒级毫秒以内
消息可靠性一般一般
  • 使用场景:

    • 追求可用性:KafkaRocketMQRabbitMQ
  • 追求可靠性:RabbitMQRocketMQ

    • 追求吞吐能力:RocketMQKafka
  • 追求消息低延迟:RabbitMQKafka


2.RabbitMQ快速入门


RabbitMQ概述

RabbitMQ是基于Erlang语言开发的开源消息通信中间件,安装步骤如下(以Ccentos7安装RabbitMQ为例):

  • 在线拉取:
docker pull rabbitmq:3-management
  • 安装:
docker run \
 -e RABBITMQ_DEFAULT_USER=xxx \
 -e RABBITMQ_DEFAULT_PASS=xxx \
 --name mq \
 --hostname mq1 \
 -p 15672:15672 \
 -p 5672:5672 \
 -d \
 rabbitmq:3-management

RabbitMQ的结构和概念如图所示,其中角色有以下5个:

  • publisher:生产者
  • consumer:消费者
  • exchange:交换机,负责消息路由
  • queue:队列,存储消息
  • virtualHost:虚拟主机,隔离不同租户的exchangequeue等资源,即逻辑分组

在这里插入图片描述

tips:

  • 消息一旦消费就会从队列删除,因为RabbitMQ没有消息回溯功能

RabbitMQ消息模型

RabbitMQ官方提供了五个不同的示例,对应了不同的消息模型:

  • 基本消息队列(Basic Queue):

在这里插入图片描述

  • 工作消息队列(WorkQueue):

在这里插入图片描述

  • 发布订阅(Publish、Subscribe),又根据交换机类型分为以下三种:

    • Fanout Exchange:广播

    在这里插入图片描述

    • Direct Exchange:路由

    在这里插入图片描述

    • Topic Exchange:主题

    在这里插入图片描述


入门案例

基本消息队列的消息发送流程:具体代码见PublisherTest

  • 建立connection
  • 创建channel
  • 利用channel声明队列
  • 利用channel向队列发送消息

基本消息队列的消息接收流程:具体代码见ConsumerTest

  • 建立connection
  • 创建channel
  • 利用channel声明队列
  • 定义consumer的消费行为handleDelivery()
  • 利用channel将消费者与队列绑定

3.SpringAMQP

  • SpringAMQP是基于RabbitMQ封装的一套模板,并且还利用SpringBoot对其实现了自动装配,使用起来非常方便
  • SpringAMQP提供了三个功能:
    • 自动声明队列、交换机及其绑定关系
    • 基于注解的监听器模式,异步接收消息
    • 封装了RabbitTemplate工具,用于发送消息

tips:

  • Advanced Message Queuing Protocol是用于在应用程序之间传递业务消息的开放标准,该协议与语言和平台无关,更符合微服务中独立性的要求
  • SpringAMQP是基于AMQP协议定义的一套API规范,提供了模板来发送和接收消息,其中spring-amqp是基础抽象,spring-rabbit是底层的默认实现

Basic Queue-简单队列模型

  • 在父工程mq-demo中引入依赖:
<!--AMQP依赖,包含RabbitMQ-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
  • 消息发送:
# 添加MQ的连接信息
logging:
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
spring:
  rabbitmq:
    host: xxxx  # rabbitMQ的ip地址
    port: 5672  # 端口
    username: xxxx
    password: xxxx
    virtual-host: /
// 实现消息发送
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringAmqpTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;
    
    @Test
    public void testSendMessage2SimpleQueue() {
        String queueName = "simple.queue";
        String message = "hello, spring amqp!";
        rabbitTemplate.convertAndSend(queueName, message);
    }
}
  • 消息接收:完成下面配置后运行consumer服务即可
# 添加MQ的连接信息
logging:
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
spring:
  rabbitmq:
    host: xxxx  # rabbitMQ的ip地址
    port: 5672  # 端口
    username: xxxx
    password: xxxx
    virtual-host: /
// consumer服务中新建一个类,编写消费逻辑
@Component
public class SpringRabbitListener {
     @RabbitListener(queues = "simple.queue")  // 声明监听的队列
     public void listenSimpleQueue(String msg) {
         System.out.println("消费者接收到simple.queue的消息:【" + msg + "】");
     }
}

Work Queue-工作队列

Work Queues也被称为任务模型(Task Queues),就是让多个消费者绑定到一个队列,共同消费队列中的消息。它可提高消息处理速度,避免队列消息堆积

  • 消息发送:循环发送,模拟大量消息堆积现象
// 一共发送50条消息
@Test
public void testSendMessage2WorkQueue() throws InterruptedException {
    String queueName = "simple.queue";
    String message = "hello, message__";
    for (int i = 1; i <= 50; i++) {
        rabbitTemplate.convertAndSend(queueName, message + i);
        Thread.sleep(20);
    }
}
  • 消息接收:模拟多个消费者绑定同一个队列
# 如果不加下面配置,消费者1很快完成了自己的25条消息,而消费者2却在缓慢的处理自己的25条消息,即消息是平均分配给每个消费者,没有考虑到消费者的处理能力,这是不合理的
spring:
  rabbitmq:
    listener:
      simple:
        prefetch: 1  # 每次只能获取一条消息,处理完成才能获取下一个消息(消费慢的就不会和消费快的预取一样的消息数)
// 最终结果是消费者1处理了40条,消费者2处理了10条
@RabbitListener(queues = "simple.queue")
public void listenWorkQueue1(String msg) throws InterruptedException {
    System.out.println("消费者1接收到消息:【" + msg + "】" + LocalTime.now());
    Thread.sleep(20);
}

@RabbitListener(queues = "simple.queue")
public void listenWorkQueue2(String msg) throws InterruptedException {
    System.err.println("消费者2........接收到消息:【" + msg + "】" + LocalTime.now());
    Thread.sleep(200);
}

Publish/Subscribe-发布/订阅

发布订阅模式与之前的区别是允许将同一消息发送给多个消费者,实现方式是加入了交换机(exchange)。常见exchange类型包括:

  • Publisher:要发送消息的程序,但不再发送到队列中,而是发给交换机
  • Exchange:一方面接收生产者发送的消息,另一方面知道如何处理消息,例如递交给某个特别队列、递交给所有队列或是将消息丢弃。到底如何操作取决于Exchange的类型
    • Fanout:广播,将消息交给所有绑定到交换机的队列
    • Direct:定向,把消息交给符合指定routing key的队列
    • Topic:通配符,把消息交给符合routing pattern(路由模式)的队列
  • Consumer:订阅队列,与以前一样
  • Queue:接收消息、缓存消息,与以前一样

tips:

  • Exchange只负责转发消息,不具备存储消息的能力,因此如果没有任何队列与Exchange绑定,或者没有符合路由规则的队列,则消息会丢失

Fanout

在广播模式下,消息发送注意事项如下:

  • 可有多个队列
  • 每个队列都要绑定到Exchange
  • 生产者发送的消息,只能发送到交换机,交换机来决定要发给哪个队列,生产者无法决定
  • 交换机把消息发送给绑定过的所有队列,订阅队列的消费者都能拿到消息

具体实现过程如下:

  • 声明队列和交换机:
@Configuration
public class FanoutConfig {
    // 声明FanoutExchange交换机
    @Bean
    public FanoutExchange fanoutExchange(){
        return new FanoutExchange("itcast.fanout");
    }

    // 声明第一个队列fanout.queue1
    @Bean
    public Queue fanoutQueue1(){
        return new Queue("fanout.queue1");
    }

    // 绑定队列1到交换机
    @Bean
    public Binding fanoutBinding1(Queue fanoutQueue1, FanoutExchange fanoutExchange){
        return BindingBuilder
                .bind(fanoutQueue1)
                .to(fanoutExchange);
    }

    // 声明第二个队列fanout.queue2
    @Bean
    public Queue fanoutQueue2(){
        return new Queue("fanout.queue2");
    }

    // 绑定队列2到交换机
    @Bean
    public Binding fanoutBinding2(Queue fanoutQueue2, FanoutExchange fanoutExchange){
        return BindingBuilder
                .bind(fanoutQueue2)
                .to(fanoutExchange);
    }
}
  • 消息发送:
@Test
public void testSendFanoutExchange() {
    // 交换机名称
    String exchangeName = "itcast.fanout";
    // 消息
    String message = "hello, every one!";
    // 发送消息
    rabbitTemplate.convertAndSend(exchangeName, "", message);
}
  • 消息接收:
@RabbitListener(queues = "fanout.queue1")
public void listenFanoutQueue1(String msg) {
    System.out.println("消费者接收到fanout.queue1的消息:【" + msg + "】");
}
@RabbitListener(queues = "fanout.queue2")
public void listenFanoutQueue2(String msg) {
    System.out.println("消费者接收到fanout.queue2的消息:【" + msg + "】");
}

Direct

Direct Exchange会将接收到的消息根据规则路由到指定的Queue(因此称为路由模式):

  • 每一个QueueExchange不能是任意绑定,需要设置一个BindingKey
  • 消息的发送方向Exchange发送消息时必须指定消息的RoutingKey
  • ``Exchange不再把消息交给每一个绑定的队列,而是将消息路由到BindingKey与消息RoutingKey`一致的队列

具体实现过程如下:

  • 基于注解声明队列和交换机:基于@Bean的方式在FanoutConfig中声明比较麻烦,可以采用注解在SpringRabbitListener中声明
@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "direct.queue1"),
    exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
    key = {"red", "blue"}
))
public void listenDirectQueue1(String msg){
    System.out.println("消费者接收到direct.queue1的消息:【" + msg + "】");
}

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "direct.queue2"),
    exchange = @Exchange(name = "itcast.direct", type = ExchangeTypes.DIRECT),
    key = {"red", "yellow"}
))
public void listenDirectQueue2(String msg){
    System.out.println("消费者接收到direct.queue2的消息:【" + msg + "】");
}
  • 消息发送:
@Test
public void testSendDirectExchange() {
    // 交换机名称
    String exchangeName = "itcast.direct";
    // 消息
    String message = "hello, red!";
    // 发送消息
    // 此时两个消费者都会接收到各自队列direct.queue1和direct.queue2的消息
    rabbitTemplate.convertAndSend(exchangeName, "red", message);  
}

tips:

  • 如果多个队列具有相同的RoutingKey,则与Fanout功能类似

Topic

Topic ExchangeDirect Exchange相比可根据RoutingKey把消息路由到不同的队列,只不过Topic Exchange可让队列在绑定Routing key 的时候使用通配符:

  • Routingkey 一般由一或多个单词组成,多个单词之间以.分割

  • 通配符规则:

    #:匹配一个或多个词,比如item.#能匹配item.spu.insertitem.spu

    *:恰好匹配一个词,比如item.*只能匹配item.spu

具体实现过程如下:

  • 基于注解声明队列和交换机:
@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "topic.queue1"),
    exchange = @Exchange(name = "itcast.topic", type = ExchangeTypes.TOPIC),
    // 凡是以china.开头的routing key都会被匹配到
    key = "china.#"
))
public void listenTopicQueue1(String msg){
    System.out.println("消费者接收到topic.queue1的消息:【" + msg + "】");
}

@RabbitListener(bindings = @QueueBinding(
    value = @Queue(name = "topic.queue2"),
    exchange = @Exchange(name = "itcast.topic", type = ExchangeTypes.TOPIC),
    // 凡是以.news结尾的routing key都会被匹配
    key = "#.news"
))
public void listenTopicQueue2(String msg){
    System.out.println("消费者接收到topic.queue2的消息:【" + msg + "】");
}
  • 消息发送:
@Test
public void testSendTopicExchange() {
    // 交换机名称
    String exchangeName = "itcast.topic";
    // 消息
    String message = "今天天气不错,我的心情好极了!";
    // 发送消息
    rabbitTemplate.convertAndSend(exchangeName, "china.weather", message);
}

消息转换器

Spring会把发送的消息序列化为字节发送给MQ,接收消息的时候还会把字节反序列化为Java对象。但默认情况下采用的序列化方式是JDK序列化,该方式存在以下问题:

  • 数据体积过大
  • 有安全漏洞
  • 可读性差

因此可以使用JSON方式来做序列化和反序列化,具体步骤如下:

  • publisherconsumer两个服务中都引入依赖:在父工程中引入即可
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
</dependency>
  • publisherconsumer两个服务的启动类中声明MessageConverter
@Bean
public MessageConverter messageConverter(){
    return new Jackson2JsonMessageConverter();
}
  • 消息发送:
@Test
public void testSendMap() throws InterruptedException {
    Map<String,Object> msg = new HashMap<>();
    msg.put("name", "Jack");
    msg.put("age", 21);
    rabbitTemplate.convertAndSend("simple.queue","", msg);
}
  • 消息接收:
@RabbitListener(queues = "object.queue")
public void listenObjectQueue(Map<String,Object> msg){
    System.out.println("接收到object.queue的消息:" + msg);
}

tips:

  • 注意发送方与接收方必须使用相同的MessageConverter

参考

黑马程序员SpringCloud框架P61-P76

RabbitMQ官方文档

SpringAmqp官方地址


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM8使用pwm接口调试GDS06灰尘传感器

背景 刚好有项目使用GDS06这款传感器&#xff0c;这里简单做个记录。 GDS06接口如下&#xff0c;这里支持串口和PWM的输出到MCU&#xff0c;由于项目采用STM8S003F3P6&#xff0c;资源极其有限。 所以硬件设计的时候&#xff0c;就考虑采用PWM的接口方式&#xff0c;这样只是…

安科瑞有源电力滤波器的设计原理及应用前景

安科瑞 徐浩竣 江苏安科瑞电器制造有限公司 zx acrelxhj 摘要&#xff1a;该文介绍了有源电力滤波器的工作原理和基本控制方法&#xff0c;并阐述有源电力滤波器的现状及发展前景等等。 关键词&#xff1a;有源电力滤波器&#xff1b;谐波&#xff1b;工作原理&#xff1b;…

方案绞尽脑汁想不出?试试这款AI代写方案

一份计划方案&#xff0c;往往是工作进行下去的核心环节&#xff0c;需要考虑很多因素和变量&#xff0c;在某些情况下&#xff0c;可能没有足够的信息来制定有效的方案。这可能会导致需要额外的研究和调查&#xff0c;以便了解更多关于问题的信息&#xff0c;这将延长制定方案…

侧边拖拉功能

一、页面 <div class"resize-handle" mousedown"startResizing">⋮</div> 二、js data() {return {showSideBar: true,leftPaneWidth: 63, // 左侧区域的初始宽度isResizing: false, // 标记是否正在调整大小startX: 0, // 调整大小开始时的…

Spring AOP 中的切点是什么?如何定义切点?

Spring AOP 中的切点是什么&#xff1f;如何定义切点&#xff1f; 什么是切点&#xff1f; 在 Spring AOP 中&#xff0c;切点&#xff08;Pointcut&#xff09;是指一组连接点&#xff08;Join Point&#xff09;的集合。连接点是程序执行过程中的某个特定点&#xff0c;例如…

初识SpringMVC -- SpringMVC入门保姆级教程(一)

文章目录 前言一、初识SpringMVC1.认识SpringMVC2.SpringMVC入门案例3.SpringMVC开发的一般步骤4.入门案例涉及的知识点5.入门案例工作流程 总结 前言 为了巩固所学的知识&#xff0c;作者尝试着开始发布一些学习笔记类的博客&#xff0c;方便日后回顾。当然&#xff0c;如果能…

阿里云服务器端口怎么打开?详细教程一步步

阿里云服务器端口怎么打开&#xff1f;云服务器ECS端口在安全组中开启&#xff0c;轻量应用服务器端口在防火墙中打开&#xff0c;新手站长以开通80端口为例来详细说下阿里云服务器端口开放图文教程&#xff0c;其他的端口如8080、3306、443、1433也是同样的方法进行开启端口&a…

双轮云台小车实现追踪彩色目标功能

1. 功能说明 在R216a样机上安装一个摄像头&#xff0c;本文示例将实现双轮小车通过二自由度云台自主寻找彩色目标的功能。 2. 结构说明 R216a样机主要是由一个 双轮小车 和一个 2自由度云台 组合而成。 3. 电子硬件 在这个示例中&#xff0c;我们采用了以下硬件&#xff0c;请大…

CRM系统软件不好用有哪些原因?如何选择?

CRM系统的实施也会出现无法落地使用的情况&#xff0c;让CRM系统软件名存实亡。这不仅仅只是个例&#xff0c;很多企业即使投入了很大成本&#xff0c;也不能让CRM系统真正用起来。CRM系统软件用不起来&#xff0c;可以排查这三个原因&#xff0c;教你解决&#xff01; 1.操作…

简单粗暴实现el-input只允许输入数字

<el-input input"phoneNumberphoneNumber.replace(/[^0-9.]/g,)" v-model"phoneNumber" maxlength"11" > </el-input> 如果加入type"number"&#xff0c;会在输入框右侧出现这个恶心的东西 尽管可以使用样式来屏蔽掉 …

基于ArcGIS Pro、Python、USLE、R、INVEST模型等多技术融合的生态系统服务构建生态安全格局

目录 基于ArcGIS Pro、Python、USLE、INVEST模型等多技术融合的生态系统服务构建生态安全格局 第一章 生态安全评价理论及方法介绍 第二章 平台基础 第三章 数据获取与清洗 第四章 基于USLE模型的土壤侵蚀评价 第五章 基于风蚀修正模型的防风固沙功能评估 第六章 水源涵…

联想集团财报:收入持续下滑,联想集团财务前景已恶化

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 联想集团2023财年第三季度财务业绩回顾 联想集团&#xff08;00992&#xff09;于2023年2月16日盘后公布了该公司2023财年第三季度的财报。 财报显示&#xff0c;联想集团的收入已经从2022财年第三季度的201.27亿美元下降到…

西门子PLC如何实现1主多从网口无线通讯

常规来说&#xff0c;多台plc要实现以太网无线连接&#xff0c;首先要先确定以太网线必须正确连接&#xff0c;并建立物理连接。然后需要在PLC端设置好IP地址&#xff0c;以使不同PLC以相同协议可以实现通信交流。最后是建立PLC端数据采集及交换系统&#xff0c;要求在PLC端设置…

一篇必读的物联网平台物模型开发指南,为你解锁未来科技趋势

《高并发系统实战派》-- 值得拥有 文章目录 一、什么是物模型&#xff1f;二、为什么要设计物模型&#xff1f;三、如何设计物模型&#xff1f;设备属性的设计设备服务的设计设备事件的设计 四、物模型案例五、不设计物模型会有什么影响&#xff1f;六、总结 设计物模型可以使物…

热烈欢迎CSDN副总裁邹欣老师入驻知识星球

重磅消息 CSDN 副总裁 邹欣 老师成功入驻知识星球 —— 英雄算法联盟&#xff0c;成为合伙人之一。 这将是未来几年内&#xff0c;IT界最震撼的一次合作&#xff01;我相信就算现在不是&#xff0c;将来必定是&#xff01; 当然&#xff0c;这对我来说也是一种极大的鼓舞&#…

C语言实现“队列“

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f349;本篇简介:>:分享数据结构之C语言实现"队列".各个接口分别分析…

回归预测 | MATLAB实现SSA-DELM和DELM麻雀算法优化深度极限学习机多输入单输出回归预测对比

回归预测 | MATLAB实现SSA-DELM和DELM麻雀算法优化深度极限学习机多输入单输出回归预测对比 目录 回归预测 | MATLAB实现SSA-DELM和DELM麻雀算法优化深度极限学习机多输入单输出回归预测对比效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 Matlab实现SSA-DELM和D…

突破极限:YOLO9000 论文解读 - 构建更好、更快、更强大的实时检测系统

YOLOv2 论文全篇完整翻译 摘要 我们介绍了YOLO9000&#xff0c;这是一种先进的、实时的目标检测系统&#xff0c;可以检测超过9000个物体类别。首先&#xff0c;我们对YOLO检测方法进行了各种改进&#xff0c;包括新颖的方法和借鉴自先前工作的方法。改进后的模型YOLOv2在标准…

港科夜闻|叶玉如校长在大湾区科学论坛主论坛发表「为应对人口老龄化贡献大湾区力量」主旨演讲...

关注并星标 每周阅读港科夜闻 建立新视野 开启新思维 1、叶玉如校长在大湾区科学论坛主论坛发表「为应对人口老龄化贡献大湾区力量」主旨演讲。她指出&#xff0c;中国已成为世界上老年人口最多、老龄化速度最快的国家之一&#xff0c;预计到2025年&#xff0c;65岁及以上人口3…

亚马逊云科技:点燃云原生数据库创新的星星之火

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 近10年&#xff0c;全球数据库市场加速变革&#xff0c;云数据库尤其是云原生数据库成为整个数据库市场的关键变量。某种程度上&#xff0c;亚马逊云科技作为全球云原生数据库的领导者&#xff0c;具有行业风向标的价值。 近…