自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(103)
  • 收藏
  • 关注

原创 finally语句块是否一定会执行?finally和return执行顺序先后问题

finally语句块并不总是会执行。在以下情况下,finally块不会执行:1) 在try块之前抛出异常;2) 在try块中调用System.exit(0)或Runtime.getRuntime().halt(0);3) 遇到无限循环、死锁、JVM崩溃或断电等情况。此外,当try块中包含return语句时,finally块会在return语句执行之前执行。例如,在functionA中,尽管return语句调用了其他函数,程序仍会先执行finally块,然后返回结果,因此输出顺序为A、C、E、B、F。

2025-05-18 23:21:30 192

原创 【java多线程】线程间通信-利用wait和notify轮流按序打印奇数和偶数

在多线程编程中,wait和notify是实现线程间通信的关键机制。wait方法使当前线程进入等待状态,并释放持有的锁,直到其他线程调用notify或notifyAll方法唤醒它。notify用于唤醒单个等待线程,而notifyAll则唤醒所有等待线程。这些方法必须在synchronized同步块或方法中使用,以确保线程安全。通过一个交替打印奇偶数的示例,展示了如何利用wait和notifyAll实现线程间的协调与通信,确保线程按顺序执行任务,直至完成指定条件。

2025-05-18 22:45:54 427

原创 【springcloud学习(dalston.sr1)】Config配置中心-Configclient端通过和Config server端通信来获取配置文件信息(含源代码)(十四)

本文介绍了如何在Spring Cloud项目中实现Config Client与Config Server的通信,以从Git服务器获取配置文件。首先,创建了一个Config Client项目microservicecloud-config-client-3355,并在POM文件中添加了必要的依赖。接着,配置了bootstrap.yml和application.yml文件,其中bootstrap.yml指定了从Git获取的配置文件名称、环境、分支以及Config Server的地址。项目启动时,Config C

2025-05-17 21:42:42 668

原创 【springcloud学习(dalston.sr1)】Config配置中心-ConfigServer端与Git通信(含源代码)(十三)

Spring Cloud Config 是一个用于集中管理微服务配置的工具,特别适用于包含多个独立服务的复杂系统,如电商平台。通过将配置文件存储在Git服务器上,Config Server 可以在服务启动时从Git拉取配置,简化了配置管理。文章详细介绍了如何搭建Config Server端,包括创建Git远程仓库、配置POM文件依赖、设置application.yml文件以及创建启动类。最后,通过访问不同的URL,展示了如何从Config Server获取不同环境(如开发环境和测试环境)的配置信息,验证了C

2025-05-17 21:04:08 1053

原创 【springcloud学习(dalston.sr1)】Zuul路由访问映射规则配置及使用(含源代码)(十二)

本文介绍了Spring Cloud中Zuul网关的使用,重点讲解了Zuul的路由和过滤功能。Zuul通过与Eureka整合,作为微服务的统一入口,负责请求的转发和过滤。文章详细描述了如何创建一个Zuul网关项目(microservicecloud-zuul-gateway-9527),包括POM文件的依赖配置、application.yml文件的路由规则设置,以及启动类中启用Zuul代理的注解。此外,文章还展示了如何通过Zuul访问服务提供者的接口,并介绍了如何通过配置隐藏真实服务地址,增加访问前缀等安全措

2025-05-17 19:23:37 790

原创 【springcloud学习(dalston.sr1)】Hystrix Dashboard服务监控(含源代码)(十一)

该文章详细介绍了如何搭建和使用HystrixDashboard来监控微服务中的Hystrix调用。首先,Hystrix不仅提供依赖服务的调用隔离,还通过HystrixDashboard实现准实时的调用监控,展示请求的执行信息。文章详细描述了创建HystrixDashboard项目的过程,包括添加必要的Maven依赖、配置端口号、启用HystrixDashboard功能等步骤。随后,文章指导如何启动受监控的服务,并确保服务提供者的POM文件中包含相关监控依赖。最后,通过访问HystrixDashboard的W

2025-05-17 18:36:33 592

原创 【springcloud学习(dalston.sr1)】Hystrix服务降级(含源代码)(十)

