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

接口设计的那些事

  接口的一般性问题
  缺乏经验的程序员开发接口的时候,往往仅关注功能实现,但决定接口质量的恰恰是非功能性方面遗憾的是,这一点在大部分公司,从项目到产品到研发,甚至到测试,都未得到应有的重视。
  接口的非功能性要素主要体现在如下几个方面:幂等性;鲁棒性;安全性;
  幂等性
  如果某一天你在超市消费了1000元,而你的银行卡被扣了2000元,你是什么感受?
  (当然你我几乎不会遇到这种问题,因为金融级别软件出现这种低级错误,估计是不想在市面上混了。)
  重复扣款涉及到接口的幂等性问题。
  幂等性是指写型接口必须保证重复调用时的数据正确性,一般出现在添加数据的场景,以及一些非幂等修改的场景(如扣减余额)。删除场景一般具备幂等性。
  我们无法预期接口调用方如何调接口,可能由于调用超时,或者调用方实现问题(比如前端用户可短时间内高频点击),接口设计必须将重复调用作为常态考虑因接口被重复调用而导致数据问题,责任应归于接口实现者而不是调用者。
  处理幂等性的手段一般分业务逻辑层面和数据库层面。
  业务逻辑层面:selectinsert:
  这种方式应用得很多,实现方式是在添加或修改数据之前先根据请求参数(如用户编号、订单编号)查一下相关数据,以决定该请求是否已经处理过了,防止重复处理(如重复加积分、重复扣款)。
  这种处理方式的优点是它本身属于业务逻辑的一部分,产品和开发人员画流程图时往往会自然而然地包括这些逻辑,因而也是最容易想到的实现方式容易想到就意味着现实中大部分的系统已经实现了这种基本的幂等性处理。
  但这种selectinsert解决不了并发问题:在极短的时间内发生的重复请求,比如用户疯狂地点击按钮(假如按钮没做任何限制)、羊毛党薅羊毛等。
  在高并发时,同一个用户的两个请求几乎同时到达,此时两个请求几乎同时select,都发现数据库没有相关记录,于是都能执行后续业务逻辑。
  所以对于重要场景(如发券、积分等),请求必须在用户级别具有排他性:同一时间同一个用户只能有一个请求在处理,多个同样的请求必须串行处理。
  我们可以借助Redis来实现分布式请求锁。根据相关请求参数生成rediskey,比如在增加积分场景,可以根据用户id场景id生成key作为锁,请求到来时先检查锁是否存在,如果存在则直接拒绝处理,不存在的话才进入下一步。这样就保证了请求的排它性。流程图如下:
  然而,当你的数据库使用读写分离时,你会发现请求锁方案有时还是会出现漏网之鱼。业务系统处理完成后会解除请求锁,此时同一个用户的重复请求就可以进来,但此时新数据可能还没有同步到从库,因而select仍然查不到,于是业务逻辑又被执行了一遍(如加了两次积分)。你可能觉得这种延迟在毫秒级,问题不大,但如果对方是脚本薅羊毛,这可能就是不容忽视的问题。
  这种情况必须结合数据库层面的约束来解决。Redis分布式锁:
  Redis的高性能、高并发和单线程处理(命令的原子性)很适合做分布式锁。有些细节值得注意。
  我们一般使用Redis的set带nx选项实现分布式锁:
  setlockkeyprivatevalex20nx
  (其中lockkey和privateval是程序生成的。)
  上面设置锁lockkey,过期时间是20秒。其中关键在nx选项,它表示当lockkey不存在时才设置。这条指令是setnx的增强版,在setnx基础上增加了对过期时间的支持。
  那么我们如何释放锁呢?直接执行dellockkey?不行的,程序只能释放由自己加的锁,如果直接del,那么有可能会删除掉别的进程加的锁(比如当前进程执行超时,原来的锁过期了,而此时另一个进程刚好也加了个lockkey的锁,此时会把另一个进程的锁删了)。
  所以删除前必须判断privateval是不是当前进程生成的,所以必须先判断再比较:
  getlockkey
  dellockkey
  这样实现有没有问题呢?还是有那么一点小问题的:这里执行了两条Redis命令,不具备原子性,可能出现第一条执行成功了第二条失败的情况(虽然概率很低),另外需要两次网络开销。有没有优化空间呢,可以使用Redis的eval命令执行Lua脚本来保证原子性(相关语言SDK都有支持):
  evalif(redis。call(get,KEYS〔1〕)ARGV〔1〕)thenredis。call(del,KEYS〔1〕);endreturn1;lockkeyprivateval
  (Lua语言很简单,自行百度,1小时学会。)
  数据库层面:
  我们可以通过数据库提供的唯一键约束来实现幂等性。
  我们看看储值卡扣费场景。电商的储值卡支付场景中,储值卡扣费环节至少要发生两个操作:产生一笔流水,至少包含订单号和支付金额;储值卡账户扣除相应金额;
  如果储值卡支付接口不做任何幂等性处理,那就有可能同一笔订单会产生两笔支付流水且卡账户被重复扣款,造成客诉。
  这里我们除了可以采用前面的请求锁selectinsert方案,还可以在数据库层面增加唯一键约束。假如一笔订单仅支持支付一次,那么就可以用订单号做唯一键约束,当同一笔订单进行多次支付(插入流水)时就会因唯一键冲突而插入失败(账户余额变更操作和增加流水在一个数据库事务中,自然也不会成功)。
  有些场景的唯一性约束体现在组合键上,比如签到,用户一天只能签到一次,那么就可以用用户id日期这样的组合唯一键。
  当然,有些场景可能压根就不存在这样的唯一约束字段,比如增减积分、发券,此时必须创造出单独的约束字段来实现唯一性约束,比如给表增加一个uniqid并建立唯一键索引。现在的问题是uniqid从哪里来?
  这种情况下基本上接口提供方无法根据接口请求参数生成唯一标识,必须由接口调用方提供这个uniqid。接口提供方(如券系统)在写入数据的时候(如给用户发券)会将该uniqid存入,如果之前已经写入过,则会发生唯一键冲突,数据写入失败。
  那么现在的问题是,如何保证接口调用方生成的标识是唯一的呢?如果调用方生成的标识和其他请求的标识冲突了,就会导致本次接口调用永远会失败。
  一般有两种方案:1。调用方根据某种规则自行生成标识;2。由接口提供方提供单独的生成标识的接口。
  调用方自行生成,可以采用uuid算法生成(一般编程语言都有相应的库)。uuid能很好地保证唯一性,但缺点一方面是比较长(至少占用16字节),另外它是无序的,对MySQL这样的B树索引不是很友好,可以采用twitter开源的雪花算法(snowflake,网上也有现成的实现库)方案来生成64bit整型(long)标识。
  如果系统并发量不是特别高,而且也不想让客户端去生成唯一标识,可以由业务系统或者独立的发号器系统提供唯一标识接口来获取唯一标识。
  发号器系统(有可能就是相关业务系统自身)可以采用现成的uuid或snowflake方案,也可以自行实现。此处提供一种实现思路。
  假如我们要生成的唯一标识格式是xxxxxxxxyyyyyyyyyyyyzzzz,其中x是当前日期,y是12位十进制(千亿),每天从1开始自增,z是四位随机数,主要防止万一y位出现异常重复的情况下降低标识符重复概率。该唯一标识在不考虑随机位z的情况下,每天能生成约9千亿个标识。
  发号器服务器一般不止一台,所以需要保证多台服务器生成的y部分不会重复,我们采用中间服务Redis来分配y部分。
  那么,是不是每次生成标识符都要请求Redis呢?如此Redis的压力可就大了。所以y部分我们要采用批量分配策略,即发号器系统一次向Redis申请一个号段,比如一次申请包含1万个值的y号段,将号段的起止值记录在本地内存中,生成标识符的时候先从本地号段中取y值,只有本地号段用完了才向Redis申请新号段。
  发号器系统的本地号段是记录在内存中的(进程的全局变量),服务退出重启后会重新向Redis申请号段。所以号段范围建议不能太大,否则如果服务重启次数较多可能会耗尽y号段。
  流程如下:
  总结一下如何用数据唯一键实现接口幂等性:适用于插入数据的场景,典型的如流水总账模式的业务(如储值、积分、点赞等)。优先使用业务字段本身实现唯一性约束,比如储值卡消费流水中的订单号。或者是若干字段(2、3个)的组合键唯一约束,如点赞场景。当没有业务字段做唯一约束时,可创建单独标识字段做唯一约束,此时由调用方提供唯一标识符。需保证调用方标识符的唯一性,可采用业界标准的uuid、snowflake算法,也可以自己实现。标识符可以由调用端自行生成,也可以由发号器统一生成,根据自己的实际情况和并发量做决策。发号器的实现必须考虑其可扩展性,需保证发号器集群生成的标识具有唯一性。数据库唯一键约束可能会和请求锁、selectinsert方案一起使用。
  关于接口幂等性还有个需要关注的问题:当服务提供方发现本次调用已被处理(本次可能是调用方超时重试,也可能是其它异常调用),应该返回什么?
  有些开发者想当然地从业务判重角度将重复操作作为异常场景看待,不假思索地返回个错误码,这会给调用端带来困扰,很可能带来数据完整性问题。
  此时最简单的做法是直接返回OK如果开发团队中只有一种状态码表示成功的话(如code200)。
  有些开发团队借鉴HTTP状态码的定义,将20X状态码段定义为成功码,此时可以就操作成功和该操作已处理过定义不同的状态码(如200表示成功,201表示该操作已处理过),这样既不干扰调用端的业务处理,也能让业务端确切知道本次调用的实际处理情况。
  前后端的幂等性:
  考虑下面的场景:
  张三在管理后台创建券,点击创建按钮后半天没响应(网络较慢),于是张三又连续点了若干次,结果去列表一看,创建了三四张券。
  当然你我第一反应很可能是在前端做交互优化:点击按钮后将按钮置灰,并提示正在创建中。。。,直到后端返回数据后按钮才可以再次点击。
  上面的前端交互优化确实可以解决绝大部分重复创建的问题。
  不过,试想一下这样的场景:用户点击创建按钮后,后端服务处理较慢(如服务器负载高了),前端按钮置灰,用户不可点击。
  过了一会(如5秒钟),前端接口等待时间超过阈值,前端js直接报超时错误,告知用户服务处理超时,请稍后重试。
  于是用户再次点击创建按钮。
  然后,用户去券列表页面,很可能会发现自己创建了两张券。
  问题出在当前端发现后端接口超时后,会认为事务处理失败,于是提示用户重试,但后端事务实际上仍在执行(甚至有可能后端事务其实早都执行完了,但在返回数据时出现了网络问题而超时),此时用户再次点击创建按钮实际上会执行两次事务(创建两张券)。
  所以在前后端调用的场景中(主要是创建型事务的场景),同样需要通过唯一标识(如uuid)来保证接口调用的幂等性。
  首先我们想到用类似前面请求锁方案(但这次不是加锁):在渲染创建页面的时候,后端生成一个唯一标识符X,将其保存到Redis中(设置一个合理的有效期),并将该标识符返回给前端;前端请求后端创建优惠券接口时,带上该标识符;后端先比较该标识符是否和Redis中的一致,标识符没问题才进行后续的事务处理;后端事务处理成功后,删除掉Redis中的标识符;前端在使用该标识符请求后端,后端由于检测不到该标识符,会直接返回错误;
  流程如下:
  上面的流程有没有问题呢?
  它确实能阻止一部分重复提交,但不是全部。
  试想前端请求后端接口,后端接口超时了(但实际上后端事务仍然在执行中),此时前端会让用户重试,用户再次提交,这第二次接口请求仍然会带上刚才的flag,那这次flag校验是否会通过呢?可能会,也可能不会,取决于第二次请求到达时,前一次的事务有没有处理完(从而删除掉flag)。假如前一次的事务(这里的事务不是说数据库事务,而是指该接口要做的事情)还没有处理完,那么这个flag就仍然是合法的,那么第二次请求仍然会被处理。如下图:
  图中橙色和蓝色部分代表两次请求的处理流程(省略了Redis部分)
  我们也不能在接口处理完之前删除掉Redis中的flag,因为如果事务处理失败,是需要前端重新提交的。
  要想前后端交互真正的实现幂等性,必须借助数据库的唯一键约束。和前面的一样,我们给数据表增加一个专门字段(假如就叫flag)做唯一性约束,我们以券为例,数据表大致长这样:idname。。。flag1225元优惠券。。。122174813112
  这里的flag就是上面我们生成并存储到Redis的那个唯一标识,我们在数据库插入券数据的时候一并写进去。由于flag字段是唯一键,如果先前已经写入过了,再写入就会报唯一键冲突错误,写入失败,从而保证了接口的幂等性。如此,上图中用户再次点击提交,虽然flag校验仍然会成功,但两次处理只有一次会真正成功,另一次在写数据库时会失败(不能保证一定是第一次请求写入成功,网络调用不具备时序性)。
  加上数据库约束后两次请求的处理过程如下:
  图中橙色和蓝色部分代表两次请求的处理流程(省略了Redis部分)
  有人可能觉得有了数据库层的唯一性校验,就可以去掉Redis那一层的校验。这是不行的,如果去掉Redis这层校验,我们便无法保证前端传的这个flag是我们自己生成的,也就是说前端随便传个flag就能写库了。
  总结一下前后端接口调用的幂等性实现:通过前端js限制用户高频次点击导致的重复提交,这是成本最低、最快见效的实现方式;通过Redis实现标识符校验,结合前端js控制,能够满足大部分的幂等性要求;再加上数据库层面的唯一键约束,能够真正实现前后端交互的幂等性;
  讲完幂等性,我们看看第二个接口设计原则:鲁棒性。
  鲁棒性
  鲁棒这个词真的误人子弟,反正我第一次听到这个词时脑海中冒出的是一个粗鲁的大汉挥舞着棒子不知在干啥。
  鲁棒是音译,英文叫Robustness,翻译过来是坚固性,健壮性的意思,所以接口的鲁棒性是指接口的健壮性如何。
  接口的鲁棒性取决于它对异常场景的承载能力。
  什么样的接口不具备鲁棒性呢?如果一个接口严重依赖于外部输入的合法性以及第三方服务的正确性,一旦外部输入非预期内容(如含有SQL注入的字符串),或者所依赖的第三方服务(接口)崩溃了(如超时),该接口就会出现各种未知问题(最典型的是数据一致性问题,如卡账扣款了但订单还是未支付状态),那么我们说该接口是脆弱的,不具备鲁棒性。
  几乎所有的程序员都能写出可用的接口(实现正常流程),但至少有一半(其实不止)的程序员写不出健壮的接口。
  这里的异常主要包括:输入异常;流程异常;性能异常;
  输入异常:
  不要信任外部输入是常识,但不是所有人都正确处理这块。这里主要包括以下几块:参数类型限制;缺省参数处理;恶意输入的拦截;
  考虑到接口调用方编程语言的异构性以及其他复杂因素,参数类型尽量只使用数值类型和字符串,尽量不要用bool型(true、false)、Null有些情况下对方可能给你传的是字符串true而不是bool值true,如果你打算用这些类型,请在接口内部消化掉字符串true、false。
  接口参数应遵循最小化输入原则,即调用端只需要关心他关心的参数,接口自身应能正确处理参数缺省值。我见过有些接口有二三十个参数,每个参数都是必填的调用端对不需要的参数必须传缺省值(0或空字符串),对接的人一边对接一边崩溃,还经常因某个参数传入错误导致接口报错。
  异常输入这块重点在字符串类型上。
  字符串的第一个威胁是XSS攻击。企盼每个开发人员对每个入参都做脱敏处理是不现实的,所以这一步必须在开发框架层面提供支持,控制器中拿到的参数应该是已经做过处理了的。虽然这是件很基础(基础到不值得拿出来一说)的事情,但我敢保证,市面上有一半的系统都没有做严格的参数处理因为保证这点的唯一手段是将渗透测试作为测试的一个环节纳入到工作流程中,但大部分中小公司的产品并没有做渗透测试。退而求次,保证接口入参健壮性的次要手段(但对于大部分中小公司是最实用的)是将参数处理纳入到框架层面(有些框架天然支持这点,有些则需要定制开发)。XSS:跨站脚本攻击(CrossSiteScripting,为了不和层叠样式表的缩写冲突而写成XSS),是指恶意用户通过在网站中注入javascript脚本实现攻击(如获取Cookie信息)。
  比如我们网站有个输入框(普通文本框或者富文本),用户在里面输入,如果后端接口没有对该输入做任何处理就存入数据库,那么当这段文本在前端页面渲染时该脚本就会被执行获取到Cookie信息。
  那是不是把代码里面

