自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(126)
  • 资源 (5)
  • 收藏
  • 关注

原创 java发邮件eclipse中测试没问题,部署到tomcat上收到的是乱码问题排查

最近项目上有个需求是要求对业务错误信息进行发邮件,故而开发了个发邮件的功能。这个功能很简单,网上也有很多代码。我这里贴一下我的发邮件方法:public static void sendMailByAliyunNew(String subject, String content){ try { String receivers = "收件人邮箱";// 收件人,多个...

2020-02-21 15:32:34 430

原创 关于ThreadLocal的浅谈

以前用ThreadLocal用的比较少,今天在看以前的代码的时候,发现有个类里面的方法里面使用了公共的静态变量,而且有很多类都引用了这个方法。由于这个变量不是final的,是动态赋值的,所以在多线程的情况下可能会引起问题。因为要改造这个方法的这个变量问题,所以我想到了ThreadLocal,并对ThreadLocal进行了一次实验,通过实验,对ThreadLocal有了一次比较深刻的认识。在此把代...

2020-01-16 18:11:20 181

原创 kafka初体验

java开发kafka生产者以及消费者,并且对消费使用线程池处理。

2022-08-03 20:32:00 527 1

原创 static方法能被AOP动态代理吗?

首先在回答题目之前,应该先明确一个问题,static是什么意思,是静态的意思,静态的能被动态的代理么?从字面上来讲就不太可能。那么事实是什么呢,事实就是static不能被动态代理。动态代理的方式有两种,一种是jdk自带的动态代理,只能代理接口类;另一种是cglib提供的增强代理,需要额外引入cglib的依赖,接口和类都可以代理。<dependency> <groupId>cglib</groupId> <artifactId>cglib&lt

2022-01-13 10:45:48 2449

原创 IDEA设置maven后import报错

错误信息如下:2022-01-12 21:05:12,795 [ 441203] ERROR - #org.jetbrains.idea.maven - com.google.inject.CreationException: Unable to create injector, see the following errors:1) No implementation for org.apache.maven.model.path.PathTranslator was bound....

2022-01-12 21:27:58 1283

原创 Zookeeper 集群搭建(完整版及注意事项)

1、准备三台机器或虚拟机,系统是CentOS7 64位,jdk是1.8。修改vi /etc/hostname ,分别改为node1,node2,node3。方便主机名区分2、修改hosts文件,vi /etc/hosts,添加ip及主机名映射关系,便于用主机名访问ip,改为如下内容(根据自己三台机器的主机ip来修改对应的ip):::1 localhost node1 localhost6 localhost6.localdomain6192.168.72.128 no...

2021-10-14 15:37:57 1008

原创 LCN实现分布式事务管理---代码+图解

LCN:Lock,Confirm,Notify其实现分布式事务的原理是引入Transation Manager(简称TM),由TM来管理具体应用(TC Transaction Client)的事务确认及通知。应用起来比较简单:1、搭建TM 2、在应用中使用@LcnTransaction 代替 @Transactional上代码:1、搭建TM1.1) pom依赖创建一个springboot工程lcn-tm 引入以下依赖:<!-- tm manager --> ...

2021-04-12 17:08:22 758

原创 使用RestTemplate 提示 Unexpected end of file from server

今天在使用resttemplate进行远程调用的时候,报了个错误:2021-04-12 15:20:08.429 ERROR 7488 --- [nio-6001-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; ne

2021-04-12 15:31:37 5048

原创 spring+activemq的使用

上代码一、生产者端:1、需要的pom依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- mq -->

2021-04-09 18:26:28 259

原创 Sentinel限流 之 业务应用层使用

https://blog.csdn.net/sdmanooo/article/details/115528230 这篇文章介绍了Sentinel在网关filter的应用,这一篇介绍在应用层使用@SentinelResource注解实现限流及降级的方法。当然应用层也可以建Filter来实现,这里不介绍了。直接上代码:1、如果使用@SentinelResource 注解,还需要引入sentinel-annotation-aspectj依赖。所以需要引入的依赖: <depe.

2021-04-08 19:05:55 254

原创 Sentinel限流 之 zuul网关层应用

之前https://blog.csdn.net/sdmanooo/article/details/115522607这篇文章讲了zuul网关使用guava的RateLimiter令牌桶实现限流。其实alibaba提供了sentinel组件,也可以支持限流、降级、熔断保护等。其官网使用说明:https://github.com/alibaba/Sentinel/wiki/%E6%B5%81%E9%87%8F%E6%8E%A7%E5%88%B6这里简单的介绍下在网关上的使用,代码上要比guava的令..

2021-04-08 18:53:28 315

原创 Zuul网关之限流实现

网关限流比较简单的方式就是在pre的filter中使用令牌桶,因为是限流,所以过滤器排序要靠前,使用方法谷歌guava的RateLimiter组件,代码实现:import com.google.common.util.concurrent.RateLimiter;import com.netflix.zuul.ZuulFilter;import com.netflix.zuul.context.RequestContext;import com.netflix.zuul.exception.Zu

2021-04-08 16:02:38 811

原创 zuul routes的配置规则介绍 补充

在https://blog.csdn.net/sdmanooo/article/details/115490907这篇文章中已经介绍了routes里面RibbonRoutingFilter和SimpleHostRoutingFilter的配置使用。1、RibbonRoutingFilter核心的配置点是serviceIdyaml设置:zuul: routes: provider2: path: /mysuibian/** serviceId: servic.

2021-04-08 15:29:26 1120

原创 zuul routes的配置规则介绍

Zuul最核心的类就是ZuulServlet。使用springcloud的zuul网关,配置routes的规则时,对于routes类型的系统filter有三种:RibbonRoutingFilter、SimpleHostRoutingFilter、SendForwardFilter。对于使用yaml配置zuul的routes规则介绍,直接看配置文件及注释:zuul: ##敏感头配置为空之后,所有head内容透传给后端服务,即后端服务也可以获取到请求头信息,一般不配置,因为网关就把头部信息的逻辑

2021-04-07 18:58:25 4209 1

原创 Ribbon灰度方案之应用之间灰度实现二

https://blog.csdn.net/sdmanooo/article/details/115480381这篇文章讲的是通过eureka-client自带的ribbon,编写自定义的负载均衡策略规则rule来实现灰度。本文介绍直接使用ribbon插件来实现应用之间的灰度调用。方法跟网关的使用基本一样。使用起来也比较简单。但是有一点需要注意的是,这个ribbon插件支持的springcloud的版本不能高于2.4.0。前置环境参考https://blog.csdn.net/sdmanooo/a.

2021-04-07 11:28:18 294

原创 Ribbon灰度方案之应用之间灰度实现一

后台应用之间相互调用,一般就是用Feign或者RestTemplate进行实现。这里以RestTemplate为例描述。环境准备:之前在Zuul网关灰度一文中介绍了。此处还是两个eureka服务端(eureka-server),两个相同的后端服务(service-sms),一个额外的后端服务(api,用来调用service-sms服务)主要描述api服务的实现。灰度实现有两种方案,一种是运用eureka-client自带的ribbon编写自定义的灰度规则来实现。自定义灰度规则需要继承Abstrac.

2021-04-07 11:09:05 695 1

原创 Netflix-Ribbon灰度方案之Zuul网关灰度

Eureka默认集成了Ribbon,所以Ribbon的灰度实现原理就是借助服务注册到Eureka中的eureka.instance.metadata-map的内容来进行匹配的。Zuul网关的灰度实现也是借助了一个Ribbon的插件来实现,相对比较简单。项目环境说明:有两个eureka的服务端(eureka-server),有两个相同的后端服务(service-sms),有一个网关服务(cloud-zuul)。重点描述下网关服务的代码,其他服务有兴趣的可以去coding下载(https://kev

2021-04-07 10:41:36 289 1

原创 CompletableFuture的一例使用

CompletableFuture提供了丰富的api,底层实现是ForkJoinPool。可以用来一个任务拆分成多个任务,最后将结果集汇总输出。比如说在网约车计费的情况下,其计算规则有很多种,按路程算钱,按时间算钱,路程又根据距离的远近计价不同,时间有可能根据时间点的不同以及等待的时间等规则计价,最后将各规则的价格汇总到一起形成个总价。模拟计价代码:public class MainTest { public static void main(String[] args) throw

2021-03-31 17:33:25 117

原创 eureka服务端的搭建

eureka是spring-cloud体系里面,由netflix推出的一款服务注册发现的框架。eureka分为服务端和客户端,服务端可以是单点部署,也可以是多节点部署,为了高可用一般至少两个节点。在这里介绍eureka服务端三个节点的搭建。开发工具IntelliJ IDEA。1、新建projectnext--》finish2、启动类上添加@EnableEurekaServer 注解这个注解的真正作用不是启动eurekaserver,而是为eurekaserv.

2021-03-29 16:30:21 2086

原创 记一次linux部署的大坑

一个web项目,在windows中跑正常,挪到linux里面运行,报PropertyAccessException 2: org.springframework.beans.MethodInvocationException: Property 'transportIds' threw exception; nested excepti on is org.springframework.beans.factory.BeanCreationException: Error creating bean w

2021-03-17 18:24:45 177

原创 springboot+thymeleaf+i18n 使用例子

1、IDEA中新建项目2、选择依赖:3、next、finish 项目创建完毕(项目名、groupid等信息自己根据喜好定)4、创建controllerimport org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.RequestMapping;@Controllerpub

2021-03-12 11:19:33 548

原创 @WebServlet需要引入的依赖包

<dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope></dependency>javax.servlet下面有两个servl..

2021-03-11 17:03:40 7915 2

原创 ForkJoinPool

ForkJoinPool是一种可以将任务分发执行后将结果汇总起来的线程池。它与ThreadPoolExector线程池的不同在于,ThreadPoolExector多个线程共用一个任务队列,而ForkJoinPool是不同的线程使用不同的任务队列。如果有1000000个数,计算他们的和。如果一个线程跑,速度会比较慢,可以分成多个线程进行各自计算之后,把计算的和再汇总起来。import java.io.IOException;import java.util.Arrays;import java

2021-02-26 17:39:08 104

原创 ThreadPoolExecutor线程池及参数介绍

线程池类图如下:使用Executors工具类创建的线程池,都是创建的ThreadPoolExecutor对象。这个对象的核心参数有7个:1、corePoolSize 核心线程数,即便线程空闲也会一直在线程池中的线程数,除非设置允许核心线程超时的参数。2、maximumPoolSize 最大线程数 ,线程池中允许的最大线程,包含核心线程数3、keepAliveTime 非核心线程空闲等待时间,超过这个时间没有任务的话,非核心线程会被从线程池中销毁。4、TimeUnit keepAliv

2021-02-26 14:56:09 493

原创 交替输出A1B2C3D4...

定义两个线程,一个输出ABCD,一个输出1234,但是要求最终结果交替输出A1B2C3D4....这貌似是个面试题,尝试写了下,方法应该很多,但不是太容易。介绍两种写法:/** * 使用LockSupport交替输出A1B2C3.... */public class ByteNumber { static Thread t1 = null; static Thread t2 = null; public static void main(String[] args

2021-02-24 15:02:10 1551

原创 常用的日期相关的工具类

public class DateUtil { public static SimpleDateFormat YYYY = new SimpleDateFormat("yyyy"); public static String YYYY_MM_DD_STR = "yyyy-MM-dd"; public static SimpleDateFormat YYYY_MM_DD = new SimpleDateFormat(YYYY_MM_DD_STR); public static SimpleDat.

2021-02-22 14:22:57 132

原创 lock.lock()和lock.lockInterruptibly()的区别

一开始容易搞混两者的区别,看官方的说明看的也有点晕晕的。通过实验了几次,终于明白了,其实两者的区别就一句话:lock.lock()和lock.lockInterruptibly()在等待获取锁的时候,线程的interrupt()无法打断lock.lock(),但是可以打断lock.lockInterruptibly()。这句话有个非常重要的场景,就是这俩方法都是在等待获取锁的时候,才会有被打断一说。如果他们执行的时候已经直接获取到锁,是直接返回了。即便线程再次打断,也没法打断。除非线程执行打断的时.

2021-02-10 11:26:32 1722

原创 java开发装机后常用的软件

链接:https://pan.baidu.com/s/1xC5tgxqJa7cQtc4C-lQeBw提取码:wu0y

2021-02-10 09:31:12 151

原创 ora-03113

ora-03113 归档日志满了导致数据库连接不上的解决步骤:sqlplus / as sysdba shutdown abort ----关闭进程 startup mount ---- 装载数据库 select * from v$recovery_file_dest; ---查询归档日志 ----db_recovery_file_dest_size=10737418240; --设置归档日志空间为10Gexit;rman target /进入rma...

2021-02-08 18:26:10 446

原创 nginx配置获取客户端ip

proxy_set_header Host $host;proxy_set_header x-forwarded-for $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

2021-02-08 18:15:02 161

原创 linux环境oracle自动备份脚本

#!/bin/shexport ORACLE_BASE=/usr/local/oracleexport ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1export ORACLE_SID=orclexport PATH=$ORACLE_HOME/bin:/usr/sbin:$PATHexport LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/libexport LANG=en_US.UTF-8export NLS.

2021-02-08 18:05:16 244

原创 CAS

CompareAndSet/CompareAndSwap比较并交换,是一种乐观锁。Unsafe这个类提供的能力,从原语上支持了原子性。jdk1.8是不支持直接使用Unsafe的,通过反射可以获取到unsafe对象。public class TestCas { public static void main(String[] args) throws Exception { Field f = Unsafe.class.getDeclaredField("theUnsaf

2021-02-04 15:17:46 73

原创 项目中添加token校验的注解

实现并使用一个注解需要实现四步:1、创建注解2、创建拦截器,拦截注解并处理3、注册拦截器4、使用注解1、创建一个注解@Target(ElementType.METHOD)@Documented@Retention(RetentionPolicy.RUNTIME)public @interface TokenCheck { boolean required() default true;}2、添加拦截器,实现HandlerInterceptor 接口..

2021-02-03 18:22:35 1313

原创 死锁

所谓死锁,就是两个线程互相等待对方释放锁,即A持有B要获取的锁,B持有A要获取的锁,然后B要获取A持有的锁,A要获取B持有的锁。所以死锁至少有两把锁,对于只有一把锁的情况,不会出现死锁,只是锁等待。模拟下死锁,示例代码:public class DeadLock { static Object o1 = new Object(); static Object o2 = new Object(); public static void main(String[] arg

2021-02-02 18:06:55 170 1

原创 线程的状态

线程总共有6中状态:New、Runnable、Block、Waiting、Timed Waiting、Terminated对于Runnable状态来讲,有两个内部的状态:Ready、Running具体流转图:

2021-02-02 17:44:26 60

原创 线程的创建方法

以下不论哪一种方法,归根结底就是一种,就是new Thread()。1、继承Thread类,调start方法public class MainThread { public static void main(String[] args) { new MyThread().start(); }}class MyThread extends Thread { @Override public void run() { System.

2021-02-02 15:38:04 83

原创 统一的异常处理工具

1、统一处理参数校验对于请求参数校验,我们可以使用spring的validation包,依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> <version>2.4.1</version></dependency&

2021-01-29 18:30:19 163

原创 controller层统一返回值封装类

@Data@Builderpublic class ResultWapper<T> implements Serializable { private int code; private String msg; private T data; //返回成功的包装 public static ResultWapper.ResultWapperBuilder getSuccessBuilder(){ return ResultWappe.

2021-01-29 17:08:22 751

原创 有一种攻击叫彩虹表攻击

在我们日常系统中,很多都有用户注册功能,用户注册需要用户名和密码,密码一般我们都采用md5加密的方式,但是用md5加密,对于一个固定的字符串,其md5值是固定的,这样就会出现彩虹表攻击情况。所谓彩虹表攻击就是指攻击者有一张表,里面有密码明文和对应md5值的对应关系,攻击者利用这些关系来破解用户密码。一般的,md5加密其实也没啥,因为我觉得毕竟彩虹表攻击者少数,只要你的系统还不够大,没人会关注攻击你。树大就容易招风了。应对这个问题,可以使用BCryptPasswordEncoder加密方式代替MD5加

2021-01-28 17:32:25 3914

原创 Junit出现空指针异常

sprintboot里面当我们使用junit进行测试后的时候,需引入两个依赖: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</s

2021-01-28 13:41:01 2586

jdk1.8+kafka3.2 linux版本

适合搭建kafka环境所需要的jdk1.8linux版本,以及kafka3.2版本。

2022-08-03

简易的手写springmvc

本工程模仿了简易的springMVC的实现, 包含了controller、service、requestParam、autowired、requestMapping注解类的创建 IOC容器的创建及组装原理实现 简易的request请求

2020-08-04

nginx负载均衡的参考配置及https的参考配置

nginx进行负载均衡的配置参考示例,及nginx支持https请求的配置参考示例

2017-10-18

redis-64.3.0.503

redis-64.3.0.503

2017-02-15

spring-session+spring的依赖包

包含spring4.0相关jar包和commons-pool2-2.4.2.jar,jedis-2.7.3.jar,spring-data-redis-1.6.2.RELEASE.jar,spring-session-1.1.1.RELEASE.jar

2017-02-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除