自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

hankin的博客

学习笔记整理

  • 博客(129)
  • 资源 (2)
  • 收藏
  • 关注

原创 Callable项目实战应用

Callable项目实战应用package com.carnation.config;import org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.spri

2021-08-20 11:48:20 249

原创 ForkJoinc项目实战2021-08-20

ForkJoinc项目实战@Overrideprotected void tableColumn(Schema schema) {/* 第一步:查询所有table*/log.info("【Oracle采集】tableColumn,正在获取 " + schema.getName() + " 下的表,请耐心等待-----");long startTime = System.currentTimeMillis();umiStatusLogService.createSimpleLog(etlId,

2021-08-20 11:39:55 268

翻译 第十三章 Logstash进阶

一、Logstash体系结构1、概念介绍Logstash数据传输管道所具备的流水线特征,体现在数据传输过程分为三个阶段:输入、过滤和输出。这三个阶段按顺序依次相连,像一个加工数据的流水线。 在实现上,它们分别由三种类型的插件实现,即输入插件、过滤器插件 和输出插件,并可通过修改配置文件实现快速插拔。除了这三种类型的插件以外, 还有种称为编解码器(Codec)的插件。编解码器插件用于在数据进人和离开管道时对数据做解码和编码,所以它一般都是与具体的输入插件或输出插件结合起来使用事件(Event)是L

2020-07-28 14:18:15 2781

翻译 第十二章 Logstash入门

一、概念介绍Logstash是一个类似实时流水线的开源数据传输引擎,它像一个两头连接不 同数据源的数据传输管道,将数据实时地从一个数据源传输到另一个数据源中。在数据传输的过程中,Logstash还可以对数据进行清洗、加工和整理,使数据在 到达目的地时直接可用或接近可用,为更复杂的数据分析、处理以及可视化做准备。既然需要将数据搬运到指定的地点,为什么不在数据产生时就将数据写到需要的地方呢?这个问题可以从以下几个方面理解。首先,许多数据在产生时并不支持直接写入到除本地文件以外的其他数据源。比如大多数第三

2020-07-28 09:18:09 3065

翻译 第十一章 Kibana入门

Kibana在整个Elastic Stack家族中起到数据可视化的作用,也就是通过图、表、统计等方式将复杂的数据以更直观的形式展示出来。由于Kibana运行于Elasticsearch基础之上,所以可以将Kibana视为Elasticsearch 的用户图形界面(Graphic User Interface, GUI) 。一、文档发现( Discover) 本章主要介绍Kibana导航栏中的第一个功能文档发现( Discover),它提供了交互式检索文档的接口,用户可以在这里提交查询条件、设置过滤器

2020-07-27 23:38:42 1567

翻译 第十章 ES与Spring的集成

一、综述1、常见的Elasticsearch Java API有四类client连接方式: 1.1、TransportClient(不推荐)Elasticsearch原生的api,TransportClient可以支持2.x,5.x版本,TransportClient 将会在Elasticsearch 7.0弃用并在8.0中完成删除。1.2、RestClient,ES官方推荐使用1.3、Jest(不推荐)是Java社区开发的,是Elasticsearch的Java Http Rest

2020-07-24 16:21:38 4354 1

翻译 第九章 ES索引别名、接口拾遗

一、索引别名别名,有点类似数据库的视图,别名一般都会和一些过滤条件相结合,可以做到即使是同一个索引上,让不同人看到不同的数据。别名的访问接口是_alias。1、创建索引添加别名PUT /index_alias{"aliases": {"index1": {"filter": {"term": {"name": "Apache"}}}}}2、为已有...

2020-07-22 23:07:18 1902 1

翻译 第八章 Elasticsearch集群

我们知道了Elasticsearch能够做什么,接下来我们将见识Elasticsearch另一个很强的-----扩展能力,也就是,Elasticsearch如何能够处理更多的索引和搜索请求,或者是更快地处理索引和搜索请求。在处理百万级甚至数十亿级的文档时,扩展性是一个非常重要的因素。 没有了某种形式的扩展,在单一的 Elasticsearch运行实例或节点( node)上就无法一直支持规模持续增大的流量。Elaticsearch很容易扩展。所以我们来了解 Elasticsearch所拥有的扩展能力,以及如何

2020-07-21 23:54:26 516

翻译 第七章 ES高级搜索—聚集查询(下)

一、管道聚集管道聚集不是直接从索引中读取文档,而是在其他聚集的基础上再进行聚集运算。所以管道聚集可以理解为是在聚集结果上再次做聚集运算,比如求聚集结果中多个桶中某一指标的平均值、最大值等。要实现这样的目的,管道聚集都会包含一个名为buckets_path的参数,用于指定访问其他桶中指标值的路径。buckets_ path参数的值由三部分组成,即聚集名称、指标名称和分隔符。聚集名称与聚集名称之间的分隔符是“>”,而聚集名称与指标名称之间的分隔符使用“.”。 按管道聚集运算来源分类,管道聚集可以分

2020-07-21 23:38:46 1516

翻译 第六章 ES高级搜索—聚集查询(上)

聚集查询(Aggregation)提供了针对多条文档的统计运算功能,它不是针对文 档本身内容的检索,而是要将它们聚合到一起运算某些方面的特征值。聚集查询与SQL语言中的聚集函数非常像,聚集函数在Elasticsearch中相当于是聚集查询的一种聚集类型。比如在SQL中的avg函数用于求字段平均值, 而在Elasticsearch中要实现相同的功能可以使用avg聚集类型。聚集查询也是通过_search接口执行,只是在执行聚集查询时使用的参数是aggregations或aggs。所以_search接口可

2020-07-21 23:20:31 2668

翻译 第五章 ES相关性检索与组合查询

一、相关性检索和组合查询概念在全文检索中,检索结果与查询条件的相关性是一个极为重要的问题,优秀的全文检索引擎应该将那些与查询条件相关性高的文档排在最前面。想象一下。如果满足查询条件的文档成千上万,让用户在这些文档中再找出自己最满意的那一条,这无异于再做一次人工检索。用户一般很少会有耐心在检索结果中翻到第3页,所以处理好检索结果的相关性对于检索引擎来说至关重要。Google公司就是因为发明了Page Rank算法,巧妙地解决了网页检索结果的相关性问题,才在众多搜索公司中迅速崛起。相关性问题有两方.

2020-07-21 16:14:41 2320

翻译 第四章 ElasticSearch基础搜索(二)

一、内置分析器前面说过,每个被分析字段经过一系列的处理步骤:1)字符过滤:使用字符过滤器转变字符。2)文本切分为分词:将文本切分为单个或多个分词。3)分词过滤:使用分词过滤器转变每个分词。每个分析器基本上都要包含上面三个步骤至少一个。其中字符过滤器可以为0个,也可以为多个,分词器则必须,但是也只能有一个,分词过滤器可以为0个或者多个。Elasticsearch已经为我们内置了很多的字符过滤器、分词器和分词过滤器,以及分析器。不过常用的就是那么几个。1、字符过滤器Character f

