java
文章平均质量分 92
牧小农
这个作者很懒,什么都没留下…
展开
-
Nacos源码系列—订阅机制的前因后果(下)
在上一节中我们讲解了在NotifyCenter中维护了事件名称和事件发布者的关系,而默认的事件发布者为DefaultPublisher,今天我们就来讲一下DefaultPublisher的事件发布的具体逻辑原创 2022-05-19 08:58:31 · 1002 阅读 · 2 评论 -
Nacos源码系列—订阅机制的前因后果(上)
关于Nacos订阅机制,你不来看看吗?原创 2022-05-14 22:34:48 · 735 阅读 · 0 评论 -
Nacos在企业生产中如何使用集群环境?
点赞再看,养成习惯,微信搜索【牧小农】关注我获取更多资讯,风里雨里,小农等你,很高兴能够成为你的朋友。项目源码地址:公众号回复 nacos,即可免费获取源码前言由于在公司,注册中心和配置中心都是使用的Nacos,因为前一段时间比较忙(木有划水时间),没有精力仔细去研究,时间就像海绵里的水,挤一挤总会是有的,出于对技术的好奇心,今天挤了一点时间,终于到了我 牧汉三 出马的时候。今儿个就说一说Nacos集群架构是如何搭配,以及在企业中是如何使用的。Nacos集群架构在搭建Nacos集群之前,我们首.原创 2022-04-30 11:19:32 · 897 阅读 · 20 评论 -
这一篇 K8S(Kubernetes)集群部署 我觉得还可以
Kubernetes 的安装其实并不复杂,因为Kubernetes 属于Google 的产品,都是从Google的官方上进行下载,但是因为网络问题,在国内是没办法连接它的中央仓库进行下载安装包的,只能通过其他的途径进行安装,在国内有四种安装方式原创 2021-11-06 17:06:17 · 4807 阅读 · 10 评论 -
ZK(ZooKeeper)分布式锁实现
点赞再看,养成习惯,微信搜索【牧小农】关注我获取更多资讯,风里雨里,小农等你。本文中案例都会在上传到git上,请放心浏览git地址:https://github.com/muxiaonong/ZooKeeper/tree/master/mxnzookeeper准备本文会使用到 三台 独立服务器,可以自行提前搭建好。不知道如何搭建的,可以看我之前 ZooKeeper集群 搭建:Zookeeper 集群部署的那些事儿关于ZooKeeper 一些基础命令可以看这篇:Zookeeper入门看这篇就够.原创 2021-10-24 17:53:43 · 1466 阅读 · 4 评论 -
ZooKeeper分布式配置——看这篇就够了
ZooKeeper 的由来PS:这一段不重要,不感兴趣的小伙伴可以跳过ZooKeeper 最早起源于雅虎研究院的一个研究小组,在当时,研究人员发现,在雅虎内部有很多的大型系统基本上都需要依赖一个类似的系统来进行分布式协调,但是这些系统往往都存在分布式单点的问题,所有雅虎的开发人员就尝试开发了一个通用的无单点问题的分布式协调框架,以便让开发人员将精力集中在处理业务逻辑上。关于"ZooKeeper"这个项目的名字。也有一个故事,在项目开始初期,因为考虑到内部的很多项目都是用动物的名字来命名的(例如:Pig项原创 2021-10-21 17:15:18 · 1450 阅读 · 2 评论 -
Zookeeper入门看这篇就够了
ookeeper 是一个分布式应用程序的分布式开源协调服务。Zookeeper入门看这篇就够了!原创 2021-09-29 15:46:01 · 1783 阅读 · 9 评论 -
Apollo 配置中心详细教程
一、简介Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。服务端基于Spring Boot和Spring Cloud开发,打包后可以直接运行,不需要额外安装Tomcat等应用容器。Java客户端 不依赖任何框架,能够运行于所有Java运行时环境,同时对Spring/Spring Boot环境也有较好的支持。.Net客户端 不依赖任何框架,能够运行于所有.N原创 2021-09-17 13:07:58 · 8466 阅读 · 8 评论 -
浅析 DDD 领域驱动设计
前言最近公司一场有关于领域驱动设计的技术分享会,引起了我的注意,主要讲解了服务的划分,Restful API的设计,如何将抽象具有统一业务的范畴的Model,使其模块化,同时能够提炼组合多个模块,使得业务能够独立服务化,在软件开发中如何降低系统的复杂度是一个永恒的挑战,在之前都是通过一系列的设计模式或者范例来降低一些比较常见的复杂度,这些都是通过技术手段来解决技术问题,没有从根本上解决业务上的问题,但是在03年 Eric Evans 的《Domain Driven Design》 中,才是真正的从业务的原创 2021-09-07 15:10:13 · 3454 阅读 · 8 评论 -
【玩转PDF】贼稳,产品要做一个三方合同签署,我方了!
一、前言事情是这个样子的,小农的公司,之前有个功能需要签署来进行一系列的操作,于是我们引入了一个三方平台的签署——上上签,但是有一个比较尴尬的点就是,它不支持合同在浏览器上和附件一起预览的,我们想要的是需要将附件拼接在合同主文件中一起展示,但是它不支持,于是我们就开了一个需求会。。。产品说,我们要做一个线上合同签署的功能,不依靠第三方来完成,可以浏览器上预览和下载合同,小农,你这边能做吗?我一听,这个啊,这个有点难度啊(我需要时间),不太好做,之前我们接入的第三方就没有完全完成浏览器预览的功能,相原创 2021-05-26 16:15:43 · 1322 阅读 · 10 评论 -
运维:生产日志重复打印了,赶紧来看看~
一、前言在一次生产环境发布后,运维对我说,你这个日志打印了两遍,你看一下,我很好奇,打印了两遍,本地和测试都没有这个问题啊,然后运维就发了下面两个文件给我,一看还真是,日志怎么打印了两遍启动也是日志会打印两遍二、解决方案刚开始是看资料说设置:配置文件中logger的additivity属性为 false但是还是会重复打印两遍日志,并没有什么特别的效果但是后来一想,本地和测试都可以,只有生产不行,是不是文件日志文件设置的有问题,于是重新写了日志类:logback-spring.xml<原创 2021-02-04 11:07:10 · 4486 阅读 · 4 评论 -
看完这篇,再也不怕面试官问我线程池了
一、为什么需要线程池在实际使用中,线程是很占用系统资源的,如果对线程管理不善很容易导致系统问题。因此,在大多数并发框架中都会使用线程池来管理线程,使用线程池管理线程主要有如下好处:1、使用线程池可以重复利用已有的线程继续执行任务,避免线程在创建和销毁时造成的消耗2、由于没有线程创建和销毁时的消耗,可以提高系统响应速度3、通过线程可以对线程进行合理的管理,根据系统的承受能力调整可运行线程数量的大小等二、工作原理线程池执行所提交的任务过程:▪ 1、先判断线程池中核心线程池所有的线程是否都在原创 2020-12-02 10:12:23 · 9132 阅读 · 32 评论 -
JDK新特性-Lambda表达式的神操作
一、Lambda表达式的介绍Lambda表达式是 Java8 中最重要的新功能之一。使用 Lambda 表达式可以替代只有一个抽象函数的接口实现,告别匿名内部类,代码看起来更简洁易懂。Lambda表达式同时还提升了对集合、框架的迭代、遍历、过滤数据的操作。lambda表达式可以替代只有一个抽象函数的接口实现,告别匿名内部类,代码看起来更简洁易懂lambda表达式同时还提升了对集合、框架的迭代、遍历、过滤数据的操作lambda可以极大的减少代码冗余,同时代码的可读性要好过冗长的内原创 2020-11-07 15:22:47 · 2513 阅读 · 21 评论 -
JDK新特性——Stream代码简洁之道
Stream 是一组用来处理数组、集合的API,Stream API 提供了一种高效且易于使用的处理数据的方式。原创 2020-10-24 12:17:54 · 7465 阅读 · 170 评论 -
ActiveMQ详细入门教程系列(一)
一、什么是消息中间件两个系统或两个客户端之间进行消息传送,利用高效可靠的消息传递机制进行平台无关的数据交流,并基于数据通信来进行分布式系统的集成。通过提供消息传递和消息排队模型,它可以在分布式环境下扩展进程间的通信。消息中间件,总结起来作用有三个:异步化提升性能、降低耦合度、流量削峰。系统A发送消息给中间件后,自己的工作已经完成了,不用再去管系统B什么时候完成操作。而系统B拉去消息后,执行自己的操作也不用告诉系统A执行结果,所以整个的通信过程是异步调用的。二、什么是ActiveMQActiveM原创 2020-10-11 10:50:19 · 3130 阅读 · 34 评论 -
多线程与高并发笔记
1. 创建线程的三种方式实现Runnable 重写run方法继承Thread 重写run方法线程池创建 Executors.newCachedThreadPool()2. Thread线程操作方法Thread.sleep([mills])当前线程睡眠指定mills毫秒Thread.yield()当前线程优雅让出执行权join例如Thread t1, t2在t2的run方法中调用t1.join(),线程t2将等待t1完成后执行3. Thread状态原创 2020-09-13 10:14:52 · 3915 阅读 · 18 评论 -
掌握Redis分布式锁的正确姿势
前言在Java中,我们对于锁会比较熟悉,常用的有 synchronized、Lock锁,在java并发编程中,我们通过锁,来实现当多个线程竞争同一个共享资源或者变量而造成的数据不一致的问题,但是JVM锁只能针对于单个应用服务,随着我们业务的发展需要,单体单机部署的系统早已演化成分布式系统,由于分布式系统的多线程、多进程而且分布在不同的机器上,这个时候JVM锁的并发控制就没有效果了,为了解决跨JVM锁并且能够控制共享资源的访问,于是有了分布式锁的诞生。为什么JVM锁在分布式下不可以呢?我们通过代码来.原创 2020-07-18 11:12:12 · 3669 阅读 · 5 评论 -
SpringColud Eureka的服务注册与发现
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>有的教程中还引入spring-boot-starter-web,其实不用。因为上面的依赖已经包含了它。在pom中点此依赖进去,一共点4次spring-c原创 2020-06-13 19:46:42 · 5074 阅读 · 45 评论 -
小白也能看懂的锁升级过程和锁状态
一、前言锁的状态总共有四种,级别由低到高依次为:自旋锁、偏向锁、轻量级锁、重量级锁,这四种锁状态分别代表什么,为什么会有锁升级?其实在 JDK 1.6之前,synchronized 还是一个重量级锁,是一个效率比较低下的锁,但是在JDK 1.6之后,Jvm为了提高锁的获取与释放效率对(synchronized )进行了优化,引入了 偏向锁 和 轻量级锁 ,从此以后锁的状态就有了四种(自旋锁、偏向锁、轻量级锁、重量级锁),并且四种状态会随着竞争的情况逐渐升级,而且是不可逆的过程,即不可降级,也就是说只能进原创 2020-06-06 12:40:23 · 8549 阅读 · 77 评论 -
悲观锁与乐观锁的实现(详情图解)
一、前言在了解悲观锁和乐观锁之前,我们先了解一下什么是锁,为什么要用到锁?技术来源于生活,锁不仅在程序中存在,在现实中我们也随处可见,例如我们上下班打卡的指纹锁,保险柜上的密码锁,以及我们我们登录的用户名和密码也是一种锁,生活中用到锁可以保护我们人身安全(指纹锁)、财产安全(保险柜密码锁)、信息安全(用户名密码锁),让我们更放心的去使用和生活,因为有锁,我们不用去担心个人的财产和信息泄露。而程序中的锁,则是用来保证我们数据安全的机制和手段,例如当我们有多个线程去访问修改共享变量的时候,我们原创 2020-05-27 10:26:59 · 31250 阅读 · 148 评论 -
JVM性能优化(四)提高网站访问性能之Tomcat优化
一、前言tomcat 服务器在JavaEE项目中使用率非常高,所以在生产环境对tomcat的优化也变得非常重要了,对于tomcat的优化,主要是从2个方面入手,一是tomcat本身的配置,另一个是tomcat所运行的Jvm虚拟机的调优Tomcat配置优化案例中使用的Tomcat版本是 8.0+ 版本下载安装:https://tomcat.apache.org/download-80.c...原创 2020-05-05 12:07:28 · 3227 阅读 · 7 评论 -
网页性能优化之图片懒加载
一、前言最近因为需要做一个小网站,但是呢,因为图片比较多,打开网页速度很慢,服务器压力就会很大。不仅影响渲染速度还会浪费带宽,比如一个1M大小的图片,并发情况下,达到1000并发,即同时有1000个人访问,就会产生1个G的带宽。于是就想到了图片懒加载来减轻服务器的压力,优先加载可视区域的内容,其他部分等进入了可视区域再加载,从而提高性能,可以大幅度的提高网页加载速度,效果很明显,于是想着将这个方...原创 2020-01-14 10:33:19 · 6095 阅读 · 10 评论 -
网站页面性能优化的34条黄金守则
雅虎团队经验:网站页面性能优化的34条黄金守则1、尽量减少HTTP请求次数 终端用户响应的时间中,有80%用于下载各项内容。这部分时间包括下载页面中的图像、样式表、脚本、Flash等。通过减少页面中的元素可以减少HTTP请求的次数。这是提高网页速度的关键步骤。 减少页面组件的方法其实就是简化页面设计。那么有没有一种方法既能保持页面内容的丰富性又能达到加快响应时间的目转载 2016-06-01 16:05:24 · 2392 阅读 · 0 评论 -
SpringBoot thymeleaf——修改后如何实时生效
开发期间模板引擎页面修改以后,要实时生效1)、禁用模板引擎的缓存# 禁用缓存spring.thymeleaf.cache=false 2)、页面修改完成以后ctrl+f9:重新编译;原创 2019-09-05 13:54:45 · 4640 阅读 · 14 评论 -
FastDFS搭建文件管理系统(详细教程)
一 FastDFS介绍开源中国:https://www.oschina.net/question/tag/fastdfsgitHub开源地址:https://github.com/happyfish100参考:http://blog.chinaunix.net/uid-20196318-id-4058561.html1.1 简介FastDFS 是一个开源的高性能分布式文件系统(Distr...原创 2019-10-09 15:32:33 · 5267 阅读 · 16 评论 -
shiro(三)shiro实战——Spring 集成 Shiro(案例)
**步骤 加入 jar 包 配置 web.xml 文件 在 Spring 的配置文件中配置 Shiro**配置 web.xml 文件配置启动 Spring IOC 容器的 Filter配置 WEB 应用中的 Shiro Filter在 Spring 的配置文件中配置 Shiro配置自定义 Realm:实现自定义认证和授权 配置 Shiro 实体类使用的缓存策略 配置 SecurityM原创 2016-11-24 15:47:53 · 5292 阅读 · 1 评论 -
Shiro(一):shiro简介
一、权限基础 两个基本的概念安全实体:就是被权限系统保护的对象,比如工资数据。权限:就是需要被校验的行为,比如查看、修改等。分配权限:把对某些安全实体的某些权限分配给某些人员。是向数据库里面添加数据、或是维护数据的过程权限验证(权限匹配):判断某个人员或程序对某个安全实体是否拥有某个或某些权限。从数据库中获取相应数据进行匹配的过程。权限的继承性:如果多个安全实体存在包含关系,而某原创 2016-11-24 15:09:44 · 2292 阅读 · 0 评论 -
【并发编程】安全发布对象—单例模式升级版
发布对象使一个对象能够被当前范围之外的代码所使用,将创建的对象保存到容器中,也可能通过某个方法返回对象的引用,或者将引用传递到其他类的方法中对象逸出一种错误的发布,当一个对象还没有构造完成时,就使它被其他线程所见1、发布的对象只需要被它需要的线程被看见2、避免对象逸出发布错误对象:import java.util.Arrays;//线程不安全的//发布对象public...原创 2019-09-27 00:05:28 · 2605 阅读 · 19 评论 -
【学习笔记】线程原子性-锁 synchronized的用法
线程安全性的定义:当多个线程访问某个类的时候,不管运行时环境采用何种调度方式或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或者协同,这个类都能表现出正确的行为,那么我们就称则这个类是线程安全的原子性的锁有两种:synchronized:是Java中的关键字,是一种同步锁,依赖于JVMLock:依赖特殊的CPU指令,代码实现,ReentrantLock这里我们先来了解sy...原创 2019-09-25 22:54:41 · 3076 阅读 · 15 评论 -
深入浅出ReentrantLock(可重入锁)
一、前言在Java 5.0之前,在协调对共享对象的访问的时可以使用的机制只有synchronized 和 volatile。Java 5.0 增加了一种新的机制:ReentrantLock 。与之前提到过的机制相反,ReentrantLock 并不是一种替代内置加锁的方法,而是当内置解锁机制不适用时,作为一种可选择的高级功能。二、简介ReentrantLock 重入锁实现了 Lock和 ...原创 2019-11-09 11:53:41 · 3330 阅读 · 19 评论 -
并发模拟工具(JMeter、Apache Bench、postMan)详解
目录简介:一、Psotman:Http请求模拟工具1.1 下载地址1.2 操作说明(以win64为例)简介:一、Psotman二、Apache Bench(AB)三、JMeter四、代码一、Psotman:Http请求模拟工具1.1 下载地址Postman for MACPostman for windows X64Postman for windows X86Post...原创 2019-11-04 15:50:23 · 5795 阅读 · 7 评论 -
线程安全性详解(原子性、可见性、有序性)
一、定义:什么是线程安全性当多个线程访问某个类时,不管运行时环境采用 何种调度方式 或者这些进程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类就是线程安全的。当设计线程安全的类的时,良好的面向对象技术、不可修改性,以及明晰的不变性规范都能起到一定的帮助作用。二、线程安全性的三个体现原子性:提供互斥访问,同一时刻只能有一个线程对数...原创 2019-10-22 16:32:45 · 7724 阅读 · 15 评论 -
多线程之死锁详解
一、什么是死锁当两个或两个以上的线程在执行过程中,因为争夺资源而造成的一种相互等待的状态,由于存在一种环路的锁依赖关系而永远地等待下去,如果没有外部干涉,他们将永远等待下去,此时的这个状态称之为死锁。经典的 “哲学家进餐” 问题很好地描述了死锁状况: 5个哲学家去吃中餐,坐在一张圆桌旁,他们有5根筷子(而不是5双),并且每两个人中间放一根筷子,哲学家们要么在思考,要么在进餐,每个人都需...原创 2019-10-13 16:37:09 · 10949 阅读 · 23 评论 -
IDEA类和方法注释模板设置(超详细教程)
一直在使用idea自带的注释模板,但是一直不太好用,最近在网上整理了一些比较完整的模板使用方法,来供大家学习使用,有不对的地方,欢迎大家在下方留言。idea和eclipse的注释模板还是有一些差别的,下面就为大家介绍我整理的资料。类注释模板:/*** @program: ${PROJECT_NAME}* @ClassName ${NAME}* @description: * @aut...原创 2019-09-23 12:19:07 · 4816 阅读 · 18 评论 -
Tomcat请求特殊字符参数问题:Invalid character found in the request target. The valid characters are defined in
一、问题错误最近遇到客户端说接口get请求,全部400错误,无法请求,刚开始以为是服务器对请求进行拦截了,但是访问主页面是正常的,也是get请求,那么可能就是tomcat的问题了,想到tomcat8的原因,会不会是请求参数的问题,后来url请求中包含{}[]特殊字符的都报错,是因为Tomcat在 7.0.73, 8.0.39, 8.5.7版本后,在http解析时做了严格限制。tomcat8正常...原创 2019-10-24 11:17:35 · 4537 阅读 · 10 评论 -
navicat 连接Docker中mysql容器报错:Client does not support authentication protocol requested by server;
原因:mysql8 之前的版本中加密规则是 mysql_native_password,但是在mysql8之后,加密规则是caching_sha2_password,所以navicat低版本不支持了,要么升级navicat,要么把用户密码登录的加密规则还原成mysql_native_password这种加密方式,这里我们使用第二种方式。1:查看自己的mysql容器别名(NAMES)[root...原创 2019-09-18 14:13:08 · 2524 阅读 · 13 评论 -
An attempt was made to call a method that does not exist. The attempt was made from the following
spring boot 整合 duboo+zookeeper报错信息如下:org.apache.curator.utils.DefaultZookeeperFactory.newZooKeeper***************************APPLICATION FAILED TO START***************************Description:A...原创 2019-09-16 22:39:10 · 55913 阅读 · 7 评论 -
java.lang.NoClassDefFoundError: org/apache/curator/framework/CuratorFrameworkFactory
springboot整合dubbo报错:缺少curator依赖 <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <v...原创 2019-09-16 22:14:37 · 13340 阅读 · 8 评论 -
Failed to bind properties under 'spring.datasource' to javax.sql.DataSource:
springboot整合druid时,引入了druid的数据源,在配置文件application.yml中配置了相关配置spring: datasource: username: root password: 123456 url: jdbc:mysql://192.168.2.218:3306/test driver-class-name: com.mysq...原创 2019-09-06 15:40:17 · 4018 阅读 · 1 评论 -
JVM性能优化(三)G1垃圾收集器
文章预习:JVM性能优化(二)垃圾回收算法详解一、简介G1垃圾收集器是在jdk1.7中正式使用的全新的垃圾收集器,oracle官方计划在jdk9中将G1变成默认的垃圾收集器,以替代CMSG1的设计 原则就是简化JVM性能调优,开发人员只需要简单的三步即可完成调优:第一步:开启G1垃圾收集器第二步:设置堆的最大内存第三步:设置最大的停顿时间G1中提供了三种模式垃圾回收模式,Youn...原创 2020-04-28 15:13:29 · 3718 阅读 · 16 评论