Gateway随笔
本地搭建SpringCloud Demo引入API Gateway模块,记录一些SpringCloud Gateway相关的知识。
一、Gateway
首先看一下Spring官网的微服务架构图:
可以看待网关位于所有服务的上层,所有服务的调用都需要经过网关。
Gateway旨在提供一种简单而有效的方式来对API进行路由,以及提供一些强大的过滤器功能,例如:熔断、限流、重试等。
Spring Cloud Gateway是基于异步非阻塞模型上进行开发,性能优秀,且具有动态路由、对路由指定Predicate和Filter、集成Hystrix的断路器功能、集成SpringCloud服务发现、请求限流、支持路由重写等特性。
Zuul 1.x以及过时,且其基于阻塞I/O实现,性能较差,Zuul 2.x咕咕咕,且没有和SpringCloud进行整合…
二、Spring Cloud Gateway
官方文档:https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/
网关的工作流程如下:
Clients ma ...
Hystrix服务熔断
主要记录在本地搭建SpringCloud Demo时,使用Hystrix模拟服务降级和服务熔断的相关知识点和配置。
Hystrix断路器
1.使用场景
在微服务架构中,服务调用的链路会随着业务的复杂边的越来越长,一旦其中某些服务节点挂掉,就会导致整体链路无法继续进行。
服务雪崩:是一种因“服务提供者的不可用”(原因)导致“服务调用者不可用”(结果),并将不可用逐渐放大的现象。
比如在一个调用连上,服务A调用服务B,服务B调用服务C,如果此时流量突然激增,服务A和服务B能抗住请求,但是服务C挂了,那么请求都阻塞在服务B上,服务B的线程资源会被逐步消耗完,进而导致服务B也不可用,同理,最终服务A也会不可用。
服务熔断则是解决服务雪崩的方案之一。
2.服务降级
啥时服务降级?如果下游服务响应太慢,服务提供者会进行服务降级,如暂时停掉重要性低的服务来释放出服务器的资源,来保证主业务的可用性,增加服务响应速度;上游服务调用者发现下游服务响应速度太慢,可以在本地调用服务降级逻辑,直接返回给用户,给予用户友好提示,避免卡顿。
3.服务熔断
服务熔断是服务降级的一种方式。
当下游服务因为某种原因变得不 ...
《被讨厌的勇气》书摘
《被讨厌的勇气》书摘
最近在看这本书,觉得比较适合现在这个阶段去阅读,就记录一些书中的观点。
本书通过青年与哲人对话的方式,向读者描述了阿德勒心理学的观点,因此看起来也不觉得枯燥无味。
一、我们的不幸是谁的错
如果我们一直依赖原因论,就会永远止步不前。
再怎么找“原因”,也没法改变一个人。决定我们自身的不是过去的经历,而是我们自己赋予经历的意义。
阿德勒心理学认为,生活方式是自己主动选择的结果。你之所以无法改变,是因为自己下了“不改变”的决心。即使人们有各种不满,但还是认为保持现状更加轻松、更能安心。阿德勒心理学就是勇气心理学。你之所以不幸并不是因为过去或者环境,更不是因为能力不足,你只不过是缺乏“勇气”,可以说是缺乏“获得幸福的勇气”。
阿德勒心理学的目的论是说:无论之前的人生发生过什么,都对今后的人生如何度过没有影响。
你的人生取决于“当下”。
二、一切烦恼都来自人际关系
为什么讨厌自己?你由于太惧怕人际关系所以才会变得讨厌自己,你是在通过自我厌弃来逃避人际关系。
自卑感来自主管的臆造。我们的自卑感不是“客观性的事实”而是“主观性的解释”。书中以身高为例,解释了问题在于我们如何 ...
LeetCode146-LRU缓存
146. LRU 缓存
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。
函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。
面试比较高频,并且涵盖了很多知识点。这里手动实现了双向链表DoubleLink类。
需要注意各个情况下链表的处理,其实逻辑不难。
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535 ...
SpringCloud注册中心
最近在学习SpringCloud框架,首先接触的应该就是注册中心,目前SpringCloud常用的几个注册中心包括:Eureka、Zookeeper、Nacos和Consul。
目前我在本地搭建SpringCloud demo时主要使用Eureka进行调试,后期学习Nacos时,再添加Nacos相关知识~
一、服务注册中心
在微服务架构中,随着业务越来越复杂,系统中的服务节点会变得越俩越多,为了更好地管理架构中的服务节点,就需要服务注册中心。服务注册中心提供了服务注册、服务发现、服务管理、负载均衡等能力。
服务的提供方和服务的消费者都需要将自己的信息注册到服务注册中心中,服务注册中心会保存所有服务,当服务的消费者需要调用服务时,会根据服务列表,通过负载均衡算法,选择服务提供方的相应地址进行服务调用。
Eureka
官网目前已经停止更新了~
介绍
Netflix开发的服务发现框架,基于REST的服务。
提供了两个组件:Eureka Server和Eureka Client,分别对应服务的provider和服务的consumer。Eureka的架构比较清晰和简单,如下图所示:
包 ...
高并发随笔
在ImportNew公众号看到一篇高并发的文章,之前自己也写过一个简单的秒杀项目,这里记录一些文章中的知识点。
原文连接
如何理解高并发
不能只看数字,要看具体的业务场景。就是不能只看10WQPS、100WQPS或者并发量,需要根据具体的业务逻辑来衡量。
业务是慢慢做大的,业务量也是逐渐变为10倍、100倍的。要用高并发的处理方法去演进系统,从架构设计、编码实现、甚至产品方案等多维度去预防和解决高并发问题。
高并发有很多场景:如有读多写少的信息流场景、有读多写多的交易场景等。
高并发系统设计的目标是什么?
宏观目标
高性能:系统的并行处理能力;用户体验,降低服务的响应时间
高可用:系统可以正常服务的时间。隔三差五服务器就挂肯定会影响业务和用户体验。
高扩展:系统的扩展能力。流量高峰时能否在短时间内完成扩容,平稳承接峰值流量。如秒杀活动等。
微观目标
性能指标
平均响应时间:最常用,但是缺陷很明显,对于慢请求不敏感。
TP90、TP99等分位值:将响应时间按照从小到大排序,TP90表示排在第90分位的响应时间, 分位值越大,对慢请求越敏感。
吞吐量:和响应时间成 ...
LeetCode56-合并区间
56. 合并区间
以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] = [starti, endi] 。请你合并所有重叠的区间,并返回 一个不重叠的区间数组,该数组需恰好覆盖输入中的所有区间 。
输入:intervals = [[1,3],[2,6],[8,10],[15,18]]
输出:[[1,6],[8,10],[15,18]]
解释:区间 [1,3] 和 [2,6] 重叠, 将它们合并为 [1,6].
思路:先按照区间起始位置升序排序,然后逐个遍历,如果当前区间起始位置 > 结果数组最后一个区间的结束位置,则不合并,直接加到结果数组;否则合并。
这里注意排序的使用:Arrays.sort(intervals, (a1, a2) -> a1[0] - a2[0]);
以及最后根据idx的长度使用Arrays.copyOf进行裁剪,注意接口参数是左闭右开
1234567891011121314151617class Solution { public int[][] merge(int[][] intervals ...
LeetCode39-组合总和
39. 组合总和
给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。
candidates 中的 同一个 数字可以 无限制重复被选取 。如果至少一个数字的被选数量不同,则两种组合是不同的。
对于给定的输入,保证和为 target 的不同组合数少于 150 个。
输入:candidates = [2,3,6,7], target = 7
输出:[[2,2,3],[7]]
解释:
2 和 3 可以形成一组候选,2 + 2 + 3 = 7 。注意 2 可以使用多次。
7 也是一个候选, 7 = 7 。
仅有这两种组合。
回溯的思路是每次用target减去选择的数,然后进行递归。当target=0表示找到了一种选择。
本题的难点是去除重复的。比如target为5时,选择2-3和选择3-2即是一种重复的选择。
去重的思路是按照candidate数组的下标,确定起始下标i,且只能选择i和i后面的树,这样就不会出现选择3后 ...
LeetCode32-最长有效括号
32. 最长有效括号
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
示例 1:
输入:s = “(()”
输出:2
解释:最长有效括号子串是 “()”
示例 2:
输入:s = “)()())”
输出:4
解释:最长有效括号子串是 “()()”
感觉动态规划的题,核心就是找到状态转移的方差,一个是定义dp[i],一个是如何根据之前的结果推理出dp[i]的表达式。
对于数组的题目,dp[i]的定义很多都是以i结尾的最优解是啥,然后再推理dp[i]的表达式。
对于这题,我们定义dp[i]表示以i结尾的最长有效括号的子串长度。
根据题意,我们假设:
当s[i] = '('时,dp[i]必然等于0,因此不必讨论。
当s[i] = ')'时:
如果s[i-1] = '(',那么s[i]就必定和s[i - 1]配对,那么很容易得出这种情况的表达式:dp[i] = dp[i - 2] + 2
如果s[i-1] = ')',dp[i-1]表示以s[i - 1]结尾的最长有效括号子串,那么s[i]有可能和s[i - dp[i - 1] - 1] ...
LeetCode20-有效的括号
20. 有效的括号
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
思路比较简单,就是用栈。
这里用map存了括号的配对,这里在new的时候进行了初始化赋值,可以记住这个用法。这里的双{}是用的匿名内部类,第一个括号为匿名内部类,第二个括号为实例初始化块。
这种写法代码比较简单,但执行效率比普通初始化低。
123456789101112131415161718192021222324class Solution { private static final Map<Character,Character> map = new HashMap<Character,Character>(){{ put('}','{'); put(']','['); put ...