Spring Cloud 微服务开发:入门、进阶与源码剖析
本栏目通篇讲述了 Spring Cloud 的核心常用组件,如 Eureka、Feign、Ribbon、Hystrix、Zuul 等。
同时栏目书在核心组件的基础上,对服务的质量保证组件也做了讲解,如:配置中心、全链路监控以及 Spring Cloud Alibaba 贡献的生态进行了详细的阐述。
优惠券已抵扣
余额抵扣
还需支付
¥9.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
极客挖掘机
一个来自十八线城乡结合部破写代码的,平时喜欢读读书、写写代码,从2019年开始运营有自己的个人公众号:极客挖掘机,想交流的朋友可以来公众号找我聊天。
展开
-
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 通篇概述
前因后果关注小编的同学应该知道,小编去年和出版社约稿写过一本书,后面种种原因放弃掉最后的审校过程了,小编说过会把这本书发出来,这次选择了 CSDN 的平台也是因为能赚点小钱,价格也不贵,9.9 元,买不了吃亏买不了上当,不用担心小编烂尾或者书没写完(只是没有经过审校,可能错别字会有不少),全部内容统计将近 18w 字(未计算代码内容),预计一周发两篇到三篇左右的样子(不要问为啥不一周发十几篇,因...原创 2020-01-17 15:00:43 · 5776 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 14.4 本章小结
14.4 本章小结在本章中提出了微服务中分布式事务的问题,介绍了目前已有的两种解决思路,并且介绍了 Seata 的实现方案以及设计思路,是基于 XA 两阶段提交方式的一个改进版,对比原有的 XA 两阶段提交,提高了服务性能和降低了全局锁的时间,但是请各位读者注意一点,目前在 Seata v0.8.0 的版本中,Server端尚未支持集群部署,不建议应用于生产环境,并且开源团队计划在 v1.0.0...原创 2020-04-15 10:10:17 · 590 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 14.3 Spring Cloud Alibaba Seata 实战
14.3 Spring Cloud Alibaba Seata 实战14.3.1 目标介绍在本节,我们将通过一个实战案例来具体介绍Seata的使用方式,我们将模拟一个简单的用户购买商品下单场景,创建3个子工程,分别是 order-server (下单服务)、storage-server(库存服务)和 pay-server (支付服务),具体流程图如图14-15:14.3.2 环境准备在本...原创 2020-04-15 10:09:21 · 905 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 14.2 Spring Cloud Alibaba Seata 概述
14.2 Spring Cloud Alibaba Seata 概述上一节我们介绍了什么是分布式事务以及目前的一些设计方案存在的缺陷,本节我们介绍Spring Cloud Alibaba对分布式事务的解决方案——Spring Cloud Alibaba Seata。14.2.1发展历程2014 年,阿里中间件团队发布 TXC(Taobao Transaction Constructor),为...原创 2020-04-14 10:43:10 · 860 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 14.1 分布式事务概述
14.1 分布式事务概述在构建微服务的过程中,不管是使用什么框架、组件来构建,都绕不开一个问题,跨服务的业务操作如何保持数据一致性。14.1.1 什么是分布式事务?首先,设想一个传统的单体应用,无论多少内部调用,最后终归是在同一个数据库上进行操作来完成一向业务操作,如图14-1:随着业务量的发展,业务需求和架构发生了巨大的变化,整体架构由原来的单体应用逐渐拆分成为了微服务,原来的3个服务...原创 2020-04-12 15:14:31 · 787 阅读 · 1 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 13.4 本章小结
13.4 本章小结本章我们介绍了Dubbo Spring Cloud的一些基本使用操作,介绍了RPC和HTTP的一些优劣势以及性能方面的差距,如果是在系统之间做内部调用的时候可以使用RPC调用,毕竟性能更高,消耗更小,同时如果需要像系统外部提供接口,Dubbo Spring Cloud一样支持提供REST API,无需增加新的封装层或者代理层。希望各位读者在阅读本章节后可以依据具体业务场景合理选...原创 2020-04-12 15:13:46 · 530 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 13.3 Dubbo Spring Cloud HTTP
13.3 Dubbo Spring Cloud HTTP上一个小结我们介绍了Dubbo Spring Cloud的基本使用,使用的服务中心为Spring Cloud Alibaba提供的Nacos,Dubbo内部提供了基于Dubbo的RPC调用,同时,Dubbo Spring Cloud在整合了Spring Cloud之后,可以直接提供HTTP接口,同Spring Cloud无缝衔接,直接支持F...原创 2020-04-11 15:04:24 · 692 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 13.2 Dubbo Spring Cloud 入门实战
13.2 Dubbo Spring Cloud 入门实战13.2.1 入门案例本小结将会以一个简单的入门案例,介绍一下在使用Nacos作为服务中心,使用Dubbo来实现服务提供方和服务消费方的案例。Nacos的安装和部署已经在前面的章节介绍过了,这里不再赘述,如果还有不清楚的读者,请参考第十一章。创建父工程ch13_1父工程依赖pom.xml如下:代码清单:ch13_1/pom.x...原创 2020-04-05 18:26:02 · 1456 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 13.1 Dubbo Spring Cloud 概述
13.1 Dubbo Spring Cloud 概述13.1.1 Dubbo 简介可能说起来Dubbo,很多人都不陌生,这毕竟是一款从2012年就开始开源的Java RPC框架,中间由于各种各样的原因停止更新4年半的时间,中间只发过一个小版本修了一个小bug,甚至大家都以为这个项目已经死掉了,竟然又在2017年9月份恢复了更新,不可谓不神奇。网络上很多人都拿Dubbo和Spring Clou...原创 2020-04-03 11:48:37 · 788 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 12.5 本章小结
12.5 本章小结本章主要介绍了Spring Cloud Alibaba Sentinel的常用功能和主要特性,并介绍了Sentinel如何和现有的Spring Cloud做整合,包括整合Feign、RestTemplate、Zuul和Gateway,还介绍了Sentinel基于Nacos做动态规则存储。限于本书篇幅原因,无法介绍的更多,各位读者更多内容可以参考官方文档,地址为:https://...原创 2020-04-02 19:23:55 · 602 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 12.4 Sentinel 动态规则
12.4 Sentinel 动态规则前面几个小结较为详细的介绍了Sentinel的使用姿势,但是依然无法满足我们日常的生产需要,其中,非常重要的一点就是限流规则的配置是存在当前应用的内存中的,每次我们重启应用以后,我们在Sentinel控制台中配置的规则就丢失了,下面,我们就介绍一下Sentinel规则持久化的方式。Sentinel为我们提供了两种方式对规则进行修改:通过 API 直接修改...原创 2020-04-02 19:18:16 · 679 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 12.3 Sentinel 进阶实战
12.3 Sentinel 进阶实战12.3.1 Sentinel 整合 Feign 和 RestTemplateSentinel目前已经同时支持Feign和RestTemplate,需要我们引入对应的依赖,在使用Feign的时候需要在配置文件中打开Sentinel对Feign的支持:feign.sentinel.enabled=true,同时需要加入openfeign starter依赖使s...原创 2020-04-01 09:26:44 · 713 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 12.2 Sentinel 入门实战
12.2 Sentinel 入门实战12.2.1 Sentinel 控制台概述在介绍入门实战之前,先来介绍一下Sentinel。Sentinel控制台提供一个轻量级的开源控制台,它提供机器发现以及健康情况管理、监控(单机和集群),规则管理和推送的功能。Sentinel控制台主要功能:查看机器列表以及健康情况:收集 Sentinel 客户端发送的心跳包,用于判断机器是否在线。监控 (单机...原创 2020-03-30 10:46:13 · 1227 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 12.1 Spring Cloud Alibaba Sentinel 概述
12.1 Spring Cloud Alibaba Sentinel 概述12.1.1 Sentinel 概述在第五章,我们介绍了Netflix公司提供的服务熔断组件Hystrix,Hystrix在官网宣布停止更新,整个项目进入维护阶段,最终版本定格在1.5.18,Spring Cloud Alibaba同样提供了功能类似的组件Sentinel,Sentinel以流量为切入点,从流量控制、熔断...原创 2020-03-24 19:15:55 · 877 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 11.6 本章小结
11.6 本章小结本章简单介绍了什么是Spring Cloud Alibaba,并介绍了Spring Cloud Alibaba开源的一些组件,介绍了Spring Cloud Alibaba Nacos的基本以及进阶的用法和实战,结合Spring Cloud Gateway动态路由介绍了Nacos的服务配置监听的具体使用方法。并对Spring Cloud Alibaba Nacos的源码进行了简...原创 2020-03-22 13:54:47 · 840 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 11.5 Nacos 源码解读
11.5 Nacos 源码解读源码解读更多的是希望可以做一个抛砖引玉的过程,希望各位读者可以在源码解读的过程中得到一些自己的收获,可以学习到一些看源码的方法。首先需要先去Github代码仓库上将Nacos的源码Down下来,可以直接执行如下语句:git clone git@github.com:alibaba/nacos.git下载完成后,我们将Nacos的源码导入IDEA编辑器中,如图...原创 2020-03-22 13:54:09 · 844 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 11.4 Nacos 进阶
11.4 Nacos进阶11.4.1 服务配置namespace首先看一下Nacos官方文档对namespace的定义:用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。配置文件中如果没有明确指明${spring.cl...原创 2020-03-20 11:13:10 · 936 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 11.3 Nacos 服务配置入门实战
11.3 服务配置入门实战11.3.1 服务配置入门案例创建子工程ch11_1_config_client工程依赖pom.xml如下:代码清单:ch11_1/ch11_1_config_client/pom.xml<dependencies> <dependency> <groupId>com.alibaba.cloud&...原创 2020-03-20 11:11:49 · 1073 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 11.2 Nacos 服务发现入门实战
11.2 Nacos 服务发现入门实战先简单介绍一下本节的案例目标,构建一个服务提供者提供一个Hello服务,再构建一个服务的消费者,消费提供者提供的Hello服务。11.2.1 入门案例创建Maven父级pom工程在父级工程中,需要配置好父级工程依赖,目的是方便配置和简化管理,由于篇幅原因,Spring Cloud Alibaba相关章节父工程pom这里只列举一次,后续章节父工程po...原创 2020-03-17 18:50:08 · 1204 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 11.1 Spring Cloud Alibaba Nacos 概述
11.1 Spring Cloud Alibaba Nacos 概述11.1.1 Spring Cloud Alibaba 简介在一开始,我们先简单介绍下Spring Cloud Alibaba的背景,Spring Cloud Alibaba于2018年7月27日在Spring Cloud孵化器仓库提交第一次代码,到2019年8月1日在Alibaba仓库发布第一个毕业版本,时间将近整整一年。...原创 2020-03-16 18:02:07 · 1157 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 10.6 本章小结
10.6 本章小结本章讲解了Sleuth的基本用法,还介绍了三种APM平台,讲解了Zipkin、Skywalking和Pinpoint的基础构建和综合实战。在微服务的架构方式下,APM平台可以帮助我们更好的了解系统行为、分析系统性能以及状态、发生故障时,可以帮我们快速的定位问题所在。希望各位读者在选择使用APM平台的时候可以根据自己的业务场景选择自己合适的APM平台。...原创 2020-03-14 12:23:14 · 917 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 10.5 Spring Cloud 与 Pinpoint
10.5 Spring Cloud 与 Pinpoint10.5.1 Pinpoint 概述Pinpoint是一个由韩国人编写的为大型分布式系统服务的链路跟踪平台,并提供大量链路跟踪数据分析汇总解决方案。自2012年7月开始开发,与2015年1月做为一个开源项目推出。10.5.2 Pinpoint 主要特性分布式事务跟踪,跟踪跨分布式应用的消息。自动检测应用拓扑,帮助你搞清楚应用的架构...原创 2020-03-14 12:04:32 · 2057 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 10.4 Spring Cloud 与 Skywalking
10.4 Spring Cloud 与 Skywalking10.4.1 Skywalking概述Skywalking与2016年11月2日由国人吴晟在Github上传v1.0版本,用于提供分布式链路追踪功能,从5.x开始,成为一个功能较为完善的APM(Application Performance Management)系统,2019年4月17日从Apache孵化器毕业,正式成为Apache...原创 2020-03-08 11:23:27 · 989 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 10.3 Spring Cloud Sleuth 与 Zipkin
10.3 Spring Cloud Sleuth 与 ZipkinZipkin 是一个开放源代码分布式的跟踪系统,由Twitter公司开源,它致力于收集服务的定时数据,以解决微服务架构中的延迟问题,包括数据的收集、存储、查找和展现。Zipkin是Twitter基于Google的分布式监控系统Dapper(论文)的开发源实现,Zipkin用于跟踪分布式服务之间的应用数据链路,分析处理延时,帮助我...原创 2020-03-05 14:31:14 · 2044 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 10.2 Spring Cloud Sleuth 入门
10.2 Spring Cloud Sleuth 入门10.2.1 Spring Cloud Sleuth 入门案例先简单介绍一下案例目标,在本案例中,我们将会使用Feign、RestTemplate和新线程的方式调用下游服务,来观察每个请求在整体调用链中的TraceID和SpanID是否一致,包含两个服务,一个是Sleuth-Provider,另一个是Sleuth-Consumer,具体内容...原创 2020-03-04 15:29:16 · 898 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 10.1 Spring Cloud 全链路监控概述
10.1 Spring Cloud 全链路监控概述在传统的SOA架构体系中,系统的调用层级不多,调用关系也不复杂,凭借系统的异常信息,可以比较快捷的定位到问题并进行排查。但是在微服务的系统中,服务数量成百上千,服务之间的调用关系成网状结构,无法通过人力进行问题的排查,在这种情况下,一个完善的调用链路监控系统就显得至关重要。10.1.1 全链路监控背景在微服务的架构体系下,服务按照不同的维度进...原创 2020-03-02 14:27:44 · 955 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 9.7 Spring Cloud Gateway 动态路由
9.7 Spring Cloud Gateway 动态路由本章前几节我们介绍了Spring Cloud Gateway的路由配置,但都是将路由的配置和规则加载到内存里,需要重启才能生效,在实际生产过程中,为了保证程序的高可用以及尽量避免重启,所以我们需要实现路由的动态配置。本案编码主要用来讲解如何实现Spring Cloud Gateway的动态路由配置。1.spring-cloud-gat...原创 2020-02-29 11:28:20 · 974 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 9.6 Spring Cloud Gateway 全局过滤器
9.6 Spring Cloud Gateway 全局过滤器全局过滤器的配置方式不同于网关过滤器;且虽然其作用范围是所有路由配置,但都有各自的启用条件。9.6.1 Spring Cloud Gateway Filter和Global FilterSpring Cloud Gateway的Filter的生命周期不像Zuul的那么丰富,gateway只有pre和post。pre:在请求被路由...原创 2020-02-28 19:07:37 · 1249 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 9.5 Spring Cloud Gateway 过滤器工厂
9.5 Spring Cloud Gateway 过滤器工厂过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应。过滤器可以限定作用在某些特定请求路径上。 Spring Cloud Gateway包含许多内置的GatewayFilter工厂。GatewayFilter工厂同上一篇介绍的Predicate工厂类似,都是在配置文件application.yml中配置,遵循了约定大于配置的...原创 2020-02-24 18:48:57 · 1302 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 9.4 Spring Cloud Gateway 路由断言工厂
9.4 Spring Cloud Gateway 路由断言工厂断言(predicate),java 8中的断言函数。Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自于HttpRequest中的任何信息,比如请求头和参数等。9.4.1 Afte...原创 2020-02-23 10:08:09 · 1108 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 9.3 Spring Cloud Gateway 路由配置转发
9.3 Spring Cloud Gateway 路由配置转发9.3.1 Spring Cloud Gateway(不整合Eureka)1.引入依赖父项目配置文件。代码清单:ch9_3/pom.xml<dependency> <groupId>org.springframework.boot</groupId> <artifactId&...原创 2020-02-22 11:04:59 · 1109 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 9.2 Spring Cloud Gateway 启动访问流程源码解析
9.2 Spring Cloud Gateway 启动访问流程源码解析网关启动第一步就是去加载config包下的几个类,如图9-3:做网关开发时,不用引入spring-boot-starter-web依赖,因为gateway是基于spring-webflux开发的,它依赖的DispatcherHandler就和我们web里的DispatcherServlet一样的功能。org.springf...原创 2020-02-21 19:39:00 · 1281 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 9.1 Spring Cloud Gateway 概述
9.1 Spring Cloud Gateway 概述9.1.1 什么是Spring Cloud GatewaySpring Cloud Gateway建立在Spring Ecosystem之上的API网关,包括:Spring 5,Spring Boot 2和Project Reactor。Spring Cloud Gateway旨在提供一种简单而有效的方式来路由到API,并为他们提供横切关注...原创 2020-02-18 08:51:09 · 1074 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 8.9 本章小结
8.9 本章小结本章主要介绍了Spring Cloud Config的基本操作方式,结合不同的存储方式(Git、Mysql)如何作为配置中心,介绍了Spring Cloud Config的一些增强使用方式,包括刷新配置,通过Spring Cloud Bus结合RabbitMQ来推送配置更新信息。最后两节讲解和介绍了携程开源的配置中心Apollo的使用方式,以及Spring Cloud如何整合Ap...原创 2020-02-17 15:05:49 · 935 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 8.8 Spring Cloud 整合 Apollo
8.8 Spring Cloud 整合 Apollo8.8.1 Apollo部署我们这里介绍快速开始方案,该方案仅适合测试环境和本地练习,生产环境请使用分布式部署方案,具体可参考官方网站:https://github.com/ctripcorp/apollo/wiki/%E5%88%86%E5%B8%83%E5%BC%8F%E9%83%A8%E7%BD%B2%E6%8C%87%E5%8D%97...原创 2020-02-16 19:51:15 · 1193 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 8.7 配置中心 Apollo
8.7 配置中心 Apollo8.7.1 Apollo概述Apollo(阿波罗)是携程框架部门研发的开源配置管理中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性。Apollo支持4个维度管理Key-Value格式的配置:application (应用)environment (环境)cluster (集群)name...原创 2020-02-14 12:06:41 · 1123 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 8.6 Spring Cloud Bus 基于 JDBC
8.6 Spring Cloud Bus 基于 JDBCSpring Cloud Config提供了jdbc的方式,本节将通过实际案例讲解其配置以及具体实现,具体使用的数据库是Mysql数据库。在介绍之前,我们先了解一下具体的架构,如图8-7:8.6.1 创建工程Config-Server-Mysql工程依赖pom.xml如下:代码清单:ch8_3/ch8_3_config_ser...原创 2020-02-13 14:53:03 · 1243 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 8.5 Spring Cloud Bus
8.5 Spring Cloud Bus前面的章节我们介绍了Spring Cloud Config配置中心,当我们在更新github上面的配置以后,如果想要获取到最新的配置,需要手动刷新或者利用WebHook的机制每次提交代码发送请求来刷新客户端,客户端越来越多的时候,需要每个客户端都执行一遍,这种方案就不太适合了。使用Spring Cloud Bus(国人很形象的翻译为消息总线,我比较喜欢叫消...原创 2020-02-12 09:13:17 · 1247 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 8.4 Spring Cloud Config 手动配置刷新
8.4 Spring Cloud Config 手动配置刷新上一节,我们介绍了Spring Cloud Config最基本的使用方式,最后留了一个问题,远端信息改变后,Client端并不会实时去获取最新信息,关于这个问题,可以有两种解决方案,下面,我们开始逐个介绍。8.4.1 手动刷新配置创建工程config_client_refresh,工程依赖pom.xml如下:代码清单:ch8_...原创 2020-02-11 13:37:17 · 1063 阅读 · 0 评论 -
Spring Cloud 微服务开发:入门、进阶与源码剖析 —— 8.3 Spring Cloud Config 高可用
8.3 Spring Cloud Config 高可用前面一小节我们介绍Spring Cloud Config 配置中心,并且和Github做了集成,我们的Server端是单机版的,任何单机版的服务都只能使用与测试环境或者自己做Demo测试,生产环境严禁使用单机服务,配置中心在整个微服务体系中都是及其重要的一个节点,尤其是在DevOps中自动扩容,如果配置中心宕机,那么所有的自动扩容都会失败。...原创 2020-02-10 08:41:31 · 916 阅读 · 0 评论