
系统架构
春风化作秋雨
学而思,思而学
展开
-
Spring中的@Qualifier与@Primary
使用场景:Spring匹配到多个可用的bean。1、@Qualifier 注解使用@Qualifier("bean名称")指定具体需要注入的 bean;这种方式控制方在使用方。public interface UserService {}@Servicepublic class UserService1 implements UserService {}@Servicepublic class UserService2 implements UserService {}原创 2022-02-22 09:49:01 · 470 阅读 · 0 评论 -
这 30 条架构原则,值得反复阅读~
作者来源 :#java充电社今天给大家带来的是Apache的一个架构师总结的30条架构经验,我觉得非常好,所以分享给大家,这些原则被广泛认可,也成为了新手架构师的学习途径。—1—基本原则原则1:KISS(Keep it simple, sutpid)保持每件事情都尽可能的简单。用最简单的解决方案来解决问题。原则2:YAGNI(You aren’t gonna need it)不要去搞一些不需要的东西,需要的时候再搞吧。点评:speculative development的例子..转载 2022-02-22 09:30:00 · 159 阅读 · 0 评论 -
多线程线程的优势
1、发挥多核CPU 的优势现在的笔记本、台式机乃至商用的应用服务器一般都是2核、4 核、8 核甚至 16 核;如果是单线程的程序,那么在双核 CPU 上就浪费了 50%, 在 4 核CPU 上就浪费了 75%。单核 CPU 上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程"同时"运行罢了。多核CPU 上的多线程才是真正的多线程,能实现多段逻辑同时工作。多线程,可以真正发挥出多核CPU 的优势来,达到充分利用CPU 的目的。2、防止阻塞从原创 2022-02-21 09:07:19 · 1698 阅读 · 0 评论 -
Spring @EnableAsync &@Async实现方法异步调用 方式二:通过实现AsyncConfigurer接口
1、测试类package com.async;/** * Created by Liuxd on 2018-09-11. */import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Con原创 2022-01-07 16:55:52 · 818 阅读 · 0 评论 -
Spring @EnableAsync &@Async 实现方法异步调用 方式一
1、异步测试类package com.async2;import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class AsyncTest { public static void main(String[] args) { AnnotationConfigApplicationContext context = new AnnotationConf原创 2022-01-07 16:44:08 · 285 阅读 · 0 评论 -
kafka 不可以脱离 zookeeper
kafka 不能脱离 zookeeper 单独使用。原因: kafka 使用 zookeeper 管理和协调 kafka 的节点服务器。原创 2021-12-24 23:37:40 · 483 阅读 · 0 评论 -
ORM 框架
1、什么是ORM 框架ORM(Object Relation Mapping)对象关系映射,是把数据库中的关系数据映射成为程序中的对象。2、ORM 的优点有效降低开发成本,提高开发效率降;开发更对象,更简单,可移植更强。3、常见的ORM 框架mybatis,hibernate。...原创 2021-12-19 15:24:09 · 855 阅读 · 0 评论 -
OkHttpClient实现http请求异步
1、AsyncHttpTestpackage com.http.file;import com.alibaba.fastjson.JSON;import java.util.Arrays;import java.util.HashMap;import java.util.List;public class AsyncHttpTest { public static void doPost(String url, Object req) { String re原创 2021-10-11 14:34:33 · 1663 阅读 · 0 评论 -
基于自定义注解+事件发布与监听+面相切面编程实现日志采集
1、自定义注解LogRecord import java.lang.annotation.ElementType;import java.lang.annotation.Retention;import java.lang.annotation.RetentionPolicy;import java.lang.annotation.Target;/** * 记录请求日志 */@Target({ElementType.METHOD, ElementType.TYPE})@R.原创 2021-06-10 17:06:18 · 310 阅读 · 0 评论 -
Java高并发解决方案一
知识点线程安全,线程封闭,线程调度,同步容器,并发容器,AQS,J.U.C,等等高并发解决思路与手段扩容:水平扩容、垂直扩容缓存:Redis、Memcache、GuavaCache等队列:Kafka、RabitMQ、RocketMQ等应用拆分:服务化Dubbo与微服务Spring Cloud限流:Guava RateLimiter使用、常用限流算法、自己实现分布式限流等服务降级与服务熔断:服务降级的多重选择、Hystrix数据库切库,分库分表:切库、分表、多数据源高可用的转载 2021-06-05 18:33:02 · 187 阅读 · 0 评论 -
高可用架构方案
1、高可用架构具备特征 主从切换 很好理解,当其中一台机器的服务宕机后,对于服务调用者来说,能够迅速的切换到其他可用服务,从服务升级为主服务,这种切换速度应当控制在秒级别(几秒钟)。 当宕机的服务恢复之后,自动变为从服务,主从服务角色切换。主从切换一定是要付出代价的,所以当主服务恢复之后,也就不再替换现有的主服务。 负载均衡 当服务的请求量比较高的时候,一台服务不能满足需求,这时候需要多台机器提供同样的服务,将所有请求分发到不同机器上。 高可用架构中应该具有丰富的负载均衡策略原创 2021-06-05 18:12:53 · 4063 阅读 · 4 评论 -
服务容错保护:Spring Cloud Hystrix
1、简介Hystrix,是由Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性、容错性与局部应用的弹性,是一个实现了超时机制和断路器模式的工具类库。2、原则1)防止单独的依赖耗尽线程资源;过载立即切断并快速失败,防止扎堆排队。2)提供回退以保护用户免受故障。3)使用隔离技术(例如隔板,泳道和断路器模式)来限制任何一个依赖的影响。4)通过近实时的指标,监控和告警,确保故障被及时发现5)通过动态修改配置属性,确保故障及时恢原创 2021-03-13 16:27:54 · 220 阅读 · 0 评论 -
客户端负载均衡: Spring Cloud Ribbon
客户端负载均衡: Spring CloudRibbon,它是一个基于HTTP和CP的客户端负载均衡工具,它基于NetflixRibbon实现。通过 Spring Cloud的封装,可以让我们轻松地将面向服务的REST模板请求自动转换成客户端负载均衡的服务调用。 Spring Cloud Ribbon虽然只是一个工具类框架,它不像服务注册中心、配置中心、API网关那样需要独立部署,但是它几乎存在于每一个Spring Cloud构建的微服务和基础设施中。因为微服务间的调用,API网关的请求转发等内容,实际上都.原创 2021-03-06 16:17:31 · 172 阅读 · 0 评论 -
服务治理 Spring Cloud Eureka
Spring Cloud Eureka是 Spring Cloud Netflix微务套件中的一部分,它基于 NetflixEureka做了二次封装,主要负责完成微服务架构中的服务治理功能。 Spring Cloud通过为EurekaSpring增加了 Boot风格的自动化配置,我们只需通过简单引入依赖和注解配置就能让 iSpring Boot构建的微服务应用轻松地与 Eureka服务治理体系进行整合。1、构建服务注册中心2、服务注册与服务发现3、Eureka的基础架构4、Eureka的..原创 2021-03-06 15:07:37 · 144 阅读 · 0 评论 -
mybatis能否预防SQL注入
1、概念:什么是sql注入SQL注入:是一种代码注入技术,用于攻击数据驱动的应用,恶意的SQL语句被插入到执行的实体字段中。它一种常见的攻击方式。攻击者在界面的表单信息或者URL上输入一些特殊的SQL片段(比如“OR1=1”),就有可能入侵参数检验不完善的应用程序。所以,应用开发中需做一些工作,来防备SQL注入。一些对安全性要求很高的应用中(如银行软件),通常使用将SQL语句全部替换为存储过程的方式,以防止SQL注入。是一种很安全的处理方式。答案:mybatis是能够防止SQL注入的,请继续阅.原创 2021-03-06 12:03:20 · 1635 阅读 · 1 评论 -
Spring之Ribbon与Nginx区别
1、Nginx 服务器端_负载均衡Nginx 是客户端所有请求统一交给 nginx,由 nginx 进行实现负载均衡请求转发,属于服务器端负载均衡。它是一种集中式的负载均衡器。即请求由 nginx 服务器端进行转发。2、Ribbon 客户端_负载均衡Ribbon 是从 eureka 注册中心服务器端上获取服务注册信息列表,缓存到本地,然后在本地实现轮询负载均衡策略。即在客户端实现负载均衡。3、应用场景的区别1)Nginx 适合于服务器端实现负载均衡 比如 Tomcat2)Ri原创 2021-01-30 16:54:01 · 1215 阅读 · 0 评论 -
Spring cloud RestTemplate
1、RestTemplate是什么Spring的RestTemplate是一个强大的,流行的基于Java的REST客户端。简言之,RestTemplate是Spring提供的一个访问Http服务的客户端类2、使用示例import org.apache.http.client.config.RequestConfig;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.clien原创 2021-01-30 15:37:51 · 242 阅读 · 1 评论 -
缓存穿透、缓存击穿与缓存雪崩解决方案
一、前言程序设计中使用缓存,前端发起取数请求到后台:情况一:首先从缓存中取数据,取到则直接返给前端;情况二:缓存中没取到,则转向数据库取数,取到后,先更新缓存再返给前端;情况三:数据库中也没取到,那直接返回空。二、缓存穿透【穿透缓存、数据库,都无数据】定义:缓存穿透,是指缓存和数据库中都无数据,而用户不断发起请求;如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。解决方案:1)在接口层增加校验。比如:①用户鉴权校验,②原创 2021-01-30 13:19:24 · 620 阅读 · 3 评论 -
Redis分布式锁成功案例
1、自定义分布式锁工具类package com.cache.redis.demo.util;import org.apache.commons.lang.time.DateFormatUtils;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.data.redis.connection.RedisStringCommands;import org.springframewor原创 2021-01-26 15:10:54 · 742 阅读 · 0 评论 -
Spring Boot 使用配置接口WebMvcConfigurer 解决跨域问题
1、问题描述:前端调用接口出现跨域问题2、解决方案,添加如下类import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.CorsRegistry;import org.springframework.web.ser原创 2021-01-25 17:43:40 · 2698 阅读 · 0 评论 -
SpringBoot配置项目访问路径URL的根路径
1、SpringBoot在2.0之前版本使用server.context-pathserver.context-path=/api2、SpringBoot在2.0之后版本使用server.servlet.context-pathserver.servlet.context-path=/api原创 2021-01-23 23:43:18 · 11881 阅读 · 3 评论 -
MyBatis中的动态SQL标签作用与实现
前言动态 SQL 是 MyBatis 的强大特性之一。如果使用过 JDBC 或其它类似的框架,应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。如果你之前用过 JSTL 或任何基于类 XML 语言的文本处理器,你对动态 SQL 元素可能会感觉原创 2021-01-23 16:28:22 · 1416 阅读 · 0 评论 -
Mybatis中Mapper接口与Maper.xml文件的绑定方式
1、接口与文件的绑定关系Mapper接口与 XML文件的绑定:通过 XML里mapper 标签的 namespace值(Mapper接口的包路径.接口名)绑定。示例:mapper接口xml文件2、方法名的绑定关系Mapper 接口的方法名与 XML 文件中标签的 id 值绑定。示例:mapper接口xml文件...原创 2021-01-23 15:32:38 · 7570 阅读 · 3 评论 -
Spring Boot扫描mapper接口类的两种实现方式
1、方式一:使用注解@Mapper在所有mapper接口上添加注解@Mapper;Spring boot启动注解自动扫描以下是spring boot启动缺省扫描配置2、方式二:使用注解@MapperScan在springboot启动类上添加注解@MapperScan,标注dao所在的包路径。一劳永逸,推荐使用!!import org.mybatis.spring.annotation.MapperScan;import org.springframework.b.原创 2021-01-23 14:27:59 · 10830 阅读 · 0 评论 -
Mybatis之map-underscore-to-camel-case开启驼峰功能
场景:数据库字段是下划线,程序中使用驼峰目的:实现数据库下划线字段与实体中的驼峰属性映射方式:设置map-underscore-to-camel-case属性为true来开启驼峰功能1、application.yml配置mybatis: mapperLocations: classpath:mapper/*.xml,classpath:mapper/base/*.xml configuration: map-underscore-to-camel-case: true原创 2021-01-23 13:59:46 · 11005 阅读 · 5 评论 -
资源调度平台系统架构与产品设计方案
资源调度系统,使用Spring boot搭建系统框架,Spring cloud实现多服务间的治理,Eureka实现微服务注册和发现,Spring data实现各类数据的持久化管理;采用多线程并发计算,提升系统吞吐和效率;使用线程异步处理附属业务;使用异步监听降低耦合性;使用redis缓存技术,降低数据库压力,并提升系统性能和响应速率。 基于分布式Job、多线程计算和异步监听,实现业务所需资源的自动调度、任务进度的定时采集、处理速率的计算、任务结束时间的有效预判以及任务使用资...原创 2020-12-21 23:19:58 · 1075 阅读 · 0 评论 -
Spring获取系统环境变量
1、代码 @Autowired private Environment environment; public void doBusiness(){ String env = ArrayUtils.isNotEmpty(environment.getActiveProfiles())? environment.getActiveProfiles()[0] : "未知"; }原创 2020-12-17 11:21:47 · 1998 阅读 · 0 评论 -
为什么要使用线程池,牢记并理解
1、减少开销提升效率 减少在创建和销毁线程上所花的时间及系统资源的开销;同时,提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行2、提高线程的可管理性 方便线程并发数的管控;线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成CPU过度切换(CPU切换线程是有时间成本的(需要保持当前执行线程的现场,并恢复要执行线程的现场))。对线程进行统一的分配、调优和监控,从而也提高相应速度;提供更强大的功能,延时定时线程池。...原创 2020-11-22 15:37:20 · 485 阅读 · 0 评论 -
Java使用单线程池实现多线程顺序执行(不交替,未同步)
1、原理机制使用单线程池,保证提交和执行是有序的。说明:1)不支持线程之间交替继续执行。2)多线程之间并非同步,只保证执行顺序有序,多线程之间是并发执行。2、代码示例package com.thread;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.locks.Condition;import jav原创 2020-11-22 10:53:50 · 972 阅读 · 0 评论 -
Java使用锁实现多线程顺序交替执行方式一
1、原理Lock同步锁Condition的signal()和await()2、代码示例package com.thread;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.ut原创 2020-11-21 18:55:44 · 490 阅读 · 0 评论 -
Java使用锁实现多线程顺序交替执行方式二
1、原理synchronized线程同步notify() 唤起线程wait() 线程等待2、代码示例package com.thread;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;public class TasksTestSync extends Thread { private static Integer num = 0; priva原创 2020-11-21 18:45:57 · 355 阅读 · 0 评论 -
Java无锁编程实现线程顺序交替执行方式三
1、原理分析AtomicInteger是线程安全的2、代码示例package com.thread;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;import java.util.concurrent.atomic.AtomicInteger;public class TasksTest extends Thread { private static At原创 2020-11-21 18:07:26 · 428 阅读 · 0 评论 -
Java实现重试机制
关键词:线程、线程池、队列、任务调度1、重试工具类package com.iretry;import com.alibaba.fastjson.JSON;import lombok.extern.slf4j.Slf4j;import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;import org.springframework.scheduling.concurrent.ThreadPoolTaskS原创 2020-11-21 16:43:23 · 3449 阅读 · 7 评论 -
Eureka配置案例详述
1、serverserver: port: 8000spring: application: name: eureka-server#eureka : 配置EurekaInstanceConfigBean和EurekaClientConfigBean中的属性eureka: instance: # hostname: 127.0.0.1 # 使用IP地址注册 preferIpAddress: true # 心跳周期 lease-rene...原创 2020-07-27 09:58:43 · 339 阅读 · 0 评论 -
Spring boot allowBeanDefinitionOverriding
1、问题启动异常Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.2020-07-24 17:08:33.330 ERROR 15684 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : ***************************原创 2020-07-24 17:10:40 · 1870 阅读 · 0 评论 -
Spring boot 请求服务端失败
1、情形描述服务端与消费者端都已成功注册在eureka,但是,消费者端无法请求到服务器端。2、原因与方案原因:服务端FeignClient命名与服务的应用名称不一致方案:如下改成一致即可:user-service-providerspring: application: name: user-service-provider@FeignClient(name = ServiceProvider.USER_SERVICE)public interface Remote原创 2020-07-24 16:56:37 · 480 阅读 · 0 评论 -
Eureka客户端注册失败:Cannot execute request on any known server
1、问题spring boot启动异常如下:Cannot execute request on any known server2、原因分析开启Eureka安全Security认证后,security默认加上了 csrf 拦截,applicaton.ymlserver: port: 8888spring: application: name: eureka-server security: user: name: admin原创 2020-07-24 16:43:17 · 2467 阅读 · 0 评论 -
两地 三中心
1、 两地 三中心同城双中心+异地灾备中心,“两地三中心”的灾备模式,方案兼具高可用性和灾难备份的能力。同城双中心 是指在同城或邻近城市建立两个可独立承担关键系统运行的数据中心,双中心具备基本等同的业务处理能力并通过高速链路实时同步数据,日常情况下可同时分担业务及管理系统的运行,并可切换运行;灾难情况下可在基本不丢失数据的情况下进行灾备应急切换,保持业务连续运行。与异地灾备模式相比较,同城双中心具有投资成本低、建设速度快、运维管理相对简单、可靠性更高等优点。异地灾备中心 是指在异地的城市建立一.原创 2020-07-06 16:57:56 · 2002 阅读 · 0 评论 -
容灾备份的关键技术
1、关键技术 在建立容灾备份系统时会涉及到多种技术,如:SAN或NAS技术、远程镜像技术、基于IP的SAN的互连技术、快照技术等。这里重点介绍远程镜像、快照和互连技术。1. 远程镜像技术 远程镜像技术是在主数据中心和备援中心之间的数据备份时用到。镜像是在两个或多个磁盘或磁盘子系统上产生同一个数据的镜像视图的信息存储过程,一个叫主镜像系统,另一个叫从镜像系统。按主从镜像存储系统所处的位置可分为本地镜像和远程镜像。远程镜像又叫远程复制,是容灾备份的核心技术,同时也是保持远...原创 2020-07-06 16:38:07 · 4532 阅读 · 1 评论 -
容灾备份分类
1、容灾分类 从其对系统的保护程度来分,可以将容灾系统分为:数据容灾和应用容灾 数据容灾就是指建立一个异地的数据系统,该系统是本地关键应用数据的一个实时复制。 所谓数据容灾,就是指建立一个异地的数据系统,该系统是本地关键应用数据的一个可用复制。在本地数据及整个应用系统出现灾难时,系统至少在异地保存有一份可用的关键业务的数据。该数据可以是与本地生产数据的完全实时复制,也可以比本地数据略微落后,但一定是可用的。采用的主要技术是数据备份和数据复制技术。 ...原创 2020-07-06 15:41:37 · 7053 阅读 · 0 评论