2020-07-20 14:27:07 2135

翻译 第三章 Elasticsearch基础搜索(一)

一、管理Elasticsearch索引和文档在es中,索引和文档是REST接口操作的最基本资源,所以对索引和文档的管理也是我们必须要知道的。索引一般是以索引名称出现在REST请求操作的资源路径上,而文档是以文档ID为标识出现在资源路径上。映射类型_doc也可以认为是一种资源,但在es7中废除了映射类型,所以可以_doc也视为一种接口。1、索引的管理在前面的学习中我们已经知道,GET用来获取资源,PUT用来更新资源,DELETE用来删除资源。所以对索引,GET用来查看索引,PUT用来创建索引,DE

2020-07-20 14:16:28 1171

翻译 第二章 ES数据类型介绍

一、文档字段介绍1、核心数据类型#字符串类型:string,字符串类还可被分为text和keyword类型,如果我们让es自动映射数据,那么es会把字符串定义为text,并且还加了一个keyword类型字段。text文本数据类型,用于索引全文值的字段。使用文本数据类型的字段,它们会被分词,在索引之前将字符串转换为单个术语的列表(倒排索引),分词过程允许ES搜索每个全文字段中的单个单词。什么情况适合使用text,只要不具备唯一性的字符串一般都可以使用text。keyword关键字数据类型,用于

