ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

精通JavaSE 基础知识,有良好的面向对象分析能力,掌握常用设计模式及应用方式、泛型、各类集合、IO、 Lambda表达式、Stream流、自定义注解、反射和Java-Agent实现,具有良好的编程

精通JavaSE 基础知识,有良好的面向对象分析能力,掌握常用设计模式及应用方式、泛型、各类集合、IO、 Lambda表达式、Stream流、自定义注解、反射和Java-Agent实现,具有良好的编程 设计模式创建型工厂造单例适配组装代1.工厂模式简单工厂遇到最多spring 的单例池通过bean名称获取单例bean、mybatis的sqlsessionfactory把一个个数据库session放线程的threadlocal里面。2.构造者模式工作中用的Lombok的Builder注解mybatis的sqlsessionfactory的根据config配置文件Build的链式调用Build的方式。3.单例模式spring的单例实现方式构造方法私有化常用的饿汉式类加载了就去加载对象了静态内部类外部类加载使用懒加载的机制加载。结构性4.适配器模式mvc的handlerAdapter、spring 默认的slft-logback的Adapter将其他日志框架日志转成logback模式。5.组合模式整体架构设计思想就是组合模式如tomcat、netty和k8s各种组件的搭配组合。6.装饰者模式各种WrapperqueryWrapperspringsession对request和response的Wrapper放redis里共享mybatis的缓存的Wrapper。代理模式动态代理JDK、cglibaop代理调用原方法dubbo、feign、mybatis的mapper。行为型链子叠模板观察策略变7.责任链模式mvc的handlermappingchain拦截器、tomcat的chain、netty的handlerpipeline。8.迭代者模式集合遍历的iterator。9.模板方法顶层的抽象动作定义的足够的高交给子类实现具体逻辑各类templateresttemplate、redistemplate、jdbctemplatejuc、redisson的lock和unlock。10.观察者模式消息队列spring中各种listenerprocess回调11.策略模式面对同一场景采取不同的策略结果。工作业务代码能用到的策略和责任链模式比如apisec场景我们有v3和v4探针上游kafka解出来的报文格式不同在配置文件中配置v3或者v4通过spring的ConditionalOnExpression或者onproperties动态选择注入其中一个bean而上游的业务代码都是调用顶级接口方法下游v3 v4具体实现不一样这样就做到了灵活切换探针了。责任链模式业务场景是apisec场景敏感词检测一条响应内容做多个敏感词规则的正则匹配用户前端又能选择性的开启或关闭还有检测顺序的规则。这时候我们是采用一个敏感词规则对应一个bean之后通过注入一个listspring会找到这个类型的全部bean进行注入一条流量进来做判断的时候根据这个些bean的enable开关进行判断是否生效order进行排序处理。用户做了修改启用或者顺序则把对应bean里面的字段修改数据库也改重启则加载数据库的配置。各类集合ArrayList基于动态数组实现扩容机制是当添加元素时如果当前数组长度不足则扩容为当前长度的1.5倍大约。LinkedList基于链表实现适合频繁插入和删除元素。HashSet基于哈希表实现元素唯一性通过hashCode和equals方法保证。LinkedHashSet在HashSet基础上使用链表维护元素的插入顺序。TreeSet基于红黑树实现元素按照自然顺序或自定义比较器排序。HashMap基于哈希表实现JDK 1.8之后当链表长度大于8且数组长度大于64时链表会转化为红黑树。扩容机制是当元素数量超过阈值容量 * 加载因子时会扩容为原来的2倍。TreeMap基于红黑树实现键自然排序或根据提供的Comparator排序。key 实现comparator接口重写compare 方法。LinkedHashMap 的底层数据结构是哈希表加双向链表。哈希表保证了数据的快速存取而双向链表则用于维护数据的插入顺序或访问顺序。线程安全的集合Collections.synchronizedList set mapList list Collections.synchronizedList(new ArrayList());锁整个listCopyOnWriteArrayListCopyOnWriteArrayList是一个线程安全的List实现它在修改操作如add、set等时会复制底层数组并在新数组上进行修改从而避免了在修改时加锁。因此它非常适合读多写少的场景。但是由于写操作需要复制底层数组因此在写操作频繁的场景下性能可能会受到影响。ConcurrentHashMap 和hashmap一样1.8桶级别锁**只锁住当前操作的桶数组的一个位置。-锁升级- 使用CAS无锁尝试初始化桶或插入节点。- 失败时升级为synchronized锁仅锁当前桶的头节点ConcurrentSkipListMap 跳表形式的map key是跳表cas保证并发跳表的特点查询根据索引范围查找快。新增、删除节点需要动上级索引但是相较于链表慢但是比数组快。LinkedBlockingQueue默认无界线程安全的队列fifo采用aqs的同步唤醒机制保证线程安全。ArrayBlockingQueue数组实现的指定大小创建线程池。IO字节流InputStream、OutputStream、FileInputStream、FileOutputStream、BufferedInputStream、BufferedOutputStream等。字符流Reader、Writer、BufferedReader、BufferedWriter等。NIOSelect 、 Channel、Buffer 三者的具体模式有操作系统绝对centos上就是epoll模型。ByteBuffer.allocateDirect(分配直接内存DMA技术减少了两次内核和用户态的转换。Stream流中间操作 filter map sorted limit skip distinct终端操作 collect tolist tomap groupingBy reduce自定义注解// 异步执行结果 同步查询缓存AspectComponentOrder(Integer.MIN_VALUE)Slf4jpublicclassBusAsyncCacheAspect{ResourceStringRedisTemplateops;Around(annotation(com.xs.common.redis.annotation.XsAsyncCache))publicObjectaround(ProceedingJoinPointpoint){}Target({ElementType.PARAMETER,ElementType.METHOD})Retention(RetentionPolicy.RUNTIME)DocumentedpublicinterfaceXsAsyncCache{//缓存时长 单位秒 固定时长请输入合法数字小于等于0的字符串都是永不失效。默认-1永不失效。// 区间时长输入如1#60,缓存1至60秒随机。 参数不合法则不缓存起始时间不能小于等于0不能大于结束时间Stringtime()default-1;// 超过此时间的查询进行缓存,单位毫秒默认1800mslonglimitTime()default1800L;}AOP加自定义注解实现redisson分布式锁同步缓存和异步缓存策略。同步缓存先查缓存缓存没有查询数据库之后缓存放一份等过期失效查最新的db数据。异步缓存先查缓存缓存没有查询数据库记录查询时间大于1秒则往数据库放一份后续查询都查询缓存但是没查询一次后台异步线程池任务查询db更新缓存也就是说大于2秒钟的接口每次查询的都是缓存都是上一份结果但是数据已经会更新。业务场景是有一次DR钻戒需要客服聊天系统急着上数据存储用了mysql近两亿的数据历史消息一直查询需要7秒以上每次进去都转半天我们临时给他们上的异步缓存的方案总比让他们的用户一直聊天界面转强数据更新就非常的延迟。反射创建反射的三种方式Class? clazz1 String.class; Class? clazz2 “hello”.getClass();Class? clazz3 Class.forName(java.lang.String); Class? clazz classLoader.loadClass(“com.example.MyClass”);false 只加载不解析反射创建对象Object instance clazz1.getDeclaredConstructor().newInstance();反射调用方法Method method clazz1.getDeclaredMethod(“someMethod”, String.class);method.invoke(instance, “someArgument”);Java-Agent先导入byte-buddy依赖静态Agent也就是java -javaagent 这种启动方式skywalking就是这种这种需要写一个class类重写premain方法要是动态探针类似Arthas就重写agentmain方法获取到一个instrumentation对象就是目标jar对象编写一个transformer指定包扫描路径再在transformer创建一个interceptor可以获取到指定包下的方法的入参、返回值或者异常了类似aop的环绕通知。业务场景敏感词检测本来是在旁路api层面上进行敏感词检测现在客户的需求更加细粒度需要知道他们内部的代码哪一个方法会泄露敏感词有用skywalking的客户希望把敏感词信息配合skywalking自带的日志上传功能通过谷歌的grpc一起上传到es在监控平台上就能知道一整个链路哪里有敏感词泄露风险了修改了skywalking源码拓展了功能。不用skywalking的客户就直接使用javaagent的方式通过打warn日志的方式提示出来。
返回列表