Java
文章平均质量分 86
Java
油墨香^_^
想要敲出漂亮的代码, 就要暴露在全世界的眼睛下!
展开
-
IDEA 自定义容器 +Docker打包部署,一套带走
如下图所示,自定义一个容器跑配置。因为上面的步骤我们已经创建了镜像了,所以可以直接用这个镜像即可。话不多说,直接运行起来看下。再来看下端口映射,这次就映射好了,完美!再来测试下是否能访问 API。还是用 curl 命令,返回结果如下,这次就成功了。passjava,悟空聊架构。转载 2023-04-04 09:43:23 · 1628 阅读 · 0 评论 -
jenkins+gitlab+maven+docker自动化部署spring boot
构建成功后,在jenkins workspace文件目录里可看到下载下来的代码,以及在target里生成的jar包。在gitlab的项目里》设置》导入所有仓库,webhooks配置,填上上边的url,secret token。1.生成docker镜像,上传到阿里云或自搭镜像服务器,远程到主机shell进行pull,更新容器等。Jenkins 执行远程脚本(停止老版本容器,删除老版本容器,build 镜像,run 新容器)2.4 Maven配置,新增一个,去掉自动安装,选择安装的目录。转载 2023-03-09 10:52:04 · 424 阅读 · 0 评论 -
Java 开发打飞机小游戏(附完整源码)
技术源于分享,所以今天抽空把自己之前用java做过的小游戏整理贴出来给大家参考学习。java确实不适合写桌面应用,这里只是通过这个游戏让大家理解oop面向对象编程的过程,纯属娱乐。代码写的很简单,也很容易理解,并且注释写的很清楚了,还有问题,自己私下去补课学习。转载 2023-03-09 10:46:46 · 1107 阅读 · 1 评论 -
顶级Javaer都在使用的类库
下面是收集的一些有用的第三方库,Java 开发人员可以在他们的应用程序中使用它们来完成很多有用的任务。从 JDK 8 开始,没有理由使用 Joda,因为您可以在 JDK 8 的新日期和时间 API中获得所有这些功能,但是如果您使用的是较旧的 Java 版本,那么 JodaTime 是一个值得学习的库。优秀且经验丰富的 Java 开发人员的特点之一是对 API 的广泛了解,包括 JDK 和第三方库。在 Java 8 之前,JDK 的数据和时间库有很多缺陷,因为它们不是线程安全的、不可变的和容易出错的。转载 2023-03-01 09:54:28 · 92 阅读 · 0 评论 -
SpringBoot+WebSocket实时监控异常....
最近做了一个需求,消防的设备巡检,如果巡检发现异常,通过手机端提交,后台的实时监控页面实时获取到该设备的信息及位置,然后安排员工去处理。前端略微复杂,需要在一张位置分布图上进行鼠标描点定位各个设备和根据不同屏幕大小渲染,本文不做介绍,只是简单地用页面样式进行效果呈现。预期效果,未接收到请求前----->id为3的提交了异常,id为3的王五变成了红色。我们可以看到,id为3的王五状态已经变成异常的了,实时通讯成功。2、因为是模拟数据,所以全部显示正常,没有异常提交时的页面呈现。控制台输出,连接成功。转载 2023-02-20 10:11:26 · 108 阅读 · 0 评论 -
K8s + SpringBoot实现零宕机发布
K8s + SpringBoot实现零宕机发布:健康检查+滚动更新+优雅停机+弹性伸缩+Prometheus监控+配置分离(镜像复用)转载 2023-02-15 09:53:27 · 116 阅读 · 0 评论 -
Jenkins+Docker+Spring+Java项目持续集成(单机版)
Jenkins 流水线构建 jar 微服务,打包成镜像并发布到生产服务器,大致流程很简单。1、拉取代码2、编译,打包成 images 镜像3、给镜像打标签4、push镜像到harbor5、拉取镜像到生产部署服务器6、部署当然,还有很多问题,比如项目回滚,多个微服务参数化发布等,还有集群下的发布。后期再弄弄k8s的发布。转载 2023-02-13 09:55:47 · 367 阅读 · 0 评论 -
全网最详细的线程池 ThreadPoolExecutor 解读
该接口是真正的线程池接口。上面的以及下面的都是该接口的实现类。Future转载 2023-02-07 17:16:16 · 1048 阅读 · 0 评论 -
还在手动部署jar包?太low了,动态上传jar包热部署真的爽
这里以一个简单的计算器功能为例,接口定义比较简单,直接上代码。转载 2023-02-07 17:13:27 · 134 阅读 · 0 评论 -
Spring Boot 项目打包 + Shell 脚本部署
正如上面小节说的,shell中的参数 package-name,activeProfile,boot-main 都是由mvn中profiles的properties中提供,是可变的参数,脚本代码本身不需要人工去修改,只需要变的是mvn的参数即可;注:这里第一次执行./shenniu_publish.sh脚本时候,提示了错误信息;filtered节点:脚本中参数变量为pom的profiles中properties的值(该配置,是把mvn中属性值映射生成到sh文件中,如:${package-name})转载 2023-02-17 13:39:55 · 332 阅读 · 0 评论 -
SpringCloud+Docker+Jenkins+GitLab+Maven实现自动化构建与部署实战
DevOps(Development和Operations的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合,它是一种重视“软件开发人员(Dev)”和“IT运维技术人员(Ops)”之间沟通合作的文化、运动或惯例。透过自动化“软件交付”和“架构变更”的流程,来使得构建、测试、发布软件能够更加地快捷、频繁和可靠。它的出现是由于软件行业日益清晰地认识到:为了按时交付软件产品和服务,开发和运营工作必须紧密合作。转载 2023-03-08 11:06:08 · 326 阅读 · 0 评论 -
一文全面解析 Postman 工具,写得太好了!
主要场景:一般情况下,在发送请求前需要对接口的数据做进一步处理,就都可以使用这个功能,比如说,登录接口的密码,在发送前需要做加密处理,那么就可以在前置脚本中做加密处理,再比如说,有的接口的输入参数有一些随机数,每请求一次接口参数值都会发送变化,就可以在前置脚本中编写生成随机数的代码。在我们测试的接口中,经常出现这种情况。常见的接口有如下四种类型,分别是含有查询参数的接口,表单类型的接口,json类型的接口以及含有上传文件的接口,以下就对这四种类型接口及如何在postman中请求进行说明。转载 2023-03-08 11:07:58 · 483 阅读 · 0 评论 -
SpringBoot项目中解决跨域的5种方式
当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域img首先编写一个过滤器,可以起名字为MyCorsFilter.java@Component在web.xml中配置这个过滤器,使其生效-- 跨域访问 START-->-- 跨域访问 END -->转载 2023-02-25 10:07:02 · 1125 阅读 · 0 评论 -
SpringBoot 过滤器、拦截器、监听器对比及使用场景
过滤器是在web应用启动的时候初始化一次, 在web应用停止的时候销毁可以对请求的URL进行过滤, 对敏感词过滤挡在拦截器的外层实现的是 javax.servlet.Filter 接口 ,是 Servlet 规范的一部分在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后依赖Web容器会多次执行。转载 2023-01-14 16:51:47 · 165 阅读 · 0 评论 -
Spring Boot 项目打包 + Shell 脚本部署实践,太有用了!
正如上面小节说的,shell中的参数 package-name,activeProfile,boot-main 都是由mvn中profiles的properties中提供,是可变的参数,脚本代码本身不需要人工去修改,只需要变的是mvn的参数即可;注:这里第一次执行./shenniu_publish.sh脚本时候,提示了错误信息;filtered节点:脚本中参数变量为pom的profiles中properties的值(该配置,是把mvn中属性值映射生成到sh文件中,如:${package-name})转载 2023-01-05 15:37:04 · 166 阅读 · 0 评论 -
Mybatis-Plus学习总结(超详细整理)
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、 Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的。数据库插入的id为全局默认的id(ID_WORKER),我们需要配置主键自增,在实体类字段上添加注解:@TableId(type =IdType.AUTO),数据库字段一定要是自增的。转载 2022-12-17 10:06:40 · 277 阅读 · 0 评论 -
JAVA日志框架适配/冲突解决方案大全
统一使用一套日志实现删除多余的无用日志依赖如果有引用必须共存的话,那么就移除原始包,使用“over”类型的包(over类型的包复制了一份原始接口,重新实现)不能over的,使用日志抽象提供的指定方式,例如中,可以通过环境变量指定一个具体的日志框架实现项目里统一了日志框架之后,无论用那种日志框架打印,最终还是走向我们中转/适配后的唯一一个日志框架。解决了共存/冲突之后,项目里就只剩一款日志框架。再也不会出现“日志打不出”,“日志配置不生效”之类的各种恶心问题,下班都能早点了!转载 2022-12-09 17:54:00 · 365 阅读 · 0 评论 -
你知道 Java 是如何实现线程间通信的吗?
正常情况下,每个子线程完成各自的任务就可以结束了。不过有的时候,我们希望多个线程协同工作来完成某个任务,这时就涉及到了线程间通信了。本文涉及到的知识点:thread.join(),object.wait(),object.notify(),CountdownLatch,CyclicBarrier,FutureTask,Callable 。下面我从几个例子作为切入点来讲解下 Java 里有哪些方法来实现线程间通信。如何让两个线程依次执行?那如何让 两个线程按照指定方式有序交叉运行呢?四个线程 A B C D,转载 2022-12-09 17:52:52 · 56 阅读 · 0 评论 -
你能说说 Ribbon 的负载均衡策略及原理嘛?
Load Balance负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法。像nginx可以使用负载均衡分配流量,ribbon为客户端提供负载均衡,dubbo服务调用里的负载均衡等等,很多地方都使用到了负载均衡。使用负载均衡带来的好处很明显:当集群里的1台或者多台服务器down的时候,剩余的没有down的服务器可以保证服务的继续使用使用了更多的机器保证了机器的良性使用,不会由于某一高峰时刻导致系统cpu急剧上升负载均衡有好几种实现策略,常见的有:随机 (Random)轮询 (RoundR转载 2022-12-06 10:18:26 · 122 阅读 · 0 评论 -
如何把Java开源项目部署在99元阿里云centos8上
程序汪已经分享了很多开源项目了,经常发现有粉丝评论说不会安装部署项目,甚至git下载代码也不会,于是程序汪现在搞了一套视频 从环境的安装jdk ,git,maven,mysql 到项目怎么部署 SQL怎么执行 ,真的保姆级别的教程。大家可以多多提意见,程序汪进行改进。程序汪建议大家搞个云服务器玩玩也很便宜阿里云的,华为云也有非常便宜的.下面教程非常详细,大家一步步对照视频都可以把服务跑起来。搭建环境大家会遇到很多坑,程序汪都总结了核心步骤。转载 2022-09-21 10:17:09 · 268 阅读 · 0 评论 -
SpringBoot+ShardingSphereJDBC实现读写分离
本文讲述了如何使用+进行读写分离,以及利用MySQL进行一主一从的主从复制。MySQL主从复制环境准备(Docker)搭建++Druid环境测试数据库中间件可以简化对读写分离以及分库分表的操作,并隐藏底层实现细节,可以像操作单库单表那样操作多库多表,主流的设计方案主要有两种:服务端代理:需要独立部署一个代理服务,该代理服务后面管理多个数据库实例,在应用中通过一个数据源与该代理服务器建立连接,由该代理去操作底层数据库,并返回相应结果。转载 2022-09-21 10:00:23 · 2733 阅读 · 1 评论 -
Spring Boot 超详细总结
IoC容器负责管理容器中所有bean的生命周期,而在bean生命周期的不同阶段,Spring提供了不同的扩展点来改变bean的命运。采用双亲委派模型的一个好处是保证使用不同类加载器最终得到的都是同一个对象,这样就可以保证Java 核心库的类型安全,比如,加载位于rt.jar包中的java.lang.Object类,不管是哪个加载器加载这个类,最终都是委托给顶层的BootstrapClassLoader来加载的,这样就可以保证任何的类加载器最终得到的都是同样一个Object对象。转载 2022-09-16 10:13:18 · 96 阅读 · 0 评论 -
Java实现短信验证码登录
2、使用接口向短信平台发送手机号和验证码数据,然后短信平台再把验证码发送到制定手机号上,接口参数一般包括:目标手机号,随机验证码(或包含失效时间),平台接口地址,平台口令;1、构造手机验证码:使用random对象生成要求的随机数作为验证码,例如4位验证码:1000~9999之间随机数;6、对比提交的验证码与Session中的验证码是否一致,同时判断提交动作是否在有效期内;4、将手机号--验证码、操作时间存入Session中,作为后面验证使用;7、验证码正确且在有效期内,请求通过,处理相应的业务。转载 2022-09-15 09:53:06 · 5744 阅读 · 1 评论 -
一文了解文件上传
平常在写业务的时候常常会用的到的是GET,POST请求去请求接口,GET相关的接口会比较容易基本不会出错,而对于POST中常用的 表单提交,JSON提交也比较容易,但是对于文件上传呢?大家可能对这个步骤会比较害怕,因为可能大家对它并不是怎么熟悉,而浏览器Network对它也没有详细的进行记录,因此它成为了我们心中的一根刺,我们老是无法确定,关于文件上传到底是我写的有问题呢?还是后端有问题,当然,我们一般都比较谦虚, 总是会在自己身上找原因,可是往往实事呢?转载 2022-09-15 09:42:59 · 128 阅读 · 0 评论 -
如何实现文件下载
一图览全文,可以先看看大纲适不适合自己,如果你喜欢则继续往下阅读。前端的文件下载主要是通过,再加上download属性,有了它们让我们的下载变得简单。download此属性指示浏览器下载 URL 而不是导航到它,因此将提示用户将其保存为本地文件。如果属性有一个值,那么此值将在下载保存过程中作为预填充的文件名(如果用户需要,仍然可以更改文件名)。此属性对允许的值没有限制,但是/和\会被转换为下划线。大多数文件系统限制了文件名中的标点符号,故此,浏览器将相应地调整建议的文件名。转载 2022-09-15 09:44:07 · 563 阅读 · 0 评论 -
Jenkins+Docker 一键自动化部署 SpringBoot 项目
本文章实现最简单全面的一键自动部署项目,步骤齐全,少走坑路。环境:centos7+git(gitee)简述实现步骤:在docker安装jenkins,配置jenkins基本信息,利用Dockerfile和shell脚本实现项目自动拉取打包并运行。转载 2022-09-14 11:00:36 · 157 阅读 · 0 评论 -
手写一个WebSocket协议
把 “Sec-WebSocket-Key” 加上一个特殊字符串 “258EAFA5-E914-47DA-95CA-C5AB0DC85B11”,然后计算 SHA-1 摘要,之后进行 BASE-64 编码,将结果做为 “Sec-WebSocket-Accept” 头的值,返回给客户端。这样你就愉快的通信了,不需要关注协议的实现,但是真正的项目场景中,可能会有UDP、TCP、FTP、SFTP等场景,你还是需要了解不同的协议实现细节,这里我推荐一下某金的张师傅小册《TCP协议》,看过都说好。转载 2022-09-09 10:16:50 · 680 阅读 · 0 评论 -
Web 应用:Service Worker
本文首先会简单介绍下前端的常见缓存方式,再引入serviceworker的概念,针对其原理和如何运用进行介绍。然后基于google推出的第三方库workbox,在产品中进行运用实践,并对其原理进行简要剖析。先简单介绍一下现有的前端缓存技术方案,主要分为http缓存和浏览器缓存。转载 2022-09-08 10:57:00 · 559 阅读 · 1 评论 -
NPE的处理机制
在了解InterruptedException异常之前应该了解以下的几个关于线程的一些基础知识。而且得知道什么时候会抛InterruptedException异常当阻塞方法收到中断请求的时候就会抛出InterruptedException异常线程在一定的条件下会发生状态的改变,下面是线程的一些状态新建一个线程的对象,还未调用start方法java线程中将已经准备就绪(Ready)和正在运行中(Running)的两种状态都统称为“Runnable”。准备就绪的线程会被放在线程池中等待被调用。转载 2022-09-07 09:36:01 · 220 阅读 · 0 评论 -
项目一上线,遇到内存泄漏
因为strace命令中已经显示申请内存的线程ID。直接使用命令jstack pid去查看线程栈,找到对应的线程栈(注意10进制和16进制转换)如下:strace申请空间的线程栈这里基本上就可以看出问题来了:MCC(美团统一配置中心)使用了Reflections进行扫包,底层使用了Spring Boot去加载JAR。因为解压JAR使用Inflater类,需要用到堆外内存,然后使用Btrace去追踪这个类,栈如下:btrace追踪栈然后查看使用MCC的地方,发现没有配置扫包路径,默认是扫描所有的包。转载 2022-09-06 11:04:01 · 492 阅读 · 0 评论 -
消息重试框架 Spring-Retry 和 Guava-Retry
spring-retry 和 guava-retry 工具都是线程安全的重试,能够支持并发业务场景的重试逻辑正确性。两者都很好的将正常方法和重试方法进行了解耦,可以设置超时时间、重试次数、间隔时间、监听结果、都是不错的框架。但是明显感觉得到,guava-retry在使用上更便捷,更灵活,能根据方法返回值来判断是否重试,而Spring-retry只能根据抛出的异常来进行重试。转载 2022-09-05 09:26:23 · 126 阅读 · 0 评论 -
IDEA 使用 Docker 插件,实现一键自动化部署
首先我们要开启docker的远程连接访问。保证不是docker所在的服务器,也能够远程访问docker。Linux版的docker:修改 docker.service 文件,添加监听端口 -H tcp://0.0.0.0:2375找到 ExecStart,在最后面添加 -H tcp://0.0.0.0:2375,如下图所示转存失败重新上传取消重启docker如果我们有防火前记得添加防火墙策略或者关闭防火墙。window版docker。...转载 2022-08-29 09:41:10 · 477 阅读 · 0 评论 -
使用 Postman 测试你的 API
postman 中的参数使用的形式来使用,上面的baseUrl就是一个变量我们可以在请求中使用参数,然后在运行测试的时候设置一个 json/csv 文件来代替这些参数,下面来看一下示例:这个公告详情的接口是需要一个参数的,这里我们设置为一个变量,变量名叫做path然后再来运行我们的测试选择我们准备的测试数据,支持 json 和 csv,csv 必须要有 header, header 就是变量名,这里我使用的是 json选择好文件之后,可以预览我们的数据。...原创 2022-08-27 19:01:05 · 170 阅读 · 0 评论 -
JAVA面试题附答案
包含的模块:本文分为十九个模块,分别是:Java 基础、容器、多线程、反射、对象拷贝、Java Web 、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、MyBatis、RabbitMQ、Kafka、Zookeeper、MySQL、Redis、JVM如下图所示:共包含 208 道面试题,本文的宗旨是为读者朋友们整理一份详实而又权威的面试清单,下面一起进入主题吧。=================================转载 2022-08-27 18:59:27 · 189 阅读 · 0 评论 -
后端 API 接口文档 Swagger 使用指南
springboot整合swagger,只需要添加一个swagger的配置类,添加上@bean注解,就可以实现Bean的注入,然后添加一个ApiInfo的配置,添加注解扫描,其实对于扫描这里,配置分类两类,一个是包的路径扫描,一个是按照注解的扫描,我比价推荐的方式是按照注解,因为在swageer的实际使用中,你得在每个api中添加@APi的注解,但是如果配置成包的话,有可能会有遗漏,或者新增加包路径可能忘了配置,就导致配置无效。并且有一个很重要的功能,只需要点下方的try it out就可以进行接口测试,.转载 2022-08-27 18:56:58 · 2987 阅读 · 0 评论 -
Docker+Jenkins+Nginx 自动化部署SpringBoot项目
在实际开发中,Jenkins可能不仅需要项目的部署,还需要进行开发人员的鉴权,如开发人员A只能查看部署指定项目,管理员可以查看部署所有项目,但Docker主要用于镜像构建与容器运行,无法像Jenkins一样获取github/gitlab代码,也无法进行开发人员的鉴权,所以Docker可以在Jenkins中只扮演简化部署过程的一个角色。统一配置文件,简单粗暴的方式解决端口、路径、版本等配置问题,如该项目即使运行了2个8080端口的SpringBoot容器而不需担心端口的冲突、暴露问题,一切都在容器内解决。..转载 2022-08-27 18:53:31 · 133 阅读 · 0 评论 -
HashMap 源码详细分析(JDK1.8)
本章对 HashMap 常见操作相关代码进行了详细分析,并在最后补充了一些其他细节。在本章中,插入操作一节的内容说的最多,主要是因为插入操作涉及的点特别多,一环扣一环。包含但不限于“table 初始化、扩容、树化”等,总体来说,插入操作分析起来难度还是很大的。好在,最后分析完了。...原创 2022-08-25 18:59:36 · 462 阅读 · 0 评论 -
MQ 消息丢失、重复、积压问题,如何解决
比如在 Kafka 中,一个 Topic 可以配置多个 Partition(分区),数据会被写入到多个分区中,但在消费的时候,Kafka 约定一个分区只能被一个消费者消费,Topic 的分区数量决定了消费的能力,所以,可以通过增加分区来提高消费者的处理能力。毫无疑问,出问题的肯定是消息消费阶段,我来总结一下今天的重点内容。方案看似万无一失,每个阶段都能保证消息的不丢失,但在分布式系统中,故障不可避免,作为消息生产端,你并不能保证 MQ 是不是弄丢了你的消息,消费者是否消费了你的消息,所以,本着。转载 2022-08-24 11:13:17 · 169 阅读 · 0 评论 -
java基础|自定义java线程池
通过对自带的线程池的分析,我们知道自定义的线程池主要是对池子的最大数量和等待队列的最大数量做好限制,当然还有自定义的失败策略(以后单写个DEMO讲)代码如下:/***//** 线程池维护线程的最少数量 *//** 线程池维护线程的最大数量 *//** 线程池维护线程所允许的空闲时间 *//** 线程池所使用的缓冲队列 */TimeUnit.SECONDS, /* 时间单位,秒 *//* 重试添加当前加入失败的任务 */}}}}原创 2022-08-23 09:47:37 · 229 阅读 · 0 评论 -
面试必问之JVM原理
(2)方法区域存放了所加载的类的信息(名称、修饰符等)、类中的静态变量、类中定义为final类型的常量、类中的Field信息、类中的方法信息,当开发人员在程序中通过Class对象中的getName、isInterface等方法来获取信息时,这些数据都来源于方法区域,同时方法区域也是全局共享的,在一定的条件下它也会被GC,当方法区域需要使用的内存超过其允许的大小时,会抛出OutOfMemory的错误信息。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。原创 2022-08-23 09:48:02 · 63 阅读 · 0 评论