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

基于DDD的微服务落地

  DDD四层架构
  对实时性要求高的强一致性业务场景,可采取分布式事务。分布式事务有性能代价,在设计时需要平衡考虑业务拆分、数据一致性、性能和实现的复杂度,尽量避免分布式事务的产生。
  领域事件驱动的异步方式是分布式架构常用的设计方式,可以解决非实时性场景下的数据最终一致性问题。基于消息中间件的领域事件发布和订阅,可以很好的解耦微服务。通过削峰填谷,实现读写分离、减轻数据库实时访问压力,提高业务吞吐量和业务处理能力。
  DDD设计思想和方法
  DDD设计思想和方法
  聚合根
  聚合根包括聚合根属性、关联的实体和值对象以及自身的业务行为等。通过引用实体和值对象,协调聚合内的多个实体,在聚合根类方法中完成多实体的复杂业务逻辑。
  充血模型:即领域模型模式。有自己的业务行为(方法),如下充血模型中提供getDuration、addHistoryApprovalInfo等方法。
  贫血模型:即事务脚本模式。只有对象属性和settergetter。DatapublicclassLeave{Stringid;Applicantapplicant;Approverapprover;LeaveTypetype;Statusstatus;DatestartTime;DateendTime;longduration;审批领导的最大级别intleaderMaxLevel;ApprovalInfocurrentApprovalInfo;ListhistoryApprovalInfos;publiclonggetDuration(){returnendTime。getTime()startTime。getTime();}publicLeaveaddHistoryApprovalInfo(ApprovalInfoapprovalInfo){if(nullhistoryApprovalInfos)historyApprovalInfosnewArrayList();this。historyApprovalInfos。add(approvalInfo);returnthis;}publicLeavecreate(){this。setStatus(Status。APPROVING);this。setStartTime(newDate());returnthis;}publicLeaveagree(ApprovernextApprover){this。setStatus(Status。APPROVING);this。setApprover(nextApprover);returnthis;}publicLeavereject(Approverapprover){this。setApprover(approver);this。setStatus(Status。REJECTED);this。setApprover(null);returnthis;}publicLeavefinish(){this。setApprover(null);this。setStatus(Status。APPROVED);this。setEndTime(newDate());this。setDuration(this。getEndTime()。getTime()this。getStartTime()。getTime());returnthis;}}
  实体
  实体有自己的属性和关联的值对象。DatapublicclassApprovalInfo{StringapprovalInfoId;Approverapprover;ApprovalTypeapprovalType;Stringmsg;longtime;}
  值对象publicenumStatus{APPROVING,APPROVED,REJECTED}DataAllArgsConstructorNoArgsConstructorBuilderpublicclassApprover{StringpersonId;StringpersonName;intlevel;publicstaticApproverfromPerson(Personperson){ApproverapprovernewApprover();approver。setPersonId(person。getPersonId());approver。setPersonName(person。getPersonName());approver。setLevel(person。getRoleLevel());returnapprover;}}
  领域对象
  如果一个业务行为由多个实体对象参与完成,就将该业务逻辑放在领域服务中实现。
  实体方法:完成单一实体自身的业务逻辑,是相对简单的原子业务逻辑。
  领域服务:由多个实体组合的相对复杂的业务逻辑。ServiceSlf4jpublicclassLeaveDomainService{AutowiredEventPublishereventPublisher;AutowiredILeaveRepositoryiLeaveRepository;AutowiredLeaveFactoryleaveFactory;TransactionalpublicvoidcreateLeave(Leaveleave,intleaderMaxLevel,Approverapprover){leave。setLeaderMaxLevel(leaderMaxLevel);leave。setApprover(approver);leave。create();iLeaveRepository。save(leaveFactory。createLeavePO(leave));LeaveEventeventLeaveEvent。create(LeaveEventType。CREATEEVENT,leave);iLeaveRepository。saveEvent(leaveFactory。createLeaveEventPO(event));eventPublisher。publish(event);}TransactionalpublicvoidupdateLeaveInfo(Leaveleave){LeavePOpoleaveRepositoryInterface。findById(leave。getId());if(nullpo){thrownewRuntimeException(leave不存在);}iLeaveRepository。save(leaveFactory。createLeavePO(leave));}TransactionalpublicvoidsubmitApproval(Leaveleave,Approverapprover){LeaveEventevent;if(ApprovalType。REJECTleave。getCurrentApprovalInfo()。getApprovalType()){leave。reject(approver);eventLeaveEvent。create(LeaveEventType。REJECTEVENT,leave);}else{if(approver!null){leave。agree(approver);eventLeaveEvent。create(LeaveEventType。AGREEEVENT,leave);}else{leave。finish();eventLeaveEvent。create(LeaveEventType。APPROVEDEVENT,leave);}}leave。addHistoryApprovalInfo(leave。getCurrentApprovalInfo());iLeaveRepository。save(leaveFactory。createLeavePO(leave));iLeaveRepository。saveEvent(leaveFactory。createLeaveEventPO(event));eventPublisher。publish(event);}publicLeavegetLeaveInfo(StringleaveId){LeavePOleavePOiLeaveRepository。findById(leaveId);returnleaveFactory。getLeave(leavePO);}publicListLeavequeryLeaveInfosByApplicant(StringapplicantId){ListLeavePOleavePOListiLeaveRepository。queryByApplicantId(applicantId);returnleavePOList。stream()。map(leavePOleaveFactory。getLeave(leavePO))。collect(Collectors。toList());}publicListLeavequeryLeaveInfosByApprover(StringapproverId){ListLeavePOleavePOListiLeaveRepository。queryByApproverId(approverId);returnleavePOList。stream()。map(leavePOleaveFactory。getLeave(leavePO))。collect(Collectors。toList());}}
  在应用服务组合不同聚合的领域服务时,通过Id或参数传参,尽量避免领域对象传参,以减少聚合之间的耦合度。
  领域事件
  领域事件基类DatapublicclassDomainEvent{Stringid;Datetimestamp;Stringsource;Stringdata;}ServicepublicclassEventPublisher{publicvoidpublish(LeaveEventevent){sendtoMQmq。send(event);}}
  领域事件实体DatapublicclassLeaveEventextendsDomainEvent{LeaveEventTypeleaveEventType;publicstaticLeaveEventcreate(LeaveEventTypeeventType,Leaveleave){LeaveEventeventnewLeaveEvent();event。setId(IdGenerator。nextId());event。setLeaveEventType(eventType);event。setTimestamp(newDate());event。setData(JSON。toJSONString(leave));returnevent;}}
  领域事件的执行逻辑:执行业务逻辑,产生领域事件。调用仓储接口,完成业务数据持久化。调用仓储接口,完成事件数据持久化。完成领域事件发布。
  仓储模式
  仓储接口publicinterfaceILeaveRepository{voidsave(LeavePOleavePO);voidsaveEvent(LeaveEventPOleaveEventPO);LeavePOfindById(Stringid);ListLeavePOqueryByApplicantId(StringapplicantId);ListLeavePOqueryByApproverId(StringapproverId);}
  仓储实现RepositorypublicclassLeaveRepositoryImplimplementsILeaveRepository{AutowiredLeaveDaoleaveDao;AutowiredApprovalInfoDaoapprovalInfoDao;AutowiredLeaveEventDaoleaveEventDao;publicvoidsave(LeavePOleavePO){leaveDao。save(leavePO);leavePO。getHistoryApprovalInfoPOList()。forEach(approvalInfoPOapprovalInfoPO。setLeaveId(leavePO。getId()));approvalInfoDao。saveAll(leavePO。getHistoryApprovalInfoPOList());}publicvoidsaveEvent(LeaveEventPOleaveEventPO){leaveEventDao。save(leaveEventPO);}OverridepublicLeavePOfindById(Stringid){returnleaveDao。findById(id)。orElseThrow(()newRuntimeException(leave不存在));}OverridepublicListLeavePOqueryByApplicantId(StringapplicantId){ListLeavePOleavePOListleaveDao。queryByApplicantId(applicantId);leavePOList。forEach(leavePO{ListapprovalInfoPOListapprovalInfoDao。queryByLeaveId(leavePO。getId());leavePO。setHistoryApprovalInfoPOList(approvalInfoPOList);});returnleavePOList;}OverridepublicListLeavePOqueryByApproverId(StringapproverId){ListLeavePOleavePOListleaveDao。queryByApproverId(approverId);leavePOList。forEach(leavePO{ListapprovalInfoPOListapprovalInfoDao。queryByLeaveId(leavePO。getId());leavePO。setHistoryApprovalInfoPOList(approvalInfoPOList);});returnleavePOList;}}
  这里为什么没有使用一对多、多对对呢?时间紧任务重或者并发量不高时可以使用,后期并发量起来了后,数据库将成为瓶颈。
  JPAHibernate注解:OneToMany、ManyToOne、ManyToMany;
  Mybatis注解:
  Results(id,value{Result(column,property,jdbcTypeJdbcType。INTEGER),
  Result(column,property,javaTypexx。class,oneOne(selectcom。xx。。XxMapper。selectById))
  })
  或
  Results(id,value{Result(property,column),
  Result(propertyxxList,javaTypeList。class,manyMany(select),column)});
  Mybatisxml:association、collection。
  工厂模式
  工厂模式将与业务无关的职能从聚合根中剥离,放在工厂中统一创建和初始化。可考虑使用MapStructServicepublicclassLeaveFactory{publicLeavePOcreateLeavePO(Leaveleave){LeavePOleavePOnewLeavePO();leavePO。setId(UUID。randomUUID()。toString());leavePO。setApplicantId(leave。getApplicant()。getPersonId());leavePO。setApplicantName(leave。getApplicant()。getPersonName());leavePO。setApproverId(leave。getApprover()。getPersonId());leavePO。setApproverName(leave。getApprover()。getPersonName());leavePO。setStartTime(leave。getStartTime());leavePO。setStatus(leave。getStatus());ListhistoryApprovalInfoPOListapprovalInfoPOListFromDO(leave);leavePO。setHistoryApprovalInfoPOList(historyApprovalInfoPOList);returnleavePO;}publicLeavegetLeave(LeavePOleavePO){LeaveleavenewLeave();ApplicantapplicantApplicant。builder()。personId(leavePO。getApplicantId())。personName(leavePO。getApplicantName())。build();leave。setApplicant(applicant);ApproverapproverApprover。builder()。personId(leavePO。getApproverId())。personName(leavePO。getApproverName())。build();leave。setApprover(approver);leave。setStartTime(leavePO。getStartTime());leave。setStatus(leavePO。getStatus());ListapprovalInfosgetApprovalInfos(leavePO。getHistoryApprovalInfoPOList());leave。setHistoryApprovalInfos(approvalInfos);returnleave;}publicLeaveEventPOcreateLeaveEventPO(LeaveEventleaveEvent){LeaveEventPOeventPOnewLeaveEventPO();eventPO。setLeaveEventType(leaveEvent。getLeaveEventType());eventPO。setSource(leaveEvent。getSource());eventPO。setTimestamp(leaveEvent。getTimestamp());eventPO。setData(JSON。toJSONString(leaveEvent。getData()));returneventPO;}privateListapprovalInfoPOListFromDO(Leaveleave){returnleave。getHistoryApprovalInfos()。stream()。map(this::approvalInfoPOFromDO)。collect(Collectors。toList());}privateApprovalInfoPOapprovalInfoPOFromDO(ApprovalInfoapprovalInfo){ApprovalInfoPOponewApprovalInfoPO();po。setApproverId(approvalInfo。getApprover()。getPersonId());po。setApproverLevel(approvalInfo。getApprover()。getLevel());po。setApproverName(approvalInfo。getApprover()。getPersonName());po。setApprovalInfoId(approvalInfo。getApprovalInfoId());po。setMsg(approvalInfo。getMsg());po。setTime(approvalInfo。getTime());returnpo;}privateApprovalInfoapprovalInfoFromPO(ApprovalInfoPOapprovalInfoPO){ApprovalInfoapprovalInfonewApprovalInfo();approvalInfo。setApprovalInfoId(approvalInfoPO。getApprovalInfoId());ApproverapproverApprover。builder()。personId(approvalInfoPO。getApproverId())。personName(approvalInfoPO。getApproverName())。level(approvalInfoPO。getApproverLevel())。build();approvalInfo。setApprover(approver);approvalInfo。setMsg(approvalInfoPO。getMsg());approvalInfo。setTime(approvalInfoPO。getTime());returnapprovalInfo;}privateListgetApprovalInfos(ListapprovalInfoPOList){returnapprovalInfoPOList。stream()。map(this::approvalInfoFromPO)。collect(Collectors。toList());}}
  服务的组合和编排
  应用层的应用服务主要完成领域服务的组合与编排。ServicepublicclassLeaveApplicationService{AutowiredLeaveDomainServiceleaveDomainService;AutowiredPersonDomainServicepersonDomainService;AutowiredApprovalRuleDomainServiceapprovalRuleDomainService;创建一个请假申请并为审批人生成任务paramleavepublicvoidcreateLeaveInfo(Leaveleave){intleaderMaxLevelapprovalRuleDomainService。getLeaderMaxLevel(leave。getApplicant()。getPersonType(),leave。getType()。toString(),leave。getDuration());PersonapproverpersonDomainService。findFirstApprover(leave。getApplicant()。getPersonId(),leaderMaxLevel);leaveDomainService。createLeave(leave,leaderMaxLevel,Approver。fromPerson(approver));}更新请假单基本信息paramleavepublicvoidupdateLeaveInfo(Leaveleave){leaveDomainService。updateLeaveInfo(leave);}提交审批,更新请假单信息paramleavepublicvoidsubmitApproval(Leaveleave){findnextapproverPersonapproverpersonDomainService。findNextApprover(leave。getApprover()。getPersonId(),leave。getLeaderMaxLevel());leaveDomainService。submitApproval(leave,Approver。fromPerson(approver));}publicLeavegetLeaveInfo(StringleaveId){returnleaveDomainService。getLeaveInfo(leaveId);}publicListLeavequeryLeaveInfosByApplicant(StringapplicantId){returnleaveDomainService。queryLeaveInfosByApplicant(applicantId);}publicListLeavequeryLeaveInfosByApprover(StringapproverId){returnleaveDomainService。queryLeaveInfosByApprover(approverId);}}
  服务接口的提供
  facade门面接口主要抽象出ControllerApi作为OpenFeign调用的接口门面类。authorlyonardoDescriptioncreateTime2020年03月08日15:06:00FeignClient(nameleaveservice,pathleave)publicinterfaceLeaveFeignClient{PostMapping(submit)ResponsesubmitApproval(LeaveDTOleaveDTO);PostMapping({leaveId})ResponsefindById(PathVariableStringleaveId);根据申请人查询所有请假单paramapplicantIdreturnPostMapping(queryapplicant{applicantId})ResponsequeryByApplicant(PathVariableStringapplicantId);根据审批人id查询待审批请假单(待办任务)paramapproverIdreturnPostMapping(queryapprover{approverId})ResponsequeryByApprover(PathVariableStringapproverId)();}
  实现类RestControllerRequestMapping(leave)Slf4jpublicclassLeaveApi{AutowiredLeaveApplicationServiceleaveApplicationService;PostMapping(create)publicResponsecreateLeaveInfo(LeaveDTOleaveDTO){LeaveleaveLeaveAssembler。toDO(leaveDTO);leaveApplicationService。createLeaveInfo(leave);returnResponse。ok();}PutMapping(update)publicResponseupdateLeaveInfo(LeaveDTOleaveDTO){LeaveleaveLeaveAssembler。toDO(leaveDTO);leaveApplicationService。updateLeaveInfo(leave);returnResponse。ok();}PostMapping(submit)publicResponsesubmitApproval(LeaveDTOleaveDTO){LeaveleaveLeaveAssembler。toDO(leaveDTO);leaveApplicationService。submitApproval(leave);returnResponse。ok();}PostMapping({leaveId})publicResponsefindById(PathVariableStringleaveId){LeaveleaveleaveApplicationService。getLeaveInfo(leaveId);returnResponse。ok(LeaveAssembler。toDTO(leave));}根据申请人查询所有请假单paramapplicantIdreturnPostMapping(queryapplicant{applicantId})publicResponsequeryByApplicant(PathVariableStringapplicantId){ListLeaveleaveListleaveApplicationService。queryLeaveInfosByApplicant(applicantId);ListLeaveDTOleaveDTOListleaveList。stream()。map(leaveLeaveAssembler。toDTO(leave))。collect(Collectors。toList());returnResponse。ok(leaveDTOList);}根据审批人id查询待审批请假单(待办任务)paramapproverIdreturnPostMapping(queryapprover{approverId})publicResponsequeryByApprover(PathVariableStringapproverId){ListLeaveleaveListleaveApplicationService。queryLeaveInfosByApprover(approverId);ListLeaveDTOleaveDTOListleaveList。stream()。map(leaveLeaveAssembler。toDTO(leave))。collect(Collectors。toList());returnResponse。ok(leaveDTOList);}}
  数据组装层
  LeaveAssembler
  可使用MapStruct做对象转换和组装publicclassLeaveAssembler{publicstaticLeaveDTOtoDTO(Leaveleave){LeaveDTOdtonewLeaveDTO();dto。setLeaveId(leave。getId());dto。setLeaveType(leave。getType()。toString());dto。setStatus(leave。getStatus()。toString());dto。setStartTime(DateUtil。formatDateTime(leave。getStartTime()));dto。setEndTime(DateUtil。formatDateTime(leave。getEndTime()));dto。setCurrentApprovalInfoDTO(ApprovalInfoAssembler。toDTO(leave。getCurrentApprovalInfo()));ListhistoryApprovalInfoDTOListleave。getHistoryApprovalInfos()。stream()。map(historyApprovalInfoApprovalInfoAssembler。toDTO(leave。getCurrentApprovalInfo()))。collect(Collectors。toList());dto。setHistoryApprovalInfoDTOList(historyApprovalInfoDTOList);dto。setDuration(leave。getDuration());returndto;}publicstaticLeavetoDO(LeaveDTOdto){LeaveleavenewLeave();leave。setId(dto。getLeaveId());leave。setApplicant(ApplicantAssembler。toDO(dto。getApplicantDTO()));leave。setApprover(ApproverAssembler。toDO(dto。getApproverDTO()));leave。setCurrentApprovalInfo(ApprovalInfoAssembler。toDO(dto。getCurrentApprovalInfoDTO()));ListhistoryApprovalInfoDTOListdto。getHistoryApprovalInfoDTOList()。stream()。map(ApprovalInfoAssembler::toDO)。collect(Collectors。toList());leave。setHistoryApprovalInfos(historyApprovalInfoDTOList);returnleave;}}