2020-07-20 12:01:45 9716

翻译 第一章 Elastic Stack入门

一、预备知识Restful1、起源在没有前后端分离概念之前,一个网站的完成总是“all in one”,在这个阶段,页面、数据、渲染全部在服务端完成,这样做的最大的弊端是后期维护, 扩展极其痛苦,开发人员必须同时具备前后端知识。于是后来慢慢的兴起了前后端分离的思想:即后端负责数据编造,而前端则负责数据渲染,前端静态页面调用指定api获取到有固定格式的数据,再将数据展示出来,这样呈现给用户的就是一个”动态“的过程。而关于api这部分的设计则成了一个问题。如何设计出一个便于理解,容易使用的api则成了一

2020-07-20 11:53:34 1293

原创 第五章 Seata事务框架笔记

一、Seata概念介绍1、Seata 是什么?Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA和XA事务模式,为用户打造一站式的分布式解决方案。seata下载:http://seata.io/en-us/blog/download.html选择自己的版本下载seat中文文档:http://seata.io/zh-cn/docs/overview/what-is-seata.html这里我们只介绍默认的

2020-06-07 22:42:56 1432 1

原创 第七章 Auth2微服务鉴权jwt方式笔记

一、搭建认证服务器JWT:json web token是一种无状态的权限认证方式,一般用于前后端分离,时效性比较极端的权限校验,jwt模式获取token跟前面的客户端、密码、授权码模式是一样的,只是需要配置秘钥。1、服务端环境准备新建认证服务器:springcloud-micro-jwt1.1、添加pom依赖,与前面的其他模式一样<!-- 添加oath2框架依赖 --><dependency><groupId>org.springframewo...

2020-06-07 22:29:51 718

原创 第六章 Auth2微服务权限校验笔记

一、oauth2.0相关概念介绍采用token认证的方式校验是否有接口调用权限,然后在下游系统设置访问白名单只允许zuul服务器访问。理论上zuul服务器是不需要进行权限校验的,因为zuul服务器没有接口,不需要从zuul调用业务接口,zuul只做简单的路由工作。下游系统在获取到token后,通过过滤器把token发到认证服务器校验该token是否有效,如果认证服务器校验通过就会携带这个token相关的验证信息传回给下游系统,下游系统根据这个返回结果就知道该token具有的权限是什么了。所以校验toke

2020-06-07 22:16:25 4880

翻译 第四章 Sentinel动态规则持久化笔记

一、在生产环境中使用Sentinel生产环境的SentinelDashboard需要具备下面几个特性:规则管理及推送,集中管理和推送规则。 监控,支持可靠、快速的实时监控和历史监控数据查询。 权限控制,区分用户角色,来进行操作。1、规则管理及推送一般来说,规则的推送有下面三种模式 推送模式 说明 优点 缺点 原始模式 API 将规则推送至客户端并直接更新到内存中,扩展写数.

2020-06-07 18:51:05 2383

原创 第三章 SpringCloudAlibaba之Sentinel入门笔记

一、Sentinelg介绍随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。1、Sentinel的历史2012年,Sentinel诞生,主要功能为入口流量控制。2013-2017年,Sentinel在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel也因此积累了大量的流量归整场景以及生产实践。2018年,Sentinel开源,并持续演进。2019年,..

2020-06-07 17:58:01 858 2

原创 第二章 SpringCloudAlibaba之Nacos笔记

