- 博客(220)
- 收藏
- 关注
原创 Mybatis的一些小技巧
最近一段时间开发工作中,发现了一些mybatis使用的技巧或注意事项,在这里总结一下。使用Interceptor监控接口使用量最近由于项目优化,我们需要下线几个数据表,为了安全的移除对几张数据表的依赖,下线过程分成了两个步骤:一是移除对几张表的查询依赖,二是停止对几张表的写入操作。对几张表的操作使用了mybatis,涉及的方法较多,而且涉及业务系统的核心链路,稍有不慎可能会阻塞核心链路,导致P级故障。 在完成以上两个步骤的开发工作后,为了监控对几张表的使用情况,我们把每个表的Mapper方
2022-02-10 14:53:11
946
原创 浅谈针对DDD的疑问梳理
前言前段时间分享过一篇自己有关于DDD与阿里框架Cola的学习与思考:juejin.cn/post/705966…发现有很多同学再阅读完后还是会有一些对DDD的疑问,今天我主要针对大家的疑问梳理一片文章,希望有助于大家更好的理解。一、不要为了DDD而DDDDDD的思想其实从最开始提出到现在已经有很多年了,但是还是有大部分公司的项目并没有采用DDD去进行设计。到底怎么样一个项目应该去进行DDD的重构改造?本人谈一下自己的一些理解1.1 为什么要有DDD?其实对于我们开发人...
2022-02-10 14:27:44
721
原创 基于Prometheus+grafana+mysql的k8s集群监控
一、基于Prometheus的k8s集群信息监控1、部署获取官方源码git clone https://github.com/coreos/kube-prometheus.git复制代码部署CRD和监控# CRDcd kube-prometheus/manifests/setupkubectl apply -f .cd kube-prometheus/manifestskubectl apply -f .复制代码查看CRD kubectl get crd | grep
2022-02-10 14:23:56
7320
原创 bug现场谜之总不能告诉客户你要按F12(打开控制台)吧?(跨域详解)
目录1. bug现场情况 2. 尝试破案 3. 跨域详解 3.1 何谓同域(同源)? 3.2 何谓跨域(跨域怎么发生?) 3.3 跨域有什么安全问题? 3.4 何谓浏览器同源策略(same-origin policy) 3.5 何谓CORS(跨域资源共享)? 3.6 “简单”和“复杂”跨域请求生命历程 4. 总结 引用 更新记录 相关文章推荐1. bug现场情况现场两套系统,集成同一个单点登录。其中一个系统跳转到另外一个系统时浏览器会刷新两次。奇怪...
2022-02-10 14:19:55
5025
原创 Linux基础知识和帮助命令
1、linux的哲学思想一切都是一个文件。(包括硬件,文本,二进制,源代码) 系统中拥有小型,单一用途的程序。(一个程序只负责做好自己的本职工作) 当遇到复杂任务,通过不同功能用途的程序组合起来完成。 避免令人困惑的用户界面就是没有复杂的图形界面。 连配置文件都存储在文本中,方便增删改查。 不在乎后缀名,有没有都无所谓,不是通过后缀名来定义文件的类型。2、shell2.1 什么是shell(壳),怎么在硬件和用户之间翻译shell是Linux系统中后台运行的一种特殊程序也可以理解成一
2022-02-10 13:46:46
4557
原创 精选2022年大厂高频Java面试真题集锦(含答案),面试一路开挂
本文涵盖了阿里巴巴、腾讯、字节跳动、京东、华为等大厂的Java面试真题,不管你是要面试大厂还是普通的互联网公司,这些面试题对你肯定是有帮助的,毕竟大厂一定是行业的发展方向标杆,很多公司的面试官同样会研究大厂的面试题。与此同时,今年算法面试一定是会被问的,而算法不是光靠背面试题就有用的,它是需要数学逻辑思维的,因此,小编会在文末为大家准备一份非常优质的算法学习手册,重点在于学习思维方法,话不多说,直接开始上精选的大厂面试真题!由于文章篇幅限制,不可能将所有面试题以文字形式把大厂面试题展示出来,本篇为大家精
2022-02-09 21:37:02
471
原创 2021年Java面试结束,我把所有大厂的面试题都总结了个遍
2021年眼看已经结束了,马上就要进入的金三银四面试季,不知道你收获到心仪的offer了吗?今天为大家总结下大家在各个大厂遇到的面试题,并在文章末尾为大家准备好了面试学习资料阿里面试题总结HashMap底层如何实现? Hash一致算法? 说说HashMap和ConcurrentHashMap的区别?treemap和HashMap的区别? java的内存分区? java对象的回收方式,回收算法? CMS和G1了解吗? CMS解决什么问题,说一下回收的过程? CMS回收停顿了几次? j
2022-02-09 20:25:31
2174
原创 聊聊写代码的20个反面教材
前言今天跟大家聊一个有趣的话题:如何写出让人抓狂的代码?大家看到这个标题,第一印象觉得这篇文章可能是一篇水文。但我很负责的告诉你,它是一篇有很多干货的技术文。曾几何时,你在阅读别人代码的时候,有没有抓狂,想生气,想发火的时候?今天就跟大家一起聊聊,这20种我看了会抓狂的代码,看看你中招了没?1.不注重代码格式代码格式说起来很虚,下面我用几个案例演示一下,不注重代码格式的效果。作为这篇文章的开胃小菜吧。1.1 空格有时候必要的空格没有加,比如:@Service@Sl
2022-02-09 14:25:49
183
原创 springboot项目中使用shiro 自定义过滤器和token的方式
1. 在项目中导入maven依赖 <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.4.0</version> </dependency> <dependency> <groupId>org.apach...
2022-02-09 14:01:23
869
原创 Docker打包SpringBoot应用镜像及jdk基础镜像
使用Docker打包自己的第一个SpringBoot应用镜像首先有一个自己的SpringBoot应用Jar包1. 编写DockerfileFROM openjdk:8u312-jdk-oracleLABEL maintainer=zhangyaoCOPY target/*.jar /app.jarENTRYPOINT ["java","-jar","/app.jar"]复制代码解释下命令FROM 指定基础镜像,此处使用openjdk8的镜像 LABLE 指定镜像的作者CO
2022-02-09 13:59:32
5116
原创 听说可以十分钟掌握Spring Boot 集成定时任务、异步调用?
1. 定时任务在项目开发中,经常需要定时任务来帮助我们来做一些内容,比如定时发送短信/站内信息、数据汇总统计、业务监控等,所以就要用到我们的定时任务,在Spring Boot中编写定时任务是非常简单的事,下面通过实例介绍如何在Spring Boot中创建定时任务1.1 @Scheduled-fixedRate方式1.1.1 pom配置只需要引入 Spring Boot Starter jar包即可,Spring Boot Starter 包中已经内置了定时的方法<dependenc
2022-02-09 13:57:48
363
原创 SpringBoot中实现业务校验,这种方式才叫优雅
在日常的接口开发中,为了保证接口的稳定安全,我们一般需要在接口逻辑中处理两种校验:参数校验 业务规则校验首先我们先看看参数校验。参数校验参数校验很好理解,比如登录的时候需要校验用户名密码是否为空,创建用户的时候需要校验邮件、手机号码格式是否准确。而实现参数校验也非常简单,我们只需要使用Bean Validation校验框架即可,借助它提供的校验注解我们可以非常方便的完成参数校验。常见的校验注解有:@Null、@NotNull、@AssertTrue、@AssertFalse、@
2022-02-09 13:24:26
2869
原创 Callable与Runnable的区别你知道吗?
JDK版本:JDK111. 背景在平时的开发过程中线程肯定用不少,线程启动执行需要实现 Runnable 类:public class ThreadTest { public static void main(String[] args) { new Thread(new Runnable() { @Override public void run() { System.out.pri.
2022-02-08 13:40:07
3074
转载 Spring框架中都用到了哪些设计模式?详细解析设计模式在Spring框架中的应用
这是我参与2022首次更文挑战的第20天,活动详情查看:2022首次更文挑战Spring控制反转IOC控制反转IOC:Inversion of Control 是一种解耦设计原则 主要目的是借助第三方,比如Spring IOC容器实现具有依赖关系的对象之间的解耦,从而降低代码之间的耦合度 Spring IOC容器: Spring IOC容器负责创建对象并将对象连接在一起,配置这些对象.从创建中处理这些对象的整个生命周期,直到对象被完全销毁 Spring IOC容器类似一...
2022-02-08 13:39:26
380
原创 设计模式之代理模式与面向切面
前面提到了这个观察者模式,那这里顺便说一下工厂模式和面向切面,我们使用动态代理实现面向切面,使用配置文件实现一个组件管理吧,这个也是以前写的博文。何为AOP用不是人话来说就是面向切面编程,什么是切面,就是和我们程序的主体功能关系不大的那一方面,例如,程序的日志功能,这个和程序的主体功能没有任何影响,但是有时候确实必要的,但有时候我又不希望在我的主体程序中出现,这就意味着这个切面必须和我的主体程序这个面保持相对独立,在我需要的时候将其装配即可。事实上我们所谓的切面可以代指所有的功能独立的那...
2022-02-08 13:38:46
295
原创 Springboot整合web相关技术
一、springboot过滤器基础入门&实战1.1、过滤器什么是过滤器它是基于Servlet 技术实现的, 简单的来说,过滤器就是起到过滤的作用,在web项目开发中帮我们过滤一些指定的 url做一些特殊的处理过滤器主要实现什么1.过滤掉一些不需要的东西,例如一些错误的请求。2.也可以修改请求和相应的内容。3.也可以拿来过滤未登录用户复制代码过滤器代码实现过滤器(filter)有三个方法,其中初始化(init)和摧毁(destroy)方法一般不会用到,主要
2022-02-08 13:31:29
269
原创 推荐学java——Spring与web项目
关于本文Spring 的内容已经学习了三篇内容,今天算是最后一篇文章,这节内容基本上是熟悉流程,本文要实现的功能:通过web页面访问数据库,实现对数据表中的数据插入和查询;与之前内容不同的是这次要创建 web 项目,而不再是 Java 项目,此外还要简单回顾一下 jsp 的内容,接触到的新知识:如何将Spring容器对象全局唯一。实现步骤第一步:建表这一步我们还是继续使用上一节内容中新建的表programmer,里面有三个字段:id、name和age,很简单,这里不做具体流程展示了。..
2022-02-08 13:12:55
167
原创 Oracle 数据怎么实时同步到 MongoDB
摘要: 很多 DBA 同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据、表多、数据量大等情况就难以同步。我自己亲测了一种方式,可以非常方便地完成 Oracle 数据实时同步到 MongoDB,跟大家分享一下,希望对你有帮助。Oracle 数据实时同步到 MongoDB 等非关系型数据库,应该是很多同学的需求了,现在 NOSQL 数据库越来越普遍了。本次亲测的数据同步工具是 Tapdata Cloud,一个永久免费的好东西。第一步:配置...
2022-02-07 16:45:56
491
原创 MyBatis3源码解析数据库连接
简介基于上篇的示例感受,下面我们探索下MyBatis连接数据库的细节是如果实现的,在日常使用中是如何能和Druid数据库连接池等配合起来的源码解析基于上篇的示例代码:public class MybatisTest { @Test public void test() { try(SqlSession session = buildSqlSessionFactory().openSession()) { PersonMapper p
2022-02-07 16:43:22
718
原创 微服务系列:分布式链路追踪之 SkyWalking
一、基本介绍什么是链路追踪随着微服务分布式系统变得日趋复杂,越来越多的组件开始走向分布式化,如分布式服务、分布式数据库、分布式缓存等,使得后台服务构成了一种复杂的分布式网络。在服务能力提升的同时,复杂的网络结构也使问题定位更加困难。在一个请求在经过诸多服务过程中,出现了某一个调用失败的情况,查询具体的异常由哪一个服务引起的就变得十分抓狂,问题定位和处理效率是也会非常低。分布式链路追踪就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如各个服务节点上的耗时、请求具体到...
2022-02-07 16:42:08
1193
原创 Hadoop HDFS数据仓库技术
作为大数据领域的始祖,开源项目Hadoop已经诞生了近15年了,虽然今天大数据技术已经层出不穷,市场上涌现出了很多优秀的大数据架构和产品,但是Hadoop中的很多技术实现仍然有借鉴意义,本篇我们就来看下HDFS的架构与实现原理。如果让我们来设计一个分布式文件系统,我们会考虑到哪些点呢?1、首先,我们的应用场景是什么?是大数据集,处理超大文件。这里的超大文件通常是指百MB、设置数百TB大小的文件。目前在实际应用中,HDFS已经能用来存储管理PB级的数据了。如果是小量的数据,单机磁盘就能很好的处理了,但
2022-02-07 16:40:20
2476
原创 微服务系列:服务调用 Spring Cloud 之 OpenFeign 性能优化
日志增强浏览器发起的请求可以通过F12查看请求和响应信息。如果想看微服务中每个接口我们可以使用日志配置方式进行查看详细信息。OpenFeign 虽然提供了日志增强功能,但是默认是不显示任何日志的,不过开发者在调试阶段可以自己配置日志的级别。OpenFeign 的日志级别如下:NONE:默认的,不显示任何日志; BASIC:仅记录请求方法、URL、响应状态码及执行时间; HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息; FULL:除了HEADERS中定义的信息之外
2022-01-25 16:24:42
2378
原创 【Python】多线程的实现及其存在的问题
「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」。Python 多线程python主要是通过thread和threading这两个模块来实现多线程支持。python的thread模块是比较底层的模块,python的threading模块是对thread做了一些封装,可以更加方便的被使用。创建新的线程有两种方法:通过threading.Thread()传递给Thread对象一个可执行方法(或对象) 继承threading.Thread定义子类并重写...
2022-01-24 13:18:02
1941
原创 Kafka-Producer的实现细节
背景遇到一些线上问题,发现对一些kakfa的配置细节不太了解,通过本文梳理一下认知,一些核心目标:梳理一下Kafka-Client的主要流程梳理一下Kafka-Client的配置,以及他们如何影响kafka的客户端发送梳理一下kafka-Client的metric指标有哪些,如何配置和获取这些指标,以及如何利用这些指标进行观测和排查主要流程作为一个Producer来说其实核心是梳理2个东西:Sender和RecordAccumulatorSender: 是kafka发送流程的主要服务,
2022-01-24 13:15:37
2485
原创 rabbitmq确保消息不丢失后带来的那些坑,还是太年轻啊
前言之前我们有提到如何保证rabbitmq消息不丢失。分别从三个角度解析了。分别是发送方、rabbitmq、消费方。 当时有关消费方只是简单带过了介绍。今天我们从一个使用场景来分析下消费者确认消费带来的坑发送消息这里我们还是继续沿用之前的发送逻辑。public Map<String, Object> sendMessage(Map<String, Object> params) throws UnsupportedEncodingException { M...
2022-01-24 13:13:46
2063
原创 DynamicApi 将Service代码映射为可访问的api接口
简介DynamicApi是一款针对SpringBoot项目中,简化Controller代码的工具,通过使用@DynamicApi 注解,将Service代码映射为可访问的api地址。依赖maven依赖<dependency> <groupId>io.github.zhaord</groupId> <artifactId>dynamic-api-boot-starter</artifactId> <ve
2022-01-24 13:12:34
1212
原创 在面试时被问到,为什么MySQL数据库数据量大了要进行分库分表?
正文如下,如果觉得有用欢迎点赞、关注~~在文章开头先抛几个问题:(1)什么时候才需要分库分表呢?我们的评判标准是什么?(2)一张表存储了多少数据的时候,才需要考虑分库分表?(3)数据增长速度很快,每天产生多少数据,才需要考虑做分库分表?这些问题你都搞清楚了吗?相信看完这篇文章会有答案。为什么要分库分表?首先回答一下为什么要分库分表,答案很简单:数据库出现性能瓶颈。用大白话来说就是数据库快扛不住了。数据库出现性能瓶颈,对外表现有几个方面:大量请求阻塞 在高并发场景下,
2022-01-23 16:00:56
1953
原创 Redis6系列1-线程模型(单线程OR多线程)
1. Redis演进史如果单纯的说redis是单线程或多线程,这个回答肯定不严谨,不同版本使用的线程模型是不一样的。版本3.x ,最早版本,也就是大家口口相传的redis是单线程。 版本4.x,严格意义来说也不是单线程,而是负责处理客户端请求的线程是单线程,但是 开始加了点多线程的东西(异步删除) 。 最新版本的6.0.x后, 告别了大家印象中的单线程,用一种全新的多线程来解决问题。2. Redis单线程模型2.1 单线程真实含义主要是指Redis的网络IO和键值对读写是由一个线程
2022-01-23 13:41:38
1010
原创 Java接口测试之日志框架Logback
一、引言对于一个成熟的接口测试框架,日志管理这个是必不可少的。在开发和调试阶段,日志可以帮助我们更快的定位问题;而在测试的运维过程中,日志系统又可以帮助我们记录大部分的异常信息,通常很多测试框架会通过收集日志信息来对接口测试状态进行实时监控预警。二、前言Spring Boot 在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logback。每种 Logger 都可以通过配置使用控制台或者
2022-01-23 13:31:35
547
原创 【自动化运维新手村】番外-迭代器生成器
【摘要】在之前的文章中我们提到过很多次的可迭代对象,并且很多面试中对于Python几乎必问的一个问题是:“请解释一下迭代器和生成器?”在Python中对象是否可迭代是一个十分重要的特性,今天我们就一次性的给大家讲解清楚究竟什么是可迭代,如何判断一个对象是否的可迭代的,什么又是迭代器,以及什么是生成器?下图可以清晰的表示可迭代对象,迭代器,生成器之间的关系:【迭代(iter)】迭代就是指更新换代的过程,要重复进行,而且每次的迭代都必须基于上一次的结果。我们使用for循环的时...
2022-01-23 13:26:45
88
原创 作为应届生到底是去大的IT公司好,还是去小的IT公司好?
先说结论。1 应届生如果能去大厂那最好,否则赶紧得找个小公司积累入行的经验。2 小公司不能久待,如果干了3年以上会成井底之蛙,一般干个2年左右就得打算跳槽。2019年我去给过一家50人规模的小IT公司培训Java,当时和我打交道的技术总监,听到这个职位我不禁升起一股敬佩感。在这个班里,是总监带着他收下的10多号做IT的人来听,这些人里,有员工,也有开发经理。经过我培训的感受,发现这家公司的员工平时也就是根据API做增删改查,其中能用搜索引擎查资料的算不错了,能看懂日志并根据日志排查简...
2022-01-22 13:59:21
952
2
原创 Qt自定义Widget实现互斥效果问题
「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」前沿什么叫做自定义Widget实现互斥效果呢?在使用Qt做一个界面美观性比较强的功能时,可能会遇到这种问题:多个控件互斥,类似于QRadiButton控件,但又不是单纯的QRadioButton控件,互斥的可能是一个窗口,也可能是几个按钮,等等多种情况。这里我只是列举了一个简单的互斥例子,虽然简单,但是包含了各种坑,有需要的掘友们可以小笔记们记一下,尤其是对Qt新手来说,还是很有必要的。由效果图可以看出..
2022-01-21 13:49:50
2349
原创 kubernetes scheduler 源码解析及自定义资源调度算法实践
kubernetes scheduler 浅析什么是kubernetes scheduler?小到运行着几十个工作负载的 kubernetes 集群,大到运行成千上万个工作负载 kubernetes 集群,每个工作负载到底应该在哪里运行,这需要一个聪明的大脑进行指挥,kubernetes scheduler 就是这个聪明的大脑。从结果看,他的工作很简单,只是为 pod.spec.nodeName 填充上一个 node 的名字而已,从过程看,他又是极其复杂的,因为到底要选哪个节点才最合理,答案往往是和
2022-01-21 13:36:09
2162
1
原创 面试突击17:HashMap除了死循环还有什么问题?
面试合集:https://gitee.com/mydb/interview本篇的这个问题是一个开放性问题,HashMap 除了死循环之外,还有其他什么问题?总体来说 HashMap 的所有“问题”,都是因为使用(HashMap)不当才导致的,这些问题大致可以分为两类:接下来我们一个一个来看。死循环问题发生在 JDK 1.7 版本中,形成的原因是 JDK 1.7 HashMap 使用的是头插法,那么在并发扩容时可能就会导致死循环的问题,具体产生的过程如下流程所示。HashMap 正常情况下的扩
2022-01-20 17:22:04
210
1
原创 面向对象编程,不美了么?
“我是旧时代的残党,新时代没有承载我的船。”如果面向对象编程是一个人,我猜他自己在不断被非议的今天,一定会这样感慨。说实话,我用面向对象方式编程已经十几年了,我做架构设计离不开它,做系统分析离不开它,编码的时候更是严重依赖它,我对面向对象无论是思想上还是写代码上都对它是有很深的感情。刚学 Java 的时候,我觉得面向对象编程(OOP)真牛逼,用面向对象方式写出来的代码是最好的代码。但是随着项目越做越多,代码越写越多,我发现 OOP 不是万能的,盲目的迷信追求 OOP 会有代价。今天这篇文章我
2022-01-20 17:19:09
111
原创 日常开发中常遇到的一些问题和思考
一、常见的集合删除元素问题:使用for循环匹配某个元素,然后删除,猜猜下面代码输出的会是什么?List<String> list = new ArrayList<>(); list.add("淘宝"); list.add("淘宝"); list.add("掘金"); for(String item : list) { if("淘宝".equals(item)) { list.remove(item);
2022-01-20 13:46:20
124
原创 阿里P8财富自由,薪资200W+?看完我慕了呀。
阿里目前校招生的级别均在P5,由此可见P4这个职级已经消失了。主力员工是P6-P8。对于阿里来有一些业务趋近于边缘化,这类职级为P8的在总部也只是为P7职级。一、阿里P8一年赚多少钱阿里目前的薪资分成:薪资+期权。工作三年以内一般就是工资,三年以上才说会有股份。一般月薪在45-60左右,一年下来加上年底分红或者13薪资14薪大概在百万。如果你在阿里4年,拿到期权也就是股票,一年核算下来年薪在3百万到4百万。还有人反映去年还拿两百多万的P8,今年就已经三百多万了,主要因为股票升值。
2022-01-19 20:51:28
28077
原创 Redisson延迟队列执行流程源码分析一下
这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战前言之前一篇文章描述了JDK自带的延迟队列DelayQueue【DelayQueue延迟处理任务记录一下】 在实际分布式项目中延迟任务一般不会使用JDK自带的延迟队列,因为它是基于JVM内存存储,没有持久化操作,所以当服务重启后就会丢失任务。 在项目中可以使用MQ死信队列或redisson延迟队列进行处理延迟任务,本篇文章将讲述redisson延迟队列的使用demo和其执行源码。demo示例通过脚手架创建一个简易..
2022-01-19 13:22:46
70
原创 阿里Java开发岗年终奖50W+?真的是贫穷限制了想象
阿里巴巴是中国比较厉害的一个企业,旗下所涵盖的内容比较广阔,因此也成为了不少年轻人挤破头脑也想进去的地方。虽说在阿里加班是常事,但是最近也有内部员工曝光了疑似阿里的年终奖,当说出这一串数字后吗,也让网友直呼:贫穷限制了想象!据悉,阿里巴巴是一家内部竞争比较强大的企业,因此员工们在工作上,基本上都是很拼的,特别是到了双十一的阶段,通宵加班也成为了常事。而在这样的情况下,阿里对于员工的关怀也是相当不错的,不仅准备了一切需要的物资,甚至在奖金方面,也让大家拿到手软!从去年这位Java开发的表...
2022-01-18 22:10:05
1043
3
原创 寻根究底-JDK1.7下HashMap的源码探究
源码分析jdk1.7下的HashMap我们都知道1.7版本的hashmap的底层是数组加链表构成的,那么今天我们就来自己分析一波源码~篇幅有点长,废话不多说,直接开始分析~属性声明//初始化容量 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16//最大的容量static final int MAXIMUM_CAPACITY = 1 << 30;//默认的加载因子stat...
2022-01-18 20:22:15
124
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人