- 博客(41)
- 问答 (1)
- 收藏
- 关注
原创 spring-cloud-gateway限流降级熔断有代码
名词解释网关,不用解释了 路由,客户调用服务会过网关,网关根据路由规则路由到客户端请求的服务集群中的某一个 限流,在一定时间内只路由一定量的服务,限流规则可以根据客户端ip,主机名、服务名等很多 降级,服务请求超时,(服务不可用,我没试成功过这种场景)的时候快速返回降级 fallbackUri 的结果给客户端 熔断,相当于服务a原来直接到服务b,现在加上断路器,编程服务a到断路器再到服务b,如果服务b出错(可以自定义熔断哪种错误,比如500),就熔断,然后返回熔断配置的fallbackUri返回
2022-04-14 18:09:02 1328
原创 spring-cloud-security
基于webflux的spring security,即spring-cloud-security
2022-04-12 23:45:27 4635 1
原创 【mybatis源码系列1】 二级缓存
面试mybatis必问二级缓存,都知道有二级缓存,那mybatis是怎么实现的,本系列文章以mybatis-3.5.6版本为例。啰里啰唆写了,想直接看缓存的跳到缓存部分。一、mybatis流程写mybatis代码的时候,逃不过这几步// 1.获取配置文件InputStream in =Thread.currentThread().getContextClassLoader().getResourceAsStream("mybatis-config.xml");//2.开启SqlSessio
2022-01-03 17:36:15 853 3
原创 springboot 配置双mysql数据库
项目中用到,学习了一下,记录下来,先回用,再搞懂原理架构springboot+mybatis+mysql连接池(springboot默认的HikariCP)配置点1.就目录里的DataSourceConfigBackup和DataSourceConfigMaster,以第一个举例package com.faith.twodatabase.configuration;import com.zaxxer.hikari.HikariDataSource;import org.ap.
2021-12-21 23:16:50 4548 2
原创 springboot配置druid监控
引入 druid 依赖<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/x.
2021-04-29 11:47:38 140
原创 zookeeper做分布式锁
原理多个客户端抢一把锁,这些客户端在 zookeeper 里创建各自的临时序列node,无论什么顺序,阻塞住,直到找到第一个创建的节点才放开,即第一个客户端获得了锁,不是第一个的客户端,就阻塞,直到第一个客户端运行结束,删除他创建的节点,让剩下的客户端继续轮循直到找到第一个的过程。结果展示用10个线程模拟10个客户端的结果如下:代码package org.faithgreen.lock1;import org.apache.zookeeper.*;import org.apache.zoo
2021-04-24 00:15:15 86
原创 zookeeper配置中心
场景多个客户端从zookeeper 的配置中心拿到配置,如果配置中心没有配置就阻塞,如果配置修改了就拿到新的。原理因为zookeeper的同步性质,即单线程的分两段式(当发生修改时,第一阶段:leader向各个follower发送log任务,过半成功返回后进行第二段的具体的修改)的事务方式,如果节点发生更改,则要么成功且所有客户端都get到最新的修改结果,要么失败。所以代码只要注册发生修改(包括数据修改,节点增加,删除等,以下同)的事件,死循环取就行。本文只写了简单的框架,复杂的业务逻辑没有。
2021-04-23 11:28:51 511
原创 多人互砍游戏的后台服务器的多线程架构
概述本文叙述从最简单的单线模型程进化多线程的模型。不用 spring 而是用普通的 java 代码,只做了登录、移动、互砍、伤害计算,英雄死亡等功能的最最简单的版本,主要讨论的是框架架构,不是业务有多绚。1.服务器处理客户端的连接和客户端指令当然用 netty。2.客户端用 cocos,本文不讨论,协议自定义好了,生成 java 代码用protoBuf,本文不讨论。3.用到的设计模式,工厂+策略、单例、观察者。为什么游戏服务器用单线程一般会认为单线程处理超高并发的应用时慢,其实绝大部分应用的性能
2021-04-15 10:29:11 513
原创 手撕 RPC 2
把单个客户端改成多个呢?在成功连接几个client后报错了,是拆解包的时候出错,为什么呢?看一下多个客户端连接时候的 netty 的模型:
2021-04-08 10:32:25 116
原创 手撕 RPC 1
rpc要素rpc 最 low 的描述:调用远程服务像调用本地方法一样,也就是面向 interface 开发,最基本的,要做到像本地方法一样调用,意味着 consumer 要知道 provider 有什么服务( interface 名字)是什么,方法( 接口里的方法)是什么,参数(方法的传参)是什么,返回(方法的返回类型)什么。要解决这些问题,需要的知识点有:provider 和 consumer 的通信provider(至少一个)和 consumer(一般是多个)之间连接的数量,管理(多个 cons
2021-04-07 20:09:26 111
原创 系统调用回答为什么要用buffer写
为什么系统调用会慢?程序的读写是要调用内核的方法去写,产生系统调用,就必须频繁的切换用户态和内核态,切换的过程需要保存现场,清理寄存器,回复现场等,消耗cpu时间,所以慢,好的程序应该是尽量减少这种动作。java的BIO的写有两种方式:1.普通的io流写,private static void testBasicFileIO() { File file = new File(path); try { FileOutputStream out
2021-04-05 12:27:35 286
原创 linux内核管理pagecache的一丢丢知识整理
pagecache是linux内核为了提高程序运行效率开辟出来的内存。通俗点理解,程序在硬盘里是整齐码放的,但是运行的时候是需要哪一块就把哪一块load到内存里使用,如果程序运行过程中发现需要的代码没有load进内存,就产生一个软终端的系统调用,然后切换到内核态去硬盘里load这部分内容到内存里,继续运行程序。一个程序的重复的进程复用这些内存里的pagecache。这么做的好处当然是程序运行更快了,缺点显而易见就是容易丢数据(程序正在疯狂IO,突然踢电源了,在在内存中的数据没有写到磁盘上,就丢了)。lin
2021-04-05 10:12:49 462 2
原创 Bio->Nio->Selector->Epoll->Netty
c10k问题2000年左右提出的,BIO模型下的10K个socket处理客户端和服务端数据传输慢的问题。单线程模拟10k个客户端package io.bio;import java.io.IOException;import java.net.InetSocketAddress;import java.nio.channels.SocketChannel;import java.util.LinkedList;import java.util.List;/** * Author: l
2021-03-31 19:14:29 156
原创 搭建LVS_DR模型
系统准备1.ubuntu2.vmware,NAT模式,启动三台虚拟机。模型图node1作为LVS负载均衡服务器,node2和node3模拟应用程序(httpd)真实服务器。VIP 为192.168.100.100,采用轮训算法负载。操作node1安装ipvs客户端,yum -y ipvsadm配置VIP:ifconfig ens33:1 192.168.100.100/24配置连接入口:ipvsadm -A -t 192.168.100.100:80 -s rr配置连接出口之no
2021-03-31 09:48:14 240 2
原创 吓一跳
网络请求的时候,目标ip和掩码(Genmask)做按位与运算,与Destination对比,对比的上的就走下一跳,即Gateway,192.168.172.2就是这个网的下一跳的网关,0.0.0.0就说明目标地址与这台服务器在同一个网络,就不需要下一跳了。...
2021-03-30 01:48:16 397 1
原创 TCP的拥塞
先看一个演示服务端代码:package io.unittest;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.InetSocketAddress;import java.net.ServerSocket;import java.net.Socket;import jav
2021-03-28 19:09:38 170
原创 linux网络IO
Socket服务端代码package io.unittest;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.InetSocketAddress;import java.net.ServerSocket;import java.net.Socket;import java
2021-03-28 18:30:10 141
转载 转发GC
添加链接描述在控制台输入命令java -XX:+PrintCommandLineFlags -version显示结果-XX:+UseParallelGC 新生代使用ParallerGC,老年代使用Serial Old垃圾回收器列表并行:垃圾收集的多线程的同时进行。并发:垃圾收集的多线程和应用的多线程同时进行。垃圾回收器工作示意图Serial/Serial Old最古老的,单线程,独占式,成熟,适合单CPU 服务器-XX:+UseSerialGC 新生代和老年代都用串行收集器
2021-03-17 14:55:54 395
原创 指令级别解释对象创建过程和DCL为什么要volatile
先上图先明白几点1.jvm stack指的是线程栈,一个线程有一个jvm stack。2.线程里的一个方法对应一个栈帧,一个栈帧有Local Variables(本地变量表,记录了方法的参数、局部变量)、Operand Stacks(方法运算的变量引用,常量值需要压栈和弹栈)、Dynamic Linking(方法运算需要引用方法区的引用)、Return Address(记录了方法需要返回的调用者的地址)。3.所有方法栈里的运算都要压栈和弹栈,就是Operand Stacks要频繁的发生 astor
2021-03-14 16:35:58 222
原创 java 指令级别理解i++和++i
idea安装jclasslib(略)执行过程a++代码public class CodeTest { public static void main(String[] args) { int a = 8; a = a++;// a = ++a; System.out.println(a); }}打开jclasslib查看指令看右边的字节码部分,0 bipush 8 --> 把8这个值压栈,就是先把8这
2021-03-14 14:58:29 108
原创 电脑开机过程
1.通电2.BIOS自检,内存条有没有插紧啊,硬盘是不是连接上了啊之类的3.加载操作系统(bootloader),一个电脑可以有多个操作系统,选择加载哪个。操作系统是放在硬盘里的,那么一定有一个程序写死在硬件里,在硬盘的第一个扇区里(Master Boot Record)BIOS直接去那里加载。4.我们可以配置从软盘启动,硬盘启动,说明配置,开机密码等。是可以改的,那就是cmos,这个芯片是记录了用户的配置信息。...
2021-03-06 22:24:34 285
原创 linux知识
文件linux里一切皆文件,比如硬盘、键盘、摄像头、usb等在linux里都映射为文件,以inode标记。比如 ll 命令::普通文件(可执行程序、图片、文本)d :目录b :块设备c :字符设备s :socketp :pipeline[eventpoll] :l :链接...
2021-03-06 19:48:48 68 1
原创 java需要知道的计算机底层
计算机组成cpuPCProgram Counter,程序运行的时候,需要指令和数据,而一个复杂的程序有很多指令,那么每一步执行哪一条指令,就从内存里取出来放到PC了里,记住这个指令在内存里位置,从而知道下一个指令从内存的哪里取。Registers寄存器,一颗cpu里有很多寄存器,有的写,有的读,还有其他的作用,程序运行时的数据就放到寄存器里。ALUArithmetic & Logic Unit,计算和逻辑单元,比如计算2+3,从PC里拿+指令,从register A里拿2,从regi
2021-03-06 19:35:34 178
原创 join的实现原理
simple Nested-Loop JoinIndex Nested-Loop JoinBlock Nested-Loop Join(1)Join Buffer会缓存所有参与查询的列而不是只有Join的列。(2)可以通过调整join_buffer_size缓存大小(3)join_buffer_size的默认值是256K,join_buffer_size的最大值在MySQL 5.1.22版本前是4G-1,而之后的版本才能在64位操作系统下申请大于4G的Join Buffer空间。(4)使用
2021-03-04 22:36:34 540 1
原创 覆盖索引
覆盖索引1、当发起一个被索引覆盖的查询时,在explain的extra列可以看到using index的信息,此时就使用了覆盖索引mysql> explain select store_id,film_id from inventory\G*************************** 1. row *************************** id: 1 select_type: SIMPLE table: inventory
2021-03-04 22:09:33 2350 2
原创 mysql 调优
mysql调优我的版本说在前面性能监控如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入我的版本5.7.32说在前面mysql的结构:此文章只讨论使用 InnoDB存储引擎的场景。性能监控1、使用 show profile 解剖工具。 此工具默认禁用,可以在会
2021-03-04 21:52:11 2481 1
原创 MYSQL performance schema详解
MYSQL performance schema详解0、performance_schema的介绍 MySQL的performance schema 用于监控MySQL server在一个较低级别的运行过程中的资源消耗、资源等待等情况。 特点如下: 1、提供了一种在数据库运行时实时检查server的内部执行情况的方法。performance_schema 数据库中的表使用performance_schema存储引擎。该数据库主要关注数据库运行过程中的性能相关的数据,与informatio
2021-03-04 20:29:03 143 1
原创 react的bind(this)
react中组件处理事件最容易出错是事件处理函数中的this的指向问题,因为ES6 class并不会为方法自动绑定this到当前对象.React实力函数的写法主要有三种形式,不同的写法解决this指向问题的方式也不同.1.使用箭头函数,这种写法每次render调用时,都会重新创建一个新的组件,带来额外的性能开销.不传参传参2.使用组件方法,直接将方法赋值给元素的事件属性,并...
2020-04-10 00:20:38 343
原创 ubuntu18.04.4 LTS 安装NVIDIA驱动亲测有用方法2020年最新及常见问题避坑
环境准备ubuntu18.04.4 LTS系统(我的是单系统,不是双系统也不是虚拟机,原先是家庭版的win10,嫌太慢换成旗舰版的win7,然后一堆文件权限管理问题搞得头大,就剁手单装ubuntu),secure boot 设置为disable(如果不设置这一项,系统启动会不载入NVIDIA的驱动,各品牌的主板进入bios界面不同,我的是小米笔记本,插u盘之后启动的时候f2)安装1.看...
2020-04-07 04:12:40 1144 1
原创 springboot(2.2.4)全局异常处理(RestControllerAdvice,ExceptionHandler)
当程序出现异常我们一般try,catch处理,这样代码结构不好看,我们希望程序员写的代码业务和框架是分离的,通过注解进行绑定使用。springboot里通过@RestControllerAdvice注解定义全局异常处理类,通过@ExceptionHandler(异常类型.class)拦截对应的异常。我希望实现的是,前台发出请求,如果后台发生异常,后台把异常信息输出到日志,返回给前台500错误码...
2020-03-26 15:38:48 293
原创 druid连接池配置数据库密码加密
druid配置数据库密码加密后,可以把密码放在配置文件里,或本地其他文件、远程服务器等三种地方,这里只讲第一种方法。1.密码加密:cd到druid包所在文件夹打开命令行,输入java -cp druid-1.1.9.jar com.alibaba.druid.filter.config.ConfigTools you_password,得到加密后的密码,publicKey(privateKe...
2020-03-25 15:00:19 1974
转载 jdk的logging我们Logger.getLogger("xxx")jdk都干了啥
https://www.cnblogs.com/xingxingge/p/10311476.html
2020-03-24 19:33:12 157
转载 SecurityManager安全管理器
https://nicky-chen.github.io/2018/07/13/java-securitymanager/
2020-03-24 14:46:53 92
原创 springboot(2.2.4)配置druid的log4j2日志监控
druid连接池标榜自己是唯一有监控的连接池,性能最好的连接池。其中一项是强大的日志功能,方便程序员定位问题,配置log4j2步骤如下:1.去除springboot默认的logback日志框架,请参看我的另一篇博客https://blog.csdn.net/weixin_39370859/article/details/1050397872.配置数据源(我用的是配置文件的方式,也可以代码里...
2020-03-23 01:03:06 1011
原创 springboot(2.2.4)的默认日志框架logback换成log4j2
阿里https://github.com/alibaba/druid/的文档,druid经过阿里购物节的大数据量的考验,又标榜druid是带有监控的数据库连接池,可以时刻监测数据路访问的性能,并发,连接,防sql注入,强大的日志功能等,被安利,但是文档只有对log4j2的说明,就换springboot的logback框架为log4j2框架。拢共分几步1.剔除logback(dependenci...
2020-03-23 00:32:59 2187 1
空空如也
AutoConfigurationPackages.Registrar解决什么问题
2021-12-02
TA创建的收藏夹 TA关注的收藏夹
TA关注的人