- 博客(53)
- 收藏
- 关注
原创 Spring Boot自动装配
一、什么是SpringBoot? springboot框架是为了能够帮助使用spring框架的开发者快速高效的构建一个基于spirng框架以及spring生态体系的应用解决方案。它是对“约定优于配置”这个理念下的一个最佳实践。因此它是一个服务于框架的框架,服务的范围是简化配置文件。二、Spring Boot四大核心组件EnableAutoConfiguration 自动装配Starter组件, 开箱即用Actuator 监控Spring Boot Cli 为Spring Cloud 提供
2021-08-01 16:15:00
216
原创 SpringCloud Alibaba Seata处理分布式事务
一、分布式事务问题分布式前:单机库存没这个问题、从1:1->1:N->N:N分布式之后:总结:一次业务操作需要垮多个数据源或需要垮多个系统进行远程调用,就会产生分布式事务问题二、Seata简介Seata是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。一个典型的分布式事务过程:分布式事务处理过程ID+三组件模型处理过程:本地@Transational、全局@GlobalTranstional...
2021-08-01 16:00:30
173
原创 Spring Cloud之服务治理
限流一、常见限流算法计数器算法:对于每次服务调用,可以通过AtomicLong#incrementAndGet()方法来给计数器加1并返回最新值,通过这个最新值和阈值进行比较。漏洞算法:可以准备一个队列,用来保存请求,另外通过一个线程池(ScheduledExecutorService)来定期从队列中获取请求并执行,可以一次性获取多个并发执行。令牌桶算法:可以准备一个队列,用来保存令牌,另外通过一个线程池定期生成令牌放到队列中,每来一个请求,就从队列中获取一个令牌,并继续执行。实现方
2021-08-01 15:52:41
260
原创 Spring Cloud 消息总线
回顾 Spring 事件/监听package com.segumentfault.spring.event;import org.springframework.context.ApplicationEvent;import org.springframework.context.ApplicationEventPublisher;import org.springframework.context.annotation.AnnotationConfigApplicationContext;
2021-08-01 15:44:17
316
原创 Spring Cloud 服务调用
Spring Cloud Feign增加 spring-cloud-starter-feign 依赖<!-- 添加 Spring Cloud Feign 依赖 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</art...
2021-07-31 15:20:46
185
原创 Spring Cloud 服务短路
传统 Spring Web MVC以 web 工程为例创建 DemoRestController:package com.segmentfault.spring.cloud.lesson8.web.controller;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RestController;import j..
2021-07-31 15:13:48
92
原创 Spring Cloud Netflix Ribbon 源码分析
利用 RibbonLoadBalancerClient新建一个工程三个模块: user-api:公用 API user-robbon-client:客户端应用 user-service-provider:服务端应用 实现 user-robbon-client配置信息application.properties:## 用户 Ribbon 客户端应用spring.application.name = user-ribbon-client## 服务端口
2021-07-25 20:08:03
125
原创 Spring Cloud 负载均衡
Netflix Ribbon引入Maven 依赖<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId></dependency>激活 Ribbon 客户端package com.segumentfault.springcloudle
2021-07-25 20:04:37
68
原创 Spring Cloud 高可用服务治理
Spring Cloud EurekaEureka 客户端配置多Eureka 注册中心## 应用名称spring.application.name = spring-cloud-eureka-client## 客户端 端口随即可用server.port = 0## 配置连接 Eureka 服务器## 配置多个 Eureka 注册中心,以"," 分割eureka.client.serviceUrl.defaultZone = \ http://localhost:9090
2021-07-25 20:02:21
251
原创 Spring Cloud 服务发现/注册
Spring Cloud Netflix EurekaEureka 服务器引入 Maven 依赖<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId></dependency>激活 Eureka 服务器package com...
2021-07-25 20:00:30
400
原创 Spring Cloud 配置服务器
搭建 Spring Cloud Config Server基于文件系统(File System)创建本地仓库 激活应用配置服务器 在引导类上标注@EnableConfigServer package com.segmentfault.springcloudlesson3configserver;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfig
2021-07-25 19:57:20
264
原创 Spring Cloud 之配置客户端
EnvironmentEnvironment: PropertySources = 1:1PropertySources: PropertySource = 1:N[0] PropertySource (Map)spring.application.name = spring-cloud-config-client[1] PropertySource(Map)spring.application.name = spring-cloud-config-client-demoSpri
2021-07-25 19:53:26
648
原创 Spring Boot之Web高级篇
传统 Servlet 回顾什么是Servlet? Servlet 是一种基于 Java 技术的 Web 组件,用于生成动态内容,由容器管理。类似于其他 Java 技术组件,Servlet 是平台无关的 Java 类组成,并且由 Java Web 服务器加载执行。什么是Servlet容器? Servlet 容器,有时候也称作为 Servlet 引擎,作为Web服务器或应用服务器的一部分。通过请求和响应对话,提供 Web 客户端与 Servlets 交互的能力。容器管理Servlets实例以..
2021-07-25 19:45:50
76
原创 Spring Boot之Web基础
静态 Web 内容HTTP 请求内容由Web 服务器文件系统提供,常见静态Web内容如:HTML、CSS、JS、JPEG、Flash等等。特点:计算类型:I/O 类型、交互方式:单一、资源内容:相同(基本)、资源路劲:物理路径(文件、目录)、请求方法:GET(主要)常见使用场景:信息展示、样式文件(CSS)、脚本文件(JS)、图片(GIF、JPEG、JPEG)、多媒体(Movie)、文件下载。常见Web服务器:Apache HTTP Server、Nginx、GWS。为什么Java We
2021-07-25 19:25:05
64
原创 Spring Boot自定义监听器
1、配置spring.factories## 自定义 Spring Boot ApplicationListenerorg.springframework.context.ApplicationListener=\com.segmentfault.springbootlesson18.context.CustomizedSpringBootApplicationListener2、自定义类public class CustomizedSpringBootApplicationList
2021-07-25 14:12:20
114
原创 Spring Boot之配置
Spring Boot 应用的外部配置资源,这些配置资源能够与代码相互配合,避免硬编码 方式,提供应用数据或行为变化的灵活性。类型Properties 文件YAML 文件环境变量Java 系统属性命令行加载顺序热加载测试命令行Servlet参数(ServletConfig,ServletContext)JNDI先系统属性,再环境变量application-{profile}.properties(先外后内)application.propertie
2021-07-25 14:02:18
122
原创 Spring Cloud核心组件Eureka
Eureka 是微服务架构中的注册中⼼,专⻔负责服 务的注册与发现。如上图所示,库存服务、仓储服务、积分服务中都有⼀个 Eureka Client 组件,这个组件专⻔负 责将这个服务的信息注册到 Eureka Server 中。说⽩了,就是告诉 Eureka Server,⾃⼰在哪台机 器上,监听着哪个端⼝。⽽ Eureka Server 是⼀个注册中⼼,⾥⾯有⼀个注册表,保存了各服务 所在的机器和端⼝号;订单服务⾥也有⼀个 Eureka Client 组件,这个 Eureka Client .
2021-07-18 10:42:48
157
原创 Spring IoC 依赖查找
1、单一类型依赖查找接口 - BeanFactory2、集合类型依赖查找接口 - ListableBeanFactory3、层次性依赖查找接口 - HierarchicalBeanFactory4、线程安全5、内建可查找的依赖AbstractApplicationContext 内建可查找的依赖注解驱动 Spring 应用上下文内建可查找的依赖(部分)6、依赖查找中的经典异常...
2021-07-17 21:10:24
72
原创 Spring Bean的基本概念
1、定义 Spring Bean :BeanDefinition一下代码只是BeanDefinition中的部分代码,如果想详细了解,可以自行查找API/** * A BeanDefinition describes a bean instance, which has property values, * constructor argument values, and further information supplied by * concrete implementations.
2021-07-17 21:00:23
91
原创 SpringBoot的拦截器中通过流 ( request.getInputStream() ) 的方式读取body中传来的数据会导致controller接收不到值
目前项目一般都前后端分离,但是前端再访问后端服务器时,都会有接口校验,如果用户没有登录是无法访问该接口的,因此我们需要定义拦截器,而在拦截器中验证有没有访问该接口的权限;1、我们需要配置拦截器@Configurationpublic class WebConfigurer implements WebMvcConfigurer { @Autowired private LoginInterceptor loginInterceptor; @Autowired
2021-07-17 20:47:17
2570
原创 Spring Boot全局异常处理
我们在开发项目时难免需要处理异常,但是怎样优雅的处理一场呢?今天就给大家介绍一下。1、请求参数校验异常处理 现在项目一般都已经前后端分离了,而表单校验或者JSON参数校验,一般都要求前后端都校验,而以前后端校验都是通过if判断空或者字符串长度,导致我们代码看起来很恶心,因此我们需要统一处理;首先我们需要定义全局异常处理器,并且将需要拦截的异常定义一下@RestControllerAdvice(该注解对Controller进行增强的,可以全局捕获spring mvc抛的异常。)...
2021-07-17 20:20:52
508
原创 Spring 中使用了那些设计模式呢?
一、 Spring 中常见的设计模式工厂模式 : BeanFactory装饰器模式: BeanWrapper代理模式: AopProxy单例模式: ApplicationContext委派模式: DispatcherServlet策略模式: HandlerMapping适配器模式: HandlerApdapter模板方法模式: JdbcTemplate观察者模式: ContextLoaderListener二、Spring 的四大模块及典型的设计模式 1、Spr
2021-07-17 16:51:03
998
原创 Spring事务明明开启了,为什么没起作用???
一、事务的特性(ACID) 1、原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。 2、一致性(Consistency):执行事务前后,数据保持一致; 3、隔离性(Isolation):并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的; 4、持久性(Durability):一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。二、事务的属.
2021-07-17 16:50:11
120
原创 Spring中声明式事务存在的优缺点以及注意事项!
事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种。关于事务的基础知识,如什么是事务,数据库事务以及Spring事务的ACID、隔离级别、传播机制、行为等,就不在这篇文章中详细介绍了。默认大家都有一定的了解。本文,作者会先简单介绍下什么是声明式事务和编程式事务,再说一下为什么我不建议使用声明式事务。编程式事务基于底层的API,如PlatformTransactionManager、TransactionDefinition和Tr..
2021-07-17 16:46:36
645
原创 Spring的常用注解
1)、@Autowired:自动注入: @Autowired:构造器,参数,方法,属性;都是从容器中获取参数组件的值 1)、[标注在方法位置]:@Bean+方法参数;参数从容器中获取;默认不写@Autowired效果是一样的;都能自动装配 2)、[标在构造器上]:如果组件只有一个有参构造器,这个有参构造器的@Autowired可以省略,参数位置的组件还是可以自动从容器中获取 3)、放在参数位置: 使用方法: 1)、默认优先按照类型去容器中找..
2021-07-17 16:37:45
322
原创 Spring Cloud Gateway 之获取请求体(Request Body)的几种方式
一、直接在全局过滤器(随便一个全局过滤器中就可以,可参考https://blog.csdn.net/qqqqqqhhhhhh/article/details/114401668)中获取,伪代码如下private String resolveBodyFromRequest(ServerHttpRequest serverHttpRequest){ Flux<DataBuffer> body = serverHttpRequest.getBody();
2021-03-05 17:04:11
6657
4
原创 Spring Cloud Gateway之全局过滤器在工作中的使用场景
一、使用注意事项1、全局过滤器作用于所有的路由,不需要单独配置。2、通过@Order来指定执行的顺序,数字越小,优先级越高。二、默认全局拦截器的整体架构三、实战场景,例如,校验token、记录请求参数(可参考这边https://www.cnblogs.com/hyf-huangyongfei/p/12849406.html)、替换负载均衡以后的路由等等。1、校验token@Slf4jpublic class AuthenFilter implements GlobalFilt
2021-03-05 16:47:30
903
3
原创 Spring Cloud Gateway之全局异常拦截器
因Spring Cloud Gateway作为网关是异步的因此日志记录很重要,下面异常类是我再工作中长期使用的/** * @version 2019/8/14 * @description: 异常拦截器 * @modified: */@Slf4jpublic class JsonExceptionHandler implements ErrorWebExceptionHandler { /** * MessageReader */ private
2021-03-05 16:24:13
1919
原创 Spring Cloud Gateway之动态路由(数据库版)
1、实现动态路由的关键是RouteDefinitionRepository接口,该接口存在一个默认实现(InMemoryRouteDefinitionRepository)通过名字我们应该也知道,该实现是将配置文件中配置的信息加载到内存中。因此无法实现动态路由。2、如果想实现动态路由,我们可以参考默认实现,自己定义一个实现类,代码如下:@Componentpublic class UnifiedRouteRepositoryImpl implements RouteDefinition...
2021-03-05 16:19:07
1693
原创 项目中使用Spring Security,但是还想通过统一认证平台实现单点登录
最近接到一个新的需求,就是将原本的项目集成到公司的统一认证平台,实现单点登录。相比于单系统登录,SSO需要一个独立的认证中心,只有认证中心能接受用户的用户名密码等安全信息,其他系统不提供登录入口,只接受认证中心的间接授权。间接授权通过令牌实现,SSO认证中心验证用户的用户名密码没问题,创建授权令牌,在接下来的跳转过程中,授权令牌作为参数发送给各个子系统,子系统拿到令牌,即得到了授权,可以借此创建局部会话,局部会话登录方式与单系统的登录方式相同。这个过程,也就是单点登录的原理。上面我大致介绍了一下单点登录
2021-03-05 15:32:25
681
3
转载 Java语言十五讲(总结)
讲完了。你们或许会问,难道这十几讲就涵盖了Java的主要方面了吗?当然不是,有些很重要的内容我都没有提及,比如网络编程。我们的讲座不是编写教材,并不全面,主要是通过一些主题让大家对Java有一个进阶的理解。一开头我就说了,听众是相关专业毕业并有一年左右的Java编程基础的人。要看入门教科书和语言参考书,有很多选择,我决心不再走人的老路,我想结合自己的经历,为大家展示一位自认为Java布道者的理解。我的一系列讲座,从Java语言,到Web框架探索,到设计模式和算法,再到文本分析和自然语言理解,都是按照这个思路
2021-02-25 19:39:14
329
转载 Java语言十五讲(第十五讲容器框架三)
我们到此已经把ArrayList, HashSet,HashMap讲过了。JDK里面还有一些实现,如Queue,Deque,TreeSet,TreeMap等等,我就不一一讲了。现在回顾一下:Collection保存单一的元素,而Map把保存键值对。用泛型技术,就可以将制定类型的对象放到容器中,不会出现类型错误的元素,取出来的时候也不需要再进行类型转换。Collection和Map都不定长,向里面添加更多元素的时候,会自动调整容量。跟数组一样,List维持位置索引和对象的关联,因此是由确定次序的容器。
2021-02-25 19:38:21
193
转载 Java语言十五讲(第十四讲 容器框架二)
讲完了。你们或许会问,难道这十几讲就涵盖了Java的主要方面了吗?当然不是,有些很重要的内容我都没有提及,比如网络编程。我们的讲座不是编写教材,并不全面,主要是通过一些主题让大家对Java有一个进阶的理解。一开头我就说了,听众是相关专业毕业并有一年左右的Java编程基础的人。要看入门教科书和语言参考书,有很多选择,我决心不再走人的老路,我想结合自己的经历,为大家展示一位自认为Java布道者的理解。我的一系列讲座,从Java语言,到Web框架探索,到设计模式和算法,再到文本分析和自然语言理解,都是按照这个思路
2021-02-25 18:01:22
333
转载 Java语言十五讲(第十三讲 容器框架一)
计算机程序的主要用途是处理各类数据,而这些数据是有结构的,不是散乱的。几十年以前软件大师N. Wirth写道:程序=算法+数据结构。我们在数据结构里面学到过,数据的组织方式,有数组,有链表,有树,有图,有字典等等。我们现在着手探究一下Java里面提供的数据容器框架。Java里面从JDK1.2起引入容器框架,主要分成List,Set,Queue和Map四类。List是有序、可重复的;Set是无序的、不可重复的;Queue代表一种队列;Map是具有映射关系的集合。 这些也叫集合类,但是可能引起重名的混乱,我
2021-02-25 18:00:33
128
转载 Java语言十五讲(第十二讲 Multi-Thread多线程12.2)
实例变量如balance在线程间是共享的。有的时候,我们真的需要线程级别的变量,不希望共享,也是有办法的。Java里面有ThreadLocal变量。比如,我们的线程从inventory里面拿东西,上面的程序一次4个。我现在想不同的线程个数拿的个数不同,就可以用一个线程相关的变量。我们改写一下:classInventoryWorkerimplementsRunnable{Inventoryinv;privateThreadLocal<Integer>bag...
2021-02-25 17:59:38
154
转载 Java语言十五讲(第十二讲 Multi-Thread多线程12.1)
现代计算机一般是多CPU和多核的,而传统的程序是单线程的,只在一个核上运行,就会浪费掉这些计算资源,于是就发明多线程来充分利用它们。甚至在单CPU单核上也还是能有效果,因为许多时候计算在等IO,空隙时间就可以再运行别的线程。现代操作系统的主要任务就是进行进程和线程的调度。我们深入到操作系统内部,一定会发现一片繁忙的景象。我们先看基本型,实现Runnable接口,写执行代码在run()中,代码如下(NewThread.java):publicclassNewThreadimplementsRu...
2021-02-25 17:58:40
110
转载 Java语言十五讲(第十讲 Lambda 表达式)
我们要从匿名类开始讲起,一点点引出Lambda表达式。我比较喜欢Lambda这个词,显得比较有学问似的,一笑。我讲过,技术点不是孤立的,它们之间是有关联的,按照某种层次结构关联在一起就构成一个体系。我们在学习某个技术的时候,要了解它的来龙去脉,把某个技术点放在整体中学习会更有收获。事实上,学术论文一般都要求开头一段讲学术史,这是有道理的。当然,有个别天才能在不引用任何参考文献的情况下提出划时代的理论,横空出世。最著名的就是爱因斯坦在1905年写的《论动体的电动力学》。以前提到过Inner Class内部
2021-02-23 19:16:06
151
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人