阿娇自曝当初和赖弘国闪婚,是因为很喜欢对方的家庭近日,Twins组合阿娇钟欣潼和阿Sa蔡卓妍在某个节目聊天谈话的片段,引起了网友们的热议。阿娇在节目说过道,当初会和前夫赖弘国闪婚是因为很喜欢对方的家庭,他家庭氛围很好,他的爸爸妈西藏旅游性价比最高的4个地方,是它俩压轴!上一篇文章中,提到的三色湖和卓玛朗措,景色绝佳却又非常小众,不管是作者还是小编都非常推荐。不过它们也只能算是开胃小菜,今天作者的行程,才是这趟旅行中的重头戏!(作者阿拖施晓君美朵)美国疯狂放水32万亿,越南扛不住了?美国是如何收割全球财富的?美联储主席鲍威尔直言,如果通胀继续严重,将会加速减码计划。这意味着美联储的加息行动可能会比市场预期的时间要更早。迫使鲍威尔发出这种言论的是美国近一年多来32万亿的放水行为。美国商务越来越多酒店式列车投入运营普速高级旅游专列是否会成为未来旅游趋势?央广网北京12月27日消息(记者任梦岩邓君洋张垒)在火车里吃着火锅唱着歌,这一电影中的著名场景将在现实生活中实现。近日,广西壮族自治区首辆专属定制高级旅游列车八桂文旅号正式下线交付离开越南最高峰一路都是美景大雪里的寺院大钟楼半山大雪藏金阁牌坊雪后的天空尽收眼底的美景天空之城云端酒店美景美景美景离开大雪迷雾的山巅,向着城市一路走去,一路都是美景,这是一个值得玩的地方。海拔2500以上都C趣味程序(3)21。四位反序数设N是一个四位数,它的9倍恰好是其反序数,求N。反序数就是将整数的数字倒过来形成的整数。例如1234的反序数是4321。includeusingnamespaces逐渐火箭化,带队横扫洛杉矶!神奇哈登领衔,今日球员红黑榜今天结束了7场NBA常规赛的争夺,单核篮网击沉快船,灰熊与太阳上演绝杀与反绝杀,三巨头公牛让老鹰无计可施,一起来看看今天的球员红黑榜。红榜1哈登圣诞大战过后,杜兰特与欧文依然无法解去越南旅游,看到当地美女最好绕路走,导游遇到的人都吃过亏吃过亏,这是咋回事呢?自古以来,越南北部都是中国固有领土,就算它独立之后还保留着中国人的有些生活习俗和文化,那时他们还使用汉字,也都保留着中国文化的色彩,比如新年的时候贴春联。随着SSS楼高上线迎元旦新斗罗大陆今日新版本开启斗罗之路跨年的钟声即将敲响,在这隆冬时节,岁末寅初之时,小舞为大家送上新年的祝福,同时也给大家带来了新年全新版本!诸位期盼已久,掌握着大量金属资源,世界三大神匠之一,SSS魂师楼高闪亮登场华为再次成为焦点,鸿蒙超出预期,外媒全球第三大系统要来了自研系统迫在眉睫,鸿蒙成为焦点所以在这种情况下,自研国产系统成了不少人所期待的目标。近些年来虽然有基于Linux开发的电脑系统,但这部分系统大都是供应给特殊企业或者行业使用,普通消HECATE漫步者电竞x和平精英,GT4联名限量款游戏耳机评测闲暇之余,我喜欢听音乐玩手游来放松心情,所以蓝牙耳机是我日常必备的电子产品,对我来说一款蓝牙耳机不仅要音质好,还必须具备低延时特性,能让我畅快的玩游戏。在所有类型手游中,我最喜欢玩
今日黄金价格多少钱一克(2022年08月11日)参考价格购买黄金首饰的时候朋友们会发现,黄金首饰的价格并不一样,有的金店黄金价格会高一点,有的会低一些,那么不同品牌黄金为何价格有差异呢?同样的黄金首饰,在不同的金店里面售卖的价格不一样,2022年8月11日生猪价格行情外三元生猪省市今日价格(元公斤)较昨日涨跌安徽省20。871。02山东省21。630。03浙江省22。110。98江西省21。930。09福建省22。140。03江苏省21。390要取代iPhone的下一代产品来了,但价格会率先劝退你近年来,全球各大科技公司手机厂商似乎都在抓住元宇宙这个新风口,积极筹划着ARVR相关的产品。去年,OPPO带来了AirGlass智能眼镜,小米也在前不久众筹了一款米家眼镜相机,大家OPPO也坐不住了?旗舰机价格跳水,12GB256GB,降至4499元?导语由于受到疫情等因素影响,经济不太景气,手机市场竞争变得异常激烈,今年的手机都不太好卖,为了市场份额,各大品牌的营销手段可谓是层出不穷,加快了发布新机的频率,加大了优惠力度,有些高刷新率手机推荐这三款带给你无穷丝滑还拥有高性价比且价格便宜现在手机的性能也是越来越强了,提升手机的刷新率也成为各大手机厂商竞争的关键点,从开始的60赫兹一直到现在的144赫兹,手机的刷新率也是越来越高了,手机使用起来也是越来越丝滑了,而且小米MIXFold2详细参数及价格小米MIXFold2屏幕内屏8。02英寸外屏6。56英寸外屏AMOLED屏内屏OLED屏充电67W刷新率120Hz处理器骁龙8运行内存LPDDR5UFS3。1拍照前置2000万后摄全国油价调整信息8月11日调整后9295号汽油价格表新一轮油价计价周期开启,第2个工作日,原油变化率下跌4。33,折算为下跌230元吨,仅差一天,又错过了下跌2毛。大跌开局,本轮油价最后能否成功再降呢?继续关注我们每天消息!8月11新一轮家电下乡政策出台TCL引领绿色智能家电焕新风潮近日,商务部等13部门联合发布关于促进绿色智能家电消费的若干措施,旨在开展家电以旧换新活动,推进绿色智能家电下乡。与上一轮在2008年推出的家电下乡政策相比,新一轮政策旨在通过政府10句励志朋友圈早安文案,每天发圈不重样1早安,所有人用微笑开启新的一天用活力挥洒明媚的色彩向着正确的方向前进让独一无二的自己闯出一番幸福的天地2嘿!早上好时间的脚步从不停息全新的一天已经来临今日是平淡还是惊喜等待着你去开合之间依旧不凡三星GalaxyZFold4外观赏析随着三星折叠屏近几年的迭代与发展,每一年都会为折叠屏市场带来了新的惊喜在刚刚,三星也正式发布了今年焕然一新的GalaxyZFold4而这一次在开合之间它又带来了哪些惊喜呢?盖乐世社华为Mate50系列9月见!余承东华为手机开始回来了说起最近手机行业最值得关注的月份,人们都会提到9月。因为就在今年的9月,手机行业将会迎来一个令人振奋的消息当今手机界两个最有竞争力的高端品牌华为和苹果,都将发布令人期待已久的Mat潜水可以戴隐形眼镜吗隐形眼镜之所以是会受到如此的欢迎,正是因为它方便,解决了以往佩戴框架眼镜无法完成的事情。可是,也有很多时候佩戴隐形眼镜是存在一定的不健康因素的。比如潜水,潜水能戴隐形眼镜吗,其实最高温天出个门,我的衣服变色了你想一件衣服穿出不同的色彩吗?变出不同的花样吗?热敏变色纺织品了解一下!它包括两部分热敏变色染料和纺织品热敏变色染料从种类上来讲分为无机类,有机类和液晶类虽然有机类变色染料的稳定性8月旅游不知道去哪玩?这几个绝美小众古镇千万别错过说起国内著名的古镇,你肯定会第一时间想起丽江古城平遥古城凤凰古城除了这些,国内还有很多小众但值得一去的古城镇,今天小结给大家推荐7个鲜少被提及的古城镇!青岩古镇青岩古镇位于贵阳市南细胞疗法专题报告新起步的颠覆性技术,市场空间广阔核心观点细胞治疗行业快速治疗是一种新起步的颠覆性技术,目前主要用于肿瘤治疗,具有治愈潜力。细胞疗法是改造人类免疫细胞,将之药物化的一种治疗方法。目前主要用于血液瘤治疗。此类药物疗效近一半的新加坡人最想去旅游的地方(全文译自CNBC,让我们从另一个角度看到真实的世界)市场研究公司YouGov的数据显示,约49的新加坡人表示,他们出国度假时最先考虑的地方是日本。根据5月发表的研究数据,年轻公民孕妇穿爸爸衣服,中年男子气质溢出屏幕黑红色的条纹POLO衫,溢出的啤酒肚,腰间再挂上一串钥匙,再看看这手上的金戒指,这妥妥是个中年成功人士?不不不,还可以是怀孕8个多月的孕妇。近日,青岛一则孕妈穿上父亲衣服成中年大叔安莎社旅游胜地撒丁岛沙滩成多国游客偷窃目标海关查获22公斤沙子加鹅暖石贝壳中国小康网8月10日讯老马消息人士周二表示,7月下旬意大利海关官员在在游客的包中发现了22公斤被盗的撒丁岛海滩沙子。原因是意大利岛上的沙滩被当做纪念品,遭爱好者继续掠夺。海关查获的跟团旅游,为何每到饭点导游会悄悄离开,是开小灶去了吗?虽然现在自驾游的人越来越多,但是跟团游依然还是一个趋势。跟团游的费用相较于自驾来说,要低一些,而且也不用操心吃住问题和下一站去哪里玩,直接跟着导游走就行了,一切都是安排好了的。导游韩国旅游发展局如你所愿活动,为中韩Z世代交流搭建全新桥梁为庆祝中韩建交30周年,由韩国旅游发展局中国区总部策划并发起的全新线上宣传活动如你所愿韩,经过近两周的征集及实施,于8月10日圆满收官。活动携手中国新生代偶像组合中韩人气博主,从文孙宇晨的星辰大海开盲盒式上天让太空旅游走向大众2021年12月,蓝色起源公司官网发布消息,确认了波场TRON创始人孙宇晨新谢泼德号首航舱位拍卖赢家的身份,称其在当年6月以2800万美元拍得了新谢泼德号首航舱位。随后,孙宇晨宣布雪崩!元宇宙虚拟地产价值一泻千里,林俊杰投资惨遭缩水86曾经炙手可热如日中天的元宇宙虚拟地产,正遭遇人人喊打的尴尬局面。这不,美国亿万富翁NBA达拉斯小牛队的老板马克库班(MarkCuban),前两天就跳出来,把虚拟地产大肆批判了一番,
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网