9.13杭州某厂 实习一面30分钟
自我介绍+项目的大致介绍
先说一下java这边你比较熟悉的一些集合。
Java比较常用的一些几何有list,set、Hashmap,以及Treemap,还有一些线程安全的有vector以及concurrenthashmap,还有 hashtable。但是vector以及hashtable的话,这已经相当于这些由于性能问题已经在java 8之后就相当于是被废弃掉了。
你这边有是用到线程池的事情是吧?能说一下那个线程池的一些怎么去构建,然后他那些参数,这些参数有什么设置的一些策略?
一共有有参数,有核心线程数,还有最大还有一个最大线程数。还有你这个有一个工作消息工作队列。工作队列同时有一个你这个时间的一个单位,还有一个时间以及有一个拒绝策略。
能说一下你在那个BI的平台里面,你的线程池是怎么配?
我当时是用了一个,就相当于是一个核心线路,核心线程数等于最大限制数。你相当于是把这个我先就他俩相等的话,到时候就当核心线程数和最大线程数相等的话,就无法再增加线程了。这时候你因为你用户对一些数据进行分析的话。超过。他如果超过核心线程数的话,因为已经没有到位到线程的,他这个时候只能采用拒绝策略,或者如果还有请求的话,可以对他直接返回。你已经请求的次数过多,直接给他返回过去OK
能具体的说一下,当时在部署这个项目的时候,服务器里面的配置跟你当前那个性能说你的实际里面配置的是什么样的一个情况。就比如说你的你比如你是4CPU?你的线程池里面你那个线程数配的是多少?然后你用的是什么样的一个队列,然后在你的那个实际的项目里面,你是用了什么样的一个拒绝策略?
我们在在这个项目中,我们用当时是部署了服务器的一个当时这个4核4G的一个服务器。当时我们线程线程数是设置的是一个设置的是一个六。就是如果你你达到一个核心线程数,同时因为它核心线数等于最大线程数,如果你超过这个限度的话,他会采用一个拒绝的策略。我们当时选的双端队列来进行一个对这个拒绝的策略,对这个拒绝的一个线程进行一个处理,相当于是如果如果你这个先这队列已经满的话,你就像可以返回一个数据,提示用户当前当前请求过载,请稍后再再进行。
你的意思是说当我的队列满了之后,我就通过主线程去发送一个提示消息是吗?
对,让用户知道你可以等等流量等等这个请求的频率低的时候,你再进行一个分析。
那你们的队列是怎么设置大小?
队列的话,我们当时设置的是一个双端设置的一个是是一个双双端队列大小的话。
我想在任意的方法里面,我想娶到我某一个参数的话,我们应该要怎么做?鉴权这块你了解吗?比如说我现在一般健全的时候,其实我的我们的接口上下文里面是能拿到这个用户信息的,对不对?那你的用户信息一般会存在哪里呢?在我们直接写代码的业务里面,如果你想要去获取用户信息,你会怎么获取?
存到本地内存里面ThreadLocal
可以对她进行一下介绍吗?你对ThreadLocal的理解
它是一个本地内存,相对于相对一个线线上的那种内存的话,他可能放在本地访问的可能访问的应对在本地的话可能更安。比较安全。
有了解过加java里面有哪几种引用对象的类型吗?哪几种对象?
类型,弱引用类型,虚引用类型,软引用类型。
强引用话一般就很如果垃圾回收的话,很难被回收。弱引用还有后面的三个,如果垃圾回收的话,一定会被回收的
java里面是怎么确定我这个对象可以被回收的呢?
java里面垃圾回收的话,它他一般来说他对堆内存里面垃圾回收策略的话,他有个分在堆里面分为新生代和老年代。如果新生代里面有分为一个EDEN区,还有一个survivor层,两个survivor层有个S1一区还是S2区?因为eden,他是一个新加的进去的。所以说他如果进行垃圾回收的话,先从这里进行垃圾回收。
在这里垃圾回收,如果第一轮如果没有被回收的话,它会进入到S1或者S2区。如果等他在S1S2区有一个限度,一般来说默认是十六。如果到16的话还没有被回收的话,此时就会进入老年代。然后比如一些String以及一些实例化,一般就在老年代里面这种也会被回收。但是一般一般是在后面才会回收,很难被回收的。
假设我这个A对象被其他对象持有的情况下,他会被回收吗?
不会被回收
那那垃圾处理器它是怎么确定这个对象有没有被引用呢?
有没有被引用它有两种方法,一种是可达性分析,还有一种是给他设置一个值,就每每一次被调用的话会对他加一。然后如果如果销毁一次的话,就点一直到它没有再被引用的时候,他就可以对它进行一个回收。然后可达性分析的话,相当于是从根节点创建一个类似树一样的,从根节点到依次遍历到最最底端。如果他没有如果没有一个,如果他是能到达的话,说明他这个可达性的话就会对他进行一个回收。如果如果垃圾回收的话,就会对它进行一个回收。
说一下spring过滤器和拦截器有什么区别
过滤器的话,过滤器一般是。过滤器是可以在它是基于java的拦截器的话,一般拦截器是基于过滤器是基于servlet,局限于servlet,而拦截器是不受servlet影响的。同时过滤器。过滤器的话它是能能对所有请求拦截。而拦截器的话它会受受会受一些限制,可能对一些请求无法进行一些拦截。
他们分别涉及到了什么设计模式?
不是很了解
那你先说一下你这边比较熟悉的设计模式,什么样的熟悉的设计模式?
一般来说有单例模式,单例模式的话它有懒汉式饿汉式,以及懒汉式饿汉市还有一种。但是的情况下,一般单单列是一般它只进行一次初始化,后面就不用再进行初始化了。
就是有策略模式,策略模式的话他你有一些代码当中,如果有很如果有就那种那种一些冗余的那种代码。比如很多if的情况下,它可以通过策略者模式来进行一种优化。它相当于是你可以对他进对他通常他有一个策略接口,然后他然后有几个实现具体实现这个策略接口的一个实现类,然后再给一个统一的一个请求这个策略的一个中间的一个环境。然后你可以自定义的选择,选择用哪种策略。这种策略这种设计模式的优点的话,它可以更加的让代码更加灵活,同时也有很强的扩展性。如果你有你想扩展一个别的策略的话,你只需要继承这个接口就行了。
然后的话还有工厂模式。工厂模式的话它相当于提供了一个工厂,可以封装的创建一个工创建对象。您正常来说,你每个产品都要有一个对应的一个生产这个产品的工厂。这个时候用工厂模式的话,就把产品也产品筹划抽象了一下,把工厂也抽象。然后如果你想要实现这个产品的话,你就对这个抽象的产品进行一个聚成工厂。你要是有很多个工厂的话,你想要实现哪种工厂,你就对这个抽象工厂进行一个实现。这种工厂的话你就用户只需要用户只需要关心那个。相当于是你用户不用关心他他这个产品是来自哪个工厂,你只需要知道你已经你得到了这个产品。同时的话也是可以提高代码的可扩展性和可维护性。
对,那你先说一下在这个项目上面有没有让你觉得有挑战的地方?
因为这个项目我觉得学到更多的可能在AK和SK设计的那些那那一块。
你正常来说你我这个接口正常来说每个人调用的话,我不可能免费给你调用。一般来说是需要收费的。然后涉及到收费的话,你要就要采就要去就要防止一些用恶意用户来进行一个访问。这个时候我对每一个在我这个平台上注册的用户,我先注册,注册的时候已经给他生成一个默认,生成一个随机,生成一个AK和SK然后存到你的数据库里面。然后你如果要来访问我的数据库的时候,你要来访请求我这个接口的话,我会把请你把你的AK和一些请求头以及时间戳,或者加一些随机数,通过前通过这个请求头来进行一个加密算法。然后我们当时选的是MD5加密的。
加密完之后,如果因为我们是通过一个网关请求,请求都会统一进入到网关层。在网关层的话,它会通过你用户的ID然后查询到你这个数据库里面的AK通过AK然后再根据获得请求,请求头里面获取到那个随机数,以及你的请求的一个数据以及随机数,然后再进行一个MD5加密。
MD5加密后的一个数据,如果相等的时候,你我这个API接口这个提供者才能信任你这个调对我这个接口调用的对他产生了信任,这时候才能进行调用,否则的话他就不允许他调用。这时候可以防止有一些用户,有一些恶意用户,比如获取到你这个伪造一个请求,然后来恶意的攻击我这个API。
你这个AK跟SK跟oauto的认证是同一套体系吗?
类似。因为我们当时参考的是腾讯云以及一些阿里云。他当时你如果想要使他第三方平台一些OSOSS那种对象存储的话,他会给你提供一个AK和SK。我们当时是通过这来思考的那我在登录的时候,
你们主要是在上面发布了哪些接口呢?
发布结果的话,我们有一些比如在线调试调在线桥每日的天气,以及根据一些就比如给一个相关的一个字段,然后返回你一个想要的一个图片吧。还有一些我们在别的一些我们当时写的别的项目,我们觉得可能后期会用到,然后就把这些封装到项上线到项目当中,然后可以对他进行后期一个项目开发进行一个复用。
就是你这边统计接口的调用次数是怎么统计的?
因为我们当时想的是有3种,因为正常来说你前我你前端如果要访问我这个项目的话,有一种情况是你前端可以直接访问我这个模拟的这个接口。然后还有一种是通过后端,你前端先到后端,然后再通过后端来访问这个模拟接口。这种情况的话可以用一些NGINX这种来进行一个负载均衡。
但是我们考虑到NGX可能编程的话更复杂一些。我们这时候用的是SpringBoot gataway, 然后你前端先通先访问接口的话,都会通过先会请求到API网关层。网关层在网关中统一对一个次数进行一个计算。你到这个接口的时候,你先对你要请求哪一个接口,然后对这个进行计算之后,通过网关层来通过网关层来对你这个路由统一进行转发。转发到你对应的有一个接口,有一个模拟接口的一个模块。通过这个模拟接口的模块就可以进行真实的一个对接口的请求,直接就在网关层进行数据统进行这个次数的统计。
反问
我想问一下,如果我入职本公司的话,你觉得我会从本公司获得最大的收获是哪方面的?
这块其实我们现在公司里面,其实实现的就是做的事情蛮多的。就是有你对我们自己有一个低代码的一个平台,低代码平台的一个团队。这个团队里面,他会因为我看你的项目上设计里面,其实是比较倾向于做一些技术的一些研究的对吧?就是很多逻辑里面,所以其实你可能对业务这块可能不太感觉比较喜欢玩技术。那玩技术这边我们有一些低代码平台的一个设计的,然后同时我们有一个小团队在做,也在做AIGC相关的一个内容。所以如果说你入职之后,这两方面我觉得你是能够得到一些实际的一个产品应用的。
想问一下公司,因为我看搁网上看到咱公司是有一个低代码平台的话。然后咱公司除了低代码平台,还有别的一些技术,就是常用的一些后端相关的一些技术
低代码平台它主要管两种。我们现在有两层,一个是pass,pass的话就是帮我们去玩一些部署,就是整个部署底层都给你代理掉。类似于我不知道有没有用过阿里云的那个线服务,部署的时候有一个GPS,我不知道你们有没有听过。这是一层底层的一个pass。
然后低代码平台它是什么呢?它是说我们在做一些简单的业务处理的时候,我们是不需要写代码,我们可以做一些简单的服务编排,页面设计上也可以直接去搭一些页面出来。那本身它还开放了一个区别,就是其实它是可以拥抱整个java生态的。就是你在java里面你是可以任意使用你自己想要的一些技术站,这个是不限制你的。并且我们现在90%的写的一些业务逻辑,都是基于这个java原生生态的一些技术上去做的。当然在现在的团队里面,我们会有一些技术规范。就是说如果你想引用一下一个新的一个技术框架的时候,其实需要经过一些详细的评估的。