自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

啦啦啦啦 la

个人学习笔记

  • 博客(244)
  • 资源 (26)
  • 问答 (8)
  • 收藏
  • 关注

原创 使用 arpl 在 PVE 上安装黑群晖

是 GitHub 上开源的自动装载程序,能够实现使用 arpl 在物理机或虚拟机中安装黑群晖。

2023-07-01 16:22:06 7209 1

原创 使用兮克 2.5G 交换机将北京联通 EPON 改为 ODI 猫棒接入

最近入手了兮克2.5G交换机(兮克SKS1200-8GPY1XF),有 8 个 2.5G 电口和 1 个 10G SFP+ 光口;支持多种组网模式,其中一种是支持使用猫棒接入,由路由器拨号后再回接到交换机,这样就可以替换掉光猫了。

2023-06-19 09:02:11 7956 9

原创 在 Linux 上使用 yuzu 模拟 Nintendo Switch 试玩王国之泪

王国之泪5月12日发售,DLC 玩家已经造出各种脑洞大开的东西了,但是买的卡带迟迟没有收到,因此,打算使用模拟器先体验一下是一款开源的 Ninetendo Switch 模拟器,支持在 Linux 或者 Windows 平台运行,能够模拟 Switch 平台的大部分游戏;对于性能较好的机器,可以流畅运行游戏,并且没有 Switch 切换场景或者读取游戏时长时间的加载等待;对于没有 Switch 的可以作为尝鲜体验的工具,不过实际游戏效果体验不如 Switch 好。

2023-05-20 15:43:31 4980 1

原创 N5105 Promox VE 虚拟机频繁死机问题处理

使用 N5105 作为 HomeLab 的服务器;之前安装的 ESXi,使用 Ubuntu 22 的时候经常会出现 Ubuntu CPU 占用达到100%,然后死机;但是其他的虚拟机都没有问题,因为对 Linux 并不熟,查看了 ESXi 和 Ubuntu 日志并没有异常;后面安装黑群晖一直失败,因此换到了 Proxmox VE换到 PVE 后依然存在同样的问题,以为是服务的问题,于是给 Docker 容器添加了资源限制,无效后迁移到了 CentOS 部署,发现还是同样的问题;

2023-03-25 17:03:59 5104 3

原创 使用 PowerCLI 的 Docker 容器自行构建 ESXi 镜像

参考,在使用 ESXi 7 时,基于 Windows 系统,使用 PowerCLI 为 ESXi 7 的镜像添加了 NVMe 和 Intel I225V 网卡的驱动;虽然当时已经可以在 Linux 或者 MacOS 上使用 PowerShell,但是因为 PowerCLI 不支持 Core 版本的 PowerShell,会提示;导致只能使用 Windows 构建,对于没有 Windows 系统的用户非常不方便。

2023-02-07 11:36:29 998

原创 N5105 构建 Esxi 镜像

N5105 软路由自行构建 Esxi 镜像,添加 Intel I225V 网卡和光威 Nvme 硬盘驱动

2022-08-12 10:12:55 5118 2

原创 树莓派 4 使用 WiFi 从 SSD Headless 启动

树莓派 4 使用 WiFi 从 SSD Headless 启动树莓派已经默认支持从 SSD 启动,可以根据官方提供的工具初始化树莓派系统并启动;尝试通过安装 Ubuntu Server,不使用网线、显示器、键盘等,从 SSD 直接启动依赖树莓派 4MacSSD安装 Ubuntu Server1. 安装 Raspberry Pi ImagerRaspberry Pi Imager 是官方提供的树莓派镜像写入工具,可以通过 UI 操作,选择树莓派支持的系统,并直接写入到 SSD 或者 SD

2021-04-24 22:58:28 474

原创 树莓派 4b 安装 Kubernetes

树莓派 4b 安装 KubernetesK3S 是 Rancher 提供的用于边缘硬件的简化版本的 Kubernetes,基本能力和 Kubernetes 接近,适用于 IoT 硬件,支持 x86_64, ARMv7, ARM64 等安装在 Ubuntu Server 21.04 上安装 K3S1. 安装 Dockerapt update & apt upgrade & apt install docker.io2. 安装 K3S登录树莓派所在的机器,执行安装脚本curl