本文介绍了Spring Cloud中的服务降级机制及其实现方式。服务降级是在资源不足时暂停部分服务,待资源稳定后再恢复,主要在服务消费者端实现。文章以microservicecloud-consumer-feign项目为例,详细说明了如何在POM文件中添加依赖、在application.yml中配置服务降级,以及通过FeignClient注解和FallbackFactory接口实现服务降级。通过模拟服务提供者不可用的情况,验证了服务降级的有效性。最后,文章比较了服务降级与服务熔断的区别,指出服务降级在调用方

2025-05-16 22:23:46 805

原创 【springcloud学习(dalston.sr1)】Hystrix服务熔断(含源代码)(九)

Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统中,许多依赖不可避免的会调用失败。日入超时、异常等,Hystrix能保证在一个依赖出现问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个符合预期的、可处理的备选响应(FallBack),而不是让调用方长时间的等待或者抛出调用无法处理的异常,这样就保证了服务调用方的线程不会长时间占用,从而避免了故障

2025-05-16 21:33:37 992

原创 【springcloud学习(dalston.sr1)】使用Feign实现接口调用(含源代码)(八)

该文章介绍了如何在Spring Cloud项目中使用Feign来简化HTTP请求的调用。通过Feign,开发者可以像声明DAO接口一样声明HTTP请求接口,避免了使用RestTemplate时的硬编码问题。文章详细说明了如何在microservicecloud-api项目中创建带有@FeignClient注解的接口GoodsClientService,并在microservicecloud-consumer-feign模块中通过依赖注入来调用该接口。此外,文章还介绍了如何配置POM文件和applicatio

2025-05-14 19:50:24 849

原创 【springcloud学习(dalston.sr1)】Ribbon负载均衡(含源代码)(七)

本文介绍了Spring Cloud中Ribbon负载均衡的实现及其验证过程。Ribbon是一种客户端负载均衡工具,类似于火车站售票窗口的选择机制,通过选择访问次数较少的服务端来分散请求压力。文章详细描述了如何通过RestTemplate和@LoadBalanced注解实现负载均衡,并默认使用轮询算法。此外,文章还介绍了如何通过一个消费者项目和三个提供者项目来验证负载均衡的效果,确保请求能够均匀分配到不同的服务端。最后,通过启动Eureka服务端、提供者和消费者项目,并访问消费者接口,观察返回数据的变化,验证

2025-05-14 18:47:11 1062

原创 【springcloud学习(dalston.sr1)】Eureka 服务发现(含源代码)(六)

服务的注册是指eureka client将自身注册到server端。从此之外,客户端自己还可以在自身接口里,也能查询到server端的服务注册列表。然后我们在controller中会注入,然后在接口里就可以使用这个discoveryClient,然后获取到Eureka server端的服务注册列表,即客户端就算不访问。server网页, 也能通过自己去发现server端注册了哪些服务。我们讨论了服务的注册,现在我们来看看服务的发现。,如下图,也能看到server端的服务注册列表。(一)服务发现的理解。

2025-05-14 18:02:26 215

原创 【springcloud学习(dalston.sr1)】服务消费者通过restTemplate来访问服务提供者(含源代码)(五)

在浏览器中访问http://localhost/consumer/goods/list/applicationName,页面正常展示返回结果,说明能通过服务名称来访问到服务提供者的接口。我们启动服务消费者项目microservicecloud-consumer-80,然后在浏览器中访问 http://localhost/consumer/goods/list/http。通过服务消费者microservicecloud-consumer-80模块的创建,我们在controller中定义了接口。

2025-05-14 17:24:38 1063

原创 【springcloud学习(dalston.sr1)】Eureka 客户端服务注册(含源代码)(四)

这篇文章主要介绍Eureka客户端服务注册到eureka的server端

2025-05-14 15:50:59 844

原创 【springcloud学习(dalston.sr1)】Eureka单个服务端的搭建(含源代码)(三)

本文介绍了如何搭建单个Eureka服务端,而非集群环境。通过修改项目microservicecloud-eureka-7001的配置文件,将server.port设置为7001,eureka.instance.hostname设置为localhost,并配置register-with-eureka和fetch-register为false,表示该服务端不向注册中心注册自己,且自身即为注册中心。service-url.defaultZone配置为自身地址http://localhost:7001/eureka

