游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

万字长文带你吃透SpringCloudGateway工作原理

  SpringCloudGateway
  SpringCloud2。x实现了社区生态下的SpringCloudGateway(简称SCG)微服务网关项目。SpringCloudGateway基于WebFlux框架开发,目标是替换掉Zuul。SpringCloudGateway概述
  SpringCloudGateway主要有两个特性:
  非阻塞,默认使用RxNetty作为响应式Web容器,通过非阻塞方式,利用较少的线程和资源来处理高并发请求,并提升服务资源利用的可伸缩性。
  函数式编程端点,通过使用SpringWebFlux的函数式编程模式定义路由端点,处理请求。
  SpringCloudGateway可与Eureka、Ribbon、Hystrix等组件配合使用,基于Spring5的Reactor和SpringBoot2构建,使用Netty作为底层通信框架,支持异步非阻塞编程模型和响应式编程框架,解决了Zuul框架的IO阻塞问题和线程收敛问题。使用SpringWebFlux框架可以使SpringCloudGateway在高并发场景下具有更好的性能表现,占用更少的资源。
  下面是SpringCloud官方对SpringCloudGateway特征的介绍。
  基于SpringFramework5、Reactor和SpringBoot2。0框架。
  根据请求的属性可以匹配对应的路由。
  集成Hystrix。
  集成SpringCloudDiscoveryClient。
  把易于编写的Predicates和Filters作用于特定路由。
  具备一些网关的高级功能,如动态路由、限流、路径重写。
  对于微服务网关来说,最核心的特征包括路由和过滤器机制。从功能特性上来看,SpringCloudGateway和Zuul具备相似的特性。它们都可以集成Hystrix、Ribbon负载均衡及SpringCloud的现有组件来实现附加功能。而且SpringCloudGateway的本质特性还体现在底层的通信框架上,它可以基于Netty的IO多路复用和事件响应机制来实现网络通信;它的另外一大特性就是使用SpringFramework5的响应式编程模型,允许通过SpringWebFlux实现异步非阻塞特性,在性能和资源利用率上,都有了质的提升。在编程范式上,SpringCloudGateway使用函数式编程模式。官方提供的SpringCloudGateway的架构图如下所示。
  SpringCloudGateway的核心概念
  简单说明一下架构图中的三个术语。
  Filter(过滤器):和Zuul的过滤器在概念上类似,可以使用Filter拦截和修改请求,实现对上游的响应,进行二次处理,实现横切与应用无关的功能,如安全、访问超时设置、限流等功能。
  Route(路由):网关配置的基本组成模块,和Zuul的路由配置模块类似。一个Route模块由一个ID、一个目标URI、一组断言和一组过滤器组成。如果断言为真,则路由匹配,目标URI会被访问。
  Predicate(断言):Predicate来自Java8的接口,它可以用来匹配来自HTTP请求的任何内容,例如headers或参数。接口包含多种默认方法,并将Predicate组合成复杂的逻辑(与、或、非),可以用于接口参数校验、路由转发判断等。
  SpringCloudGateway的接入和配置
  SpringCloudGateway依赖SpringWebFlux提供的Netty运行时环境,所以SpringBoot必须是2。0或者以上版本。基本的SpringCloud环境配置确认后,主要的接入步骤如下。
  1。Maven依赖引入
  2。路由配置方式一:配置文件方式
  各字段含义如下。
  id:自定义的路由ID,保持唯一。
  uri:目标服务地址。
  predicates:路由条件,Predicate接受一个输入参数,返回一个布尔值结果。
  第一个Predicate基于URL的方式。配置文件的第一个路由的配置采用URL方式,配置了一个ID为urlproxy1的URI代理规则。路由的规则为:当访问地址为http:localhost:8080csdn1。jsp时,会路由到上游地址https:localhost:80101。jsp。第二个Predicate基于服务ID发现的方式。配置文件的第二个路由的配置采用与注册中心相结合的服务发现方式,与单个URI的路由配置相比,区别其实很小,仅在于URI的schema协议不同。单个URI地址的schema协议,一般为HTTP或者HTTPs协议。
  3。基于代码DSL方式的路由配置接入
  路由转发功能同样可以通过代码来实现,我们可以在启动类GatewayApplication中添加customRouteLocator方法来定制转发规则,代码如下:
  SpringCloudGateway的工作原理
  客户端向SpringCloudGateway发出HTTP请求后,如果GatewayHandlerMapping确定请求与路由匹配,则将其发送到GatewayWebHandler。WebHandler通过该请求的特定过滤器链处理请求。过滤器可以在发送代理请求之前或之后执行逻辑。在SpringCloudGateway的执行流程中,首先执行所有prefilter逻辑,然后进行回源请求代理。在请求代理执行完后,执行postfilter逻辑。在pre类型的过滤器中,可以实现参数校验、权限校验、流量监控、日志输出、协议转换等功能;在post类型的过滤器中,可以实现响应内容、响应头的修改,日志的输出、流量监控等功能。核心工作流程如下图所示。
  Predicate条件
  在SpringCloudGateway中,Spring利用Predicate的特性实现了各种路由匹配规则,通过Header、请求参数等不同条件来匹配对应的路由。
  我们来看SpringCloudGateway内置的几种Predicate的使用方法。
  在上述配置文件中,如果多种Predicates同时存在于同一个路由,请求必须同时满足所有条件才能被这个路由匹配。当一个请求满足多个路由的Predicate条件时,请求只会被首个成功匹配的路由转发。下面分别对不同规则的路由匹配进行解释。
  通过请求路径匹配(PathRoutePredicate)
  路由断言工厂接收一个参数,根据Path定义好的规则来判断访问的URI是否匹配。配置示例如下:
  如果请求路径符合要求,则此路由将匹配,例如hello1或者helloworld。
  使用curl测试,命令行输入:
  经过测试发现,第一条和第二条命令可以正常获取页面返回值,最后一个命令报404错误,证明路由是通过指定路径来匹配的。
  通过请求参数匹配(QueryRoutePredicate)
  路由断言工厂接收两个参数:一个必需的参数和一个可选的正则表达式。配置示例如下:
  在这样的配置中,只要请求中包含helloworld属性的参数即可匹配路由。使用curl测试,命令行输入:
  经过测试发现,只要请求中带有helloworld参数就会匹配路由,不带helloworld参数则不会匹配。还可以将Query的值以键值对的方式进行配置,这样在请求时会对属性值和正则表达式都进行匹配,键值对匹配后才会正确执行路由逻辑。
  在上述路由匹配中,请求中包含hello属性并且参数值是以world开头的、长度为三位的字符串,才会进行匹配和路由。使用curl测试,命令行输入:
  测试可以返回正确的页面代码。如果将hello的属性值改为ok,再次访问就会报404错误,证明路由需要匹配正则表达式才会进行路由。
  通过请求方法匹配
  路由断言工厂接收一个参数,即需要匹配HTTP方法。通过POST、GET、PUT、DELETE等不同的请求方式来进行路由。
  使用curl测试(curl默认以GET的方式去请求),命令行输入:
  测试返回页面代码,证明匹配到路由。
  我们再以POST的方式请求测试。
  返回404错误表示没有找到,证明没有匹配上路由。
  通过Header属性匹配
  路由断言工厂接收两个参数,分别是请求头名称和正则表达式。
  HeaderRoutePredicate和CookieRoutePredicate一样,也是接收2个参数:一个header的属性值和一个正则表达式。这个属性值和正则表达式匹配则执行。
  通过Host路由匹配
  SpringCloudGateway可以根据Host名进行匹配转发,HostRoutePredicate接收一组参数、一组匹配的域名列表。它通过参数中的主机地址作为匹配规则。
  使用curl测试,命令行输入:
  通过测试以上两种Host设置方式,均可匹配到hostroute,去掉host参数则会报404错误。
  时间匹配
  Predicate支持设置时间,在请求转发时,先判断这个时间与我们设置的时间,然后进行转发,所以又细分为设置时间后断言、设置时间前断言、设置时间之间断言。
  设置时间后断言:从AfterRoutePredicateFactory中获取一个UTC时间格式的参数,当请求的当前时间在配置的UTC时间之后,则成功匹配,否则不能成功匹配。下面是实例配置:
  设置时间前断言:从BeforeRoutePredicateFactory中获取一个UTC时间格式的参数,当请求的当前时间在配置的UTC时间之前,则成功匹配,否则不能成功匹配。下面是实例配置:
  设置时间之间断言:从BetweenRoutePredicateFactory中获取一个UTC时间格式的参数,当请求的当前时间在配置的UTC时间之间,则成功匹配,否则不能成功匹配。下面是实例配置:
  通过Cookie匹配
  Cookie路由断言会取两个参数,一个是Cookiename,一个是正则表达式,路由规则是通过获取的对应Cookiename值和正则表达式进行匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。
  通过IP地址匹配
  RemoteAddrRoutePredicateFactory配置一个IPv4或者IPv6网段的字符串或者IP地址。当请求的IP地址在网段之内或者与配置的IP地址相同,匹配成功,则进行转发,否则不进行转发。
  可以将curllocalhost:8080设置为本机的IP地址进行测试,如果请求的远程地址是192。168。1。30,则此路由将匹配。
  GatewayFilter与GlobalFilter
  SpringCloudGateway中有两种Filter,一种是GlobalFilter(全局过滤器),一种是GatewayFilter。GlobalFilter默认对所有路由有效,GatewayFilter需要通过路由分组指定。
  GlobalFilter接口与GatewayFilter具有相同的签名,是有条件地应用于所有路由的特殊过滤器。
  当请求进入路由匹配逻辑时,WebHandler会将GlobalFilter的所有实例和所有GatewayFilter路由特定实例添加到FilterChain组件。Filter组合执行的顺序由Ordered接口决定,可以通过getOrder方法或使用Order注释来设置。SpringCloudGateway通过执行过滤器将逻辑分为前置和后置阶段,优先级较高的前置过滤器会优先被执行,而优先级较高的后置过滤器的执行顺序正好相反,最后执行。
  GatewayFilterFactories
  过滤器允许以某种方式修改传入的HTTP请求或返回的HTTP响应。
  过滤器的作用域是某些特定路由。SpringCloudGateway包括许多内置的过滤器工厂。
  实现前缀修改(增加前缀、去掉前缀)
  PrefixPathGatewayFilterFactory及StripPrefixGatewayFilterFactory是一对处理请求URL的前缀的Filter工厂,前者添加前缀,后者去除前缀。
  配置文件application。yml如下:
  PrefixPathGatewayFilterFactory允许你在对应的路由请求前增加前缀。例如实例配置中的请求hello,最后转发到目标服务的路径变为mypathhello。
  StripPrefixGatewayFilterFactory允许你在对应的路由请求前去除前缀,例如实例配置中的请求namebarfoo,去除前面两个前缀后,最后转发到目标服务的路径为foo。
  实现请求头内容添加和改写
  AddRequestHeaderGatewayFilterFactory采用一对名称和值作为参数,配置文件application。yml如下:
  对于所有匹配的请求,将在向下游请求的头内容中添加xrequestfoo:barheader。
  实现请求体内容添加和改写
  AddRequestParameterGatewayFilterFactory采用一对名称和值作为参数,配置参数application。yml如下:
  对于所有匹配的请求,将向下游请求添加foobar查询字符串。
  实现熔断降级
  HystrixGatewayFilter允许向网关路由引入Hystrix,保护服务不受级联故障的影响,并允许在下游故障时提供fallback响应。要在项目中启用Hystrix网关过滤器,需要向Hystrix的依赖HystrixGatewayFilterFactory添加一个name参数,即HystrixCommand的名称,配置文件application。yml如下:
  当调用hystrixfallback时,将转发到incaseoffailureusethis。注意,这个示例还演示了通过目标URI上的lb前缀使SpringCloudNetflixRibbon客户端实现负载均衡。主要场景是网关应用程序中的内部控制器或处理程序使用fallbackUri,它也可以将请求重新路由到外部应用程序中的控制器或处理程序。
  分布式限流
  SpringCloudGateway内置的RequestRateLimiterGatewayFilterFactory提供限流的能力,基于令牌桶算法实现。目前它内置的RedisRateLimiter,依赖Redis来存储限流配置和统计数据。当然你也可以实现自己的RateLimiter,只需实现SpringCloudGateway自带的RateLimiter接口或者继承AbstractRateLimiter。
  首先,添加Maven依赖。
  其次,添加限流配置。
  最后,完成对Path的KeyResolver(可以通过KeyResolver来指定限流的Key),实现对特定Path下的限流控制配置。在过滤器中可以配置一个可选的KeyResolver,KeyResolver在配置中根据名称使用SpEL引用Bean。{myKeyResolver}是引用名为pathKeyResolver的Bean的SpEL表达式。KeyResolver接口允许使用可插拔策略来派生限制请求的Key。代码如下:
  SpringCloudGateway的动态路由
  下面介绍基于SpringCloudGateway的动态路由实现(相关代码将会随书附带),实现方式与Zuul的动态路由实现方式类似,具有比Zuul更加灵活的路由策略和匹配模式。这两种解决方案如下。
  通过SpringCloudGateway提供的GatewayControllerEndpointduan端点功能,实现路由的增删改查,或者自己实现ApplicationEventPublisherAware接口,实现自定义的路由操作方法。具体可以参考源码:GatewayControllerEndpointduan类。
  通过实现RouteDefinitionRepository接口,实现自定义的Repository类,实现从数据库或者缓存中动态加载路由信息的功能。架构模式与Zuul的动态路由采用相似的路由加载策略,架构流程图如下。
  动态路由思路及解决方案具体如下。
  首先,Admin作为前端管理界面,将用户对路由的添加、修改等操作通过RouteAsynchService存储到DB中。DB中的存储结构如下图所示。
  字段映射关系如下。
  routeid:标识路由的唯一ID,可以根据路由ID查找路由,路由ID不能重复。
  routename:应用名称是标识路由的别名,是非必选项。
  routeorder:对应RouteDefinition中的order属性。
  routestatus:路由状态,包括编辑、发布、下线等状态。
  strategy:路由策略,和Zuul的路由策略相似,也支持ServiceID策略和URL策略。
  predicates:对应RouteDefinition中的Listpredicates策略集合,以键值对的形式对应断言策略。
  filters:对应RouteDefinition中的Listfilters集合,以键值对的形式对应过滤器策略。
  uri:对应后端服务,可以是后端服务的ServiceID,也可以是服务的URL地址,与路由策略对应。
  groupname:标识这个新建的路由归属在哪个网关集群下面。
  其次,SpringCloudGateway的动态路由管理策略都通过Admin接收对网关路由的增删改查命令,然后通过RouteAsynchService将路由更新服务并发布到对应的网关节点,网关节点从数据库动态获得最新的路由状态,更新缓存和当前路由。下面对网关节点的事件监听机制进行讲解。
  说明1:在代码段中,refreshRoute方法是事件监听的入口方法,该方法会向Admin管理服务暴露一个REST服务。当Admin对路由进行更改后,会调用refreshRoute方法,触发SpringCloudGateway自带的RefreshRoutesEvent事件,同时设置原子布尔变量routedefine为true,在下面的动态路由加载中根据该原子布尔变量决定是从数据库中读取路由还是从缓存中读取路由。
  下面是定制化的核心路由动态加载和缓存管理的关键代码,主要通过实现自定义的路由Repository加载类来动态地加载路由,通过继承RouteDefinitionRepository父类来提供路由的配置信息,实现逻辑如下:
  说明2:在代码段中,SagRouteDefinationRepository是自定义的路由加载实现类,这个类实现了RouteDefinitionRepository接口。
  该接口的源码如下:
  然后,跟进getRouteDefinitions方法,它是RouteDefinitionRouteLocator的回调方法,可以实时更新路由信息,代码如下:
  从源码中调用链路追溯,可以发现下面的调用链路:
  说明3:在代码段中,refreshNeed()方法是判断缓存是否失效的标识原子布尔变量,当Admin回调1代码段中的刷新接口时,会将该失效接口打开。在路由加载时,如果refreshNeed为false并且routeDefinitions不为空,那么优先加载缓存中的路由信息。如果refreshNeed为true,那么优先执行加载数据库的操作,通过这段代码的逻辑处理就可以保证网关中路由的刷新效率和缓存与数据库中路由信息的同步。
  说明4:该代码段是从数据库中加载路由的核心实现。
  localteRoutefromDB()方法从数据库中加载路由,返回RouteDefinitionVo模型的数据库路由列表信息。下面是该模型类的代码:
  transfer()方法实现了从RouteDefinitionVo到RouteDefinition的类型转换,下面是transfer()方法调用的类型转换的核心代码:
  说明5:在代码段中,GatewayPredicateDefinitionFactory完成断言的模式匹配转换。PredicateDefinition是断言的模型定义,定义name为Key、args为Value。举例如下:
  GatewayPredicateDefinitionFactory完成过滤器的模式匹配转换。FilterDefinition是过滤器的模型定义,定义name为Key、args为Value。举例如下:
  SpringCloudGateway源码解析
  启动SpringCloudGateway,需要依赖官方的Starter组件。下面我们从Maven依赖开始,对SpringCloudGateway的源码进行解析。
  初始化加载
  上述是springcloudstartergateway启动前需要引用的一个自动配置Starter,可以通过查询该Starter的源码发现SpringCloudGateway的实现所依赖的组件,Maven配置如下:
  可以看到SpringCloudGateway的Starter启动类主要依赖springcloudgatewaycore组件。使用EnableAutoConfiguration注解完成自动配置初始化信息,我们在SpringCloudGateway下的spring。factories(在包springcloudgatewaycore)声明文件如下:
  GatewayAutoConfiguration
  说明:
  GatewayAutoConfiguration配置是SpringCloudGateway的核心配置类,初始化如下组件:
  NettyConfiguration
  GlobalFilter(AdaptCachedBodyGlobalFilter、RouteToRequestUrlFilter、ForwardRoutingFilter、ForwardPathFilter、WebsocketRoutingFilter、WeightCalculatorWebFilter等)
  FilteringWebHandler
  GatewayProperties
  PrefixPathGatewayFilterFactory
  RoutePredicateFactory
  RouteDefinitionLocatorRouteLocator
  RoutePredicateHandlerMapping(查找匹配到的Route并进行处理)
  GatewayWebfluxEndpoint(管理网关的HTTPAPI)
  HTTP请求路由源码分析
  SpringCloudGateway中使用HandlerMapping对请求的链接进行解析,匹配对应的Route,转发到对应的服务。下图为整个请求的流程,用户请求先通过DispatcherHandler找到对应的GatewayHandlerMapping,再通过GatewayHandlerMapping解析匹配到的Handler;Handler处理完后,经过Filter处理,最终将请求转发到后端服务。
  在前面的动态路由加载过程中,其实已经贯穿了整个HTTP请求的调用链路,具体如下:
  请求先由DispatcherHandler进行处理,DispatcherHandler在初始化时会在SpringIoC容器中查找实现HandlerMapping接口的实现类。然后保存到内部变量handlerMappings数据结构中。
  DispatcherHandler调用handler方法迭代handlerMappings中的HandlerMapping接口,主要源码如下:
  AbstractHandlerMapping在getHandler方法中封装了CORS(CrossOriginResourceSharing,跨域资源共享)。因为所有Handler都可能涉及CORS的处理,所以抽象类AbstractHandlerMapping提供了getHandlerInternal子类来实现查找Handler的具体方法。
  RoutePredicateHandlerMapping用于匹配具体的路由,并返回FilteringWebHandler。通过RoutePredicateHandlerMapping中的RouteLocator对象存储启动时加载的路由对象信息。当RoutePredicateHandlerMapping获取对应的路由时,会将Route信息存储到ServerWebExchanges属性中,然后返回实现了WebHandler接口的FilteringWebHandler。FilteringWebHandler是一个存放过滤器的Handler。
  调用RoutePredicateHandlerMapping的getHandlerInternal方法从RouteLocator获取路由,并存放在ServerWebExchange中,返回webFilter对象,代码如下:
  DispatcherHandler通过SimpleHandlerAdapter组件调用FilteringWebHandler模块的handler方法,FilteringWebHandler模块接着调用之前在容器中注册的所有Filter,处理完毕后返回Response,代码如下:
  小结
  构建响应式微服务可以获得异步、响应性、弹性、快速恢复、背压等系统特性,同时响应式微服务架构在资源占用、高并发、高吞吐、异步处理场景中具有更强的优势。目前响应式框架技术选型众多,如果将响应式编程应用到大规模生产系统中,则需要进行周密的调研,并对实际项目周期、人员经验、技术框架等因素进行综合权衡考虑,避免技术的复杂度问题成为业务发展过程中的瓶颈。本文给大家讲解的内容是响应式微服务架构,SpringCloudGateway工作原理动态路由源码解析下篇文章给大家讲解的内容是Kubernetes容器管理,Kubernetes的基础觉得文章不错的朋友可以转发此文关注小编;感谢大家的支持!

