JAVA
文章平均质量分 59
sss
程序员劝退师-TAO
没事敲两行代码
展开
-
JAVA-SPI机制
前言本文是做Dubbo的SPI机制的铺垫文章,那么本文我们就来看看JAVA的SPI是个啥!SPI全称为 (Service Provider Interface),通常在一些第三方框架上有的!本文先使用数据库驱动来讲解一下!市面上有许许多多的数据库,如MySQL、SQLServer、Oracle等等,这些在JAVA中都能对接,是应为有Driver接口在顶层抽象控制!Driver提供一套接口规范,那么各第三方数据库驱动依赖需要实现Driver接口,然后各个数据库驱动依赖包中配置实现类全限定名,如下!那原创 2022-01-12 15:58:58 · 368 阅读 · 0 评论 -
XXL-JOB集群部署调度中心
前言前些年写过分布式任务调度平台XXL-JOB,本文补充一下高可用的调度中心,也就是集群版的调度平台,这个其实挺简单的!就连官网也就几个字!环境准备MySQLNginx/LSB多台服务器Nginx反向代理这个比较简单,使用Docker搭建就行了,简单把流程跑通即可,线上的话可以采用阿里云的LSB做代理,修改配置user nginx;worker_processes auto;error_log /var/log/nginx/error.log notice;pid原创 2022-01-11 14:17:27 · 1827 阅读 · 0 评论 -
大厂面试资料
基于SSD的Kafka应用层缓存架构设计与实现Java中9种常见的CMS GC问题分析与解决Java即时编译器原理解析及实践外卖客户端容器化架构的演进Kubernetes如何改变美团的云基础设施?新一代垃圾回收器ZGC的探索与实践美团搜索中NER技术的探索与实践BERT在美团搜索核心排序的探索和实践美团万亿级 KV 存储架构与实践MyBatis版本升级引发的线上告警回顾及原理分析美团MySQL数据库巡检系统的设计与应用Java线程池实现原理及其在美团业务中的实践Intel PAUSE原创 2021-11-19 01:05:40 · 1425 阅读 · 0 评论 -
JAVA 给List赋初始值最简单方案
/** * swagger 放行URL */ List<String> SWAGGER_URL = Arrays.asList( "/v3/**",//此请求不放开会导致 error api-docs无法正常显示 https://songzixian.com/javalog/905.html "/swagger-ui**", "/swagger-ui/**",//此请求不放开没有权限请求一直失.原创 2021-10-06 13:42:42 · 2055 阅读 · 0 评论 -
JAVA实现数据脱敏(结合Spring)
前言这个数据脱敏是最近做的一个权限系统的功能,我们这个权限系统包含菜单权限,操作权限,数据权限,字段权限,其中字段权限就是控制字段根据不同的角色隐藏或者显示,这个和数据脱敏也是差不多的,正儿八经的数据脱敏如用户的身份证后几位为**** ,或则如用户电话号码不全部展示,如187 **** 9101,我们做的这种字段权限并不是用****替代,而是这个字段直接不给前端展示!设计方案每个接口根据不同的业务模块来控制字段的显示,那么我们可以设计一个注解,这个注解是用来标注当前接口使用哪个业务模块,然后通过业务模原创 2021-08-26 15:05:04 · 1574 阅读 · 1 评论 -
JAVA读取json文件
1.准备json文件2.编写java代码 String jsonStr=null; try { File file = new File("C:\\Users\\TAO\\Desktop\\ss.json"); FileReader fileReader = new FileReader(file); Reader reader = new InputStreamReader(new FileInputStream(file), "Utf-8"); int ch = 0;原创 2021-04-22 16:16:09 · 440 阅读 · 0 评论 -
匿名内部类引用变量必须为final
示例代码public class Hello { public static void main(String[] args) { final String str="haha"; new Thread() { @Override public void run() { System.out.println(str); } }.start(); }}以上代码就是典型的匿名内部类引用变量必须使用final修饰!这里必须使用final修饰的原因是因为java中原创 2021-03-29 20:38:21 · 1971 阅读 · 3 评论 -
JDK1.8新特性四大内置核心函数
/** * Consumer<T> :消费型接口 * void accept(T t) * Supplier<T t> :供给型接口 * T get(); * Function<T t,R r> :函数型接口 * R apply(T t); * Predicate<T t> :断言型接口 * boolean test(T t); .原创 2021-03-28 20:08:41 · 336 阅读 · 0 评论 -
JDK1.8新特性(Lambda表达式)
为什么使用Lambda表达式Lambda是一个匿名函数,我们可以吧Lambda表达式理解为一段可以传递代码(将代码像数据一样进行传递)。可以写出更加简单、更灵活的代码。作为一种更紧凑的代码风格,是Java的语言表达能力得到了提升。...原创 2021-03-28 20:07:23 · 252 阅读 · 0 评论 -
JAVA线程池
为什么使用线程池降低资源消耗,提高线程利用率,降低创建和销毁线程的消耗。提高响应速度;任务来了,直接有线程可用可执行,而不是先创建线程,在执行。提高线程的可管理性,线程是稀缺资源,使用线程可统一分配调优监控线程池参数corePoolSize代表核心线程数,也就是正常情况创建工作的线程数,这些线程创建后并不会消除,而是一种常驻线程maxinumPoolSize代表最大线程数,它于核心线程数相对应,代表最大允许被创建的线程数,比如当前任务较多,将核心线程数都用完了,还无法满足需求时,此时就会创原创 2021-03-10 22:58:09 · 193 阅读 · 0 评论 -
JAVA内存模型JMM剖析
1.CPU多核并发缓存架构剖析这张图是早期计算机硬件CPU多核并发的缓存架构图,简单解释一下这张图的意思。程序大家都知道是安装在硬盘中的,当我们的计算机要启动程序的时候,会先从硬盘中将程序加载到内存中去也就是加载到内存条上去。早期的CPU是直接和内存进行交互的,中间是没有什么CPU缓存的,大家都知道CPU和内存的发展计算机诞生这么多年来,CPU的性能增长还是比较快的,早些年有个摩尔定律(每...原创 2020-04-26 02:38:35 · 197 阅读 · 0 评论 -
Dubbo搭建管理控制台(dubbo-admin)
搭建方式1直接搜索dubbo-admin.war找到下载链接,直接下载下载后得到dubbo-admin.war这个是一个war工程,需要tomcat容器,那么我们启动一个tomcat,软件包启动也好,docker启动也好Docker 安装 Tomcat,个人是个docker依赖患者!将dubbo-admin.war放到/tomcat/webapps/目录下,tomcat会自动解压得到dubbo-admin修改/dubbo-admin/WEB-INF/dubbo.properties重启t原创 2021-01-16 22:51:30 · 295 阅读 · 0 评论 -
zookeeper集群搭建
程序包下载官网下载地址这个官网做的仅次于linux镜像下载的网站搭建我这里搭建一个伪集群,也就是在同一台服务器上搭建3个节点,正式生产环境还是需要分别部署在三台服务器上的!这里搭建的时候节点个数需要是奇数!1.上传服务器、解压、创建集群目录#解压tar -zvxf zookeeper-3.4.6.tar.gz#修改zoo_sample.cfg为zoo.cfgcd cd zookeeper-3.4.6/conf/mv zoo_sample.cfg zoo.cfg#创建集群目录m原创 2021-01-16 15:08:51 · 184 阅读 · 0 评论 -
高并发情况下加锁-本地锁、分布式锁实现
前言在高并发情况下,要保证服务端的性能,那么会采用缓存来提高服务端的性能,如百万请求访问一个查询的接口,这个接口做了缓存,但是不能保存并发同时到达接口时缓存中也没有数据,恰巧这百万的并发又进入到数据库,那么这时数据库压力过大,导致数据库崩溃,导致服务的不可用,乃至整个系统的崩溃,那么这是由于并发同时绕过了缓存判断直接进入到数据库导致的,这时就可以针对这个并发问题进行加锁本地锁单体项目时可以这么做 public R getData { /** *原创 2020-07-15 22:40:11 · 1902 阅读 · 5 评论 -
跨域产生的原因以及常见的解决方案
跨域:是指浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安全限制!同源策略:是指协议(http、https、rtmp…)、域名(jd、taobao、baidu)、端口(80、8080、443)其中有一个不同都产生跨域跨域引发的请求报错浏览器显示如下图Access to XMLHttpRequest at 'http://192.168.0.99:3331/authentication/form?username=TAO&password=12原创 2020-11-11 15:25:23 · 830 阅读 · 0 评论 -
JAVA接入支付宝
前言:1.由于支付宝商家版个人账号无法申请所以,而且需要等待审核,这里就不过多演示,接下来采用支付宝沙箱环境来接入,后期商家版申请好了更换对应配置即可;2.虽然是本地测试环境,但是还是需要接受支付宝支付成功的回调,这里提供三种为本地开发提供三种解决方案!(1.将项目直接部署到公网服务器上接受回调、2.使用第三方内网穿透服务提供商内网穿透服务-ngrok、3.自己搭建内网穿透服务,这需要有一台公网服务器-使用Frp搭建内网穿透准备支付宝账号环境1.进入官网注册账号支付宝服务商平台2.进入沙箱服务原创 2020-08-20 12:42:52 · 818 阅读 · 0 评论 -
集群常见的基本形式
集群的目标高可用: ,是当一台服务器停止服务后,对于业务及用户毫无影响。停止服务的原因可能由于网卡、路由器、机房、CPU负载过高、内存溢出、自然灾害等不可预期的原因导致,在很多时候也称单点问题。突破数据量限制: 一台服务器不能储存大量数据,需要多台分担,每个存储一部分,共同存储完整个集群数据。最好能做到互相备份,即使单节点故障,也能在其他节点找到数据。数据备份容灾: 单点故障后,存储的数据仍然可以在别的地方拉起。压力分担:由于多个服务器都能完成各自一部分工作,所以尽量的避免了单点压力的存在集群的基原创 2020-09-03 12:23:33 · 1695 阅读 · 0 评论 -
JVM堆内存监控-VisualGC
堆内存使用情况监控准备一份代码import java.util.ArrayList;public class HeapTest { byte[] a=new byte[1024*100];//100KB public static void main(String[] args) throws InterruptedException { ArrayList&...原创 2020-04-27 00:01:25 · 644 阅读 · 0 评论 -
JVM底层实现原理
1.JVM内存模型先上图,先上图,先上图!!!想必大家都似曾相识的见过,见过,见过这张图,这是JDK体系结构图。都是英文,翻译过来也看不懂,我还是介绍一下吧!!!这里的核心就是JVM,它也是实现JAVA语言跨平台的核心。这里注意,在我们搭建JAVA开发环境的时候,下载JDK的时候,会提供系统版本,下图这是因为不同的JDK搭载的环境系统,会将.class文件由JVM挂载到当前机器能...原创 2020-04-25 16:15:34 · 681 阅读 · 0 评论 -
JDK11源码导读记录(HashMap)
HashMap这玩意JAVA开发中常用,但是都是用,至于底层实现原理,都不是什么很清楚,也就只知道什么数组+链表+红黑树!!!那么现在从0开始看。数组数组+链表数组+链表+红黑树点开我们的HashMap的JDK11源码,先基本上过一遍,在分析JDK11HashMap的时候需要一定的数据进制基础不然会很懵逼的!基本数据 //初始桶的大小(默认16)必须是2的整数次方 static...原创 2020-04-22 16:25:51 · 974 阅读 · 0 评论 -
JDK11源码导读记录(准备)
JDK对于JAVA程序员来说:既熟悉又陌生,为毛?熟悉:就是每天敲代码都要用;陌生:就是每天都用却感觉有种只知皮,不知骨,这种感觉草鸡不爽!所以,在今天2020.4.15开始沉下心来分析JDK源码!(这一天其实对于我来说挺有意义的,在人生这条艰苦,且充满希望的路上,我揣着对未来的憧憬,来到魔都,开始了程序之路!!!)废话不多说那就开始干吧!!!1.环境准备IDEA开发工具JAVA1...原创 2020-04-15 17:05:43 · 337 阅读 · 1 评论 -
分布式任务调度平台XXL-JOB
前言定时任务在开发中经常用到,Spring也为我们提供了非常方便的注解来开启定时任务,之前有一篇文章简单介绍了Spring的定时任务,基本代码如下;@Component@EnableScheduling//开启定时任务public class SpringScheduleHandler { @Scheduled(cron = "0/5 * * * * *") //这个cron 表达式不用死记,在线生成网址 https://cron.qqe2.com/ public void原创 2021-01-20 18:43:52 · 350 阅读 · 0 评论 -
Slf4j输出乱码
这里设置了文件存储方式为UTF-8或者GBK的编码方式也没有用这里可能是我本机的idea编码问题吧,我命令行启动时没问题的,所以window系统编码也没问题这里需要在启动的时候而外设置日志输出格式即可-Dfile.encoding=UTF-8搞定...原创 2020-11-15 20:50:48 · 3702 阅读 · 1 评论 -
JUC-原子变量和CAS算法
先写个测试demo,目的是引出CAS的作用!/** * @author TAO * @description: 原子变量-CAS算法 * @date 2020/9/21 20:53 */public class TestAtomicDeme { public static void main(String[] args) { AtomicDemo ad=new AtomicDemo(); for (int i=0;i<10;i++){原创 2020-09-22 21:31:40 · 172 阅读 · 0 评论 -
JUC-volatile-内存可见性
实例代码/*** @description: Volatile 关键字* @author TAO* @date 2020/9/21 7:57*/public class TestVolatile { public static void main(String[] args) { ThreadDemo td=new ThreadDemo(); new Thread(td).start();//开启一个线程 while (true){原创 2020-09-21 08:57:34 · 124 阅读 · 0 评论 -
JUC-多线程
线程状态类型Thread.State public static enum State { NEW,//新生 RUNNABLE,//运行 BLOCKED,//阻塞 WAITING,//等待 永远等待 TIMED_WAITING,//超时等待-设定时间等待 TERMINATED;//终止 private State() { } }wait/sleep区别1.属原创 2020-09-18 21:08:36 · 99 阅读 · 0 评论 -
JUC-并发和并行
并发多个线程同时操作同一个资源 ,一核CPU,多个线程情况下快速切换CPU交替使用并行并行是在多核CPU情况下,多个线程可以同时执行任务。我这里逻辑处理器,也就是同时能处理4条线程,如果用了超线程的话就会翻倍同时我们作为程序员也可以使用代码获取CPU核数 public static void main(String[] args) { System.out.println(Runtime.getRuntime().availableProcessors()); }原创 2020-09-18 20:59:06 · 172 阅读 · 0 评论 -
JUC-线程和进程
进程一个程序如,微信、网抑云、一个进程可以包含多个线程,至少包含一个,java默认存在两个进程main、GC线程如微信程序,打字、发送都是线程负责JAVA事实上是无法创建线程的!new Thread().start();底层创建线程是用的是本地方法,所以并不是java创建的,而是底层的C++代码,因为java无法直接操作硬件,因为java是跑在虚拟机上的...原创 2020-09-18 20:41:35 · 115 阅读 · 0 评论 -
分布式事务
分布式系统经常出现的异常:机器宕机、网络异常、消息丢失、消息乱序、数据错误、不可靠的TCP、存储数据丢失CAP定理一致性(Consistency) : 在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)可用性(Availability) : 在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)分区容错性(Partition tolerance): 大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(parti原创 2020-08-13 21:06:25 · 181 阅读 · 0 评论 -
本地事务
本地事务什么是本地事务,现在有一个单体应用,就连接了一个数据库,也没有多个数据库,也没有多个项目,也不牵扯到远程调用,现在有一个这样的业务流程,下订单,减库存,减积分,这三个多数据库的操作要么同时成功要么同时失败,这就是本地事务!事务的基本性质原子性(Atomicity)、一致性( Consistency) 、隔离性或独立性(Isolation)和持久性(Durabilliy,简称就是ACID;**原子性:**一系列的操作整体不可拆分,要么同时成功,要么同时失败**一致性:**数据在事务的前后,业原创 2020-08-13 00:52:59 · 944 阅读 · 0 评论 -
Thread.currentThread().getStackTrace()[?]
1.先康康JDK源码的注释Thread.currentThread().getStackTrace()返回表示此线程的堆栈转储的堆栈跟踪元素数组。 如果此线程尚未启动,已启动但尚未安排由系统运行或已终止,则此方法将返回零长度数组。 如果返回的数组长度为非零,则数组的第一个元素表示堆栈的顶部,这是序列中最近的方法调用。 数组的最后一个元素表示堆栈的底部,这是序列中最近的方法调用。如果有一个安全管理器,并且该线程不是当前线程,则调用安全管理器的checkPermission方法,并获得RuntimeP原创 2020-08-12 15:08:01 · 4175 阅读 · 1 评论 -
接口幂等性
一、什么是幂等性接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用;比如说支付场景,用户购买了商品支付扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额返发现多扣钱了,流水记录也变成了两条. …,这就没有保证接口的幂等性。二、哪些情况需要防止用户多次点击按钮用户页面回退再次提交微服务互相调用,由于网络问题,导致请求失败。feign触发重试机制其他业务情况三.什么情况下不需要原创 2020-08-07 21:43:34 · 566 阅读 · 0 评论 -
重定向取RedirectAttributes中的值
没用的话就不说了,像什么RedirectAttributes 是Spring mvc 3.1版本之后出来的一个功能,专门用于重定向之后还能带参数跳转的的工具类,网上一大堆!来看看问题!后端代码 @PostMapping("/dologin") public String dologin(RedirectAttributes redirectAttributes){ redirectAttributes.addAttribute("error","我是错误信息");原创 2020-08-04 12:52:09 · 3204 阅读 · 4 评论 -
ThreadLocal-同一个线程共享数据
每一个请求到达服务器,Tomcat都会开启一个线程处理这个请求,从拦截器->controller->service->dao、在到数据返回到客户端都是同一个线程,那么在同一个线程之间,上一层放的数据如拦截器、或者controller,在下一层=数据需要共享,这里就可以使用ThreadLocal;ThreadLocal的核心原理就是一个Map<Thread,Object> threadLocal,将每个线程做为key,当前线程需要共享的值就是Object,使用ThreadLo原创 2020-08-01 22:34:10 · 1090 阅读 · 0 评论 -
JAVA接入QQ授权登录
1.官网注册账号QQ开放者平台2.安卓/IOS接入这里安卓和IOS会跳转到QQ然后用户授权,IOS/安卓会拿到一堆参数!主要就两个access_tokenopenid.3.服务端实现 String accessToken=params.getString("access_token"); String openid=params.getString("openid"); Out.debug(accessToken); Out.debug(o原创 2020-08-01 11:16:58 · 441 阅读 · 0 评论 -
JAVA接入微信授权登录
1.注册微信开放品台账户微信开放平台2.IOS/Android接入这里安卓和IOS会跳转到微信APP然后用户授权,IOS/安卓会拿到一堆参数!主要就两个access_tokenopenid3.服务端实现 String accessToken=params.getString("access_token"); String openid=params.getString("openid"); String baseUserInfoUrl = "https://原创 2020-08-01 10:58:46 · 639 阅读 · 0 评论 -
分布式Session共享解决方案
1.session复制2.浏览器本地存储3.负载均很Hash-IP一致性4.服务端同一存储这里采用服务端同一存储的方式解决分布式Session共享问题演示存在的问题环境准备1.创建三个服务器ac为认证服务器,oth1、oth2分辨扮演其他业务服2.设置本地域名C:\Windows\System32\drivers\etc这里设置域名也是模拟线上环境,因为不同域名存在session跨域问题,3.导入依赖-这里的依赖4.编写伪代码ac服务器login.html<原创 2020-07-30 10:26:34 · 389 阅读 · 0 评论 -
JAVA接入微博登录
账号准备1.微博开放者平台注册微博放者平台登录,然后进入我的应用!2.完善信息微博开放者平台还是挺好认证的,大概10分钟就能搞定!3.填写应用回调信息客户端代码实现1.先微博认证服务器发送请求client_id:这个就是基本信息中的App Keyredirect_uri:这个是高级信息中的授权回调页面服务端实现1.编写认证成功微博的回调接口. @GetMapping("/weibo/success") public String weiboSuccess(@Requ原创 2020-07-25 16:30:09 · 938 阅读 · 0 评论 -
MD5&MD5盐值加密
MD5. Message Digest algorithm 5,信息摘要算法压缩性:任意长度的数据,算出的MD5值长度都是固定的容易计算:从原数据计算出MD5值很容易。抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是非常困难的不可逆加盐:通过生成随机数与MD5生成字符串进行组合·数据库同时存储MD5值与salt值.验证正确性时使用salt进行MD5即可MD5 public static void原创 2020-07-24 23:03:49 · 903 阅读 · 0 评论 -
JAVA实现爬虫
1.项目搭建2.导入相关依赖 <dependency><!--jsoup只能解析网页 tika能解析视频网站 --> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.10.2</version> </depe原创 2020-07-23 23:41:01 · 629 阅读 · 1 评论