范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

万字长文带你吃透SpringCloudGateway工作原理动态路由源码解析

  Spring Cloud Gateway
  Spring Cloud 2.x 实 现 了 社 区 生 态 下 的 Spring CloudGateway(简称SCG)微服务网关项目。Spring Cloud Gateway基于WebFlux框架开发,目标是替换掉Zuul。  Spring Cloud Gateway概述
  Spring Cloud Gateway主要有两个特性:
  ①非阻塞,默认使用RxNetty作为响应式Web容器,通过非阻塞方式,利用较少的线程和资源来处理高并发请求,并提升服务资源利用的可伸缩性。
  ②函数式编程端点,通过使用Spring WebFlux的函数式编程模式定义路由端点,处理请求。
  Spring Cloud Gateway可与Eureka、Ribbon、Hystrix等组件配合使用,基于Spring 5的Reactor和Spring Boot 2构建,使用Netty作为底层通信框架,支持异步非阻塞编程模型和响应式编程框架,解决了Zuul框架的I/O阻塞问题和线程收敛问题。使用Spring WebFlux框架可以使Spring Cloud Gateway在高并发场景下具有更好的性能表现,占用更少的资源。
  下面是Spring Cloud官方对Spring Cloud Gateway特征的介绍。
  ● 基于Spring Framework 5、Reactor和Spring Boot 2.0框架。
  ● 根据请求的属性可以匹配对应的路由。
  ● 集成Hystrix。
  ● 集成Spring Cloud DiscoveryClient。
  ● 把易于编写的Predicates和Filters作用于特定路由。
  ● 具备一些网关的高级功能,如动态路由、限流、路径重写。
  对于微服务网关来说,最核心的特征包括路由和过滤器机制。从功能特性上来看,Spring Cloud Gateway和Zuul具备相似的特性。它们都可以集成Hystrix、Ribbon负载均衡及Spring Cloud的现有组件来实现附加功能。而且Spring Cloud Gateway的本质特性还体现在底层的通信框架上,它可以基于Netty的I/O多路复用和事件响应机制来实现网络通信;它的另外一大特性就是使用Spring Framework 5的响应式编程模型,允许通过Spring WebFlux实现异步非阻塞特性,在性能和资源利用率上,都有了质的提升。在编程范式上,Spring CloudGateway使用函数式编程模式。官方提供的Spring Cloud Gateway的架构图如下所示。
  Spring Cloud Gateway的核心概念
  简单说明一下架构图中的三个术语。
  ● Filter(过滤器):和Zuul的过滤器在概念上类似,可以使用Filter拦截和修改请求,实现对上游的响应,进行二次处理,实现横切与应用无关的功能,如安全、访问超时设置、限流等功能。
  ● Route(路由):网关配置的基本组成模块,和Zuul的路由配置模块类似。一个Route模块由一个ID、一个目标URI、一组断言和一组过滤器组成。如果断言为真,则路由匹配,目标URI会被访问。
  ● Predicate(断言):Predicate来自Java 8的接口,它可以用来匹配来自HTTP请求的任何内容,例如headers或参数。接口包含多种默认方法,并将Predicate组合成复杂的逻辑(与、或、非),可以用于接口参数校验、路由转发判断等。
  Spring Cloud Gateway的接入和配置
  Spring Cloud Gateway依赖Spring WebFlux提供的Netty运行时环境,所以Spring Boot必须是2.0或者以上版本。基本的Spring Cloud环境配置确认后,主要的接入步骤如下。
  1.Maven依赖引入
  2.路由配置方式一:配置文件方式
  各字段含义如下。
  ● id:自定义的路由ID,保持唯一。
  ● uri:目标服务地址。
  ● predicates:路由条件,Predicate接受一个输入参数,返回一个布尔值结果。
  ○ 第一个Predicate基于URL的方式。配置文件的第一个路由的配置采用URL方式,配置了一个ID为url-proxy-1的URI代 理 规 则 。 路 由 的 规 则 为 : 当 访 问 地 址 为http://localhost:8080/csdn/1.jsp时,会路由到上游地址https://localhost:8010/1.jsp。○ 第二个Predicate基于服务ID发现的方式。配置文件的第二个路由的配置采用与注册中心相结合的服务发现方式,与单个URI的路由配置相比,区别其实很小,仅在于URI的schema协议不同。单个URI地址的schema协议,一般为HTTP或者HTTPs协议。
  3.基于代码DSL方式的路由配置接入
  路由转发功能同样可以通过代码来实现,我们可以在启动类GatewayApplication中添加customRouteLocator方法来定制转发规则,代码如下:
  Spring Cloud Gateway的工作原理
  客户端向Spring Cloud Gateway发出HTTP请求后,如果GatewayHandlerMapping 确 定 请 求 与 路 由 匹 配 , 则 将 其 发 送 到 GatewayWebHandler。WebHandler通过该请求的特定过滤器链处理请求。过滤器 可 以 在 发 送 代 理 请 求 之 前 或 之 后 执 行 逻 辑 。 在 Spring CloudGateway的执行流程中,首先执行所有"pre filter"逻辑,然后进行回源请求代理。在请求代理执行完后,执行"post filter"逻辑。在"pre"类型的过滤器中,可以实现参数校验、权限校验、流量监控、日志输出、协议转换等功能;在"post"类型的过滤器中,可以实现响应内容、响应头的修改,日志的输出、流量监控等功能。核心工作流程如下图所示。
  Predicate条件
  在Spring Cloud Gateway中,Spring利用Predicate的特性实现了各种路由匹配规则,通过Header、请求参数等不同条件来匹配对应的路由。
  我们来看Spring Cloud Gateway内置的几种Predicate的使用方法。
  在上述配置文件中,如果多种Predicates同时存在于同一个路由,请求必须同时满足所有条件才能被这个路由匹配。当一个请求满足多个路由的Predicate条件时,请求只会被首个成功匹配的路由转发。下面分别对不同规则的路由匹配进行解释。
  ● 通过请求路径匹配(Path Route Predicate)
  路由断言工厂接收一个参数,根据Path定义好的规则来判断访问的URI是否匹配。配置示例如下:
  如果请求路径符合要求,则此路由将匹配,例如/hello/1或者/hello/world。
  使用curl测试,命令行输入:
  经过测试发现,第一条和第二条命令可以正常获取页面返回值,最后一个命令报404错误,证明路由是通过指定路径来匹配的。
  ● 通过请求参数匹配(Query Route Predicate)
  路由断言工厂接收两个参数:一个必需的参数和一个可选的正则表达式。配置示例如下:
  在这样的配置中,只要请求中包含helloworld属性的参数即可匹配路由。使用curl测试,命令行输入:
  经过测试发现,只要请求中带有helloworld参数就会匹配路由,不带helloworld参数则不会匹配。还可以将Query的值以键值对的方式进行配置,这样在请求时会对属性值和正则表达式都进行匹配,键值对匹配后才会正确执行路由逻辑。
  在上述路由匹配中,请求中包含hello属性并且参数值是以world开头的、长度为三位的字符串,才会进行匹配和路由。使用curl测试,命令行输入:
  测试可以返回正确的页面代码。如果将hello的属性值改为ok,再次访问就会报404错误,证明路由需要匹配正则表达式才会进行路由。
  ● 通过请求方法匹配
  路由断言工厂接收一个参数,即需要匹配HTTP方法。通过POST、GET、PUT、DELETE等不同的请求方式来进行路由。
  使用curl测试(#curl默认以GET的方式去请求),命令行输入:
  测试返回页面代码,证明匹配到路由。
  我们再以POST的方式请求测试。
  返回404错误表示没有找到,证明没有匹配上路由。
  ● 通过Header属性匹配
  路由断言工厂接收两个参数,分别是请求头名称和正则表达式。
  Header Route Predicate和Cookie Route Predicate一样,也是接收2个参数:一个header的属性值和一个正则表达式。这个属性值和正则表达式匹配则执行。
  ● 通过Host路由匹配
  Spring Cloud Gateway 可 以 根 据 Host 名 进 行 匹 配 转 发 , HostRoute Predicate接收一组参数、一组匹配的域名列表。它通过参数中的主机地址作为匹配规则。
  使用curl测试,命令行输入:
  通过测试以上两种Host设置方式,均可匹配到host_route,去掉host参数则会报404错误。
  ● 时间匹配
  Predicate支持设置时间,在请求转发时,先判断这个时间与我们设置的时间,然后进行转发,所以又细分为设置时间后断言、设置时间前断言、设置时间之间断言。
  设置时间后断言:从After Route Predicate Factory中获取一个UTC时间格式的参数,当请求的当前时间在配置的UTC时间之后,则成功匹配,否则不能成功匹配。下面是实例配置:
  设置时间前断言:从Before Route Predicate Factory中获取一个UTC时间格式的参数,当请求的当前时间在配置的UTC时间之前,则成功匹配,否则不能成功匹配。下面是实例配置:
  设置时间之间断言:从Between Route Predicate Factory中获取一个UTC时间格式的参数,当请求的当前时间在配置的UTC时间之间,则成功匹配,否则不能成功匹配。下面是实例配置:
  ● 通过Cookie匹配
  Cookie路由断言会取两个参数,一个是Cookie name,一个是正则表达式,路由规则是通过获取的对应Cookie name值和正则表达式进行匹配,如果匹配上就会执行路由,如果没有匹配上则不执行。
  ● 通过IP地址匹配
  RemoteAddr Route Predicate Factory配置一个IPv4或者IPv6网段的字符串或者IP地址。当请求的IP地址在网段之内或者与配置的IP地址相同,匹配成功,则进行转发,否则不进行转发。
  可以将curl localhost:8080设置为本机的IP地址进行测试,如果请求的远程地址是192.168.1.30,则此路由将匹配。
  GatewayFilter与GlobalFilter
  Spring Cloud Gateway 中 有 两 种 Filter , 一 种 是GlobalFilter(全局过滤器),一种是GatewayFilter。GlobalFilter默认对所有路由有效,GatewayFilter需要通过路由分组指定。
  GlobalFilter接口与GatewayFilter具有相同的签名,是有条件地应用于所有路由的特殊过滤器。
  当请求进入路由匹配逻辑时,Web Handler会将GlobalFilter的所有实例和所有GatewayFilter路由特定实例添加到Filter Chain组件。Filter组合执行的顺序由Ordered接口决定,可以通过getOrder方法或使用@Order注释来设置。Spring Cloud Gateway通过执行过滤器将逻辑分为"前置"和"后置"阶段,优先级较高的前置过滤器会优先被执行,而优先级较高的后置过滤器的执行顺序正好相反,最后执行。
  GatewayFilter Factories
  过滤器允许以某种方式修改传入的HTTP请求或返回的HTTP响应。
  过滤器的作用域是某些特定路由。Spring Cloud Gateway包括许多内置的过滤器工厂。
  ● 实现前缀修改(增加前缀、去掉前缀)
  PrefixPathGatewayFilterFactory及StripPrefixGatewayFilterFactory 是 一 对 处 理 请 求 URL 的 前 缀 的Filter工厂,前者添加前缀,后者去除前缀。
  配置文件application.yml如下:
  ○ PrefixPathGatewayFilterFactory允许你在对应的路由请求前增加前缀。例如实例配置中的请求/hello,最后转发到目标服务的路径变为/mypath/hello。
  ○ StripPrefixGatewayFilterFactory允许你在对应的路由请求前去除前缀,例如实例配置中的请求/name/bar/foo,去除前面两个前缀后,最后转发到目标服务的路径为/foo。
  ● 实现请求头内容添加和改写
  AddRequestHeader GatewayFilter Factory采用一对名称和值作为参数,配置文件application.yml如下:
  对于所有匹配的请求,将在向下游请求的头内容中添加xrequest-foo:bar header。
  ● 实现请求体内容添加和改写
  AddRequestParameter GatewayFilter Factory采用一对名称和值作为参数,配置参数application.yml如下:
  对于所有匹配的请求,将向下游请求添加foo=bar查询字符串。
  ● 实现熔断降级
  Hystrix GatewayFilter允许向网关路由引入Hystrix,保护服务不受级联故障的影响,并允许在下游故障时提供fallback响应。要在项 目 中 启 用 Hystrix 网 关 过 滤 器 , 需 要 向 Hystrix 的 依 赖 HystrixGatewayFilter Factory添加一个name参数,即HystrixCommand的名称,配置文件application.yml如下:
  当调用hystrixfallback时,将转发到/incaseoffailureusethis。注意,这个示例还演示了通过目标URI上的"lb"前缀使Spring Cloud Netflix Ribbon客户端实现负载均衡。主要场景是网关应用程序中的内部控制器或处理程序使用fallbackUri,它也可以将请求重新路由到外部应用程序中的控制器或处理程序。
  ● 分布式限流
  SpringCloudGateway内置的RequestRateLimiterGatewayFilterFactory提供限流的能力,基于令牌桶算法实现。目前它内置的RedisRateLimiter,依赖Redis来存储限流配置和统计数据。当然你也可以实现自己的RateLimiter,只需实现Spring Cloud Gateway 自 带 的 RateLimiter 接 口 或 者 继 承AbstractRateLimiter。
  首先,添加Maven依赖。
  其次,添加限流配置。
  最后,完成对Path的KeyResolver(可以通过KeyResolver来指定限流的Key),实现对特定Path下的限流控制配置。在过滤器中可以配置一个可选的KeyResolver,KeyResolver在配置中根据名称使用SpEL引用Bean。#{@myKeyResolver}是引用名为"pathKeyResolver"的Bean的SpEL表达式。KeyResolver接口允许使用可插拔策略来派生限制请求的Key。代码如下:
  Spring Cloud Gateway的动态路由
  下面介绍基于Spring Cloud Gateway的动态路由实现(相关代码将会随书附带),实现方式与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中的List predicates策略集合,以键值对的形式对应断言策略。
  ● filters:对应RouteDefinition中的Listfilters集合,以键值对的形式对应过滤器策略。
  ● uri:对应后端服务,可以是后端服务的ServiceID,也可以是服务的URL地址,与路由策略对应。
  ● groupname:标识这个新建的路由归属在哪个网关集群下面。
  其次,Spring Cloud Gateway的动态路由管理策略都通过Admin接收对网关路由的增删改查命令,然后通过RouteAsynchService将路由更新服务并发布到对应的网关节点,网关节点从数据库动态获得最新的路由状态,更新缓存和当前路由。下面对网关节点的事件监听机制进行讲解。
  说明1#:在代码段中,refreshRoute方法是事件监听的入口方法,该方法会向Admin管理服务暴露一个REST服务。当Admin对路由进行更改后,会调用refreshRoute方法,触发Spring Cloud Gateway自带的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完成断言的模式匹配转换。Predicate-Definition是断言的模型定义,定义name为Key、args为Value。举例如下:
  GatewayPredicateDefinitionFactory完成过滤器的模式匹配转换。FilterDefinition是过滤器的模型定义,定义name为Key、args为Value。举例如下:
  Spring Cloud Gateway源码解析
  启动Spring Cloud Gateway,需要依赖官方的Starter组件。下面我们从Maven依赖开始,对Spring Cloud Gateway的源码进行解析。
  初始化加载
  上述是spring-cloud-starter-gateway启动前需要引用的一个自动配置Starter,可以通过查询该Starter的源码发现Spring CloudGateway的实现所依赖的组件,Maven配置如下:
  可 以 看 到 Spring Cloud Gateway 的 Starter 启 动 类 主 要 依 赖spring-cloud-gateway-core组件。使用EnableAutoConfiguration注解完成自动配置初始化信息,我们在Spring Cloud Gateway下的spring.factories(在包spring-cloud-gateway-core)声明文件如下:
  GatewayAutoConfiguration
  说明:
  GatewayAutoConfiguration配置是Spring Cloud Gateway的核心配置类,初始化如下组件:
  ● NettyConfiguration
  ●GlobalFilter( AdaptCachedBodyGlobalFilter、RouteToRequestUrlFilter、 ForwardRoutingFilter、ForwardPathFilter、WebsocketRoutingFilter、WeightCalculatorWebFilter等)
  ● FilteringWebHandler
  ● GatewayProperties
  ● PrefixPathGatewayFilterFactory
  ● RoutePredicateFactory
  ● RouteDefinitionLocator● RouteLocator
  ● RoutePredicateHandlerMapping(查找匹配到的Route并进行处理)
  ● GatewayWebfluxEndpoint(管理网关的HTTP API)
  HTTP请求路由源码分析
  Spring Cloud Gateway中使用HandlerMapping对请求的链接进行解析,匹配对应的Route,转发到对应的服务。下图为整个请求的流程 , 用 户 请 求 先 通 过 DispatcherHandler 找 到 对 应 的GatewayHandlerMapping,再通过GatewayHandlerMapping解析匹配到的Handler;Handler处理完后,经过Filter处理,最终将请求转发到后端服务。
  在前面的动态路由加载过程中,其实已经贯穿了整个HTTP请求的调用链路,具体如下:
  请求先由DispatcherHandler进行处理,DispatcherHandler在初始化时会在Spring IoC容器中查找实现HandlerMapping接口的实现类 。 然 后 保 存 到 内 部 变 量 handlerMappings 数 据 结 构 中 。
  DispatcherHandler 调 用 handler 方 法 迭 代 handlerMappings 中 的HandlerMapping接口,主要源码如下:
  AbstractHandlerMapping 在 getHandler 方 法 中 封 装 了CORS(Cross-Origin Resource Sharing,跨域资源共享)。因为所有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的基础觉得文章不错的朋友可以转发此文关注小编;感谢大家的支持!

年产20亿颗!她把一个市井小吃做成流量爆品她从小幻想一柄长剑一匹快马喝着雪花勇闯天涯,毕业却发现,剑未佩妥,出门已是江湖。她用5年时间,为各类上市公司做财务分析,最终得出结论,这些公司,可真有钱。她涉足投资领域,见过各式各人民币汇率破7,如何看?当前在全球主要货币都对美元大幅贬值的前提下,人民币对美元汇率的适度贬值有助于维持人民币有效汇率的平稳,没有必要死扛。9月16日,10年期中美利差倒挂至74个基点,人民币汇率的贬值压北溪管道被破坏,对我们国内钢市有何影响?北溪管道被破坏,还不知道谁干的,北约乌克兰美国俄罗斯中东,都有可能,都不好说,谁都有干的动力,咱先不管它。北溪管道那么,管道被破坏,第一影响就是,石油天然气会涨。第二影响,美国的降太突然!联合国紧急呼吁,欧美股市集体暴拉,美联储要转向?华尔街最大空头发声,反弹能持续多久?幸福来得太突然!在经历了黑色9月之后,周二,全球股市再度上演狂欢。欧洲股市大幅反弹超3,美股盘前期指亦是全线大涨,美股开盘后三大指数均涨超2,大宗商品非美货币国债等集体大反攻。那么新车26。98万元起售,座椅记忆功能回归!2023款奔驰B级到店文懂车帝原创付博懂车帝原创产品一周前,2023款奔驰B级车正式上市,新车售价区间为26。9828。38万元。配置方面,新车此次配置调整增加了后视镜组件,智能手机互联系统以及带记忆功我国港口稳定运行畅通物流大动脉来源央视网央视网消息眼下正是传统外贸进出口旺季,在各大港口,随处可见繁忙有序的作业场景。交通运输部数据显示,今年18月,我国港口货物吞吐量完成102。5亿吨,同比持平集装箱吞吐量1那些为女性发声的品牌NEIWAI内外是中国贴身衣物生活方式品牌。2022年3月,NEIWAI内外发布年度品牌大片NOBODYISNOBODY身心之路,见微知著,通过记录30位女性真实的身体和勇敢的心没六爷爷我总会做一个梦,梦里六爷爷胸腔发出呵嘶呵嘶的声音,坐在我家老房子的炕沿边,不说话,慈祥地看着我。他的身边放着他编的精致的小筐子,里面有草药。在村子里与六爷爷有关的一切,那些记忆因为智慧的人,少争执富兰克林说,傻瓜的心,在嘴里聪明人的嘴,在心里。年少时,谁又不曾是个傻瓜呢,直言直语,常与人争执对错,心里想着为了别人好,总要争理和对错。殊不知,进入社会和工作后,争执的个性会给自福不双至,祸不单行文文军常言道福不双至,祸不单行!讲的是人生无常,祸福相依的世事规律。福报的到来,通常是我们期待之中的某一件事情,适时到来令人感到幸福,即是令人珍惜的福不双至。祸害之事的到来却总是突每日省思千万不要把对方的包容当成你放纵的理由头条创作挑战赛人的性格形形色色,但正是因为存在着差异,这个世界才会如此的多彩多姿。当性格迥异的两个人相遇并结合,这是一件令人欣羡的事情,即使偶尔会出现磨合,只要彼此包容着对方,这段
浙商郑永刚接班之争,家庭恩怨暴露商业领袖之路浙商郑永刚接班之争,家庭恩怨暴露商业领袖之路近日,浙江省知名企业家郑永刚因病逝世的消息在业内外引发强烈关注。作为创立了浙江卫视金华市开发区等多个地方的浙商代表人物,郑永刚早在生前就连诗雅陈家乐晒过大礼,金银首饰堆满地超豪气,女方有20多位前任港圈艺人陈家乐和连诗雅将于下月24日举办婚礼。此前在出席活动的时候,陈家乐曾表示婚礼已经筹备得七七八八,伴郎和伴娘的人选也已经准备好了。3月26日,陈家乐和连诗雅在社交平台分享了一4月22日,刘若英演唱会在光谷举行4月22日(周六),刘若英2023飞行日巡回演唱会将在光谷国际网球中心举行。3月26日1300起,演唱会门票在大麦全面预售。在音乐上,此次演唱会邀请金曲奖最佳单曲制作人与编曲得主陈chatgpt璀璨星途!揭晓最美十大影星,她们是你心目中的女神吗?在荧幕前,我们总是为那些美丽动人的女神而痴迷。她们用自己的才华和美貌俘获了无数观众的心。今天,我们就要为大家盘点一下那些让人瞩目的最美十大影星!这些女神是否与你心目中的偶像不谋而合湖南司法救助协作,为困难妇女儿童构建避风港视频加载中华声在线3月24日讯(全媒体记者杨昱通讯员肖文婕)3月24日,省人民检察院省妇联就困难妇女儿童司法救助工作协作机制签约,加大检察机关办理司法救助案件过程中对困难妇女儿童的论历史周期律历史周期律是指世界上任何一个国家的政权都会经历兴衰治乱,往复循环呈现出的周期性现象。极端的不公导致社会的崩溃,从而达到新的相对公平,周而复始。为什么大多朝代都跳不出历史周期律?先理突发!缅泰边境爆发激战,口岸紧急关闭缅泰边境消息,今天(3月25日)凌晨,克伦邦妙瓦底边贸区政府军驻军,遭到了民族武装联军的攻击。从当地居民处得知,受战事影响,连接妙瓦底与泰国美索的口岸已经临时关闭。截止到今天上午,英国遭遇干旱草枯叶落,盛夏宛若深秋中国生物多样性保护与绿色发展基金会(简称中国绿发会,绿会)作为联合国防治荒漠化公约的观察员机构,持续关注全球范围内荒漠化干旱以及防治荒漠化和对抗干旱方面的最新动态和资讯。近日,中国中国助沙伊和解,有一国总统访阿联酋,沙漠玫瑰再次绽放引言在中国全力斡旋下,中东两大国沙特与伊朗,这对二十年宿敌,终于实现了和解。沙特与伊朗握手言和,使世界各国饱受战争之苦的人民,看到了重回岁月静好的希望。于是,有识之士,纷纷开始思考硬科技投资领航者她是上海交大高材生,从事金融行业20年,曾主导湖北省知名民营银行成功筹建,如今执掌近60亿基金管理公司。她有着金融职场女性特有的气质,温婉大方干练豁达。通过金融这扇窗,她逐渐练就了300亿市值蒸发,资讯界拼多多跌倒文王崭编辑斯问下沉市场的流量有多香,曾经的下沉三巨头可能最有体会。拼多多快手和趣头条有着类似的起点下沉市场起家,创始人都在用着精英的身份做着草根的生意,也充分尝到了五环外市场的甜头