2021-04-24 22:57:35 428

原创 Spring Cloud Gateway 使用 Kubernetes 作为服务发现

Spring Cloud Gateway 使用 Kubernetes 作为服务发现Spring Cloud Gateway 作为网关,通过用于执行一些通用逻辑后做请求转发,后端可能涉及到多个服务,每个服务又有多个实例,调用服务实例就需要动态的更新,可以通过注册中心来实现,如果部署在K8S集群中,可以直接使用K8S实现服务发现应用Gateway添加依赖build.gradleplugins { id 'org.springframework.boot' version '2.2.6.R

2021-04-10 11:48:59 2939

原创 Spring Cloud Gateway 使用 Kubernetes 实现负载均衡

Spring Cloud Gateway 使用 Kubernetes 实现负载均衡在使用 Spring Cloud Gateway 作为服务服务发现时,可能会遇到 Gateway 并没有部署在服务所在的 Kubernetes 集群中,或者存在网络隔离,无法直接通过 Service Name 访问到相应的服务,这时候就需要通过 Service 的 IP 访问,但是,spring-cloud-kubernetes-discovery没有像 spring-cloud-consul-discovery一样实现服务

2021-04-10 11:48:14 774 1

原创 Spring Cloud Kubernetes 服务注册和发现实现

Spring Cloud Kubernetes 服务注册和发现Spring Cloud Kubernetes 使用,可以通过引入 org.springframework.cloud:spring-cloud-starter-kubernetes,这个 starter 依赖于 org.springframework.cloud:spring-cloud-kubernetes-core 和 org.springframework.cloud:spring-cloud-kubernetes-discovery

2021-04-10 11:47:33 1813 1

原创 Spring Cloud Consul 服务注册和发现实现

Spring Cloud Consul 服务注册和发现实现Spring Cloud Kubernetes 使用,可以通过引入 org.springframework.cloud:spring-cloud-starter-consul-discovery,这个 starter 依赖于 org.springframework.cloud:spring-cloud-consul-core 和 org.springframework.cloud:spring-cloud-consul-discoveryCons

2021-04-10 11:46:41 1119

原创 Spring Cloud 使用 Kubernetes 作为配置中心实现

Spring Cloud 使用 Kubernetes 作为配置中心实现Spring Cloud 支持使用 Kubernetes 作为配置中心,通过 ConfigMap 或 Secret,将配置添加到应用中加载配置加载配置是通过 PropertySourceLocator 来实现的,ConfigMap 使用 ConfigMapPropertySourceLocator 加载,Secret 使用 SecretsPropertySourceLocator加载Bean 初始化 @Bean @Cond

2021-04-10 11:45:45 1047

原创 Spring Cloud 使用 Kubernetes 作为注册中心

Spring Cloud 使用 Kubernetes 作为注册中心Spring Cloud 可以使用 Kubernetes 作为注册中心,实现服务注册和发现创建两个应用,Consumer 和 Provider,Provider 提供一个 REST 接口供 Consumer 调用Provider添加依赖build.gradledependencies { compile project(":discovery/common") implementation 'org.sp

2021-04-10 11:44:45 1191

原创 Spring Cloud 使用 Kubernetes 作为配置中心 - 使用加密配置

Spring Cloud 使用 Kubernetes 作为配置中心 - 使用加密配置Spring Cloud 可以通过使用 Kubernetes 的 Secrets 作为加密配置创建应用添加依赖build.gradledependencies { implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-config'} 添加配置编码内容通过 Base64 编码后添加到 Kubernete

2021-04-10 11:44:04 312

原创 Spring Cloud 使用 Kubernetes 作为配置中心

Spring Cloud 使用 Kubernetes 作为配置中心Spring Cloud 可以通过使用 Kubernetes 的 ConfigMap 作为配置中心,实现配置的拉取和刷新创建应用添加依赖build.gradledependencies { implementation 'org.springframework.cloud:spring-cloud-starter-kubernetes-config'}添加配置ConfigMapkind: ConfigMapap

2021-04-10 11:42:56 423

原创 Spring Cloud 使用 Consul 作为配置中心

Spring Cloud 使用 Consul 作为配置中心加载配置加载配置是通过 ConsulPropertySourceLocator 来实现的,该类是 PropertySourceLocator接口的实现类Bean 初始化 @Bean public ConsulPropertySourceLocator consulPropertySourceLocator(ConsulConfigProperties consulConfigProperties) { return new Con

2021-04-10 11:42:02 1119

原创 Raspberry Pi 4 使用 Grafana 监控

Raspberry Pi 4 使用 Grafana 监控运行 InfluxdbInfluxdb 和 Prometheus 一样都是时序数据库,不同的是它能够作为一个转发代理接受来自不同程序的消息,这里使用 Telegraf 采集数据,存放到 Influxdb 中启动挂载的目的是为了将数据保存在宿主机上,方便查询历史数据docker run --name influxdb -d \ -p 8086:8086 \ -v /root/workspace/docker/influxdb:/var/

2021-04-10 11:40:57 799

原创 Raspberry Pi 4 使用 USB 从 SSD 启动

Raspberry Pi 4 使用 USB 从 SSD 启动树莓派 4 的最新固件已经支持从USB 启动,通过外接 U盘或者硬盘,能够摆脱 SD 卡的IO 速度限制,这里通过 USB 从 SSD 硬盘启动系统安装 Raspberry Pi OS下载 Imager从 https://www.raspberrypi.org/downloads/ 下载相应 Imager安装 Raspberry Pi OS 到 SD 卡中选择第一个镜像然后选择 SD 卡后写入待写入完成后,将 SD 卡插

2021-04-04 09:18:41 2238

原创 SpringBoot 框架自带插件构建 Docker 镜像

SpringBoot 框架自带插件构建 Docker 镜像Spring Boot 2.3.0 之后支持通过 buildpacks 插件构建 Docker 镜像,原理和执行过程与 Jib 类似,支持 Spring Boot 项目的分层构建,当代码改动后,只需更新代码部分,可以减少构建后 push 和 pull 镜像的时间,减少镜像存储的成本底层是通过 Buildpacks 构建,Buildpacks是 Dockerfile 的一个替代方案。Buildpacks 能够自动探测运行 Docker 容器中的应用

2021-04-04 09:17:36 486

原创 Spring-Boot Liveness 和 Readness 接口使用

Spring Boot Liveness 和 Readness 接口使用在 Spring Boot 2.3+ 中,提供了单独的 liveness 和 readness,用于为 Kubernetes 提供相应检查接口liveness用于检查应用是否存活,当应用组件因故障不健康时,可以通过这个接口的结果,配置相应策略,重启应用或重新调度 Podreadness用于检查应用是否就绪,是否可以提供服务,如当流量太大超过应用的承载范围时,可以将这个接口的状态改为不健康,这样可以停止接收流量,当处理完后再

2021-04-04 09:16:38 3672

原创 HPA 使用自定义的指标自动扩缩容

HPA 使用自定义的指标自动扩缩容Kubernetes 支持使用自定义的指标作为 HPA 的依据;KEDA 是基于事件驱动的自动扩缩容组件;主要有两部分:Agent: 用于触发和停用扩缩容,通过 keda-operator 实现Metrics: 用于收集指标,提供给 Agent,通过 keda-operator-metrics-apiserver 实现KEDA 适配了多个组件,支持从 Prometheus、MySQL、MQ、Redis、自定义的组件等获取指标前提环境中安装了 metrics

2021-04-04 09:15:23 1171 1

原创 gRPC Transport

gRPC TransportTransport 分为 ClientTransport 和 ServerTransport,分别用于客户端和服务端ClientTransportClientTransport 与真正的 IP 地址是一一对应的,用于建立连接,创建流实现ClientTransport 有多个继承接口和实现类:支持失败的实现类 FailingClientTransport,客户端启动时创建的流会快速失败支持生命周期管理的接口 ManagedClientTransport支持延迟

2021-04-04 09:13:41 760 3

原创 gRPC Stream

gRPC StreamStream 在 gRPC 中代表一个真正的请求,包含要发送的 消息;Stream 分为 ClientStream 和 ServerStreamClientStreamClientStream 接口继承 Stream 接口,有多个实现类或抽象实现类:ForwardingClientStream: 用于转发的 ClientStream,支持代理真正的流,可以用于触发一些动作,如统计等NoopClientStream: 不做任何操作的 ClientStream,用于空实现

2021-04-04 09:13:09 2219

原创 gRPC Server 端请求处理流程

gRPC Server 端请求处理流程文章目录gRPC Server 端请求处理流程初始化处理请求请求整体处理流程1. 读取 Settings 帧2. 接收 header3. 流创建事件4. 流 ready 事件5. 执行流创建任务6. 提交要求指定数量的消息任务7. 执行流 ready 任务8. 执行读取指定数量的消息任务并提交有可用消息任务9. 执行有新的可用消息任务10. 提交半关闭请求任务11. 执行半关闭任务处理响应1. 执行业务逻辑处理2. 发送响应内容1. 发送响应 header2. 发送

2021-04-04 09:12:38 1795 1

原创 gRPC Server 端启动流程

gRPC Server 端启动流程gRPC Server 启动流程,底层实现以 Netty 为例;核心类io.grpc.ServerServer 的定义接口,实现类是 io.grpc.internal.ServerImpl,实现了服务、方法与方法处理器的绑定,端口监听,不同类型的 Server 实现的调用,Server 生命周期管理等io.grpc.BindableService由编译器生成的服务抽象类的基础接口,并将实现类绑定到服务器,提供将服务的实现的实例绑定到 Server 的方式

2021-04-04 09:11:45 2993

原创 gRPC Server 端关闭流程

gRPC Server 端关闭流程关闭 Server关闭 Server 可以使用 shutdown 或者 shutdownNow 方法shutdownserver.shutdown().awaitTermination(10, TimeUnit.SECONDS);io.grpc.internal.ServerImpl#shutdown开始顺序的关闭 Server,已经存在的请求会继续执行,新的请求会被拒绝public ServerImpl shutdown() { boolean

2021-04-04 09:11:16 4776 1

原创 gRPC Gateway 使用

gRPC Gateway 使用gRPC Gateway 可以代理 gRPC 服务,接收 HTTP 请求,并转为 gRPC 请求由服务进行处理,并将返回结果转换为 HTTP 响应发送给调用者 gRPC Gateway支持代理单个服务或者多个服务,当代理多个服务时,可以通过命名解析实现转发请求快速使用启动项目git clone https://github.com/helloworlde/grpc-gateway.git & cd grpc-gatewaymake all 访问

2021-04-04 09:10:42 1248

原创 gRPC Client 启动流程

gRPC Client 启动流程gRPC 启动初始化的流程,使用 Netty 作为底层的实现初始化 ChannelChannel 的初始化通过 ChannelBuilder 构建这里通过 forTarget 设置了要解析的服务名称,会通过 NameResolver 解析,转换为具体的地址ManagedChannel channel = ManagedChannelBuilder.forTarget("grpc-server")

2021-04-03 12:17:35 2226

原创 gRPC-Channel

gRPC ChannelChannel 是用于执行 RPC 请求的概念上的端点连接,基于负载和配置,一个 Channel 可以有 0 或多个真实连接Subchannel 代表逻辑连接,最多维护一个物理连接发送 RPC,对应多个 TransportChannel 有多个子类:ManagedChannel: 实现了生命周期管理能力的抽象子类ManagedChannelImpl: ManagedChannel 的实现类,Channel 的主要实现ManagedChannelOrphanWrapp

2021-04-03 12:17:03 5084

原创 gRPC 自定义健康检查

gRPC 自定义健康检查在 gRPC 中自定义健康检查逻辑,用于检查特定的组件(如检查 Redis、MQ 等),或者结合其他的服务组件一起使用(如使用 Spring Boot 的健康检查)实现gRPC 的健康检查服务是通过 health.proto定义的health.protosyntax = "proto3";package grpc.health.v1;option csharp_namespace = "Grpc.Health.V1";option go_package =

2021-04-03 12:16:32 1235

原创 gRPC 重试流程

gRPC 重试流程当第一次调用失败,流监听器关闭的时候,会根据请求的处理状态和方法的配置,判断是否需要重试请求的处理状态有三种,在io.grpc.internal.ClientStreamListener.RpcProgress中定义:PROCESSED: 请求被正常处理,按照返回的状态码决定是否要重试REFUSED: 没有被服务端的应用逻辑层处理,直接重试,不计入重试次数DROPPED: 请求被负载均衡丢弃了,不重试,如果是对冲则取消其他的对冲请求,直接提交发起请求io.grpc.s

2021-04-03 12:16:05 1931 1

原创 gRPC 中使用 Channelz

gRPC 中使用 ChannelzgRPC 提供了 Channelz 用于对外提供服务的数据,用于调试、监控等;根据服务的角色不同,可以提供的数据有:服务端: Servers, Server, ServerSockets, Socket客户端: TopChannels, Channel, SubchannelChannelz 服务定义参考 Channelz 的设计 gRPC Channelz 以及服务定义 channelz.proto,提供了以下方法:service Channelz {/

2021-04-03 12:15:21 9207

原创 gRPC 中监听 Sream 和 Transport 的事件

gRPC 中监听 Sream 和 Transport 的事件gRPC 提供了拦截器可以监听请求的事件,但是对于 Stream 或者 Transport 的具体事件,无法通过拦截器实现;gRPC 提供了 StreamTracer 和 TransportFilter 支持这样的能力StreamTracerStreamTracer 用于监听流的所有事件,包括流关闭、出入站消息、出入站流大小等信息StreamTracer 有用于客户端的 ClientStreamTracer 和用于服务端的 ServerSt

2021-04-03 12:14:48 873

原创 gRPC 中泛化调用服务接口

gRPC 中泛化调用服务接口gRPC 没有直接支持泛化调用,protobuf 可以不依赖于生成的代码实现调用,所以可以通过反射接口间接实现泛化调用要求 Server 端提供 grpc.reflection.v1alpha.ServerReflection 服务,用于获取服务的描述文件大致的流程是:根据方法名称,调用服务端反射服务的方法,获取方法所在 proto 文件的描述根据 proto 描述文件,获取文件描述、服务描述,用于重新构建要被调用方法的方法描述 MethodDescriptor根据

2021-04-03 12:14:12 3165

原创 gRPC 中的核心概念

gRPC 中的核心概念StubStub 层暴露给开发者,提供类型安全的绑定到正在适应的数据模型/IDL/接口ChannelChannel 层是传输处理之上的抽象,适合拦截器、装饰器,并比 Stub 层暴露更多的行为给应用一个 Channel 可能有多个 SubchannelSubchannelSubchannel 代表负载均衡过的 ChannelChannel 状态CONNECTINGChannel 正在尝试建立连接,并且正在等待名称解析,TCP连接建立或TLS握手所涉及的步骤之一,

2021-04-03 12:13:38 689 1

原创 gRPC 中打印请求二进制日志

gRPC 中打印请求二进制日志gRPC 支持将请求调用的参数、Header 等信息以二进制的方式输出到文件中,方便在必要时排查问题使用1. 添加依赖binlog 的依赖在 grpc-services中,所以需要有该依赖dependencies { implementation("io.grpc:grpc-services:${grpcVersion}")}2. 添加 BinaryLogSink 实现@Slf4jpublic class CustomBinaryLogSink im

2021-04-03 12:13:05 821

原创 gRPC 中 Binlog 打印原理

gRPC 中 Binlog 打印原理gRPC 支持将请求调用的参数、Header 等信息以二进制的方式输出到文件中使用binlog 的依赖在 grpc-services中,所以需要有该依赖创建 Channel 时指定BinaryLog binaryLog = BinaryLogs.createBinaryLog(new TempFileSink(), "*");this.channel = ManagedChannelBuilder.forAddress(host, port)

2021-04-03 12:12:31 342

原创 gRPC 使用自定义的 NameResolver

gRPC 使用自定义的 NameResolver在使用注册中心时,gRPC 并未提供注册中心的服务发现,需要自己实现 NameResolverProvider 和 NameResolverNameResolverNameResolver 里面重写了 start 和 refresh 方法,这两个方法都调用一个 resolve 方法做服务发现;resovle 方法内部通过服务名从注册中心拉取服务实例列表,然后调用 Listener 的 onResult方法,将实例列表传递给 LoadBalancer

2021-03-28 11:40:44 2710 1

原创 gRPC 使用自定义的 LoadBalancer

gRPC 使用自定义的 LoadBalancergRPC 中提供了 round_robin, pick_first, grpclb, HealthCheckingRoundRobin 等负载均衡的实现,默认使用HealthCheckingRoundRobin,该负载均衡支持检查 Subchannel 的健康状态LoadBalancer 主要类包括 LoadBalancerProvider, LoadBalancer, SubchannelPicker, LoadBalancer.SubchannelSt

2021-03-28 11:40:12 1618 1

Gradle 4.1

Gradle 最新版本4.1。。。。。Gradle 最新版本4.1。。。。。Gradle 最新版本4.1。。。。。Gradle 最新版本4.1。。。。。

2017-08-23

软考试题2007-2015

软考试题2007-2015

2017-06-10

Angular配置路由Demo

AngularJS 配置路由 相关文档:http://blog.csdn.net/u013360850/article/details/72667801

2017-05-23

SpringMVC 国际化/多语言

SpringMVC实现国际化/多语言项目,具体内容参考http://blog.csdn.net/u013360850/article/details/70860144

2017-04-27

gradle-3.4-bin

gardle 3.4版本

2017-03-03

Gauge自动化测试Http和DB Demo

Gauge自动化测试项目,测试包含Http和数据库增删改查测试

2017-02-22

Gradle创建的SpringBoot小项目

使用Gradle创建的最简单的SpringBoot项目,开发工具使用IDEA

2016-11-30

IDEA创建SpringBoot项目步骤记录

IDEA创建SpringBoot项目步骤记录,记录了从项目开始创建到运行的过程

2016-11-30

SpringMVC演示项目

使用IDEA创建最简单的SpringMVC项目,可以参考文章http://blog.csdn.net/u013360850/article/details/53289446

2016-11-22

jakarta-taglibs-standard-1.1.2.tar.gz

jakarta-taglibs-standard-1.1.2.tar.gz,可以解决使用Spring框架时的java.lang.ClassNotFoundException: javax.servlet.jsp.jstl.core.Config异常

2016-11-22

SpringMVC 4.3.4 所需的jar包

SpringMVC 4.3.4 所需的jar包,集合了所需要的jstl和standard

2016-11-22

Gradle 2.13-bin

gradle 2.13-bin,支持spring boot使用

2016-11-18

gradle-3.1

Gradle 3.1,不能从官方下载的可以从这里下载,为了减少体积删除了docs和src目录

2016-11-13

GitHub-win-离线客户端

GitHub Windows离线客户端

2016-11-12

MyBatis增删改查基本操作

基于MyBatis的XML配置文件的Java项目,可以进行基本的增删改查操作,使用JDBC连接数据库

2016-11-01

官方jar文件

官方jar文件

2016-11-01

Ajax将数据发送到后台进行局部刷新操作

Ajax将数据发送到后台进行局部刷新操作,将前台数据用js脚本发送给后台,后台处理后返回结果

2016-10-24

div弹出对话窗口

使用div弹出一个对话框,并在对话框内实现操作,使用js脚本和html完成

2016-10-23

JavaWeb项目生成验证码

JavaWeb项目生成随机验证码,使用IDEA开发,可以导入到Eclipse和MyEclipse中

2016-09-18

subline Text windows x86

subline Text windows x86

2016-09-08

Chrome49 XP可用

Chrome49 XP可用

2016-09-01

UltraNav驱动 XP

UltraNav驱动 XP

2016-09-01

2015软件设计师历年真题

2015软件设计师历年真题 2010-2015:http://download.csdn.net/detail/u013360850/9493206

2016-04-16

2010-2015软件设计师历年真题及答案

2010-2015软件设计师历年真题及答案,软考真题及答案

2016-04-16

Myeclipse check error替换文件

Myeclipse2015 2016破解后会出现check error问题,替换为该资源文件可以解决该问题

2016-04-04

Myeclipse取消空格提示代码上屏

Myeclipse取消空格提示代码上屏,解决按下空格后选取提示

2016-03-14

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

TA关注的人

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