专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

一文搞懂基于zipkin的分布式追踪系统原理与实现

  传统单机系统在使用过程中,如果某个请求响应过慢或是响应出错,开发人员可以清楚知道某个请求出了问题,查看日志可以定位到具体方法。但是在分布式系统中,倘若客户端一个请求到达服务器后,由多个服务协作完成。比如:服务A调用服务B,服务B又调用服务C和服务D,服务D又调用服务E,那么想要知道是哪个服务处理时间过长或是处理异常导致这个请求响应缓慢或中断的话,就需要开发人员一个服务接一个服务的去机器上查看日志,先定位到出问题的服务,再定位出问题的具体地方。试想一下,随着系统越来越壮大,服务越来越多,一个请求对应处理的服务调用链越来越长,这种排查方式何其艰难。为了解决这种问题,便诞生了各种分布式场景中追踪问题的解决方案,zipkin就是其中之一。整体结构长啥样
  一个独立的分布式追踪系统,客户端存在于应用中(即各服务中),应具备追踪信息生成、采集发送等功能,而服务端应该包含以下基本的三个功能:信息收集:用来收集各服务端采集的信息,并对这些信息进行梳理存储、建立索引。数据存储:存储追踪数据。查询服务:提供查询请求链路信息的接口。
  zipkin整体结构图如下:
  zipkin(服务端)包含四个组件,分别是collector、storage、search、webUI。collector就是信息收集器,作为一个守护进程,它会时刻等待客户端传递过来的追踪数据,对这些数据进行验证、存储以及创建查询需要的索引。storage是存储组件。zipkin默认直接将数据存在内存中,此外支持使用Cassandra、ElasticSearch和Mysql。search是一个查询进程,它提供了简单的JSONAPI来供外部调用查询。webUI是zipkin的服务端展示平台,主要调用search提供的接口,用图表将链路信息清晰地展示给开发人员。
  zipkin的客户端主要负责根据应用的调用情况生成追踪信息,并且将这些追踪信息发送至zipkin由收集器接收。各语言支持均不同,具体可以查看zipkin官网,java语言的支持就是brave。上面结构图中,有追踪器就是指集成了brave。基本概念了解下
  在使用zipkin之前,先了解一下Trace和Span这两个基本概念。一个请求到达应用后所调用的所有服务所有服务组成的调用链就像一个树结构(如下图),我们追踪这个调用链路得到的这个树结构可以称之为Trace。
  在一次Trace中,每个服务的每一次调用,就是一个基本工作单元,就像上图中的每一个树节点,称之为span。每一个span都有一个id作为唯一标识,同样每一次Trace都会生成一个traceId在span中作为追踪标识,另外再通过一个parentId标明本次调用的发起者(就是发起者的spanid)。当span有了上面三个标识后,就可以很清晰的将多个span进行梳理串联,最终归纳出一条完整的跟踪链路。此外,span还会有其他数据,比如:名称、节点上下文、时间戳以及KV结构的tag信息等等(Zipkinv1核心注解如cs和sr已被Span。Kind取代,详情查看zipkinapi
  ,本文会在入门的demo介绍完后对具体的Span数据模型进行说明)。具体怎么追踪的
  追踪器位于应用程序上,负责生成相关ID、记录span需要的信息,最后通过传输层传递给服务端的收集器。我们首先思考下面几个问题:每个span需要的基本信息何时生成?哪些信息需要随着服务调用传递给服务提供方?什么时候发送span至zipkin服务端?以何种方式发送span?
  一个span表示一次服务调用,那么追踪器必定是被服务调用发起的动作触发,生成基本信息,同时为了追踪服务提供方对其他服务的调用情况,便需要传递本次追踪链路的traceId和本次调用的spanid。服务提供方完成服务将结果响应给调用方时,需要根据调用发起时记录的时间戳与当前时间戳计算本次服务的持续时间进行记录,至此这次调用的追踪span完成,就可以发送给zipkin服务端了。但是需要注意的是,发送span给zipkincollector不得影响此次业务结果,其发送成功与否跟业务无关,因此这里需要采用异步的方式发送,防止追踪系统发送延迟与发送失败导致用户系统的延迟与中断。下图就表示了一次http请求调用的追踪流程(基于zipkin官网提供的流程图):
  可以看出服务A请求服务B时先被追踪器拦截,记录tag信息、时间戳,同时将追踪标识添加进httpheader中传递给服务B,在服务B响应后,记录持续时间,最终采取异步的方式发送给zipkin收集器。span从被追踪的服务传送到Zipkin收集器有三种主要的传送方式:http、Kafka以及Scribe(Facebook开源的日志收集系统)。1分钟安装zipkin
  上文对基于zipkin实现分布式追踪系统的原理做了全面的说明,这里简单介绍一下zipkin的安装方法,下载jar包,直接运行。简单粗暴,但要注意必须jdk1。8及以上。其余两种安装方式见官方介绍。wgetOzipkin。jarhttps:search。maven。orgremotecontent?gio。zipkin。javaazipkinservervLATESTcexecjavajarzipkin。jar复制代码
  启动成功后,打开浏览器访问zipkin的webUI,输入http:ip:9411,显示页面如下图。具体使用后面介绍。
  写个Demo用起来(SpringBoot整合zipkin)
  java版客户端Brave的官方文档很少,都在github里。小编当时找的那叫个头疼啊,网上各路大神写的博客中的代码你扒下来换最新的依赖后都会显示那些类被标记为过时,不建议使用。brave源码地址:github。comopenzipkin官方demo地址:github。comopenzipkin友情提示:本节代码较多,注释还算详细,介绍文字偏少。小编写的demo结构如下图,分别创建了service1、service2、service3三个boot应用,将brave整合部分单独作为一个module,这样可以嵌入服务中复用,避免重复编码。maven依赖(zipkinclient)lt;?xmlversion1。0encodingUTF8?projectxmlnshttp:maven。apache。orgPOM4。0。0xmlns:xsihttp:www。w3。org2001XMLSchemainstancexsi:schemaLocationhttp:maven。apache。orgPOM4。0。0http:maven。apache。orgxsdmaven4。0。0。xsdmodelVersion4。0。0modelVersiongroupIdcom。ycggroupIdzipkinclientartifactIdversion1。0SNAPSHOTversionnamezipkinclientnamebuildpluginsplugingroupIdorg。apache。maven。pluginsgroupIdmavencompilerpluginartifactIdconfigurationsource6sourcetarget6targetconfigurationpluginpluginsbuildpackagingjarpackagingpropertiesjava。version1。8java。versionspringboot。version2。1。1。RELEASEspringboot。versionbrave。version5。6。0brave。versionpropertiesdependencyManagementdependenciesdependencygroupIdorg。springframework。bootgroupIdspringbootdependenciesartifactIdversion{springboot。version}versiontypepomtypescopeimportscopedependencydependencygroupIdio。zipkin。bravegroupIdbravebomartifactIdversion{brave。version}versiontypepomtypescopeimportscopedependencydependenciesdependencyManagementdependenciesdependencygroupIdorg。springframework。bootgroupIdspringbootstarterwebartifactIddependencydependencygroupIdorg。apache。httpcomponentsgroupIdhttpclientartifactIddependency!zipkin客户端依赖dependencygroupIdio。zipkin。bravegroupIdbraveartifactIddependencydependencygroupIdio。zipkin。reporter2groupIdzipkinsenderokhttp3artifactIddependency!添加记录MVC的类、方法名到span的依赖dependencygroupIdio。zipkin。bravegroupIdbraveinstrumentationspringwebmvcartifactIddependency!添加brave的httpclient依赖dependencygroupIdio。zipkin。bravegroupIdbraveinstrumentationhttpclientartifactIddependency!集成Brave上下文的logdependencygroupIdio。zipkin。bravegroupIdbravecontextslf4jartifactIddependencydependenciesproject复制代码配置类编写(zipkinclient)packagecom。ycg。zipkinclient;importbrave。CurrentSpanCustomizer;importbrave。SpanCustomizer;importbrave。Tracing;importbrave。context。slf4j。MDCScopeDecorator;importbrave。http。HttpTracing;importbrave。httpclient。TracingHttpClientBuilder;importbrave。propagation。B3Propagation;importbrave。propagation。ExtraFieldPropagation;importbrave。propagation。ThreadLocalCurrentTraceContext;importbrave。servlet。TracingFilter;importbrave。spring。webmvc。SpanCustomizingAsyncHandlerInterceptor;importorg。apache。http。impl。client。CloseableHttpClient;importorg。springframework。beans。factory。annotation。Autowired;importorg。springframework。beans。factory。annotation。Value;importorg。springframework。boot。web。client。RestTemplateCustomizer;importorg。springframework。context。annotation。Bean;importorg。springframework。context。annotation。Configuration;importorg。springframework。context。annotation。Import;importorg。springframework。http。client。HttpComponentsClientHttpRequestFactory;importorg。springframework。web。client。RestTemplate;importorg。springframework。web。servlet。config。annotation。InterceptorRegistry;importorg。springframework。web。servlet。config。annotation。WebMvcConfigurer;importzipkin2。Span;importzipkin2。reporter。AsyncReporter;importzipkin2。reporter。Sender;importzipkin2。reporter。okhttp3。OkHttpSender;importjavax。servlet。Filter;针对mvccontroller和restTemplate的zipkin客户端配置ConfigurationImport(SpanCustomizingAsyncHandlerInterceptor。class)publicclassZipkinClientConfigurationimplementsWebMvcConfigurer{配置如何向zipkin发送spanBeanSendersender(){注意这里更换为自己安装的zipkin所在的主机IPreturnOkHttpSender。create(http:10。150。27。36:9411apiv2spans);}配置如何把span缓冲到给zipkin的消息BeanAsyncReporterSpanspanReporter(){returnAsyncReporter。create(sender());}配置跟踪过程中的Trace信息BeanTracingtracing(Value({spring。application。name})StringserviceName){returnTracing。newBuilder()。localServiceName(serviceName)设置节点名称。propagationFactory(ExtraFieldPropagation。newFactory(B3Propagation。FACTORY,username))。currentTraceContext(ThreadLocalCurrentTraceContext。newBuilder()。addScopeDecorator(MDCScopeDecorator。create())putstraceIDsintologs。build())。spanReporter(spanReporter())。build();}注入可定制的SpanBeanSpanCustomizerspanCustomizer(Tracingtracing){returnCurrentSpanCustomizer。create(tracing);}决定如何命名和标记span。默认情况下,它们的名称与http方法相同BeanHttpTracinghttpTracing(Tracingtracing){returnHttpTracing。create(tracing);}导入过滤器,该过滤器中会为http请求创建spanBeanFiltertracingFilter(HttpTracinghttpTracing){returnTracingFilter。create(httpTracing);}导入zipkin定制的RestTemplateCustomizerBeanRestTemplateCustomizeruseTracedHttpClient(HttpTracinghttpTracing){finalCloseableHttpClienthttpClientTracingHttpClientBuilder。create(httpTracing)。build();returnnewRestTemplateCustomizer(){Overridepublicvoidcustomize(RestTemplaterestTemplate){restTemplate。setRequestFactory(newHttpComponentsClientHttpRequestFactory(httpClient));}};}AutowiredSpanCustomizingAsyncHandlerInterceptorwebMvcTracingCustomizer;使用应用程序定义的Web标记装饰服务器spanOverridepublicvoidaddInterceptors(InterceptorRegistryregistry){registry。addInterceptor(webMvcTracingCustomizer);}}复制代码boot服务模块maven依赖:bootweb起步依赖,另引入上面封装的zipkinclient模块依赖。dependencygroupIdcom。ycggroupIdzipkinclientartifactIdversion1。0SNAPSHOTversiondependency复制代码启动类导入zipkinclient模块的配置类ZipkinClientConfiguration。SpringBootApplicationImport(ZipkinClientConfiguration。class)publicclassService1Application{publicstaticvoidmain(String〔〕args){SpringApplication。run(Service1Application。class,args);}}复制代码编写Controller,service2和service3的代码类似。由于zipkin配置类那边向IOC容器注入zipkin定制的RestTemplateCustomizer,注意这里使用注入的RestTemplateBuilder创建restTemplate。EnableAutoConfigurationRestControllerpublicclassService1Controller{privateRestTemplaterestTemplate;AutowiredService1Controller(RestTemplateBuilderrestTemplateBuilder){this。restTemplaterestTemplateBuilder。build();}GetMapping(valueservice1)publicStringgetService(){try{Thread。sleep(100);}catch(InterruptedExceptione){e。printStackTrace();}returnservice1sleep100msrestTemplate。getForObject(http:localhost:8882service2,String。class);}}复制代码设置三个boot服务的内置tomcat端口号分别为8881、8882、8883。启动验证
  到这里,就完成了一个springboot整合zipkin简单的demo,分别启动三个boot应用后,在浏览器访问http:localhost:8881service1,浏览器显示如下图:
  打开zipkinwebUI,点击查询,便可以查到刚才请求的追踪链路,如下图。
  继续点击查到的链路信息,便可查看该条追踪链路的详细信息。这里采用缩进的形式展示了整条调用链路,并且再每个调用后表明了所花费时间。点击右上角json按钮,便能看到本次trace的json数据。
  span数据结构详解json结构概览与各字段含义
  一次追踪链路会包含很多个span,因此一个trace便是一个数组,其标准的json结构如下:〔{traceId:string,追踪链路IDname:string,span名称,一般为方法名称parentId:string,调用者IDid:string,spanIDkind:CLIENT,替代zipkinv1的注解中的四个核心状态,详细介绍见下文timestamp:0,时间戳,调用时间duration:0,持续时间调用的服务所消耗的时间debug:true,shared:true,localEndpoint:{本地网络节点上下文serviceName:string,ipv4:string,ipv6:string,port:0},remoteEndpoint:{远端网络节点上下文serviceName:string,ipv4:string,ipv6:string,port:0},annotations:〔value通常是缩写代码,对应的时间戳表示代码标记事件的时间{timestamp:0,value:string}〕,tags:{span的上下文信息,比如:http。method、http。pathadditionalProp1:string,additionalProp2:string,additionalProp3:string}}〕复制代码聊聊annotation和kind的前世姻缘
  zipkinV1之AnnotationV1时Annotation用于记录一个事件,事件由value标识,事件发生时间则记录对应的时间戳。一些核心注解核心注解用于定义一个请求的开始和结束。主要是如下四种注解:csClientSend,表示客户端发起请求。srServerReceive,表示服务端收到请求。使用sr的时间减去cs的时间便可得到网络传输的时间。ssServerSend,表示服务端完成处理,并将结果发送给客户端。使用ss的时间减去sr的时间便是服务端处理请求的时间。crClientReceived,表示客户端获取到服务端返回信息。使用cr的时间减去cs的时间便是整个请求所消耗的时间。
  zipkinV2之KindV2使用Span。Kind替代了V1的几个表示请求开始与结束的核心注解。kind一共有四种状态,其为不同状态时,timestamp、duration、remoteEndpoint代表的意义均不相同。CLIENT:timestamp是请求被发送的时刻,相当于v1中注解cs。duration代表发送请求后,接收到服务端响应前的持续时间,也就是整个请求所消耗的时间。remoteEndpoint表示被调用方的网络节点信息。SERVER:timestamp是服务端接到请求并准备开始处理它的时间,相当于v1中的sr。duration代表服务端接到请求后、发送响应前的持续时间,也就是服务端的净处理时间。remoteEndpoint表示调用方的网络节点信息。PRODUCER:timestamp是消息被发送的时刻。duration代表发送方发送后,消息队列结束到消息前的延迟时间,比如批处理的场景。remoteEndpoint表示消息队列的网络节点信息。CONSUMER:timestamp是消息被消息队列接收到的时刻。duration代表消息被消息队列接收到,被消费者消费前的持续时间,比如消息积压的场景。remoteEndpoint表示消费者节点信息,未知则表示servicename。
  V1针对消息队列也有ms、mr等注解,这里就不再详细介绍了。小编觉得kind这种替换后,整个追踪链路更为清晰直观,或许这也是zipkin的考虑之一吧。再看Demo中追踪链路的JSON数据
  相信看到这里的小伙伴回头再看demo中链路的json数据,应该可以明白具体的意思了。小编这里再梳理一下。追踪链路的JSON数据如下(建议直接跳过数据看下面分析):〔{traceId:3857b4a56c99e9f8,parentId:7dd11a047eb02622,id:e5427222edb62a7c,kind:SERVER,name:getservice3,timestamp:1547458424863333,duration:409599,localEndpoint:{serviceName:server3,ipv4:172。30。22。138},remoteEndpoint:{ipv4:127。0。0。1,port:52845},tags:{http。method:GET,http。path:service3,mvc。controller。class:Service3Controller,mvc。controller。method:getService},shared:true},{traceId:3857b4a56c99e9f8,parentId:7dd11a047eb02622,id:e5427222edb62a7c,kind:CLIENT,name:get,timestamp:1547458424756985,duration:520649,localEndpoint:{serviceName:server2,ipv4:172。30。22。138},tags:{http。method:GET,http。path:service3}},{traceId:3857b4a56c99e9f8,parentId:3857b4a56c99e9f8,id:7dd11a047eb02622,kind:SERVER,name:getservice2,timestamp:1547458424446556,duration:880044,localEndpoint:{serviceName:server2,ipv4:172。30。22。138},remoteEndpoint:{ipv4:127。0。0。1,port:52844},tags:{http。method:GET,http。path:service2,mvc。controller。class:Service2Controller,mvc。controller。method:getService},shared:true},{traceId:3857b4a56c99e9f8,parentId:3857b4a56c99e9f8,id:7dd11a047eb02622,kind:CLIENT,name:get,timestamp:1547458424271786,duration:1066836,localEndpoint:{serviceName:server1,ipv4:172。30。22。138},tags:{http。method:GET,http。path:service2}},{traceId:3857b4a56c99e9f8,id:3857b4a56c99e9f8,kind:SERVER,name:getservice1,timestamp:1547458424017344,duration:1358590,localEndpoint:{serviceName:server1,ipv4:172。30。22。138},remoteEndpoint:{ipv6:::1,port:52841},tags:{http。method:GET,http。path:service1,mvc。controller。class:Service1Controller,mvc。controller。method:getService}}〕复制代码
  我们从下往上看,这才是请求最开始的地方。首先看最下面的span(3857b4a56c99e9f8)。请求(http:localhost:8881)是由浏览器发出,那么当请求到达服务1时,作为服务端便会生成kind为SERVER的span,其中duration便是本次请求到后端后的净处理时间,localEndpoint是server1的节点信息,remoteEndpoint的调用方也就是浏览器的节点信息。
  接着服务1需要调用服务2的服务,这时服务1是作为客户端发出请求的。因此会记录出从下往上第二个span(7dd11a047eb02622),一个客户端span,也就是kindCLIENT。localEndpoint还是自己,同时tag里添加了发出的请求信息,duration表示发出service2的请求后,到接收到server2的响应所消耗的时间。再往上span(7dd11a047eb02622),就是server2接收到server1的请求后记录的SERVERspan。剩下的同理,小编就不多说了。结束语
  到这里就介绍完了基于zipkin实现分布式追踪系统的基本原理与实现,当然这只是一个入门,追踪信息是全量收集还是采样收集,设置什么样的采样频率,异步发送span使用http还是kafka,这些问题都是需要在生产环境中根据实际场景综合考量的。就本文而言,小编觉得只要你仔细阅读了,认真思考了,一定还是收获不少的

