- 博客(25)
- 资源 (2)
- 问答 (1)
- 收藏
- 关注
原创 Spring Cloud实现灰度发布-基于Spring Cloud Gateway和Spring Cloud Loadbalancer
Spring Cloud实现灰度发布,基于注册中心Eureka,网关Spring Cloud Gateway,负载均衡器Spring Cloud Loadbalancer。我们要实现灰度发布,实现应用平滑升级,那就要做两件事,第一,在注册中心标识出哪些是灰度应用,哪些是正常的应用,第二,修改负载均衡器,根据灰度规则将需要灰度的请求转发到灰度应用上。下面也是按照这两个步骤介绍,文章最后会给出源码示例。
2024-09-01 19:35:49 1066
原创 蓝绿部署/红黑部署/滚动发布/灰度发布
把正在提供服务的系统标记为绿色,准备发布的系统标记为蓝色。蓝绿发布流程:采购两套完整的机器,一套作为热备,一套对外提供服务。服务发布时将新版本服务发布到热备机器上,测试没问题之后将流量切换到新的服务上,旧版本服务保留,有问题可以再切换回去。
2024-09-01 18:39:07 337
原创 LVS DR模式实现Nginx负载均衡
LVS(Linux Virtual Server)是基于Linux的高性能负载均衡方案,它是一个4层负载,区别于Nginx的7层负载。理论上来说如果不需要处理HTTP报文或者一些静态资源,可以使用LVS替代Nginx实现负载均衡。另外,由于LVS工作的协议层次更低,因此它效率更高,支持更大的并发。也可以将LVS前置在Nginx之前,实现更大的一个网络架构,支持更大的并发。这里LVS来实现Nginx负载均衡作为演示。
2024-08-12 16:32:06 1062
原创 一致性协议
一致性协议(Consensus Protocol)是分布式系统中用于解决多个节点之间达成一致的算法或协议。它们的主要作用是确保在节点之间保持数据的一致性。需要说明的是一致性协议和拜占庭将军问题没有直接的关联。拜占庭将军的核心问题是在缺少可信任的中央节点和可信任的通道的情况下,分布在不同地方的各个节点如何达成共识。因此拜占庭将军问题强调安全性方面,而一致性协议则更强调系统的容错性。
2024-06-19 13:25:33 626
原创 由于错误使用TransmittableThreadLocal导致的线程污染问题
使用阿里巴巴的transmittable-thread-local可以让外部线程的ThreadLocal变量副本在线程池中也可以访问到,并且在请求结束后会把线程池中的属于外部线程的ThreadLocal变量清除掉,恢复原本的线程池中的线程ThreadLocal信息。Transmittable-thread-local有两种使用方式首先引入jar包。
2024-05-31 15:38:28 1130 1
原创 《实战高并发程序设计》读书笔记
多线程访问ArrayList的问题在于:在ArrayList容量快要用完时(只有一个可用空间),如果两个线程同时进入add函数,并且判断认为系统满足继续添加元素而不需要扩容,那么两个线程先后向系统写入自己的数据,必然会有一个线程将数据写到边界外,从而产生ArrayIndexOutOfBoundsException。令牌桶算法:在令牌桶算法中,桶中存放的不是请求而是令牌。线程的suspend和resume方法,如果resume在前面执行,则线程会永久阻塞,但是线程的状态是runnable,是令人迷惑的。
2023-08-13 16:20:10 135
原创 Java8 ~ Java17 新特性
主要特性:函数式接口就是有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。可以隐式转化为 Lambda 表达式。通过方法引用,可以使用方法的名字来指向一个方法。使用一对冒号来引 "::" 用方法。构造方法引用使用Class:new静态方法引用使用方式:Class::staticMethod实例方法引用使用方式:instance::methodJava 8 新增了接口的默认实现,通过 default 关键字表示。Java 8 支持了重复注解。在 Java 8 之前想实现重复注
2023-04-19 16:25:32 771
原创 JVM C1,C2编译器以及分层编译
JVM会在解释执行的时候收集程序运行的各种信息,然后编译器会根据这些信息进行一些基于预测的激进优化,比如分支预测,根据程序不同分支的运行概率,选择性地编译一些概率较大的分支。当下次执行时,再遇到这段代码,就会从codeCache中读取机器码,直接执行,以此来提升程序运行的性能。C2编译器是为长期运行的服务器端应用程序做性能调优的编译器,适用于执行时间较长或者对峰值性能有要求的程序,也称为Server Compiler,例如,服务器上长期运行的Java应用对稳定运行就有一定的要求。
2023-04-04 22:32:06 1871
转载 Hystrix断路器原理
Netflix Hystrix使用滑动窗口来统计调用的指标数据。Hystrix 1.5将滑动窗口设计成了数据流(reactive stream, rxjava中的Observable)的形式。通过消费数据流的形式利用滑动窗口,并对数据流进行变换后进行后续的操作,可以让开发者更加灵活地去使用。由于 Hystrix 里大量使用了 RxJava,再加上滑动窗口本质就是不断变换的数据流,滑动窗口中每个桶的数据都来自于源源不断的事件,因此滑动窗口非常适合用观察者模式和响应式编程思想的 RxJava 实现。
2022-11-13 00:09:56 239
原创 Spring Full configuration & Lite configuration
Full Configuration模式类上有@Configuration注解,且属性proxyBeanMethods=true注意proxyBeanMethods这个属性是从Spring 5.2版本才有的属性。Lite Configuration模式1. 类上标注有@Component注解2. 类上标注有@ComponentScan注解3. 类上标注有@Import注解4. 类上标注有@ImportResource注解5. 类上没有注解,但类内存在@Bean方法6.
2021-11-27 23:39:53 435
原创 Spring @Bean实例的初始化
简介我们都知道Spring有很多种创建bean的方式,包括使用@Component, @Service等注解,包括实现ImportSelector或ImportBeanDefinitionRegistrar接口,也可以调用AnnotationConfigApplicationContext#register手动注册bean,也可以在@Configuration类里定义bean。那么今天我们要说的就是在@Configuration配置类里@Bean实例化的原理。首先来看下通常情况下在@Config
2021-11-26 19:18:41 1060
翻译 NoClassDefFoundError原因解析
介绍首先来说明一下NoClassDefFoundError和ClassNotFoundException的区别。NoClassDefFoundError表明一个类在编译时是能找到的,但是在运行时找不到了。ClassNotFoundException表示在运行时尝试加载类时找不到这个类。它不会在编译时去查找。 可能的原因类不在类路径上(Classpath)比如缺少了某些JAR包,或者Jar包没有被放在类路径上,或者JAR包改名字了因此找不到。你可能通过jar命令运行的程序,并
2021-03-14 23:18:30 32414 1
原创 Spring Data JPA的几种查询方法
Introduction库存文章,发出来免得找不到了。在基本的数据查询实例中,可以通过实现CrudRepository接口来实现针对一个的查询或多个字段的组合查询,但这只是对于条件比较简单的情况下,如果条件比较复杂,那么一个方法的名字就会显的很长,那么就可以换一种方式来实现数据查询,比如下面即将提到的Criteria API, Specification, Query dsl. Criteria APICriteriaQuery一个典型的查询代码如下:LocalDate today
2021-03-14 22:13:04 1230
翻译 OAuth2.0 & OpenID Connect解析
IntroductionOAuth2是一个授权框架, 可以使一个应用程序获取其他HTTP服务, 比如Facebook, 的用户账号的部分权限。 当一个第三方应用程序想要访问用户账号时, OAuth2会把验证的过程委托给含有用户账号信息的应用程序。OAuth2提供了Web, Desktop applications, mobile devices的授权流。 OAuth RolesOAuth定义了四种角色:Resource OwnerClientResource ServerAuth
2020-12-14 22:57:32 1760
翻译 Java GC流程介绍
Garbage Collection自动垃圾回收即在堆空间中识别被引用的对象以及未被引用的对象, 然后删除未被引用的对象的过程。基本步骤:Marking(标记): 识别被引用的对象, 以及未被引用的对象。 所有的对象都会被扫描。Normal Deletion(正常删除): 删除未被引用的对象, 引用的对象会被保留, 并且memory allocator会保存空闲块的引用。或:Deletion with Compacting(删除并压缩): 删除未被引用的对象, 把被引用的对象移动到一起, 方便
2020-07-12 11:47:12 469
原创 Java内存区域划分
JVM定义了Java程序执行时所用到的时的各种运行时数据区域(run-time data areas). 有些是在JVM启动时创建的并且在线程之间共享,其他的则是在线程执行时创建的, 是线程私有的。总共有五大数据区域: 程序计数器, 虚拟机栈, 本地方法栈, 堆以及方法区。按照内存归属分为两类:线程私有的:程序计数器,Java虚拟机栈, 本地方法栈线程共享的:堆(heap), 方法区(method area) 程序计数器每个线程都有一个私有的,独立的程序计数器。 如果当前线程执行的是
2020-07-12 11:40:07 104
原创 Redis 单实例模式、Sentinel模式、Cluster模式入门
Redis想必大家都或多或少有点了解,一个开源的内存数据库,支持持久化,支持各种过期策略,可以用作缓存,消息代理。像一些Redis安装的细节在这里就不说了,这里主要总结一下,Redis运行的几种模式,这里有参考一些其他文章,参考的文章我会在文章结尾贴上链接。Redis支持单实例运行,主从复制,以及基于主从复制的哨兵模式,以及集群模式。在单实例下,若节点失败,则服务无法从redis获取数据,如果开启了主从复制,则在master节点失败后可以手动把slave节点切换为master节点,当然这中间会有一定的
2020-05-31 20:58:56 2345
原创 Spring + Hibernate多租户配置
介绍多租户(Multi-tenancy)是一种软件架构,一个服务实例可以服务多个客户,每个客户叫一个租户。而这其中最关键的一部分就是各个租户的数据的分离。针对这种情形,主要有三种策略,数据的隔离级别从高到低依次是:Database per Tenant, Shared Database, Separate Schema, Shared Database, Shared Schema:Database per Tenant: 每一个tenant有它自己的数据库实例,并且是和其他tenant的数据库隔离的
2020-05-27 23:03:38 2090
原创 Spring5 WebClient源码简析
WebClient是Spring5引入的响应式非阻塞Http客户端,同时支持阻塞式调用。其中exchange()方法是非阻塞式的, 而retrieve()方法是阻塞式的。WebClient内部将实际发出请求的操作委托给一个HTTP客户端库,默认是Reactor Netty。下面首先写一个代码示例:WebClient webClient = WebClient.create();Mono<ClientResponse> response = webClient.get() .uri(
2020-05-17 22:46:55 1461
原创 Spring中的RestTemplate源码分析
之前有一篇文章是分析的Feign, 这边文章来分析Spring中的RestTemplate,下面还会有一篇来分析最新的WebClient,当然这时后话,下面来具体看一下RestTemplate的执行流程。Get请求流程分析(getForObject)首先从get方法开始,传入url,返回类型,参数即可,方法原型:public <T> T getForObject(String u...
2020-05-05 22:00:11 352
原创 Spring Cloud OpenFeign执行流程解析(待完善)
Feign是向远程服务器发送请求的客户端,类似于RestTemplate,但是使用声明式的方式,实际使用的时候请求会根据声明的方法签名,注解这些动态构造请求。下面主要是分析Spring Cloud集成的Openfeign的一系列执行流程。一个最基本的使用情况如下:首先在配置类上启用Feign:@EnableFeignClientspublic class SpringCloudFeignD...
2020-05-01 22:33:43 756
转载 算法的时间复杂度和空间复杂度-总结
通常,对于一个给定的算法,我们要做 两项分析。第一是从数学上证明算法的正确性,这一步主要用到形式化证明的方法及相关推理模式,如循环不变式、数学归纳法等。而在证明算法是正确的基础上,第二部就是分析算法的时间复杂度。算法的时间复杂度反映了程序执行时间随输入规模增长而增长的量级,在很大程度上能很好反映出算法的优劣与否。因此,作为程序员,掌握基本的算法时间复杂度分析方法是很有必要的。 算法
2017-05-02 21:02:12 395
原创 记一次服务器线上测试
写了个小项目,测试时一脸懵逼,这里记下两个问题。一、quartz定时器不执行的问题解决方法::修改tomocat容器的时区,之前百度说修改jdk的时区,不过改了jdk时区没用,还是修改tomcat时区,方法为找到${TOMCAT_HOME}/bin/catalina.sh(如果为windows则为cataline.bat),找到JAVA_OPTS,加上-Dfile.encoding=UTF
2017-03-01 23:51:10 354
怎么抓取淘宝上所有关于酒的商品
2017-03-12
TA创建的收藏夹 TA关注的收藏夹
TA关注的人