大结局了!再见西蒙斯!篮网热火商讨3换2交易,巴特勒联手欧文在接连输给缺少核心的76人和勇士后,热火队内发生了内讧,巴特勒和哈斯勒姆在板凳席上口吐芬芳,根据现场球迷晒出的视频,哈斯勒姆对着巴特勒喊到:什么?你想打架?我会打的你找不着北的……1979年,一份不起眼的报纸,揭开44年前瞿秋白被杀的真相1979年3月6日,一个73岁的老太太出现在了燕城监狱门口。在众人的搀扶下,她眼眶湿润,满脸激动。看着一份老报纸,她大声说道:我终于澄清冤屈了。这个老人究竟是谁?她为何会被逮捕……分析宠物销售市场,看袖虎如何养猫生财2018的时候,区块链、人工智能、新零售,都是投资人们的热门话题,给所有人都带来了丰厚的回报。但要想获得最大的利益,就必须要有一个好的时机。虽然经历了数次经济危机,但宠物经济并……世乒赛后再相遇,王曼昱孙颖莎零封倪夏莲组合,与早田伊藤争冠北京时间3月16日消息,2022年世界职业乒乓球大联盟(WTT)大满贯新加坡站进入到正赛第六日争夺。女双半决赛,世乒赛冠军王曼昱孙颖莎发挥出色,以3比0击败卢森堡组合倪夏莲德努……相信自己,一往无前,小米从创立至今背后的故事2023年的4月6日,是小米创立的第十三周年,是米粉节,也是众多米粉看着长大的13岁小米。在13年前的这一天,雷军和联合创始人喝了一碗小米粥,正式成立了小米公司,此后,小米就将……新款魏牌拿铁DHTPHEV申报图曝光外观全新设计【太平洋汽车新车频道】日前,在最新一期工信部目录中,我们获取到了新款魏牌拿铁DHTPHEV的申报信息,从申报图来看,新车采用了全新的家族式设计语言,采用了更为大胆前卫的外观设计……塔利班为何如此强悍?阿富汗为何会被称为帝国坟场?1747年,一位叫艾哈迈德的酋长,建立了阿富汗王国。阿富汗地处山区,地理位置非常复杂,各部落之间经常相互攻击,这也形成了部落之间的强悍,当号称日不落帝国的英军连续三次发动……陈延年党内不可多得的政治家陈延年是中国共产党早期的政治活动家、优秀的共产主义战士、中共江苏省委首任书记,五四运动后投身民族解放事业,1927年7月,他在国民党反动派的屠刀下英勇就义,年仅29岁。他难能可……朱元璋要求在城砖刻上名字,南乐好牌坊,大名好城墙邯郸头条旅游头条城墙是古代军事防御设施,由墙体和其它辅助军事设施构成的军事防线。为了保障质量,达到牢固坚不可摧,起到防御的作用,杜绝中饱私囊,朱元璋费尽心思,让每块砖都刻上生产……康熙24子,有着九子夺嫡,乾隆17子,为何没夺嫡之争?清朝康熙年间的九子夺嫡,可谓是中国历史上夺嫡之争的一个暗黑极致体现,它不同于玄武门之变那般,最后是兄弟之间兵戎相见自相残杀,造成残忍的流血事件,而是虽然没有出现流血事件,兄弟之……1974年浙江老汉刑满出狱后,蹬三轮车谋生,暴露身份后被国家2005年的芷江国际和平节迎来了一位特殊的来客,这个老人其貌不扬,衣着朴素,但是他的出现却引得当地的市政协和公安局公车列队欢迎?迎接的车队引起全市人民的关注。不少市民都纷……如果宝宝智力低下,会表现出什么症状?各位准父母们,首先不用太担心,智力底下的宝宝毕竟是少数,要相信自己的宝宝是最完美的。如果实在是担心的话,可以从以下两方面,宝宝出生前的产检筛查以及出生后的各项表现,看是否真的存……
蒋介石退守台湾是谁出的主意?之前谁在管理台湾?台湾,是中国领土不可分割的一部分,自古以来就有宝岛的美称。台湾位于中国东南沿海的大陆架上,虽然仅占了3。6万平方千米的土地,历史上却在此引发了无数的纷争。自从明清时期大批……丈夫被美国以间谍罪判刑,台湾妻子向中方求援,死后北京惊现墓碑1985年下旬某日,美国中情局办公室接到了一个秘密电话。神秘人对接线员说:让中情局局长接电话,我有机密情报只对他说。唯恐耽误情报,接线员将电话转给了中情局局长……尘埃落定!国足新帅诞生,带队冲亚洲杯世预赛,剑指2026世界随着李铁案的持续发酵,中国足坛如今的重点,已经全部放在了反腐扫黑上面。足协内多位高官接连被查,就连原足协主席陈戌源都已经被抓,成为了涉嫌严重违纪违法的嫌疑人。受此影响,国家队的……宋美龄心善全是表象?曾扬言要在大陆扔原子弹,蒋介石只是傀儡?宋美龄到底是个怎样的人,曾扬言要在大陆扔原子弹来扳回局势,如此心狠手辣的她为何被称为第一夫人,蒋员长对她更是百般依赖,甚至传言她才是幕后掌舵者,真实的宋美龄到底是怎样的?她又是……太后王娡秦汉历史人物评析之四十六生年不满百,常怀千岁忧。昼短苦夜长,何不秉烛游!东汉无名氏《古诗十九首生年不满百》节选一hr汉武帝刘彻的生母姓王名娡,槐里(刘邦改废丘为槐里,今陕西省兴平市东……甲午海战清军失利,是不是也有运气不好的因素呢?感谢邀请甲午战争海军运气确实比较差,你也可以理解为天佑倭寇。毕竟日本海军在战场上表现拉胯,但是很多细节几乎都有如神助一般。不沉的定远,来自于日本水兵三浦虎次郎临死前……5岁北漂9岁封神,征服数位大导演,张子枫靠的难道只是演技吗?在电影《唐山大地震》的发布会上。一众戏骨一一落座,唯独空下了最中间的C位没人敢坐。原来,这张椅子的主人早就被冯小刚安排给了9岁的张子枫。而他和陈道明一左一右,……慈禧的妹妹结婚以后为什么同姐姐关系不好?你怎么看?谢谢邀请!慈禧的妹妹婉贞在结婚以后姊妹关系不好,原因有两个:一是婉贞比慈禧长得漂亮,婉贞进宫远秀,没想到竟然落选,这是慈禧做了手脚,生怕婉贞入宫,因婉贞的漂亮,影响她的地位。这……不同价位的性价比机型,从中端到高端,看看有你在用的吗了解智能手机市场的小伙伴们应该都知道,不管是哪个价位的手机,都存在很激烈的竞争,市场上有很多品质不佳的劣质手机,令人眼花缭乱。如果你想选一款优质手机,第一可以向专业人士询问,第……夏明翰怒撕吴佩孚字屏,毛泽东为他当月老,牺牲后妻子守贞余生同志们曾说世上惟有家钧好,今日里才觉你是巾帼贤。我一生无愁无泪无私念,你切莫悲悲戚戚泪涟涟。张眼望,这人世,几家夫妻偕老有百年。抛头颅,洒热血,明翰早已视等闲。各取所需终有日,……清朝铁帽子亲王的世子袭爵为亲王后,其它的儿子们怎么办?清代宗室爵位奉行一子继承制,也就是只有一个儿子可以继承父亲的爵位,而其他的儿子被称为余子,在他们面前有两条路,一条路是参加考封,一条路是不参加考封。所谓考封,是清代皇族的……斯诺克世锦赛半决赛希奥会希金斯罕见失误崩盘,前三阶段火箭15斯诺克世锦赛半决赛奥沙利文PK希金斯第三阶段比赛奥沙利文5:3从而以总比分15:10进入休息,稍后再进行第四阶段的增夺。前两阶段,奥沙利文和希金斯手感都……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网