- 博客(278)
- 资源 (7)
- 问答 (1)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
转载 [BetterExplained]书写是为了更好的思考
我经常在走路和睡前总结所学过的内容,思考遗留的问题,一段时间的阅读和思考之后,一个总体的知识框架就会逐渐浮现在脑海中。然后我会将它书写下来,然而,我往往非常惊讶地发现,当我书写的时候,新的内容仍然源源不断的冒出来,就像我的键盘自己也会思考一样。大半年前的时候,我曾在一篇文章《跟波利亚学解题》中写到将问题求解的思维过程记录下来的好处,现在再次回忆起来,当时列出的几点其实不仅对于问题求解是大有好处,对于
2017-02-06 16:47:44
683
原创 Mybatis-Plus同时实现分表和表内多租户模式
在之前经理的某家公司中,经历了一个saas服务的某些功能的数据量不断变大的过程,因为各种功能和性能的原因想到的方法就是直接按saas租户做分库和按租户对某些数据量大的表做分表。利用DynamicTableNameInnerInterceptor主要是用来对某些数据量大的表做分表查询的,这个拦截器可以在执行sql语句的时候动态的修改查询的表名。Mybatis自带的无自定义的租户的拦截器会在所有的sql后面加上对应的租户条件,但是我们可以自定义对应的处理租户信息相关的Handler.
2023-12-14 22:43:51
298
原创 SpringBoot发送邮件
需要特别多注意的是,文章正文内容使用html文本编写,因此如果需要动态替换文本内容,就需要引入模板引起来进行操作,因此我引入的是freemarker来进行模板替换。对应的在resources下templates邮件正文内容test.vtl下的邮件正文内容为。另外就是附件的功能,主要由如下代码完成,及读取文件,设置发送附件时的文件名称。application.properties中设置对应的发送邮箱的信息。在实际工作中已经遇到数次需要发邮件的场景了,因此把这个操作分享给大家。引入组件,设置邮箱信息。
2023-02-19 14:10:49
166
1
原创 SpringBoot统一API返回格式的两种方式
在操作的过程中也是同样的逻辑//是否支持handleReturnValue@Override&&!@Override// TODO 可通过客户端的传递的请求头来切换不同的响应体的内容但是由于spring的默认处理类是RequestResponseBodyMethodProcessor,它是根据判断是否有@ResponseBody注解来处理的。
2023-02-18 23:52:37
795
1
原创 Excel文件加密的两种方式
我们经常会遇到导出的数据需要安全和需要脱敏的场景,这种场景下如何做呢,这里我们使用EasyExcel来实现,有以下两种方案使用EasyExcel配合Zip4j将文件加密为zipZip4j的压缩选项更多 //生成密码压缩文件 private static File getZipFile(File file,char [] pwd) throws ZipException { ZipFile zipFile = new ZipFile(UUID.randomUUID().t
2022-05-02 20:26:08
2290
1
原创 ThreadLocal与线程池共用可能会出现的两个问题
直接先线程池中获取主线程或非线程池中的ThreadLocal设置的变量的值例如 private static final ThreadPoolExecutor syncAccessPool = new ThreadPoolExecutor( 50,&
2022-05-01 21:58:57
963
原创 Feign经典错误
欢迎使用Markdown编辑器## Incompatible fallbackFactory instance. Fallback/fallbackFactory of type clas失败原因:是我用的是fallbackFactory来进行回退,但是feignclient注解定义回退的类型是fallback,类型不一致。在调用报错时会校验fallabck或fallbackFactory是不是符合要求正常fallback模式示例@FeignClient(name = "mall-shop-e",
2022-04-17 16:45:33
4121
原创 Docker内Redis集群的配置
Redis集群环境配置首先要创建docker内的网络环境docker network create redis --subnet 172.28.0.0/16 ```配置文件的第一种声明方式内网运行,这种方式在虚拟机外电脑上会出现Can’t connect to master的错误for port in KaTeX parse error: Undefined control sequence: \ at position 12: (seq 1 6); \̲̲do \mkdir -p ~
2021-08-25 21:59:55
306
原创 Spring Cloud Stream使用
Spring Cloud Stream对Spring Cloud体系中的Mq进⾏了很好的上层抽象,可以让我们与具体消息中间件解耦合,屏蔽掉了底层具体MQ消息中间件的细节差异,就像Hibernate屏蔽掉了具体数据库(Mysql/Oracle⼀样)。如此⼀来,我们学习、开发、维护MQ都会变得轻松。⽬前Spring Cloud Stream原生⽀持RabbitMQ和Kafka,阿里在这个基础上提供了RocketMQ的支持简单使用Spring Cloud Stream 构建基于RocketMQ的生产者和消费者
2021-07-23 12:34:18
716
原创 SpringCloud Config使用
构建配置中心配置中心服务端配置新建一个配置中心模块,且注册到eureka中,在其他服务的基础上增加如下配置pom文件增加配置服务端设置 <!--config配置中⼼服务端--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-serv
2021-07-17 15:48:07
340
1
原创 SpringCloud GateWay使用
GateWay之路由转发和过滤在一个Gateway项目(配置了eureka等组件)中进行配置server: port: 9006spring: application: name: zhao-service-gateway cloud: gateway: routes: - id: service-autodeliver-router #uri: http://127.0.0.1:8091 uri: lb://z
2021-07-16 09:25:28
465
2
原创 Feign使用分析
feign使用在实现的效果上来说Feign = RestTemplate+Ribbon+HystrixFeign实现RestTemplate+Ribbon效果Feign实现RestTemplate+Ribbon效果,只需要以下几步在springcloud项目调用方的pom文件中加入openFeign的配置 <dependency> <groupId>org.springframework.cloud</groupId>
2021-07-14 22:56:57
245
原创 Hystrix使用分析
Hystrix使用使用Hystrix实现熔断要实现熔断,首先需要在请求调用方pom文件中加入 <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> </dependency&g
2021-07-14 07:27:42
295
1
原创 Ribbon负载均衡分析
Ribbon使用ribbon在使用上非常简单,仅仅只需要在配置类上加入配置即可 @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }调用时,直接使用在eureka中注册的服务名进行调用,就可以由ribbon来进行负载均衡了 @GetMapping("/checkAndBegin/{userId}") publ
2021-07-13 07:32:46
323
1
原创 Eureka功能和可用性解读
元数据除了普通的基础设置之外,eureka支持自定义元数据。配置方式如下eureka: instance: metadata-map: cluster: cl1 name: zhaozhen获取元数据代码 List<ServiceInstance> list = discoveryClient.getInstances("
2021-07-08 21:51:23
521
原创 Zookeeper客户端zkClient和curator的操作
zkClient操作基本增删改查代码如下public class createSession { public static void main(String[] args) { ZkClient zkClient = new ZkClient("119.45.52.68:2181"); System.out.println("connect success"); }}public class CreateNo
2021-06-25 23:03:59
358
原创 Zookeeper的原生api操作
pom文件引入<dependencies> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.14</version> </dependency></dependencies&g
2021-06-23 22:57:20
218
2
原创 使用group_concat需要注意的问题
最近在看一段别人使用group_concat之后发生的诡异的问题。具体表现就是。拼接字符串没有问题。但是用拼接的字符串作为in查询的条件。就出现了问题。平铺拼接的字符串之后,发现最后的字符串比其他字符串少。经过查询发现 show variables like "group_concat_max_len"; 的值为1024.修改10240 SET GLOBAL group_concat_max_len=1024000; 之后的查询就正常了欢迎搜索关注本人的公众号【微
2021-06-23 18:42:11
347
原创 ElasticJob简单使用
ElasticJob单点使用任务类public class BackupJob implements SimpleJob { public void execute(ShardingContext shardingContext) { String selectSql = "select * from resume where state='未归档' limit 1"; List<Map<String, Ob
2021-06-23 00:20:56
865
1
原创 分布式hash相关内容
Hash算法相关内容⾸先有⼀条直线,直线开头和结尾分别定为为1和2的32次⽅减1,这相当于⼀个地址,对于这样⼀条线,弯过来构成⼀个圆环形成闭环,这样的⼀个圆环称为hash环。我们把服务器的ip或者主机名求hash值然后对应到hash环上,那么针对客户端⽤户,也根据它的ip进⾏hash求值,对应到环上某个位置,然后如何确定⼀个客户端路由到哪个服务器处理呢?按照顺时针⽅向找最近的服务器节点假如将服务器3下线,服务器3下线后,原来路由到3的客户端重新路由到服务器4,对于其他客户端没有影响只是这⼀⼩部分
2021-06-22 21:28:09
143
原创 nginx相关知识总结
nginx配置属性总结全局属性worker_processes 1; worker进程数量,通常配置为与cpu核数相同 默认为1events属性worker_connections 1024;服务器与⽤户的⽹络连接,⽐如worker_connections 1024,标识每个workderprocess⽀持的最⼤连接数为1024http属性http属性是配置最频繁的部分,虚拟主机的配置,监听端⼝的配置,请求转发、反向代理、负载均衡等,后面配置时再详细讲解nginx用法总结反向代理新增t
2021-06-20 23:23:16
216
原创 手写一个简单的SpringBoot Starter
现在各种自定义的starter屡见不鲜,也许就需要自己来自定义一个starter了。学习一下starter的构建必备starter-定义首先需要自顶一个配置beanpackage com.zhao.starter;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.boot.context.properties.EnableConfigurati
2021-06-19 16:52:53
360
原创 解读SpringBoot和SpringMVC中配置类的@Impot等导入是如何解析的
首先,给出答案,SpringBoot和SpringMVC中配置类的@Impot等导入是通过Spring中的invokeBeanFactoryPostProcessors解析的SpringBoot中的EnableAutoConfiguration是如何实现导入配置类的在源码中我们可以看到,配置类应该是通过AutoConfigurationImportSelector和AutoConfigurationPackages.Registrar来导入的。@Target(ElementType.TYPE)@Re
2021-06-18 23:33:48
224
原创 简单实现springmvc中的请求处理
自定义MVC框架中的一些元素一些注解@Documented@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)public @interface Controller { String value () default "";}@Documented@Target({ElementType.TYPE,ElementType.METHOD})@Retention(RetentionPolic
2021-06-17 23:32:19
225
1
原创 ShardingShpere的sharding-jdbc效果测试
sharding-jdbc在目前微服务和各种saas软件等数据量日益加大的情况下变得使用的人多了起来。sharding-jdbc读写分离测试数据库实体@Data@Table(name = "city")@Entitypublic class City implements Serializable { @Id @Column(name = "id") @GeneratedValue(strategy = GenerationType
2021-06-15 21:01:31
353
原创 Spring中如何在非Spring管理的Bean中获取到Spring管理的Bean并操作
最近在开发过程中遇到了一个问题,就是和安卓端需要借助socket进行通信,但是此时的socket并不是spring websocket,且此时socket需要在线程中执行,无法被Spring管理,于是找到了另外一种用法@Componentpublic class SpringApplicationContextUtil implements ApplicationContextAware{ private static ApplicationContext applicationContext;
2021-06-15 14:56:37
639
原创 init-method,@postcontruct,afterPropertiesSet的先后顺序;
在牛客面经上遇到的一个面试题。突然想尝试下然后就开始做了测试 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:applicationContext.xml"); TestDao testDao = applicationContext.getBean(TestDao.class); ((ClassPathXmlAp
2021-06-14 17:45:39
358
原创 读写分离与分库分表,分布式事务
读写分离与分库分表,分布式事务MySql存储引擎,建表规范,事务级别,sql优化,读写分离思想等。了解过读写分离吗? 你说读的时候读从库,现在假设有一张表User做了读写分离,然后有个线程在一个事务范围内对User表先做了写的处理,然后又做了读的处理,这时候数据还没同步到从库,怎么保证读的时候能读到最新的数据呢? 你如何保证系统的稳定性? 答:分布式的链路一般都很长,所以我们首先通过全链路压测,分析整个链路,到底是哪个节点出现瓶颈。如果是数据层出现瓶颈,那么可以考虑加缓存,读写分离等降低数据库压力,
2021-06-09 13:49:44
386
原创 mysql Redo Log,Undo log和binlog日志相关面试题
Undo Log,Redo Log和BinlogMySQL隔离级别,一致性视图,undo log,redo log和binglog MySQL索引结构,回表,最左前缀原则 Mysql相关 1、innoDB跟myisam的区别; 2、InnoDB的索引实现,唯一索引、覆盖索引、前缀索引、联合索引、最左匹配原则; 3、什么时候需要索引,以及如何选择索引; 4、MVCC的原理、redo、undo、回滚段; 5、自增锁、共享锁、排他锁、意向锁、插入意向锁、记录锁、间隙锁是什么; 说一下undolog, re
2021-04-29 13:35:47
731
原创 通关kafka之Kafka面试题
kafkakafka说说它的特性,客户端offset宕机后,同一个topic客户端能不能接上它消费? 不能,只能客户端本地记录offset。kafka 各个模块概念 kafka 高水位(不会) 17、Kafka 选主怎么做的? 18、kafka 与 rabbitmq区别; 19、kafka 分区怎么同步的? 20、kafka 怎么保证不丢消息的?kafka partition broker consumer consumer group topic 等都是啥关系? 21、kafka 为什么可以扛
2021-04-20 18:51:05
421
原创 Kafka入门
Kafka生产者消费者,拦截器,分区器,序列化以及反序列化器直接上代码pom文件 <dependencies> <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-clients</artifactId> <version>1.0.2</v
2021-04-20 07:58:13
145
原创 Java并发之线程池简介
为什么要有线程池加快速度,提高效率(大量的操作需要多个线程进行处理时)达到可复用的目的,减少内存消耗,避免内存问题(大量请求处理例如Tomcat)统一管理具体核心参数corePoolSize 线程池的常驻核心线程数。如果设置为 0,则表示在没有任何任务时,销毁线程池;maximumPoolSize 线程池的最大线程数,当到达核心线程数之后,会慢慢向最大线程数变大workQueue 线程池执行的任务队列 * sychronizeQueue 同步交换队列 队列大小为1 * LinkedBl
2021-03-17 20:25:40
191
2
原创 几个开发小问题解决方案
使用@RequestBody接收数据乱码需要将练吗数据解码之后转化为char后在转化为stringstring s= URLDecoder.decode(PlatFormID, "UTF-8") private static String revert(String s){ char[] chars = s.toCharArray(); byte[] bytes = new byte[chars.length]; for(int
2021-03-11 22:34:51
159
2
原创 Soul的匹配策略和waf执行流程
Soul的匹配策略和waf执行流程soul的匹配策略通过前面几节的分析我们可以看到,几乎所有的插件都有匹配的规则执行的顺序,而我们通过插件分析了解到,具体的规则匹配是在soul-plugin-base中实现的在AbstractSoulPlugin文件中我们可以看到,具体的筛选规则的要求被封装在了MatchStrategyUtils.match方法中,通过规则要求条件数量来获取到匹配的规则在具体操作时,我们可以看到匹配规则,由Soul内部的SPI自己实现了规则的加载最后我们可以看到AndMatc
2021-02-06 01:53:54
1527
3
原创 Soul限流插件之RateLimiter插件
Soul限流插件之RateLimiter插件从Soul的RateLimiter插件的配置可以看到RateLimiter是依赖于Redis的,可以看到限流也可以基于Redis的三种模式的单机(standlone),集群(cluster)和哨兵(sentinel)模式在插件处理的开启的过程中即进行了Redis模式的配置在选择器规则中两个主要的配置的含义capacity(容量):是允许用户在一秒钟内执行的最大请求数。这是令牌桶可以保存的令牌数。rate(速率):是你允许用户每秒执行多少请求,
2021-02-04 22:02:30
558
原创 Soul网关限流插件Sentinel和Resilience4J扫盲
Soul网关限流插件Sentinel和Resilience4J扫盲Soul网关限流插件Sentinel扫盲首先看Soul中Sebtinel可以配置的项目对应的配置的含义degrade count:熔断阈值whether to open the degrade (1 or 0):是否开启熔断,1开启 0关闭degrade type:熔断类型、熔断策略,slow call ratio(秒级RT) 、 exception ratio(异常比例)、 exception number strate
2021-02-03 23:16:04
756
原创 Soul网关Hystrix插件相关知识点扫盲
线程隔离和信号量隔离Hystrix 里面核心的一项功能,其实就是所谓的资源隔离,要解决的最最核心的问题,就是将多个依赖服务的调用分别隔离到各自的资源池内。避免说对某一个依赖服务的调用,因为依赖服务的接口调用的延迟或者失败,导致服务所有的线程资源全部耗费在这个服务的接口调用上。一旦说某个服务的线程资源全部耗尽的话,就可能导致服务崩溃,甚至说这种故障会不断蔓延。资源隔离主要分为如下两种方式线程池信号量信号量机制信号量的资源隔离只是起到一个开关的作用,比如,服务 A 的信号量大小为 10,那么就是
2021-02-02 00:01:42
300
原创 Soul中使用的zookeeper监听功能尝试和nacos同步源码解读
Soul中使用的zookeeper监听功能尝试 一直很好奇soul中基于zookeeper的数据变更是如何做到的。虽然看到了是基于zkClient的实现的,还是想自己尝试下zookeeper监听尝试 首先新建一个maven项目,引入zkClient <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</art
2021-01-30 16:34:18
369
原创 Soul网关使用感受
阶段性 Soul网关使用感受通过一段时间的Soul网关的接触,总结了一些我认为Soul网关存在的优势使用上使用界面化的方式实现的属性配置,极大的降低了网关的使用难度,相比Springcloud gateway使用容易很多插件化的配置,使得稍有基础的开发人员很容易集成与网关相关的基础组件。同时可以自定义一些组件,接入到当前的Soul网关插件中对于SpringBoot的使用,所有现有插件以starter方式提供,在插件属性的配置上,将以往各种限流熔断组件配置文件或注解的方式替换为界面配置的方式,简
2021-01-29 22:20:28
596
原创 Soul的限流断路器的使用和流程
Soul的限流断路器的使用和流程由于之前并没有使用过Hystrix,Resilience4j和sentinel中的任何一种,此处仅对三种流控和断路器插件做一个流程分析Soul中Hystrix的使用和操作流程关于soul中插件的流程前文已经说过多次了,在此不在赘述。根据规则的具体选择方式。Soul构建了两个不同的操作类HystrixCommandOnThread和HystrixCommand。两个类的不同是HystrixCommandOnThread为拦截的接口建立了自己的线程池,实现了线程池的隔离
2021-01-28 22:59:57
1442
读入一个字符串,字符串中包含ZOJ三个字符,个数不一定相等,按ZOJ的顺序输出,当某个字符用完时,剩下的仍然安装ZOJ的顺序输出。
2013-07-08
Struts2返回无法返回到指定页面
2017-02-12
TA创建的收藏夹 TA关注的收藏夹
TA关注的人