如何使用 Sentinel 保护您的微服务

如何使用 Sentinel 保护您的微服务

云和安全管理服务专家新钛云服刘川川原创
在复杂的分布式系统中,通常有诸多依赖。如果一个应用不能对来自依赖的故障进行隔离的话,那应用本身就有可能被拖垮。通常在高流量的网站中,某个后端一旦发生延迟,就有可能在短时间内导致所有的应用资源耗尽。
如:秒杀、618、双十一等场景,在某一时刻会有爆发式的网络流量进来,如果没有很好的网络流量限制,就会对整个服务产生影响,甚至导致整个应用崩溃,进而影响用户体验。
接下来的内容我们就探讨一下,如何应对上述问题。
随着微服务的流行,服务和服务之间的稳定性、安全性变得也越来越重要。Sentinel是阿里巴巴开源的一款面向分布式服务架构的流量控制组件,主要以流量为切入点,从流量控制、熔断降级、系统自适应保护等多个维度来帮助您保障微服务的稳定性。
Sentinel具有以下特性:
丰富的应用场景:
Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受的范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等。
完备的实时监控:
Sentinel同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。
广泛的开源生态:
Sentinel提供开箱即用的与其他开源框架/库的整合模块,例如与SpringCloud、Dubbo、gRPC整合只需要引入相应的依赖并进行简单的配置即可快速地接入Sentinel。
完善的SPI扩展点:
Sentinel提供简单易用、完善的SPI扩展接口。您可以通过实现扩展接口来快速地定制逻辑。例如定制规则管理、适配动态数据源等。
除了流量控制以外,降低调用链路中的不稳定资源也是Sentinel的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,最终会导致请求发生堆积。这个问题和Hystrix里面描述的问题是一样的。
Sentinel和Hystrix的原则是一致的:当调用链路中某个资源出现不稳定,例如,表现为timeout,异常比例升高的时候,则对这个资源的调用进行限制,并让请求快速失败,避免影响到其它资源,以至于最后产生雪崩的效应。
在限制的手段上,Sentinel和Hystrix采取了完全不一样的方法。
Hystrix通过线程池的方式,来对依赖(在我们的概念中对应资源)进行了隔离。这样做的好处是资源和资源之间做到了最彻底的隔离。缺点是除了增加了线程切换的成本,还需要预先给各个资源做线程池大小的分配。
Sentinel对这个问题采取了两种手段:
1、通过并发线程数进行限制
和资源池隔离的方法不同,Sentinel通过限制资源并发线程的数量,来减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池的大小。当某个资源出现不稳定的情况下,例如响应时间变长,对资源的直接影响就是会造成线程数的逐步堆积。当线程数在特定资源上堆积到一定的数量之后,对该资源的新请求就会被拒绝。堆积的线程完成任务后才开始继续接收请求。
2、通过响应时间对资源进行降级
除了对并发线程数进行控制以外,Sentinel还可以通过响应时间来快速降级不稳定的资源。当依赖的资源出现响应时间过长后,所有对该资源的访问都会被直接拒绝,直到过了指定的时间窗口之后才重新恢复。
Sentinel同时提供系统维度的自适应保护能力(https://sentinelguard.io/zh-cn/docs/system-adaptive-protection.html)。防止雪崩,是系统防护中重要的一环。当系统负载较高的时候,如果还持续让请求进入,可能会导致系统崩溃,无法响应。
在集群环境下,网络负载均衡会把本应这台机器承载的流量转发到其它的机器上去。如果这个时候其它的机器也处在一个边缘状态的时候,这个增加的流量就会导致这台机器也崩溃,最后导致整个集群不可用。
针对这个情况,Sentinel提供了对应的保护机制,让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之内处理最多的请求。
Sentinel的主要工作机制如下:
对主流框架提供适配或者显示的API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析。
根据预设的规则,结合对资源的实时统计信息,对流量进行控制。同时,Sentinel提供开放的接口,方便您定义及改变规则。
Sentinel提供实时的监控系统,方便您快速了解目前系统的状态。
在接下来的章节中,我们将演示如何对Sentinel进行配置,以达到对我们的微服务进行保护。
Sentinel分为两个部分:SentinelDashboard和Sentinel客户端。
SentinelDashboard:SentinelDashboard是Sentinel配套的可视化控制台与监控仪表盘套件,它支持节点发现,以及健康情况管理、监控(单机和集群)、规则管理和推送的功能。SentinelDashboard是基于SpringBoot开发的WEB应用,目前最新版本为1.8.4。
Sentinel客户端:Sentinel客户端需要集成在SpringBoot微服务应用中,用于接收来自Dashboard配置的各种规则,并通过SpringMVCInterceptor拦截器技术实现应用限流、熔断保护。
1.访问:https://github.com/alibaba/Sentinel/releases,下载最新版SentinelDashboard。
wget-chttps://github.com/alibaba/Sentinel/releases/download/1.8.4/sentinel-dashboard-1.8.4.jar
2.利用下面的命令启动Dashboard。
java-jar-Dserver.port=18080sentinel-dashboard-1.8.4.jar
这个命令的含义是启动SentinelDashboard应用,SentinelDashboard会监听18080端口实现与微服务的通信。同时我们可以访问下面的网址查看SentinelDashboard的UI界面,浏览器打开http://127.0.0.1:18080,默认的用户名、密码为sentinel/sentinel,便可进入Dashboard。
第一步,利用SpringInitializr向导(https://start.spring.io/或https://start.aliyun.com/)或IDE,创建micro-service工程,pom.xml增加以下三项依赖。
com.alibaba.cloudspring-cloud-starter-alibaba-nacos-discoverycom.alibaba.cloudspring-cloud-starter-alibaba-sentinelorg.springframework.bootspring-boot-starter-actuator
第二步,配置Nacos与Sentinel客户端。
第三步,验证配置。访问下面网址,在SentinelDashboard左侧看到micro-service服务出现,则代表Sentinel客户端与Dashboard已经完成通信。
在确认micro-service与Dashboard通信成功后,使用curl命令试着访问一下:
接下来我们看看Dashboard,这时已经有了一些监控数据了:
下面我们通过Dashboard配置micro-service应用的限流规则,来体验下Sentinel的用法。
第一步,在micro-service服务中,增加NacosConfigTestController类,用于演示Sentinel限流规则。
`packagecn.lavenliu.springboot.cruddemo.controller;importorg.springframework.beans.factory.annotation.Value;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;@RestController@RequestMapping(“/api”)publicclassNacosConfigTestController{@Value(“${url.name}”)privateStringname;@Value(“${url.address}”)privateStringaddress;@GetMapping(“/nacosConfig”)publicStringnacosConfig(){return”name:”+name+”;address:”+address;}}
启动micro-service,访问http://localhost:8080/api/nacosConfig,无论访问多少次,都可以看到正常的信息。
➜springdemogit:(master)✗foriin{1..50};docurl-w”n”http://localhost:8080/api/nacosConfig;sleep0.1;donename:tyun;address:www.tyun.cn……name:tyun;address:www.tyun.cnname:tyun;address:www.tyun.cn
第二步,访问SentinelDashboard配置限流规则。
在左侧找到”簇点链路”,右侧定位到/api/nacosConfig,点击后面的“流控”按钮。
在弹出界面,按下图进行配置,其含义为/api/nacosConfig接口每秒钟只允许1QPS访问,超出的请求直接服务降级返回异常。最后点击“新增”完成规则设置。
此时针对/api/nacosConfig接口的流控规则已生效,可以在“流控规则”的界面上看到。
第三步,验证流控效果。使用curl重新访问http://localhost:8080/api/nacosConfig,如下:
➜springdemogit:(master)✗foriin{1..50};docurl-w”n”http://localhost:8080/api/nacosConfig;sleep0.6;donename:tyun;address:www.tyun.cnBlockedbySentinel(flowlimiting)name:tyun;address:www.tyun.cn……name:tyun;address:www.tyun.cn
第一次访问时会出现“name:tyun;address:www.tyun.cn”文本代表处理成功。同一秒内再次访问便会出现“BlockedbySentinel(flowlimiting)”,代表服务已被限流降级。行文至此,我们已经利用Sentinel对微服务接口实施了初步的限流降级控制。
在SentinelDashboard中“簇点链路”,找到需要限流的URI,点击“+流控”进入流控设置。sentinel-dashboard基于懒加载模式,如果在簇点链路没有找到对应的URI,需要先访问下这个功能的功能后对应的URI便会出现。
流控规则项目说明主要有以下几点。
资源名:要流控的URI,在Sentinel中URI被称为“资源”;
针对来源:默认default代表所有来源,可以针对某个微服务或者调用者单独设置;
阈值类型:是按每秒访问数量(QPS)还是并发数(线程数)进行流控;
单机阈值:具体限流的数值是多少。
下图为默认流控规则:
点击对话框中的“高级选项”,就会出现更为详细的设置项。
其中流控模式是指采用什么方式进行流量控制。Sentinel支持三种模式:直接、关联、链路,下面我们分别看看这三种模式。
以下图为例,当/api/nacosConfig接口QPS超过1个时限流,浏览器会出现“BlockedbySentinel”。
如下图所示,当同/api/nacosConfig接口关联的/api/employees接口QPS超过1时,再次访问/api/nacosConfig接口便会响应“BlockedbySentinel”。
链路模式相对复杂,我们以一个例子进行说明:假设有一个买菜服务,买菜者下单之后,代码会依次执行订单创建->减少库存->第三方支付->消息通知方法。这些方法像链表一样从前向后依次执行,这种执行的链表被称为调用链路,而链路模式限流就是为此而设计。以下图为例,在某个微服务中/status接口,会被/order接口调用;在另一个业务,/status接口也会被/user接口调用。
但如果按下图配置,将入口资源设为“/order”,则只会针对/order接口的调用链路生效。当访问/order接口的QPS超过1时,/status接口就会被限流。而另一条链路从/user接口到/status接口的链路则不会受到任何影响。链路模式与关联模式最大的区别是/order接口与/status接口必须是在同一个调用链路中才会限流,而关联模式是任意两个资源只要设置关联就可以进行限流。
介绍完了直接、关联、链路三种流控模式,下面我们一起看一看高级选项中的“流控效果”。流控效果是指在达到流控条件后,对当前请求如何进行处理。流控效果有三种:快速失败、WarmUP(预热)、排队等待。
当流量达到限流阈值后,直接返回响应并抛出BlockException,快速失败是最常用的处理形式。如下图所示,当/api/nacosConfig接口每秒QPS超过1时,可以直接抛出“BlockedBySentinel(flowlimiting)”异常。
WarmUp用于应对瞬时大并发流量冲击。当遇到突发大流量WarmUp会缓慢拉升阈值限制,预防系统瞬时崩溃,这期间超出阈值的访问处于队列等待状态,并不会立即抛出BlockException。
如下图所示,/api/nacosConfig接口平时单机阈值QPS处于低水位:默认为1000/3(冷加载因子)≈333,当瞬时大流量进来,10秒钟内将QPS阈值逐渐拉升至1000,为系统留出缓冲时间,预防突发性系统崩溃。
排队等待是采用匀速放行的方式对请求进行处理。如下所示:
介绍了上述三种流控效果,接下来我们一起看看Sentinel的熔断降级策略。
SentinelDashboard可以设置三种不同的熔断模式:慢调用比例、异常比例、异常数,下面我们分别介绍:
以上就是三种熔断模式的介绍,熔断相对流控配置比较简单,只需要设置熔断检查开启条件与触发熔断条件即可。
接下来我们重启一下微服务,看看有什么效果?如下图所示:
前面我们创建的流控规则及熔断规则哪里去了?为什么已重启微服务就不见了?接下来我们就一起看看这个问题。
上面的规则配置,都是存在内存中的。即如果应用重启,这个规则就会丢失。我们可以通过实现DataSource接口的方式,来自定义规则的存储数据源。通常我们的建议有:
当微服务重启以后所有的配置规则都会丢失,其中的根源是默认微服务将Sentinel的规则保存在JVM内存中,当应用重启后JVM内存销毁,规则就会丢失。
接下来我们通过一个实例介绍Sentinel与Nacos的整合,把Sentinel的规则持久化到Nacos中。
首先,我们快速构建演示工程micro-service。
利用SpringInitializr向导创建micro-service工程,pom.xml增加以下三项依赖。
server:port:8080spring:application:name:micro-servicedatasource:url:jdbc:mysql://localhost:3306/employee_directory?useSSL=false&serverTimezone=UTCusername:employeepassword:employEE!@#123cloud:sentinel:transport:dashboard:127.0.0.1:18080eager:truenacos:discovery:server-addr:localhost:8848username:nacospassword:nacosurl:name:tyunaddress:www.tyun.cnmanagement:endpoints:web:exposure:include:’*’
启动micro-service,访问http://localhost:8080/flowControl,如果出现如下所示,说明micro-service服务启动成功。
packagecn.lavenliu.springboot.cruddemo.controller;importorg.springframework.web.bind.annotation.GetMapping;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importcn.lavenliu.springboot.cruddemo.service.SentinelDemoService;@RestController@RequestMapping(“/api”)publicclassSentinelDemoController{privateSentinelDemoServicesentinelDemoService;@GetMapping(“/flowControl”)publicStringtestFlowRule(){returnnewString(“创建成功”);}}
完整的代码放在了Github上面:https://github.com/TyunTech/spring-cloud-alibaba-sentinel-nacos-demo.git
工程创建完成,下面我们将Sentinel接入Nacos配置中心。
在pom.xml新增sentinel-datasource-nacos依赖。
com.alibaba.cspsentinel-datasource-nacos
sentinel-datasource-nacos是Sentinel为Nacos扩展的数据源模块,允许将规则数据存储在Nacos配置中心,在微服务启动时利用该模块Sentinel会自动在Nacos下载对应的规则数据。
在Nacos的micro-service-dev.yml配置中增加Nacos下载规则,在原有的Sentinel配置下新增datasource选项。如下:
server:port:8080spring:application:name:micro-servicedatasource:url:jdbc:mysql://localhost:3306/employee_directory?useSSL=false&serverTimezone=UTCusername:employeepassword:employEE!@#123cloud:sentinel:transport:dashboard:127.0.0.1:18080eager:truedatasource:flow:nacos:server-addr:${spring.cloud.nacos.server-addr}dataId:${spring.application.name}-flow-rulesgroupId:DEFAULT_GROUPrule-type:flowusername:nacospassword:nacosnacos:server-addr:localhost:8848username:nacospassword:nacosurl:name:tyunaddress:www.tyun.cnmanagement:endpoints:web:exposure:include:’*’
通过这一份配置,微服务在启动时就会自动从Nacos配置中心DEFAULT_GROUP分组下载data-id为micro-service-flow-rules的配置信息,并将其作为流控规则。
在Nacos配置中心页面,新增data-id为micro-service-flow-rules的配置项。
这里data-id与groups与微服务应用的配置保持对应,最核心的配置内容采用JSON格式进行书写,我们来看下这段流控规则:
[{“resource”:”/api/flowControl”,”limitApp”:”default”,”grade”:1,”count”:2,”strategy”:0,”controlBehavior”:0,”clusterMode”:false}]
关于上述Key的含义如下:
其实上面的JSON配置,会生成如下Dashboard中的配置:
最后,我们启动应用来验证流控效果。使用curl访问http://localhost:8080/api/flowControl:
[root@node01alibaba]#foriin{1..50};docurl-w”n”http://localhost:8080/api/flowControl;sleep0.1;done创建成功创建成功BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)创建成功创建成功BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)创建成功创建成功BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)创建成功创建成功BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)创建成功创建成功BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)创建成功创建成功BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)创建成功创建成功BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)[root@node01alibaba]#
我们每0.1秒就发起一次请求,可以看到Sentinel已经限流了,会出现“BlockedbySentinel(flowlimiting)”的错误信息,说明流控规则已生效。
接下来我们再来验证能否自动推送新规则,将Nacos配置中心中流控规则count选项改为1。
[{“resource”:”/api/flowControl”,”limitApp”:”default”,”grade”:1,”count”:1,”strategy”:0,”controlBehavior”:0,”clusterMode”:false}]
这时可以看到应用也有相应的日志信息:
2022-04-2812:53:40.379INFO18327—[-localhost_8848]c.a.n.client.config.impl.ClientWorker:[fixed-localhost_8848][polling-resp]configchanged.dataId=micro-service-flow-rules,group=DEFAULT_GROUP2022-04-2812:53:40.379INFO18327—[-localhost_8848]c.a.n.client.config.impl.ClientWorker:getchangedGroupKeys:[micro-service-flow-rules+DEFAULT_GROUP]2022-04-2812:53:40.405INFO18327—[-localhost_8848]c.a.n.client.config.impl.ClientWorker:[fixed-localhost_8848][data-received]dataId=micro-service-flow-rules,group=DEFAULT_GROUP,tenant=null,md5=2e4c95b045fbc027c1d3b71199f263b9,content=[{“resource”:”/api/flowControl”,”limitApp”:”default”,”grade”:1,…,type=json2022-04-2812:53:40.405INFO18327—[-localhost_8848]c.a.nacos.client.config.impl.CacheData:[fixed-localhost_8848][notify-listener]timecost=0msinClientWorker,dataId=micro-service-flow-rules,group=DEFAULT_GROUP,md5=2e4c95b045fbc027c1d3b71199f263b9,listener=com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource$1@4c21f7122022-04-2812:53:40.406INFO18327—[update-thread-1]c.a.nacos.client.config.impl.CacheData:[fixed-localhost_8848][notify-ok]dataId=micro-service-flow-rules,group=DEFAULT_GROUP,md5=2e4c95b045fbc027c1d3b71199f263b9,listener=com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource$1@4c21f712
当新规则发布后,micro-service控制台会立即收到下面的日志,说明新的流控规则即时生效。再次进行访问进行验证:
[root@node01alibaba]#foriin{1..50};docurl-w”n”http://localhost:8080/api/flowControl;sleep0.1;done创建成功BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)创建成功BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)创建成功BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)创建成功BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)创建成功BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)创建成功BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)创建成功BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)BlockedbySentinel(flowlimiting)
至此,我们已经完成了Sentinel的规则并持久化到Nacos中。关于更多Sentinel的用法可以参考官方文档。
目前已经有很多公司选择了SpringCloudAlibaba开源组件进行开发,我们这里顺便介绍下SpringCloudAlibaba的组成及其与SpringCloud的对比。让大家对此有更多的选择。
我们先来简单了解下什么是SpringCloudAlibaba?SpringCloudAlibaba是由一些阿里巴巴的开源组件和云产品组成的。
SpringCloudAlibaba致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过SpringCloud编程模型轻松使用这些组件来开发分布式应用服务。
依托SpringCloudAlibaba,我们只需要添加一些注解和少量配置,就可以将SpringCloud应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
在下面的表格中,我们总结了使用SpringCloud来构建微服务架构时可以使用哪些组件,为大家做技术选型提供一个参考:
参考文档:

主题测试文章,只做测试使用。发布者:最新稳定辅助网,转转请注明出处:https://www.744broad.com/50371.html

(0)
上一篇 2023年5月18日 上午12:58
下一篇 2023年5月18日 上午12:59

相关推荐

  • 漫威,你醒啦?

    漫威,你醒啦? 漫威电影宇宙前三阶段取得了其所未有的成功。尤其在经历了《复仇者联盟:无限战争》和《复仇者联盟:终局之战》后,更是登上了一个巅峰。随着第四阶段的到来,漫威雄心勃勃推出了一堆作品。不仅每年保证了四部电影的上映,更大动作放到了剧集制作方面。每年有四到五部剧集推出,放在自家的迪士尼+流媒体平台上播出。此前漫威花了11年时间来精心布局前三阶段的共23部…

  • 隔离人员生活有无保障?情绪是否稳定?——探访南昌湾里区罗亭镇金峡谷的集中医学观察点

    隔离人员生活有无保障?情绪是否稳定?——探访南昌湾里区罗亭镇金峡谷的集中医学观察点 为了彻底阻断新冠肺炎的传播途径,近日,南昌将多家酒店改造成集中医学观察点,对来自重点地区的人员采取集中隔离观察14天的措施,全力阻止疫情蔓延。安全有保障避免交叉感染隔离人员单人单间南昌市湾里区罗亭镇金峡谷的集中医学观察点由一家酒店临时改建而成,整栋楼一共三层,共有40多间客房…

  • 19名维和战士,都是为啥牺牲的?

    19名维和战士,都是为啥牺牲的? 撰文|周宇编辑|马宁7月20日下午三点,接运两名在南苏丹执行维和任务的烈士灵柩的专机飞抵郑州。众多官兵和烈士家属在此迎候,这是继运送在马里遇袭牺牲烈士之后,再次以中央军委名义举行的迎接仪式。中央军委联合参谋部副参谋长乙晓光出席迎接仪式并讲话。这也是他40天来第二次迎接烈士灵柩回国。从1992年至今,至少已有19名中国军人和警…

  • 唱不尽乡村好风景,好日子天天都放在歌里过!——“壮美广西 锦绣乡村”广西乡村振兴 主题文化活动启动

    唱不尽乡村好风景,好日子天天都放在歌里过!——“壮美广西 锦绣乡村”广西乡村振兴 主题文化活动启动 民族要复兴,乡村必振兴!所有的只争朝夕,都是为了这里的日新月异!让我们到田间地头里去吧,看看收获的季节,那耀眼的一抹金黄!让我们到乡间小道里走走,遇见熟悉的山歌,那振奋的一声嘹亮!让我们到村口广场里瞧瞧,舞动铿锵的节奏,那热烈的一片赤诚!让我们到丰收圩市里逛逛…

  • 《艾尔登法环》让角川赚翻了,《使命召唤》与足联合作推出新英雄

    《艾尔登法环》让角川赚翻了,《使命召唤》与足联合作推出新英雄 漂游无数,寻一部落,集游戏资讯,请你驻步畅谈——游贻酋长!每日游戏资讯:2022年11月6日全球游戏资讯,每日更新游戏最新资讯,关注游贻酋长了解更多消息,今日游戏行业又有什么动向呢?速读本文:正文:索尼财报会议:PS5的价格上涨并未影响玩家对这款主机的需求,其会在年底前增加PS5的产量以改善库存的…

  • 两会现场速递|讲述春天里的中国故事——全国政协十三届五次会议首场“委员通道”扫描

    两会现场速递|讲述春天里的中国故事——全国政协十三届五次会议首场“委员通道”扫描 新华社北京3月4日电题:讲述春天里的中国故事——全国政协十三届五次会议首场“委员通道”扫描新华社记者姜琳、董瑞丰首都北京,春日渐长。4日,全国政协十三届五次会议首场“委员通道”如约而至。尽管是通过网络视频回答提问,但7位全国政协委员回应百姓关切,讲述生动故事,畅谈履职心声,传递…

  • 升级硬件好选择,TUF3-GTX1660S为老电脑加速

    升级硬件好选择,TUF3-GTX1660S为老电脑加速 电脑老旧性能吃紧怎么办?暑假已经来领,是不是应该给自己家的电脑升级一下啦?如果你不是土豪的话,华硕TUF3-GTX1660S就是性价比极高的选择。性能强悍,畅玩3A大作TUF3-GTX1660S是英伟达显卡中属于甜品级显卡范畴,但是相比同代的1660要更加强悍。在大家关心得性能方面,我们测试了《使命召唤…

  • “野泳”危险!长沙水警公布八大危险水域

    “野泳”危险!长沙水警公布八大危险水域 随着盛夏到来、暑假将至不少市民喜欢游泳避暑降温其中,在野外戏水或游泳是不少人的选择但是,每年暑期(7月—9月)是我市游泳溺水事故的高发时期在此长沙警方发布夏季游泳安全预警提醒各位市民朋友夏季游泳请到有安全保障的水上场所在安全场地游泳时也必须备齐救生设备小孩游泳必须有大人陪同现场:市民靠近航道游泳,民警现场劝导//长沙水…

  • 巨蟹传说

    巨蟹传说 传说在很久很久以前,赫拉克勒斯大战蛇妖许德拉的时候,从海中升出一只巨蟹为帮助蛇妖咬了赫拉克勒斯的脚踝,后来这只巨蟹被赫拉克勒斯打死,落在了爱琴海的一座小岛上。巨蟹没有完成女神赫拉的任务,因而被诅咒,这诅咒便波及到了雅典王后的身上。在雅典公主美洛出生的时候,就有一位预言家预言,公主结婚的时候就是王后死亡的时候。为着这个预言,王后一直没有叫公主嫁人。直…

  • 俄专家:俄高超武投入实战是人类史上首次

    俄专家:俄高超武投入实战是人类史上首次 来源:央视军事【俄专家:#俄高超武投入实战是人类史上首次#】据俄罗斯国防部发布的最新战况,#俄军用高超音速导弹攻击乌弹药库#。俄方专家评论称,这是人类历史上首次在实战中使用高超音速武器。(总台记者王斌)此前报道俄媒:俄国防部称,俄军使用“匕首”高超音速导弹发射系统摧毁一处乌军事目标【环球网报道】据塔斯社19日报道,俄罗…

关注微信