散文心态年轻,岁月不老,人生更精彩作者子墨岁月沧桑,生命终会老去,但是,保持心态年轻,能从精神上给生命注入更多活力。就如我们经常说的,态度决定人生,人生最好的样子就是保持年轻的心态。01内心安静,心态平和,你会发觉避免肝脏受损,要远离这3种甜食,要想养肝,建议多吃这3种苦大家都知道,肝脏是人体最为重要的器官,根据有关的实验数据显示,肝脏拥有多种功能,它具有分泌胆汁促进消化以及分解毒素等多个作用。一旦肝脏受到了损伤,便会影响正常的生理运转。尤其是长期6大健康食品公布,鸡蛋入榜,建议中老年人,要常吃近年来随着人民生活水平的提高,保健已经成为了每个人都在探讨的话题。俗话说民以食为天,吃已经成为了健康养生中最重要的一环。01hr什么是所谓的健康食品?健康食品,是食品中的一个种类,柳叶刀中国是错误饮食重灾区,这3个恶习早早远离为好国际权威杂志柳叶刀曾公布过一份重磅研究报告195个国家及地区的饮食结构造成的死亡率与疾病负担分析。该研究追踪了1990年2017年间15种饮食因素的摄入量趋势,分析了各国饮食结构与女人过了40岁就放弃短裤吧!今夏流行这3种长裤,优雅又显瘦短裤作为女生们最爱的夏季单品,它确实非常清凉,深受大众喜爱,但人手一条的短裤穿在身上也容易撞衫,40岁的女性朋友更是要放弃短裤,容易暴露你的腿型,穿在身上也会觉得缺乏气质,今年夏天夏天,就是要穿得热烈而斑斓仲夏将至,让人忍不住也想要在穿搭上来点热闹的色彩。想要在穿搭上多点色彩,又不想踩雷,不妨尝试一下民族风单品。民族文化中的色彩配比纹样搭配历经数千年文化的孕育和审美历练,早已变成了一朱芳雨在积极引援,力争打造强大内线,广东将再次吹响夺冠号角朱芳雨在积极引援,力争打造强大内线,广东将再次吹响夺冠号角广东男篮上个赛季,战绩很不理想,因为队伍老化,因为受伤病困扰,还因为国手太过,参加国家队任务重,还因为年轻球员顶不上来,而勇士从赢19分到输16分,很多人忽略了一点有个人多打了12分钟在勇士vs凯尔特人的总决赛G2战中,勇士凭借第三节的单节赢21分一举打花比赛,库里三节打卡下班,最终勇士大胜凯尔特人19分,把系列赛扳成11平,此战的大胜让勇士恢复了信心,本以为G总决赛三打五!怎么会赢?勇士接下来该怎么办?一文给你聊透勇士G3输球,没有意外!12落后已经被动,但更麻烦的是,如果勇士再不改变,将极有可能带着13的大比分回到金州,届时将更加棘手!现在的勇士问题很大,急需改变。那到底怎么改?我们先简单NBA新赛制遭詹姆斯全盘否定!除非奖励1000万美元,肖华彻底怒了NBA最近透露了一个消息,新赛季联盟或许会考虑缩短常规赛的赛程,但是与此同时会准备插入一个季中总冠军,而这个总冠军除了能够拿到奖杯的荣誉之外,联盟还考虑给球员还有教练组都发放现金,U23亚洲杯8强出炉!决赛预演诞生日本PK韩国,越南晋级4强有戏北京时间6月9日晚上,U23亚洲杯最后一轮小组赛继续进行,日本队30战胜塔吉克斯坦队,以及沙特队20击败阿联酋队,日本队和沙特队携手出线。至此过后,本届U23亚洲杯8强球队全部出炉
小米霸气占榜,5个纬度性价比机型排行榜,拿下3个第一说到手机性价比,大家都会不约而同的想到小米手机,特别是小米旗下的Redmi手机,没错小米就是手机中的性价比之王,从8月份手机性价比排行榜也可以看出,小米手机性价比是无敌的,5个不同又一家芯片企业德明利杀入触摸屏市场,主攻中大屏近日刚上市不久的存储主控芯片企业德明利(SZ001309)在半年报中表示,公司已在人机交互触控领域完成初步业务布局,目前,公司已完成自研触摸控制芯片投片,并在此基础上形成针对不同应盘点三款适合女孩子使用的笔记本电脑,不玩游戏只办公很多数码博主都会给男生推荐电脑,但很少有给女生推荐的。男女生使用电脑的习惯是不同的,我相信学生时代的男生,买一款电脑的目的有很多都在玩游戏上,而女生就并非如此。所以,借此机会给女孩手机进行直连卫星的时代?没有意外!华为和苹果两家将前后脚发布新手机,而新手机的直连卫星的能力备受瞩目。按照现在流传的信息,华为手机将发布捅破天的技术,而苹果也将随后推出手机的卫星通信能力。华为手机将率先支环形战争主线12怎么打边境沼泽北通关攻略环形战争主线12边境沼泽北通关攻略流浪骑士与阔剑兵互换位置,阔剑兵移动至草丛,流浪骑士移动至草丛一站位流浪骑士与阔剑兵互换位置二第一回合阔剑兵移动至草丛流浪骑士移动至草丛长弓手移动橘右京修罗皮肤手感最好?感受枫霜尽之后,玩家直呼真香苦瓜原创,翻版必究!苦瓜电竞让你体验不一样的电竞主播圈!对于王者荣耀玩家来说,每一次峡谷有新皮肤到来的时候,总是能够掀起一波热度,特别是品质优秀的皮肤,热度都是成倍的。这不,这一次助力高产!科学家解析玉米株高关键基因中国农业科学院生物技术研究所玉米功能基因组团队和作物代谢调控与营养强化团队合作研究,构建出首个玉米全节间时空特异转录调控网络,发掘和解析了关键基因CYP90D1调控玉米节间发育的分科学家成功将塑料变成钻石文李木子科学家用强大的激光冲击波制造出小钻石。图片来源Shutterstocktonkid用强大的激光对塑料进行爆破可以产生微小的钻石。在行星内部高温高压环境下也可能发生类似的过程新突破!中国科学家展示新型阿托秒尺度条纹方法提供相干HH脉冲对和TH探头脉冲的干涉仪。图片来源超快科学理化学研究所先进光子学中心和东京大学的研究小组开发了一种新型干涉仪,用于解析由阿托秒脉冲的光学干扰和物质中电子态的量子干扰融入大自然城市新空间来源人民网人民日报数据来源北京市朝阳区园林绿化局北京奥林匹克公园位于北京市朝阳区,地处城市中轴线北延长线。图为从空中俯瞰北京奥林匹克公园。本报记者雷声摄北京市朝阳区大望京科技商务创科学家或已破解灯塔水母永生之谜目前人类所知,只有一种名为T。dohrnii的特殊灯塔水母能够永生不死。在最新研究中,科学家将其基因与其它水母进行比对,并从中发掘其长生不老的秘密。几千年来,长生不老一直是许多人生
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网