一、Nacos服务注册与发现1、Nacos简介Nacos是阿里开源的易于构建云原生应用的动态服务发现、配置管理和服务管理平台。Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。通俗来说,Nacos是一个注册中心& 配置中心——作为注册中心,Nacos可用于替代Spring Cloud中的Eureka、Spring Cloud Zookeeper Discovery、Spring Cloud.

2020-06-07 17:30:34 2861

原创 第九章 Springcloud Getway学习笔记

一、概念介绍1、SpringCloud Gateway简介SpringCloud Gateway是Spring Cloud的一个全新项目,该项目是基于Spring 5.0,Spring Boot 2.0和 Project Reactor等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的API路由管理方式。SpringCloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Zuul,在Spring Cloud 2.0以上版本中,没有对新版本的Zuul 2.0以上

2020-06-07 17:12:45 1707

原创 第一章 SpringCloud Alibaba简介——学习笔记

一、SpringCloud系统版本认识1、SpringCloud版本发布时间统计springcloud官方网站:https://spring.io/1.1、SpringCloud的版本更新发布时间(统计时间2020.04.28)Angel版本:2015年3月Brixton版本:2016年5月Camden版本:2016年9月Dalston版本:2017年4月Finchley版本:2018年6月Greenwich.RELEASE:2019年1月Hoxton.RELEASE

2020-06-07 17:12:36 5822

原创 第三章 K8s存储与网络笔记

一、K8s存储1、存储卷基础在docker容器中,为了实现数据的持久性存储,在宿主机和容器内做映射,可以保证在容器的生命周期结束,数据依旧可以实现持久性存储。但是在k8s中,由于pod分布在各个不同的节点之上,并不能实现不同节点之间持久性数据的共享,并且,在节点故障时,可能会导致数据的永久性丢失。为此,k8s就引入了外部存储卷的功能。1.1、emptyDir目录emptyDir...

2020-04-12 14:15:47 981

原创 第二章 K8S基础操作笔记

一、K8S基础操作1、kubernetes卸载与docker卸载1.1、docker卸载查询安装情况yum list installed | grep dockercontainerd.io.x86_64 1.2.13-3.1.el7 @docker-ce-stabledocker-ce.x86_64 ...

2020-04-12 13:49:56 1090

原创 第一章 Kubernetes基础笔记

一、Kubernetes概述 1、背景kubernetes(简称k8s)是google基于Blog进行改进后,开源出来的一款“容器管理应用”。由于近几年来容器技术的火爆,许许多多的服务都不会直接部署在linux主机或各大云厂商的虚拟机上;利用Docker,将每个服务做成一个image,把他们跑在各自的Container中。这样做的好处有非常多,比如环境配置隔离、服务启动快、移植便捷等等...

2020-04-12 00:47:00 704 1

原创 第三章 Docker高级笔记

一、Docker-Compose使用当项目涉及容器较多时,需要一个管理容器的工具1、docker-compose安装1.1、curl方式安装命令:curl -L https://github.com/docker/compose/releases/download/1.17.1/docker-compose-`uname -s`-`uname -m` > /usr/local...

2020-04-12 00:31:51 350

原创 第二章 Docker进阶笔记

一、仓库使用1、docker官方仓库1.1、注册https://hub.docker.com自由注册,邮件激活即可使用1.2、命令使用Docker pull/search/login/push/tag示例:docker push chenhuajing/hankin:tagnametag [镜像名:版本][仓库]/[镜像名:版本]:标记本地镜像,将其归入...

2020-04-12 00:14:51 445

原创 第一章 Docker基础笔记

一、Docker简介1、概念起源Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的Linux或Windows机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是PaaS提供商dotCloud开源的一个基于LXC的高级容器引擎,源代码托管在Github上,它基于Google公司推出的go...

2020-04-11 23:25:08 411

原创 第八章 springcloud消息驱动与链路跟踪笔记

一、SpringCloudStream消息驱动SpringCloudStream看名字就知道他和消息队列相关,但它又不是消息队列,准确来说它类似于硬件里面的驱动程序,也就是前面说的适配器模式的体现。在系统开发里面难免用到消息队列,但各个的消息队列又有所区别,SpringCloudStream的作用就是屏蔽各种消息队列的区别,对消息队列的API进行进一步的抽象,使得在springcloud里...

