
项目实战
文章平均质量分 67
springcloud技术栈实战服务
liu1002880404
这个作者很懒,什么都没留下…
展开
-
详解多线程与Spring事务
大多数情况下,把事务的启动、提交或者回滚全部交给Spring框架操作非常便捷,但有一种场景,如果有一个大批量数据需要操作,为提高处理效率,通常对数据进行分组,多线程处理,这个注解对事务就不起作用了。在实际项目中,在排查单线程、数据库等细节问题后,接口速度依旧很慢,于是决定使用多线程进行优化,同时使用到多线程事务,多线程进行任务拆分能提高效率,但需要考虑的因素也随之增多,如事务、线程安全性、实际提升效率等,因此应结合业务场景,优先考虑单线程优化,再考虑多线程优化。虽然不能通过事务内,发起多线程处理。原创 2023-04-03 11:32:10 · 1468 阅读 · 1 评论 -
API接口分页方案
一次性返回全量数据集的场景几乎不存在,所以出现了数据分页的需求。本文将总结常见的列表样式以及接口分页设计相关问题。原创 2023-03-30 09:53:31 · 744 阅读 · 0 评论 -
AOP实现接口限流
前言限流方案Java限流及常用解决方案Guawa限流应用@Slf4j@RestController@RequestMapping("/limit")public class LimitController { /** * 限流策略 : 1秒钟2个请求 */ private final RateLimiter limiter = RateLimiter.create(2.0); private DateTimeFormatter dtf = Date原创 2022-05-26 10:14:22 · 927 阅读 · 1 评论 -
Springboot 统一异常处理 Assert @ControllerAdvice
前言上一篇SpringBoot 参数检验Assert使用了解了SpringBoot 参数检验Assert的使用,我们是不是可以自定义Assert,来实现自定义异常呢?用 Assert(断言) 替换 throw exceptionAssert.notNull(user, “用户不存在.”); 代替throw new IllegalArgumentException(“用户不存在.”);IResponseEnum/** * @author liu * @date 2022年05月25日 11:1原创 2022-05-25 15:06:09 · 913 阅读 · 0 评论 -
springboot整合redisson实战(二)Redisson分布式锁的使用
redisson锁说明Redisson是基于Netty实现的,是更高性能的第三方库。实现了可重入锁(Reentrant Lock)、公平锁(Fair Lock、联锁(MultiLock)、 红锁(RedLock)、 读写锁(ReadWriteLock)等。应用lockpackage com.andon.springbootdistributedlock.util;import lombok.extern.slf4j.Slf4j;import org.redisson.Redisson;imp原创 2022-05-24 17:02:03 · 1979 阅读 · 0 评论 -
springboot整合redisson实战(一)整合 redisson-spring-boot-starter
文章目录前言引入redisson依赖redisson-spring-data与Spring Boot version的版本对应关系maven依赖配置文件redisson.yml多节点配置使用 RedissonClient前言SpringBoot整合Redisson有个比较好用的starter包就是redisson-spring-boot-starter,这也是官方比较推荐的配置方式引入redisson依赖只需引入redisson-spring-boot-starter就可以了,不过这里需要注意spr原创 2022-05-24 11:24:52 · 15893 阅读 · 3 评论 -
MySQL优化完美解决方案
文章目录优化mysql数据库总则数据库设计和表创建时就要考虑性能索引选择合适的数据类型选择合适的索引列sql的编写需要注意优化引擎分区分表分库云数据选择腾讯云DCDB开源解决方案优化mysql数据库总则数据库设计和表创建时就要考虑性能sql的编写需要注意优化分区分表分库数据库设计和表创建时就要考虑性能设计表时要注意:表字段避免null值出现,null值很难查询优化且占用额外的索引空间,推荐默认数字0代替null。尽量使用INT而非BIGINT,如果非负则加上UNSIGNED(原创 2022-05-21 21:34:35 · 387 阅读 · 0 评论 -
SpringBoot 自定义注解+AOP+Redis 实现分布式锁
前言分布式环境下多个不同线程需要对共享资源进行同步,那么用Java的锁机制就无法实现了,这个时候就必须借助分布式锁来解决分布式环境下共享资源的同步问题。aop 通过设置切面,当切面设置的目标类的方法被调用时,aop 框架会拦截此次调用,源码中 pointCut 类里有两个核心属性,即 ClassFilter 类过滤器与MethodMatcher 方法匹配器,aop基于其两个核心来进行拦截,拦截之后aop机制会通过jdk或cglib生成动态代理对象,调用增强类的增强方法进行功能织入。@AspectJ 是原创 2022-05-21 17:02:26 · 1182 阅读 · 1 评论 -
服务雪崩效应及如何应对
服务的雪崩在微服务之间进行服务调用是由于某一个服务故障,导致级联服务故障的现象,称为雪崩效应。雪崩效应描述的是提供方不可用,导致消费方不可用并将不可用逐渐放大的过程。 在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100% 可用。如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况,此时若有大量的请求涌入,就会出现多条线程阻塞等待,进而导致服务瘫痪。 由于服务与服务之间的依赖性,故障会传播,会对整个微服造成严重后果,这就是服务故障的 “雪崩效应” 。Service A的流量波动很大原创 2022-05-20 17:17:27 · 534 阅读 · 0 评论 -
SpringBoot 对Logback日志系统进行配置
文章目录为什么使用logback开始使用配置logback-spring.xml 三个单词:Logger, Appenders and Layouts(记录器、附加器、布局):元素元素元素ConsoleAppenderRollingFileAppender滚动策略元素元素根据profile的配置来指定日志输出的配置,可以在logback-spring.xml中用springProfile标签logback-xml配置文件还可以从spring环境(即application.properties)中动态获取值原创 2022-05-20 09:10:36 · 933 阅读 · 0 评论 -
restTemplate 发送get,post请求,占位符传参
restTemplate 发送get 不带参数 @Operation( summary= "保存数据", description = "保存数据") @GetMapping(value = "/addTasks1") public ReturnModel<Integer> addTasks1() throws IOException { String url = "http://127.0.0.1:8080/api/task/test";原创 2022-05-19 17:39:23 · 7615 阅读 · 0 评论 -
ENUM枚举类实战应用
应用场景前端页面查询条件为一个起止日期前端传到后台直接为 今日 本周 本月 本年等汉字,后端需要查询必须把这些汉字转化为日期范围。这种第一想到的是if(本周){}else if(本年){}等,这样写很难维护代码,下面用枚举类来实现下面用代码来实现。枚举类import cn.hutool.core.date.DateTime;import cn.hutool.core.date.DateUtil;import java.time.ZoneId;import java.util原创 2022-05-12 12:28:07 · 282 阅读 · 0 评论 -
mybatis-plus QueryWrapper查询条件组装
文章目录前言in条件组装 比如sys_code in(",",'')le ge eq等 < > =前言条件查询首先使用QueryWrapper创建一个wrapper对象存放条件。例如: //创建一个QueryWrapper的对象 QueryWrapper<User> wrapper = new QueryWrapper<>(); //通过QueryWrapper设置条件 //ge gt le lt原创 2022-05-12 12:10:01 · 1888 阅读 · 0 评论 -
优雅的代替繁多的if/else(一)
前言系统都有角色的概念,不同用户分配不同的角色,每个角色访问的资源及权限不一样比如:系统管理员( ROLE_ROOT_ADMIN):有 A操作权限订单管理员( ROLE_ORDER_ADMIN):有 B操作权限普通用户( ROLE_NORMAL):有 C操作权限比如一个用户进来,我们需要根据不同用户的角色来判断其有哪些行为,这时候常见的代码出现了:public void opt(String roleName) { String result = ""; i原创 2022-05-10 08:50:58 · 266 阅读 · 0 评论 -
springboot 配置文件application.properties 中文乱码
修改IDEA编码但是这个配置⽂件⼏乎⽆法再使⽤记事本修改了。。。⽤记事本打开编辑时,发现内容被修改成了unicode编码,如果线上部署后,查找问题或者查找配置很难发现。将application.properties改为application.yml就是将application.properties的⽂件修改为application.yml的结构。...原创 2022-05-09 16:14:44 · 586 阅读 · 0 评论 -
多表查询 Mybatis Plus 自定义方法实现分页
一般办法一般物理分页,即通过sql语句分页,都是在sql语句后面添加limit分页语句,在xml文件里传入分页的参数,再多配置一条sql,用于查询总数: <select id="queryStudentsBySql" parameterType="map" resultMap="studentmapper"> select * from student limit #{currIndex} , #{pageSize} </select> &原创 2022-05-09 15:02:19 · 3869 阅读 · 3 评论 -
springboot集成webservice接口
引入jar <properties> <maven.compiler.target>1.8</maven.compiler.target> <maven.compiler.source>1.8</maven.compiler.source> <spring.boot.version>2.6.3</spring.boot.version> <spri原创 2022-05-06 17:25:40 · 798 阅读 · 0 评论 -
maven中央仓库
https://mvnrepository.com原创 2022-04-28 11:04:11 · 2753 阅读 · 0 评论 -
@DateTimeFormat @DateTimeFormat失效原因及测试填坑记录
@DateTimeFormat @DateTimeFormat失效原因及测试一、时间传值前端时间控件,一般情况下直接会传一个yyyy-MM-dd的日期字符串到后台。这个时候如果我们直接用java.util.Date类型就无法正确接收到。或者我们从数据库里查到DateTime类型并且用java的Date类型接收并返回给前台的时候,前台也无法用yyyy-MM-dd的形式进行呈现。这个时候,前面两种情况分别对应了@DateTimeFormat和@JsonFormat注解的使用。二、@DateTimeFo原创 2022-04-26 15:57:46 · 13190 阅读 · 0 评论 -
swagger Authorization测试
访问地址Swagger各版本访问地址:3.+访问地址:http://localhost:8081/{context-path}/swagger-ui/index.html2.+ 访问地址:http://localhost:8081/{context-path}/swagger-ui.html验证登录系统,打开F12请求头部分会看到如图所示部分复制Matnr-Test-Access-Token部分到swagger value部分,再复制请求主体部分就可以用swagger测试了...原创 2022-04-21 15:38:11 · 1584 阅读 · 0 评论 -
SpringBoot 参数检验Assert使用
前言assert:断言是java的一个保留字,用来对程序进行调试,后接逻辑运算表达式,如下:int a = 0, b = 1;assert a == 0 && b == 0;使用方法:javac编译源文件,再java -ea class文件名即可。在springboot中可以使用spring提供的Assert类的方法对前端来的参数进行校验Assert断言基本上替换传统的if判断,减少业务参数校验的代码行数,提高程序可读性。@Validated、@Valid对比及详细用法前面介原创 2022-04-03 18:28:27 · 4010 阅读 · 0 评论 -
PageHelper 分页原理及大数据量查询性能问题的解决办法
PageHelper分页的实现方式PageHelper.startPage(1,3)public static <E> Page<E> startPage(int pageNum, int pageSize) { return startPage(pageNum, pageSize, DEFAULT_COUNT); } public static <E> Page<E> startPage(int pageNum, in原创 2022-04-03 18:00:19 · 2426 阅读 · 1 评论 -
SpringBoot自动配置的条件注解ConditionalOnXXX分析
前言SpringBoot自动配置原理是基于其大量的条件注解ConditionalOnXXX在自动配置类中有很多Condition相关的注解,以AOP为例:Configuration(proxyBeanMethods = false)@ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)public class AopAutoConfigura原创 2022-04-03 11:20:17 · 2653 阅读 · 0 评论 -
Dubbo基本原理
DubboDubbo 是一款高性能、轻量级的开源 RPC 框架,提供服务自动注册、自动发现等高效服务治理方案, 可以和 Spring 框架无缝集成。Dubbo架构1、服务消费者(Consumer): 调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。2、注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者原创 2022-03-31 22:02:15 · 164 阅读 · 0 评论 -
线程池实战应用
线程池的设置corePoolSize:核心线程数核心线程会一直存活,即使没有任务需要执行当线程数小于核心线程数时,即使有线程空闲,线程池也会优先创建新线程处理设置allowCoreThreadTimeout=true(默认false)时,核心线程会超时关闭(1)高并发、任务执行时间短的业务,线程池线程数可以设置为CPU核数+1,减少线程上下文的切换(2)并发不高、任务执行时间长的业务要区分开看:a)假如是业务时间长集中在IO操作上,也就是IO密集型的任务,因为IO操作并不占用CPU,所以不要让原创 2022-03-31 11:32:04 · 1893 阅读 · 0 评论 -
Java线程池异常处理机制
前言Thread t = new Thread(() -> System.out.println(1 / 0));t.start();如果我们执行上面这段代码,会在控制台上看到异常输出。通常情况下绝大多数线上应用不会将控制台作为日志输出地址,而是另有日志输出。这种情况下,上面的代码所抛出异常便会丢失。那为了将异常输出到日志中,我们会这样写代码:hread t = new Thread(() -> { try { System.out.println(1 / 0); } cat原创 2022-03-30 17:02:25 · 3217 阅读 · 0 评论 -
序列化和反序列化
简介将堆内存中Java对象转换为字节序列的过程称为序列化(Serialization),对象转换成字节序列便于将其存储在文件中或在网络上传输;将字节序列恢复为对象的过程称为反序列化(Deserialization)。序列化与反序列化意义当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;当你想用套接字在网络上传送对象的时候;当你想通过RMI传输对象的时候;如何实现序列化实现Serializable接口即可一个父类实现序列化,子类自动实现序列化;子类实现序列化,父类没有实现,则子类继原创 2022-03-30 16:27:21 · 126 阅读 · 0 评论 -
SpringBoot+SpringCloud实现登录用户信息在微服务之间的传递
实现思路:1:准备一个ThreadLocal变量,供线程之间共享。2:每个微服务对所有过来的Feign调用进行过滤,然后从请求头中获取User用户信息,并存在ThreadLocal变量中。3:每个微服务在使用FeignClient调用别的微服务时,先从ThreadLocal里面取出user信息,并放在request的请求头中。4:封装为一个注解,在启动类上标记即可。1:ThreadLocal工具类 :UserInfoContextpublic class UserInfoContext {原创 2022-03-26 22:31:31 · 3399 阅读 · 0 评论 -
管理员可以修改任意用户Session的功能实现
文章目录1 Session会话简介简单实例准备启动类ModifySessionApplication:用户实体类User新建一个UserController,提供两个接口方法,分别是模拟用户登录,和获取用户信息:动态修改用户Session场景分析动态修改Session原理介绍动态修改Session实现修改UserController,通过session获取servletContext上下文,存储用户session信息,格式 { userId : sessionId }创建ManagerController测原创 2022-03-26 22:17:59 · 632 阅读 · 0 评论 -
Spring cloud alibaba--Gateway网关
文章目录1.网关简介什么是spring cloud gateway路由断言工厂(Route Predicate Factories)配置(1)基于DateTime类型的断言工厂(2)基于远程地址的断言工厂(3)基于Cookie的断言工厂(4)基于Header的断言工厂(5)基于Host的断言工厂(6)基于Method请求方法的断言工厂(7)基于Path请求路径的断言工厂(8)基于Query请求参数的断言工厂(9)基于路由权重的断言工厂自定义路由断言工厂Filter过滤器自定义过滤器自定义全局过滤器(Glob原创 2022-03-26 16:12:16 · 1115 阅读 · 0 评论 -
springcloud 线程池进行微服务之间调用,传递Authentication
import org.springframework.security.core.Authentication;import org.springframework.security.core.context.SecurityContextHolder;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;@ResourceThreadPoolTaskExecutor threadPoolTaskExecut原创 2022-03-26 15:49:13 · 570 阅读 · 0 评论 -
微服务之间共享threadlocal_threadlocal跨线程传递解决方案
ThreadLocal简介ThreadLocal 不是一个线程,而是一个线程的本地化对象。当某个变量在使用 ThreadLocal 进行维护时,ThreadLocal 为使用该变量的每个线程分配了一个独立的变量副本,每个线程可以自行操作自己对应的变量副本,而不会影响其他线程的变量副本。API 方法ThreadLocal 的 API 提供了如下的 4 个方法。1)protected T initialValue()返回当前线程的局部变量副本的变量初始值。2)T get()返回当前线程的局部变原创 2022-03-26 15:09:03 · 8223 阅读 · 0 评论 -
Alibaba Sentinel 规则参数总结
一、流控规则Field说明默认值resource资源名称 count限流阈值 grade限流阈值类型:0 表示线程数,1表示QPSQPS 模式limitApp流控针对的调用来源default,代表不区分调用来源strategy流控模式: 0表是直接,1表示关联,2表示链路根据资源本身controlBehavior流控效果(0快速失败 / 1warn up/ 2排队等待)直接拒绝二、降级规则Field说明默认值resource资源名,即限流规则的作用对象 count阈值&n原创 2022-03-24 22:30:24 · 558 阅读 · 0 评论 -
SpringBoot使用Mybatis-Plus详解
文章目录MyBatisPuls概述快速入门创建表导入依赖配置文件pojomapper测试配置日志插入操作(Insert插入)主键生成策略更新操作查询操作:【单一查询、批量查询、条件查询map】分页查询删除操作逻辑删除自动填充乐观锁性能分析插件条件构造器Wrapper代码自动生成器MyBatisPuls概述MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生国产的开源框架,基于MyBatis核心功能是简化MyB原创 2022-03-24 22:21:07 · 6064 阅读 · 1 评论 -
Sentinel综述
前言本文介绍阿里开源限流熔断方案 Sentinel 功能、原理、架构、快速入门以及相关框架比较1 名词解释服务限流 :当系统资源不够,不足以应对大量请求,对系统按照预设的规则进行流量限制或功能限制服务熔断:当调用目标服务的请求和调用大量超时或失败,服务调用方为避免造成长时间的阻塞造成影响其他服务,后续对该服务接口的调用不再经过进行请求,直接执行本地的默认方法服务降级:为了保证核心业务在大量请求下能正常运行,根据实际业务情况及流量,对部分服务降低优先级,有策略的不处理或用简单的方式处理原创 2022-03-24 19:24:04 · 163 阅读 · 0 评论 -
Sentinel的gateway规则持久化改造
文章目录前言源码改造去掉sentinel-dashboard 工程的pom中test复制 test下 NacosConfig类并修改新增 pulisher 推送规则 和 provider 拉取规则修改GatewayFlowRuleController 和 GatewayApiControllerGatewayApiController 类修改 NacosConfigUtil微服务网关改造yml配置前言上篇写过 Sentinel规则持久化改造(pull+push+Ahas),但一般springcloud项原创 2022-03-24 19:10:51 · 481 阅读 · 0 评论 -
在springCloud架构下实现sentinel持久化到nacos
文章目录前言代码配置文件改造sentinel控制台:增加指定类 *在rule文件夹下增加nacos文件夹,在nacos文件夹下创建5个规则存储和拉取所需要的class,在nacos文件夹下增加NacosConfig和NacosConfigUtil配置类,在util中增加JSONUtils工具类。JSONUtilsNacosConfigNacosConfigUtilAuthorityRuleNacosProviderAuthorityRuleNacosPublisherDegradeRuleNacosProv原创 2022-03-24 18:33:05 · 3483 阅读 · 7 评论 -
使用sentinel 遇到的一些坑
sentinel使用起来,并不是那么的容易。特别是用在gateway网关中,更是到处都是坑。gateway整合sentinel ,也就是在网关层面,实现使用sentinel限流。限流包括针对客户端ip限流,针对热点参数限流,针对head的某个字段限流。在经过修改源码以后,能够实现将sentinel的限流规则从dashbord推送到nacos。使用sentinel因为版本没选对,而导致sentinel限流不生效问题各种不生效问题,多半是因为选用版本造成的。sentinel的官方文档上,并没原创 2022-03-24 17:57:16 · 7263 阅读 · 0 评论 -
Spring Boot 统一处理全局异常
文章目录@ControllerAdvice介绍用法@ExceptionHandler拦截异常并统一处理代码实现统一异常处理前端返回值类@ControllerAdvice介绍@ControllerAdvice注解是Spring3.2中新增的注解,学名是Controller增强器,作用是给Controller控制器添加统一的操作或处理。这里ControllerAdvice也可以这么理解,其抽象级别应该是用于对Controller进行切面环绕的,而具体的业务织入方式则是通过结合其他的注解来实现的。用法1原创 2022-03-24 15:49:10 · 938 阅读 · 0 评论 -
分布式服务框架Dubbo集成Nacos框架实现注册中心
在讨论Nacos之前,我们先讨论一下CAP理论CAP理论是分布式场景绕不开的重要理论一致性:所有节点在同一时间具有一样的数据;可用性:保证每个请求不管成功还是失败都有响应;分区容忍性:系统中任意信息的丢失和失败不会影响系统的继续运作;关于分区容忍性P的理解,大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition),分区容错的意思是,区间通信可能失败。比如,一台服务器放在中国,另一台服务器放在美国,这就是两个区,它们之间可能无法通信。关于提高分区容忍性的办法,就是把同一份数原创 2022-03-23 10:12:37 · 2250 阅读 · 0 评论