2025-05-14 14:14:51 429

原创 【springcloud学习(dalston.sr1)】Eureka服务端集群的搭建(含源代码)(二)

本文详细介绍了如何搭建Eureka服务端集群环境。Eureka作为服务注册与发现的核心组件,类似于写字楼的物业管理系统,负责管理服务注册列表。文章通过创建三个模块(microservicecloud-eureka-7001、7002、7003)来模拟集群搭建,每个模块配置了不同的端口和主机名,并通过修改hosts文件实现域名映射。在配置文件中,设置了服务端不注册自己,并指定了其他Eureka服务端的地址以实现集群功能。最后,通过启动类上的@EnableEurekaServer注解启用Eureka服务,并成功

2025-05-14 00:08:23 782 1

原创 【springcloud学习(dalston.sr1)】项目整体介绍(含源代码)(一)

本文记录了一个基于Spring Cloud Dalston.SR1版本的微服务学习项目,尽管该版本已过时,但项目仍作为学习资料分享。项目展示了如何将一个大型电商项目拆分为多个微服务模块,如商品、订单、用户管理等,每个模块作为独立进程运行。项目中使用了Eureka(服务注册与发现)、Hystrix(服务熔断和降级)、Ribbon(客户端负载均衡)、Zuul(网关与路由)和Feign(服务接口HTTP调用)等Spring Cloud组件。项目结构包括API模块、提供者模块、消费者模块、Eureka服务注册模块、

2025-05-13 23:01:12 1145 1

原创 spring security自定义权限拦截FilterInvocationSecurityMetadataSource

一般情况下,我们如果需要自定义权限拦截,则需要涉及到FilterInvocationSecurityMetadataSource这个接口了。这里有个坑爹的地方。如果用户未登录,但是已经设置了拦截白名单的URL,仍然会进入到权限验证里面来。起初,我以为不会进来,但后来跟踪源代码发现,还是会进来。只是此时的身份是一个匿名用户。其默认的实现为DefaultFilterInvocationSecuri...

2019-07-08 00:43:31 22759 8

原创 spring security如果未登录,返回JSON数据