2020-04-08 21:31:01 1266

原创 第七章 SpringCloudConfig解析笔记

一、分布式配置中心讲解Zookeeper的时候其实实现过分布式的配置中心,SpringCloudConfig的核心作用其实就是在于对配置进行管理。虽然springcloud使用springboot进行开发,节省了大量的配置文件,但每个服务依然有自己的application.yml配置文件,而且每个服务一般都有负载均衡,所以这种依赖对于配置文件的统一管理就非常有必要了。下图是SpringCl...

2020-03-25 00:09:13 741

原创 第六章 Zuul网关路由及源码分析笔记

前面所有的微服务都是通过Eureka找到的,但是在很多开发中为了规范微服务的使用,提供有一个处理控制器Zuul。Zuul其实是一个API网关,类似于设计模式里面的Facade门面模式,他的存在就像是整个微服务的门面,所有的外部客户端访问都需要经过它来进行调度与过滤。代码Git地址:https://gitee.com/hankin_chj/springcloud-micro-service.gi...

2020-03-24 23:33:04 826

原创 第五章 Hystrix熔断机制及源码分析笔记

在分布式环境下,微服务之间不可避免的发生互相调用的情况,但是没有一个系统是能保证自身绝对正确的,在服务的调用过程中,很可能面临服务失败的问题,因此需要一个公共组件能够在服务通过网络请求访问其他微服务时,能对服务失效情况下有很强的容错能力,对微服务提供保护和监控。服务雪崩雪崩是系统中的蝴蝶效应导致其发生的原因多种多样,有不合理的容量设计,或者是高并发下某一个方法响应变慢,亦或是某台机器的资源...

2020-03-23 22:34:38 1384

原创 第四章 Feign接口服务及源码解析笔记

前面已经学习了Ribbon,从Eureka获取服务的实例在通过RestTemplate调用,并转换成需要的对象如:List<Product> list = restTemplate.exchange(PRODUCT_LIST_URL,HttpMethod.GET,new HttpEntity<Object>(httpHeaders), List.class).get...

2020-03-23 22:21:48 1522

原创 第三章 Ribbon负载均衡及源码解析笔记

现在服务提供方已经可以通过Eureka进行注册了,但对于服务的消费者,目前并没有处理,对于服务的消费方,也应该连接上eureka,进行服务的获取,这个时候就应该使用Ribbon这个组件了。现在服务提供方已经可以通过Eureka进行注册了,但对于服务的消费者,目前并没有处理,对于服务的消费方,也应该连接上eureka,进行服务的获取,这个时候就应该使用Ribbon这个组件了。代码Git地址:...

2020-03-23 22:17:31 948

原创 第二章Eureka注册发现原理解析笔记

一、EurekaClient运行流程分析EurekaClient为了简化开发人员的工作量,将很多与EurekaServer交互的工作隐藏起来,自主完成,具体完成的工作如下,代码见spring-cloud-netflix-eureka-client-2.0.0.RELEASE.jar。代码Git地址:https://gitee.com/hankin_chj/springcloud-micro...

2020-03-11 21:25:10 3405

翻译 第一章 SpringCloud简介

一、架构的演变过程我们最先接触的单体架构,整个系统就只有一个工程,打包往往是打成了war包,然后部署到单一tomcat上面,这种就是单体架构。假如系统按照功能划分了,商品模块,购物车模块,订单模块,物流模块等等模块。那么所有模块都会在一个工程里面,这就是单体架构。1、单体架构的优缺点优点:1)结构简单,部署简单。2)所需的硬件资源少。3)节省成本。缺点:1)版本...

2020-03-11 21:18:27 800

原创 第十章 Spring5异常与跨域问题笔记

