- 博客(171)
- 收藏
- 关注
原创 Spring Security 使用
spring security提供了一个接口只有一个方法:loadUserByUsername(String username)根据用户名加载用户信息(返回一个对象)。Spring Security 的认证过程里,系统必须要知道:用户是否存在、用户的密码是什么、用户拥有哪些权限或角色。而这些信息通常都在数据库中。Spring Security 不关心用户存在哪,只关心你能不能给我提供一个对象。它通过调用你实现的来拿这些数据。然后和表单提交的用户密码进行比对来校验用户。返回的对象类型是。
2025-11-05 15:16:33
996
原创 Spring EL 表达式
这里Resolver就是使用的SpelExpressionParser来进行EL表达式的解析。StandardBeanExpressionResolver 是在Spring 容器启动阶段由自动创建的。if (!shouldIgnoreSpel对应spring.spel.ignore配置。如果想自定义BeanExpressionResolver可以通过自定义一个StandardBeanExpressionResolver bean来说实现。可以通过以下方式进行设置@Bean。
2025-11-04 16:49:39
918
原创 nacos 使用oceanbase(oracle模式)作为数据源
由于这里oceabase使用的oracle模式,找到自己需要的oracle plugin模块,其他的不管可以删除掉或取消模块,省的影响编译。his_config_info这个历史配置表的主键名是nid,其他的表主键都是id。发现不展示配置的格式,数据库中格式存储是正确的,最后跟踪到是oracle版的plugin的查询语句没有查询type这一列,对应ConfigInfoMapperByOracle.findConfigInfoLike4PageFetchRows()方法在查询语句上加上type就可以了。
2025-10-27 17:04:56
654
原创 nacos 集群选举
Nacos 的 server 端是通过集群模式来保证高可用性的,通常采用的是基于 Raft 协议的选举机制。具体的实现过程中,Nacos 会启动多个实例作为集群中的成员,当某个实例失败时,其他实例会进行选举,选举出新的 leader 来继续处理请求。
2025-09-29 10:34:50
913
原创 nacos 服务端与客户端通讯流程实现
服务端处理客户端连接及心跳请求不管是OpenApi Http方式还是RPC方式所实现的功能都是一样的。这里将会以RPC方式来看下服务端和客户端交互的基本流程。
2025-09-26 16:38:20
686
原创 nacos 注册中心实现源码阅读
在spring cloud项目中只需要在启动类上添加@EnableDiscoveryClient注解即可实现服务注册和发现功能。当容器初始化完成后会发布一个ServletWebServerInitializedEvent事件,spring cloud 提供了一个AutoServiceRegistration接口,用来启动服务自动注册,其有一个抽象实现类AbstractAutoServiceRegistration来定义注册的大致实现,该抽象类实现了 接口, 会处理ServletWebServerInitia
2025-09-24 17:33:39
850
原创 nacos 配置中心实现原理
在系统开发过程中通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成这个步骤。配置变更是调整系统运行时的行为的有效手段之一。用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。
2025-09-22 17:33:57
650
原创 openfeigin配置相关
但是当前切换到apache httpclient后这样,FeignClient接口就不会延迟加载,因为有外部依赖,开启httpclient要在配置文件中配置feign.httpclient.enabled: true,除此之外还要添加对应的jar包依赖。来存储每个FeignClient的配置容器信息,其中key是FeignClient 的contextId或name。configuration 如果不指定,默认会使用FeignClientsConfiguration中的配置。
2025-09-18 18:33:12
797
原创 openfeigin 跨服务调用流程 源码阅读
这样@FeignClient修饰的接口就通过动态代理方式创建了一个对那个的实例bean,当调用的时候就会通过InvocationHandler.invoke()方法来处理,这里默认的InvocationHandler实例是FeignInvocationHandler,是ReflectiveFeign的内部类,其invoke方法最后会从上面methodToHandler这个map中找到当前方法对应的handler调用其invoke进行处理。接口,作用是 在容器启动时动态注册 Bean 定义。
2025-09-17 17:56:03
600
原创 spring mvc 全局异常处理
在 Spring MVC 中,实现全局异常处理可以让你在应用程序的任何地方捕获和处理未捕获的异常,从而为用户提供一个统一、友好的错误响应,而不是将默认错误页或异常信息暴露给前端。实现全局异常处理主要有三种方式,它们在功能和使用场景上各有侧重。
2025-09-15 16:20:03
1061
原创 spring mvc 拦截器 (HandlerInterceptor )
Spring MVC 的 拦截器(Interceptor)可以在请求到达 Controller 之前、执行 Controller 之后、视图渲染之前/之后进行拦截和处理。拦截器主要用于日志记录、权限校验、性能监控、通用数据处理等场景。拦截器的核心接口是HandlerInterceptor ,它定义了三个拦截器行为方法。
2025-09-11 17:30:57
293
原创 spring mvc HttpMessageConverter 消息转换器
如果默认内置的converter不能满足要求,可以进行自定义converter。如请求的body存在转码或加密,或有固定头信息,不是标准的json格式,则可以继承MappingJackson2HttpMessageConverter 类,然后重写对应的read和write方法。自定义的converter可以通过WebMvcConfigurer加载到容器中。@Override也可以通过将自定义的MessageConverter注册未一个bean来让容器自动加载。
2025-08-14 18:00:21
695
1
原创 spring mvc 整体处理流程原理
DispatcherServlet接收到请求后会调用doDispatch方法进行请求分发,然后拿出所有的HandlerMapping类实例调用getHandler(HttpServletRequest request)来根据请求获取可能匹配的handler进行调用。方法调用完后会有返回值,将控制器方法的返回值(通常是一个对象)处理成合适的响应形式(如视图、JSON 数据、XML 数据等)。它将请求和控制器方法之间的调用过程解耦。,它负责根据返回值的类型和控制器方法的注解,将返回值转换为适当的响应,并交给。
2025-07-31 18:18:32
703
原创 spring cloud sentinel 动态规则配置
Sentinel 允许在运行时根据不同的需求动态调整限流、熔断等规则。loadRulesDataSource手动修改规则(硬编码方式)一般仅用于测试和演示,生产上一般通过动态规则源的方式来动态管理规则。
2025-07-29 18:30:38
1261
原创 Spring Cloud Alibaba Sentinel 源码阅读之流量控制算法
checkFlow()校验首先根据当前资源从FlowRuleManager获取适配当前资源的限流规则,然后逐一进行规则校验。这样一个窗口的时间长度是 1000/2 = 500毫秒,LeapArray数组长度为2,存储两个样本窗口数据。: 存储在一个时间窗口内(例如 200ms)的各项指标,如通过请求数、拒绝请求数、异常数等。这里看到LeapArray数组中两个元素会被循环使用,过去的窗口数据会被清空覆盖掉。看完了数据结构,继续来看计数流程。计数窗口开始时间,这个也好理解,其实就是求上个时间窗口的结束时间,
2025-07-24 17:15:53
913
原创 Spring Cloud Alibaba Sentinel 流量控制
Sentinel 是一个用于分布式系统中的流量控制、熔断、降级和系统防护的工具。它通常用于与或等微服务框架一起使用,可以与或配合实现更好的配置管理和服务发现。
2025-07-21 17:26:47
990
原创 Spring Cloud Sleuth 链路追踪
Spring Cloud Sleuth 是一个分布式追踪解决方案,帮助你在基于 Spring 的系统中追踪请求如何在多个微服务之间流转。它能提供关于请求流转的关联信息,有助于调试、监控以及理解微服务之间的交互。从而更容易识别瓶颈、延迟问题和故障。Spring Cloud Sleuth 的最后一个小版本是 3.1,它不适用于 Spring Boot 3.x 及更高版本。其核心功能已迁移到 Micrometer Tracing 项目。这里还是以spring boot 2版本演示功能。添加依赖。
2025-05-12 17:38:17
1099
原创 Spring Cloud LoadBalancer (负载均衡)
LoadBalancerClients注解引入defaultConfig,已有的两个默认配置是LoadBalancerAutoConfiguration和BlockingLoadBalancerClientAutoConfiguration。@LoadBalancerClient注解导入自定义的某个服务配置,其有两个属性,value用来指定服务ID名称,configuration用来指定LoadBalancer配置文件。
2025-05-09 17:02:22
1964
原创 spring cloud 跨服务调用
微服务将不同功能模块拆分成多个不同的服务,在业务逻辑集成时候,难免会有一个服务需要依赖调用另一个服务的情况。如订单服务需要通过用户服务查询用户相关信息,这时候微服务之间就需要进行跨服务调用。要想进行跨服务调用,服务之间需要一种能够找到彼此的方式。这个时候就是通过前面文章介绍的注册中心。服务实例启动后会将自己的网络位置(主机和端口)注册到服务发现服务器上(注册中心),而其他服务可以通过注册中心找到它们需要调用的可用服务实例列表。
2025-05-08 11:27:07
1019
原创 spring cloud gateway 断言(Predicates)与过滤器(filters)
路由过滤器是针对单个路由进行配置的,只对匹配该路由的请求生效。在配置文件中配置在具体某个路由节点的下面。全局过滤器不针对特定的路由配置,而是会拦截并处理所有通过 Gateway 的 HTTP 请求和响应。Spring Cloud Gateway 提供了多种内置断言,可以根据请求的路径、头部、方法等条件来决定是否将请求路由到特定的处理器。那ForwardPathFilter的完整对应配置项就是:spring.cloud.gateway.global-filter.forward-path.enabled。
2025-05-07 16:48:54
1433
原创 spring cloud gateway(网关)简介
Spring Cloud Gateway 是一个基于 Spring WebFlux 构建的强大且广泛使用的 API 网关。它负责处理所有进入的请求,并将它们路由到相应的后端服务。
2025-05-06 15:53:18
1235
原创 spring cloud 服务注册与发现(Service registration and discovery)
在 Spring Cloud 中,注册中心是一个用于管理微服务实例并进行服务发现的核心组件。它可以帮助系统中的各个服务组件相互了解对方的位置以及状态,从而实现服务之间的通信。服务注册是指系统中的各个服务实例将自己的信息(如 IP 地址、端口、元数据等)注册到注册中心,以便其他服务能够找到它。服务发现是指服务消费者可以通过注册中心查询其他服务的位置信息(如 IP 地址、端口等)。健康检查功能用于检测注册到注册中心的服务实例是否健康,保证只有健康的服务实例能够对外提供服务。
2025-04-28 14:31:23
1159
原创 spring schedule 任务调度
启用 Spring 的任务调度功能需要使用@EnableScheduling注解,该注解会引入ScheduledAnnotationBeanPostProcessor。beanprocessor是一个bean后置处理器,负责扫描带有 @Scheduled 注解的方法,将其转换为可执行的任务,并根据注解的属性将其注册到 TaskScheduler 中进行管理和执行。
2025-04-28 10:45:50
1049
原创 openssl 安装及使用
OpenSSL 是一个强大的开源加密库,提供了一系列密码学功能,包括加密、解密、数字签名、证书生成和管理等。它同时也是一个通用的 SSL/TLS 协议实现,用于安全地传输数据。您可以使用 OpenSSL 来创建和管理证书、进行加密通信,以及执行各种与加密相关的操作。
2024-12-26 10:16:19
3893
原创 nginx控制连接数及访问速率
key可以是文本或变量,如果一个请求的key是空不会进行请求计数。limit_req_zone 指令用来定义请求速率限制内存区域,key同limit_zone指令,用来标识计算速率的key值,name是内存区域名称,size是内存大小,rate是速率,单位 每秒是(r/s),没分钟是 (r/m)。limit_req用来设置请求速率,zone指定使用的limit_req_zone 设定的区域名称。处理限制客户端连接数外,还可以通过ngx_http_limit_req_module模块来限制客户端的请求速率。
2024-12-13 14:49:05
1010
原创 nginx文件上传下载控制
如果你希望根据不同的条件(如请求的文件类型、客户端 IP、或者请求的文件大小等)来控制下载速度,可以结合 map 指令和 limit_rate 实现更复杂的逻辑。limit_rate_after 指令可以设置在传输一定量的数据后开始限制下载速度。它通常用于当文件已经开始下载时,限制后续的下载速度。不进行下载速度控制。limit_rate 指令的作用域可以是http, server, location, if in location。这样下载该server下的文件将会限制下载速度为每秒100kb。
2024-12-11 17:36:06
1342
原创 基数排序(Radix Sort)
基数排序的时间复杂度为O(n⋅k),其中 n 是待排序元素的数量,k是数字的位数。每位排序这里可以使用计数排序,因为每位数字范围是0-9是固定的。先按个位进行排序结果:[12, 234, 45, 6, 36, 88]一般的数字都是按10进制基数进行排序,个位,十位,百位依次进行排序。按十位进行排序结果:[6, 12, 234, 36, 45, 88]按百万进行排序结果:[6, 12, 36, 45, 88, 234]如待排序数组:[12,234,6,88,36,45]
2024-10-09 16:51:36
580
原创 桶排序(Bucket Sort)
例如在大数据处理和分布式系统中,桶排序可以用于将大量数据分配到不同的节点,然后各自进行局部排序。桶排序首先要确认桶的数量。如果数据分布均匀,可以使用较少的桶,因为每个桶内的数据量会相对均匀。如果数据分布不均匀,可能需要增加桶的数量,以防止某些桶过于拥挤,从而导致桶内排序性能下降。其基本思路是将数据分到有限数量的桶中,每个桶再单独进行排序,最后将各个桶中的元素合并起来。下一步可以根据元素所在桶索引将元素分配到对应的桶中,然后每个桶内数据进行排序。4、三个桶内进行排序,然后按桶索引依次取出所有元素排序完成。
2024-10-09 14:26:42
620
原创 计数排序(counting sort)
计算排序是一种通过计算每个元素出现的次数来进行排序的算法。它不比较元素,而是利用数组来“计数”,所以在某些情况下,它能比传统的比较排序快。计数排序首先要找到要排序数组的最大值,然后创建一个统计数组存储每个排序元素的出现次数,然后累加计数数组,根据计数数组来确定每个元素的位置。以一个实际例子来看,假设待排序数组:{2,8,7,6,4,5,2,8,5}
2024-09-29 16:47:36
705
原创 二叉树之堆树
堆树是一种完全二叉树,完全二叉树特点:除了最后一层所有层都填满,最后一层节点从左到右排列。堆树分为两种类型:大顶堆和小顶堆。:每个节点的值都大于或等于其子节点的值,根节点是最大值。:每个节点的值都小于或等于其子节点的值,根节点是最小值。
2024-09-25 21:47:36
966
原创 java中的位运算
位运算是对整数的二进制位进行操作的一种运算。在java中long, int, short, char和byte类型都可以使用位运算。位运算的过程如下:首先将十进制整数转换成二进制表示形式,然后将位运算符应用于每个二进制数位,并计算结果。最后,将二进制结果转换回其十进制表示。位运算符有以下几种:与运算(&)、或运算(|)、异或运算(^)、取反运算(~)、左移(<<)、右移(>>)等。下面来分别看下每个运算。
2024-09-24 14:38:20
1187
原创 java集合之map
在 Java 中,Map是一个用于存储键值对的集合。nullHashMapnullnullHashMapHashMap这些Map实现类各有特点,适合不同的使用场景。这里只介绍hashmap。
2024-09-20 21:50:15
1104
原创 java中的集合之List
Java 中的List是一个接口,定义了一组有序的元素集合,允许重复元素。ListArrayListVectorArrayList每种实现都有其特定的特点和适用场景,可以根据具体需求选择使用。这里主要学习平时最常用的ArrayList。
2024-09-13 14:15:46
1085
原创 二叉树之哈夫曼树
哈夫曼树(Huffman Tree)是一种用于数据压缩的树形结构,广泛应用于无损数据压缩算法中。由大卫·哈夫曼(David A. Huffman)在1952年提出。它主要用于构造哈夫曼编码,一种基于字符出现频率的变长编码方案。压缩的目的是使用更少的空间来存储比较大的数据内容。这样首先就要对原数据中重复内容进行统计,重复最多的内容使用最短编码来表示。最短编码对应到树上可以使用节点路径来表示:从根节点到任意一个叶子节点的路径。这样将重复多的项放于靠近根节点位置,重复最少的尽量存放于最底层叶子节点即可。
2024-09-13 10:14:49
380
原创 Spring Cloud Config 配置中心
在java开发中难免会涉及到配置文件,比如连接数据库配置、连接一些中间件配置、一些阈值或开关参数等等。我们一般存放到properties或yml文件中,然后应用部署启动的时候读取这些配置项。在分布式系统中,多个服务需要访问和管理配置。如果每个服务都独立管理配置,会导致配置的重复和不一致。另外在不同的环境(如开发、测试、生产)中,应用程序通常需要不同的配置。Spring Cloud Config 就是为了解决这些问题。Spring Cloud Config 允许将所有服务的配置集中管理在一个地方。
2024-09-11 21:03:40
1299
原创 Spring Cloud 简介
Spring Cloud专注于为典型用例提供良好的开箱即用体验和可扩展性。提供对微服务架构的支持,包含服务注册与发现、负载均衡、跨服务调用、熔断限流、配置管理、服务网关、分布式消息等功能。它简化了微服务的开发和运维,同时与Spring Boot无缝集成,提供了易于配置和管理的解决方案。
2024-09-09 16:28:06
2061
原创 redis的持久化RDB和AOF
RDB持久化对Redis的性能影响相对较小,因为它是通过创建数据库的快照来实现的。这种方式在生成快照的过程中,Redis会在后台执行,而不会对主线程的操作产生显著影响。RDB文件是经过优化的二进制格式,能够快速加载。相较于AOF文件,RDB在恢复数据时通常比AOF更快,适合需要快速恢复的场景。RDB文件可以方便地用于备份和迁移数据,因为它们是单个文件,易于复制和移动。也适合用于离线备份和灾难恢复。
2024-09-05 21:38:49
1152
原创 java使用jedis连接redis
在 Java 中操作 Redis 通常使用 Jedis 或 Lettuce 这两个库。Jedis简单易用,适合大部分使用场景,Lettuce支持异步和反应式编程,适合需要高并发和非阻塞操作的应用。这里使用jedis来连接redis操作。添加依赖使用jedis操作redis和使用jdbc操作数据库差不多,jedis将redis的命令行操作指令都封装到一个Jedis类里。操作方法名也基本上和redis的命令行命令相同。获取Jedis对象获取Jedis对象可以直接通过其构造函数获取连接。
2024-09-05 09:53:12
1010
原创 redis集群(Cluster)搭建
cluster-config-file指定的nodes.conf配置文件会存储集群中每个节点的槽位范围,这样当客户端发送一个key操作指令时当前节点能判断具体应该在哪个节点上,如果是当前节点,则直接执行对应的key操作。在删除节点之前,确保所有与该节点相关的数据已经被迁移到其他节点,使用前面的resharding 迁移槽位。这时候集群中节点已经是4个,但是新加入的7004对用分片的槽位是0,不会承载数据的读写,这个时候还需要执行reshard进行槽位迁移,从其它节点将一部分槽位迁移到当前节点。
2024-09-03 15:49:13
1626
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