四次跻身县域经济百强县四川西昌有这样一份破圈秘籍封面新闻记者罗石芊县集而郡,郡集而天下,郡县治,天下无不治。作为国家经济发展的重要经济载体,县(区)宛如齿轮,在共同驱动下,推动社会经济加速前进。西昌城区一角翻开近几年的赛迪县域经新行情,二波开启?每轮行情,一定要认清相应的驱动力是什么。像2月的人工智能行情,是由chatGPT的消息驱动,逻辑在于大模型,所以核心是讯飞汉王云从海天这些。这次呢,人工智能开启了二波行情,跟指数带正面刚!无视禁赛!俄罗斯大奖赛公布名单瓦利耶娃排第一个北京时间3月1日,俄罗斯媒体公布,今年的俄罗斯大奖赛将会在3月3日到5日举行,地点是圣彼得堡。名单之中,出现了瓦利耶娃的名字,同时还有不老女神图克塔米舍娃。但名单中没有谢尔巴科娃和从省级层面首批成立科技伦理治理委员会,到国内首个区域科技伦理审查中心成立湖南科技伦理治理加速走向前台华声在线全媒体记者王铭俊通讯员谢婧繁日前,聊天机器人程序ChatGPT大火。红火之余,ChatGPT却因其帮学生完成家庭作业生成的内容成为讲稿与学术研究作品,甚至直接登上学术论文作名单公布!福建两地入选国家级!3月1日第二批国家级旅游休闲街区名单公布其中,福建两地入选一起来看截图来源文化和旅游部网站第二批国家级旅游休闲街区名单(福建省部分)福建省泉州市鲤城区泉州中山路旅游休闲街区泉州中山从Facebook到TikTok,浅谈社交媒体的发展趋势趁着当下人工智能话题的热度,沉寂了一段时间的KevinSystrom与MikeKrieger又杀回来了。这两位大佬各位应该是不陌生,他们是风靡一时的现象级APPInstagram的慢性湿疹不是皮肤和环境的问题,而是正邪相较量的结果!今天这篇文章,我要说一个事实!就是为中国人几千年繁衍生息立下汗马功劳的中医,如今却被很多中国人不信任,甚至厌弃排斥。这是一件令人痛心的事情,作为一名中医人,我无法否认。那为什么会出曹操一个敢于站在天下对立面的老人历史开讲闭上眼睛,脑子里总有一个孤独的身影坐在那张椅子上。一个老头,长得不好看,个还不高,干干瘦瘦的。腰杆却挺得笔直,双手拄着剑。花白的头发用冠简单的束着,身上的黑色长袍绝对算不上再见国足!海港或助攻李霄鹏再就业,最新下家曝光中国足协已经正式任命塞尔维亚人扬科维奇接替李肖鹏成为国足的新任主帅。而李霄鹏也终于结束了国足背锅主帅生涯,对于这位曾经的中超最佳主帅而言,他依然渴望在中超赛场找到新东家重启执教生涯全国文旅越来越卷?古城零陵申请出战!相信留心的网友都发现了全国各地文旅越来越卷了最近,为了宣传本地文化旅游资源全国各地文旅纷纷放出大招让人惊叹做好文旅工作没点绝活还真不好干!!!正片永州水云潇湘文旅公司董事长张晓亮也拿破仑战争对俄国有怎样的意义?文I少年录编辑I少年录拿破仑战争拿破仑入侵俄罗斯是欧洲历史上的一个重大转折点,这场失败导致了拿破仑及其法兰西帝国在十九世纪的灭亡。之后拿破仑波拿巴(NapoleonBonapart
特价冲击最高降3。6万!小鹏成首家降价头部造车新势力特斯拉降价之后,小鹏汽车成为首家开启降价的头部造车新势力。1月17日,小鹏汽车发布公告称,自2023年1月17日14时起,小鹏汽车将启动G3iP5P7的新年新价格体系,小鹏G3i售新疆库尔勒野生天鹅连续十八年赴约至孔雀河越冬天鹅优雅身姿吸引市民驻足拍摄。杨厚伟摄中新网新疆库尔勒1月23日电(史玉江杨厚伟)1月22日,近600只野生天鹅在新疆巴音郭楞蒙古自治州库尔勒市孔雀河上鸣叫,惬意嬉戏,与近千只其它段会宗,一代白发儒帅,大汉西域之神,五进五出定西疆那拉提恰西喀拉托海特克斯琼库什台昭苏夏特古道漫大将军三人贴着天山北麓一路西行,走到这里也开始怀疑人生难不成天上真有七仙女,否则怎能织出如此天地锦绣来?只是美景迤逦,山路也一样崎岖,首钢四连败疲态尽显,四连胜新疆越战越勇,福建仍有望冲进季后赛悄然间,联赛第二阶段赛程已经告一段落。二八轮比赛过去,积分榜也发生了很大的变化。不变的是,浙江辽宁和广东,依然稳坐积分榜前三的席位。此前排在第四的首钢,在经历一波四连败后,排名跌至场均10分4助!新疆争议后卫低调崛起,脱离父子篮球重新证明自己新疆男篮第二阶段结束排名联赛第六由于新疆男篮第一阶段战绩太糟糕,俱乐部决定更换主教练来帮助球队走出困境,最终,新疆男篮引进了CBA少帅邱彪。经过第二阶段的磨合之后,新疆男篮已经慢慢新年,新疆绿洲巴扎上的狂欢天南地北大拜年挂满了火红的剪纸红灯笼巴扎。新年伊始的第一个星期天,是新疆泽普县泽普镇的巴扎日,四乡八村的各族群众,比往常更早一些走出家门,在巴扎的路上汽车摩托车电动摩托车夹杂在人流2022年新疆国有企业营收超5989亿元19日,新疆举行2023年新疆国资国企工作会议。喇小飞摄中新网乌鲁木齐1月19日电(喇小飞)19日,新疆举行2023年新疆国资国企工作会议。会上,新疆国资委党委书记副主任胡开江做2冰雪之美尽在新疆丨新疆这些地方又双叒叕发文旅礼包啦新疆是个好地方春节的脚步越来越近不少人,已做好出游计划除了银装素裹的冰雪美景春节期间,南北疆多地还将举办丰富多彩的主题活动冰雪元素加民俗活动,让旅途年味十足自治区文化和旅游厅及各地光伏市场迎来抢装潮新疆资源潜能加速激活2023年1月17日,新疆哈密市某光伏企业,在沙漠建起的光伏发电厂。孙永杰摄中新网乌鲁木齐1月20日电(陶拴科)双碳要求下,低碳环保和节能减排已成为社会经济发展中的重点话题。时下,这一趟期待了三年把东北年夜饭搬到海边人们重返海南过年连日来,网上去海南过年相关话题持续火热。过海轮渡徐闻港口3个小时往前挪动了300米三亚机场日均客流量达到6。6万人次人潮涌动背后,大波热爱温暖海岛的北方人,也重返海南欢度春节。天目茯启新年!金茯城春节游玩指南农历新年将至疫情解封后第一个新年不免让人心生激动金兔纳福,茯启新年金茯城迎来开城之后首个春节一大波新春系列活动萌兔打卡趣玩游戏汉服巡游非遗演艺赛博互动沉浸剧情缤纷庙会好运诚礼限时1
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网