一、异常处理分析1、Controller调用过程中的异常解析使用示例代码如下:package com.chj.controllerAdvice;@ControllerAdvice("com.chj")public class ExceptionHandlerControllerAdvice {@ExceptionHandler({ArrayIndexOutOfBoundsEx...

2020-01-17 23:32:02 2532

原创 第九章 DispatcherServlet源码分析笔记

一、dispatcherServlet的核心方法分析当请求过来时,首先会调用到dispatcherServlet的doService方法,最终会调用到dispatcherServlet中的doDispatch方法。该方法核心功能包含以下几点:WebAsyncManager异步管理 processedRequest文件上传 HandlerMapping根据request对象获取获取H...

2020-01-17 23:25:19 1028 2

原创 第八章 Spring MVC源码分析笔记

一、基础概念Spring Web MVC是一种基于Java的实现了Web MVC设计模式的请求驱动类型的轻量级Web框架,即使用了MVC架构模式的思想,将web层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC也是要简化我们日常Web开发的。另外还有一种基于组件的、事件驱动的Web框架在此就不介绍了,如Tapestry、JSF...

2020-01-16 19:04:03 722

sentinel-dashboard1.7.2-Nacos.jar

参考大目老师的sentinel1.6.2改造,支持Nacos持久化sentinel规则。 注意:在完成了上面的整合之后,对于接口流控规则的修改就存在两个地方了:Sentinel控制台、Nacos控制台。这个时候,需要注意当前版本的Sentinel控制台不具备同步修改Nacos配置的能力,而Nacos由于可以通过在客户端中使用Listener来实现自动更新。所以,在整合了Nacos做规则存储之后,需要知道在下面两个地方修改存在不同的效果: Sentinel控制台中修改规则:仅存在于服务的内存中,不会修改Nacos中的配置值,重启后恢复原来的值。 Nacos控制台修改规则:服务的内存中规则会更新,Nacos中持久化规则也会更新,重启后依然保持。

2020-07-06

并发编程笔记20190526.docx

第一章 线程基础、线程之间的共享和协作 3 一、基础概念 3 1. 什么是进程和线程 3 2. CPU核心数和线程数的关系 3 3. 澄清并行和并发 5 4. 多线程程序需要注意事项 6 二、认识Java里的线程 7 1. Java程序天生就是多线程的 7 2. 线程的启动与中止 7 3. 对Java里的线程再多一点点认识 8 三、线程间的共享和协作 9 1. 线程间的共享 9 2. ThreadLocal辨析 11 3. 线程间的协作 19 4. 面试题 21 第二章 线程的并发工具类 21 一、 Fork/Join框架的介绍 21 1、实现步骤: 22 2、工作窃取算法 22 3、分而治之 23 4、Fork/Join使用的标准范式 24 5、Fork/Join框架的异常处理 26 6、Fork/Join框架的实现原理 26 二、闭锁CountDownLatch 28 1、应用场景 28 2、CyclicBarrier 28 3、Semaphore 29 4、Callable、Future和FutureTask 30 5、原子操作CAS (compare atomic swap) 32 三、显式锁和AQS 34 1、AQS定义两种资源共享方式: 34 2、深入源码 37 3、了解Condition的实现 42 4、 锁的可重入 44 第三章 并发容器ConcurrentHashMap 46 一、JDK1.7中原理和实现 47 1、分段锁机制 47 2、ConcurrentHashMap中的数据结构 47 3、ConcurrentHashMap初始化 48 4、ConcurrentHashMap的操作 51 二、JDK1.8中原理和实现 54 1、ConcurrentHashMap的数据结构 54 2、ConcurrentHashMap的初始化 55 3、Node链表和红黑树结构转换 56 4、ConcurrentHashMap的操作 57 三、JDK1.8实现与1.7相比的重大变化 59 四、 更多的并发容器 60 1. ConcurrentSkipListMap和ConcurrentSkipListSet: 60 2. 写时复制容器 60 五、阻塞队列 60 第五章 JMH性能测试 62 1、 JMH环境搭建 62 2、 执行 63 3、 基本概念 63 4、 注解与选项 63

2020-07-01

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除