默认情况下,spring security如果检测到未登录,会返回一个登录页面。对于前后端分离的项目,我们一般是希望能返回自定义的JSON数据。这时候,就需要继承类LoginUrlAuthenticationEntryPoint,并重写其public void commence(HttpServletRequest request, HttpServletResponse response,...

2019-07-08 00:30:03 8922 5

原创 spring boot中 requestBody里面的json数据重新写入到request里

最近在使用spring security框架,发现一个问题,就是我通过request.getInputStream()方法读取了请求体中的json数据后,就发现在controller控制器层中无法再次获取到参数,会出现报错I/O error while reading input message; nested exception is java.io.IOException: Stream ...

2019-07-07 11:37:55 9170

原创 spring boot整合spring security(前后端分离时的json登录方式,解决获取不到用户名密码问题)

如果是自己验证用户名密码的话,spring security仅仅支持传统的form表单方式(form-data)登录。这是一个比较大的坑点。现在都流行使用前后端分离,前端发送的是json格式数据。下面我谈下如何操作。通过跟踪源代码,可以知道,获取用户名密码是在UsernamePasswordAuthenticationFilter这个类里面的attemptAuthentication方法,如下...

2019-07-06 23:13:01 9951 2

原创 spring boot整合spring security(自定义验证方式)

spring security支持传统的查询数据库方式,也即根据用户名查询出用户信息,然后再比较前端传来的密码和数据库中的密码。这种方式很常用。但不适合通过第三方进行的授权认证模式。这时候,我们需要自己处理登录验证过程。针对这些情况,我们需要自定义Authentication Provider@Componentpublic class CustomAuthenticationPr...

2019-07-03 01:05:01 2677

原创 通过反射获取参数名称

通过反射,可以获取到方法的参数类型,返回值类型,方法名称,这些大家应该都清楚,但是能够获取得到参数名称吗?在spring中,通常通过参数名称进行参数匹配并赋值。在JDK1.7版本及以下,我们可以借助于Spring中的类LocalVariableTableParameterNameDiscoverer,来获取得到参数名称。需要注意的是,该方法似乎只对类的方法有效,针对接口的方法无效。使用如下...

2019-05-07 23:46:10 2237

原创 Linux常用命令

cd /etc/sysconfig# umount -vl /mnt/mymount/ 执行延迟卸载延迟卸载(lazy unmount)会立即卸载目录树里的文件系统,等到设备不再繁忙时才清理所有相关资源。卸载可移动存储介质还可以用eject命令。下面这条命令会卸载CD并弹出CD:# eject /dev/cdrom 卸载并弹出CDvi network #编...

2019-05-07 23:21:18 198

原创 Oracle常用命令和语句

1创建用户 create user orcl_user_test identified by orcl_user_test; --删除用户drop user orcl_user_test cascade;2授予权限 grant resource,connect,dba to orcl_user_test;3创建表空间(如果没有则需要创建) create ta...

2019-05-07 23:09:17 292

原创 spring中的RuntimeBeanReference的使用

当我们需要动态注入Bean,并给该Bean的属性注入其他Bean时,比如在Mybatis和Spring的整合中,我们需要动态注入Mapper到spring容器中,而该Mapper如果需要执行SQL语句,还需要持有SqlSessionFactory的引用。但是我们注入时,可能对应的Bean还没有准备好,这时,我们就可以使用RuntimeBeanReference,以保持对实际Bean的引用。在Spr...

2019-05-07 22:58:13 3713

原创 关于spring中的BeanDefinitionRegistryPostProcessor和ImportBeanDefinitionRegistrar接口

这两个接口都可以用于动态注册bean到容器中。BeanDefinitionRegistryPostProcessor实现了BeanFactoryPostProcessor接口,是Spring框架的BeanDefinitionRegistry的后处理器,用来注册额外的BeanDefinition。postProcessBeanDefinitionRegistry方法会在所有的BeanDefini...

2019-05-07 22:49:21 6491 2

原创 java扫描包(包含自己写的包或者jar中的包)及子包下的所有类

不管是在Spring还是Mybatis中,我们都需要配置一个包路径进行扫描类对象。在Spring中,我们需要配置包路径,让Spring容器能扫描包下面的Bean组件。在mybatis中,我们需要配置mapper包路径,以扫描mapper接口,并生成对应的Bean实例。现在,我参照spring的部分源码,来写一个工具类扫描包及子包下的所有类。package com.company.ha...

2019-05-04 22:06:20 1769

原创 创建动态代理对象bean,并动态注入到spring容器中

使用过Mybatis的同学,应该都知道,我们只需要编写mybatis对应的接口和mapper XML文件即可,并不需要手动编写mapper接口的实现。这里mybatis就用到了JDK动态代理,并且将生成的接口代理对象动态注入到Spring容器中。这里涉及到几个问题。也许有同学会有疑问,我们直接编写好类,加入@Component等注解不是可以注入了吗?或者在配置类(@Configuration)...

2019-04-30 00:48:19 37175 11

原创 用动态代理给接口写默认实现,并手动注入到Spring容器中

我们大家都知道,mybatis的mapper接口,我们并没有手动编写实现代码,但仍然能在程序中注入到Spring容器并使用。这里面就用到了动态代理的原理。下面,我也编写一个接口,代码未给出实现,通过动态代理进行接口的默认实现,通过FactoryBean方式注入到容器中(当然,我们也可以通过在一个用@Configuration声明的配置类中,通过@Bean注解,手动编写该实例的生成过程)。下面是...

2019-04-15 00:15:18 4224

原创 springboot2.0与quartz整合

我数据库用的是Oracle数据库,初始化脚本如下:-- 存储每一个已配置的 Job 的详细信息CREATE TABLE qrtz_job_details ( SCHED_NAME VARCHAR2(120) NOT NULL, JOB_NAME VARCHAR2(200) NOT NULL, JOB_GROUP VARCHAR2(200) NOT NULL,...

2019-03-26 08:02:27 758

原创 缓存穿透、缓存雪崩、缓存击穿

redis缓存加快了应用程序的效率,特别是查询。下面我们来讨论下缓存穿透、缓存雪崩、缓存击穿一、缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。解决办法是我们可以将空值也缓存起来,设置一个比较短的过期时间,比如60秒二...

2019-03-12 20:09:48 417

原创 利用JDK动态代理给接口创建动态实现

我们大家都知道,一般情况下,如果一个接口没有实现类的话,我们直接调用该接口的方法会报错。但我们用过的Mybatis中Dao接口,或者Spring Data JPA接口,其实我们没有手动为他们编写实现类,那为什么仍然能正常调用呢?这里就涉及到了动态代理。下面我演示一下,如何利用JDK为一个接口创建动态实现。代码目录大致如下,在com.company.proxy包下有三个类文件一、SaleSe...

2019-03-12 20:09:28 2787 2

原创 maven 将jar包安装到本地仓库

1、首先需要在环境变量中添加mvn命令,使得该命令能在CMD下被识别2、在maven安装目录的conf目录下有一个settings.xml,需要修改该文件中的仓库地址,注意在IDEA项目或者eclipse项目中,也需要手动选择该路径作为仓库地址<localRepository>D:\lichuang\repository</localRepository>3、在...

2019-03-06 20:39:53 269

原创 事务和事务隔离级别,Spring事务传播和隔离级别

一、事务有四大特性,也即原子性(atomicity),一致性(consistency),隔离性(isolation),持久性(durability)1、原子性即不可分割,事务要么全部被执行,要么全部不执行。如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生变化;如果有子事务失败,则其他子事务的数据库操作被回滚,即数据库回到事务执行前的状态,不会发生状态转换2、一...

2019-03-06 20:39:09 234

原创 【Spring Cloud】微服务概述

对于微服务,业界并没有一个统一的、标准的定义,但通常而言,微服务架构是一种架构模式或者说是一种架构风格。它提倡将单一应用程序划分为一组小的服务,每个服务运行在其独立的自己的进程中,服务之间互相协调、互相配合,为用户提供最终价值。服务之间采用轻量级的通信机制(通常是基于Http的restful API)。每个服务都围绕着具体业务进行构建,并且能够被独立的部署到生产环境、类生产环境等。微服务化的核...

2019-03-03 20:26:14 200

原创 Spring Data JPA 使用本地SQL,并将结果集转换为自定义POJO对象

Spring Data JPA使用很方便,JPA只是一种标准,其实现通常是Hibernate。如果业务仅仅是增删改的话,那用JPA还是很方便的。但通常情况下,我们会有大量的业务查询。如果用其自带的查询,则SQL无法控制,可能会有性能问题。基于此,我们希望扩展下,使其能支持自定义查询SQL,并通过自定义POJO对象进行接收,这样我们就不需要去定义结果集所关联的实体类了。 通过查看源...

2019-03-03 19:37:28 6050 1

原创 Spring Cloud

未完待续

2019-02-22 00:32:21 135

原创 synchronized和ReentrantLock的对比

synchronized:1、依赖于JVM的底层实现;2、获取到锁后,再执行完任务或者出现异常时会自动释放锁;3、是非公平锁,也就是说一个线程可能会多次得到该锁;4、是重量级锁,是悲观锁,类似于数据库直接加for update进行锁住。ReentrantLock:1、是Java的一个类,需要手动编码;2、获取到锁后,需要手动释放,一般是在finally代码块中进行锁的释...

2019-02-22 00:24:40 307

原创 IO和NIO

在谈这个之前,我先谈下以下几个概念。同步和异步,阻塞和非阻塞同步强调的是在获取结果后再进行下一步,异步是说再未获取到结果前不进行下一步。阻塞说的是在获取到结果或者资源前什么都不做,非阻塞是获取到结果或者资源前,还可以做其他事。下面就以A打电话给B,询问今天B家里有没有多的雨伞,进行理解这些概念。同步:A和B保持通话状态,(此时A可以一直等在电话旁,但自己还可以做下其他事,比如...

2019-02-22 00:18:11 143

原创 JVM内存结构

未完待续

2019-02-22 00:15:56 363

空空如也

空空如也

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

TA关注的人

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