Docker - 学习笔记
Dockerdocker 的出现开启了一个新的时代:容器化时代
市面上有很多开发语言,如:Java、C++、JavaScript,如果你要运行,你可能拿到的是一个 .jar .exe .sh 文件甚至你需要自己编译源码。没有一个统一的标准进行管理。
而 Docker 却可以将这些应用 build 成一个镜像,你只要是一个 Docker 镜像,那么 Docker 就可以直接给你跑起来。不仅如此, 这些镜像还很容易分享,例如将某些镜像放到指定的地方,别人就可以找到这个镜像下载和运行,所以 Docker 的推出还统一了标准。
虚拟化技术在 Docker 之前,非常流行一种“虚拟化技术”,这种技术其实就是在一台机器中安装多个虚拟机,我们部署的应用都在这些安装的虚拟机中。如果有应用出现问题,比如内存泄露,顶多把他自个的机子内存占满,不会影响到别的应用。
虚拟化技术有一下痛点:
基础镜像GB级别
创建使用比较复杂
启动速度慢
移植与分享不方便
优点是隔离性很强
容器化技术
基础镜像MB级别
创建简单
隔离性强
启动速度秒级
移植与分享方便
架构
Docker_Host
如果需要使用 D ...
k8s 安装 Ingress 出错 CrashLoopBackOff
k8s 安装 Ingress 出错 CrashLoopBackOff学习 k8s 在安装 Ingress 的时候一直出现 CrashLoopBackOff
1234[root@k8s-node1 k8s]# kubectl get pods --all-namespacesNAMESPACE NAME READY STATUS RESTARTS AGEingress-nginx nginx-ingress-controller-kmkhx 0/1 CrashLoopBackOff 4 2m56singress-nginx nginx-ingress-controller-nncd7 1/1 Running 0 2m56s
搞了我3天
检查日志 kubectl logs nginx-ingress-controller-kmkhx -n ingress-nginx ,说80端 ...
Sleuth + Zipkin 服务链路追踪 - 学习笔记
Sleuth + Zipkin 服务链路追踪 - 学习笔记微服务框架是一个分布式架构,它按业务划分服务单元,一个分布式系统往往有很多个服务单元。由于服务单元数量众多、业务的复杂性,如果出现了错误和异常,很难去定位。主要体现在:一个请求可能需要调用多个服务,而内部服务的调用复杂性,决定了问题难以定位。所以微服务架构中,必须实现分布式链路追踪,去跟进一个请求到底有哪些服务参与,参与的顺序又是怎样的,从而达到每个请求的步骤清晰可见,出了问题可以很快定位。
链路追踪组件有 Google 的 Dapper、Twitter 的 Zipkin 以及阿里的Eagleeye(鹰眼)等
基本术语
Span(跨度):基本工作单元,发送一个远程调度任务,就会产生一个 Span,Span 是一个 64 位 ID 唯一标识的,Trace 是用另一个 64 位 ID 唯一标识的,Span 还有其他数据信息,比如摘要、时间戳事件、Span 的 ID以及进度 ID。
Trace(跟踪):一系列 Span 组成的一个树状结构。请求一个微服务系统的 API 接口,这个 API 接口需要需要调用多个微服务,调用每个微服务都会 ...
SpringCloud Alibaba-Sentinel - 学习笔记
SpringCloud Alibaba-Sentinel - 学习笔记熔断降级和限流1.什么是熔断?A 服务调用 B 服务的某个功能,由于网络不稳定或者 B 服务压力大,导致业务处理能力降低响应慢。如果这样的次数太多,可以直接把 B 服务断了(A 不再请求 B),凡是调用 B 的直接返回降级数据,不必等待 B 的超长执行。这样 B 的故障问题就不会级联影响到 A。
2.什么是降级?整个网站处于流量高峰期,服务器压力剧增,可以根据当前业务情况及流量,对一些服务和页面进行尤策略的降级停止服务,所有的调用直接返回降级数据。以此缓解服务器资源的压力,以保证核心业务的正常运行,同时也保证了客户和大部分客户能得到正确的响应。
3. 什么是限流对打入服务的请求流量进行控制,使服务能够承担不超过自己能力的流量压力。
4. 异同
相同点
为了保证集群大部分服务的可用性和可靠性,防止崩溃,关闭特定业务以保证资源可用
用户最终都是体验到某个功能不可用
不同点
熔断时被调用方故障,触发的系统主动规则
降级是基于全局考虑,停止一些正常服务,释放资源
整合SpringBoot导入依赖
1234< ...
定时任务
定时任务cron 表达式cron表达式语法:秒 分 时 日 月 周 年(spring暂不支持年)
Field Name
Mandatory
Allowed Values
Allowed Special Characters
Seconds
YES
0-59
, - * /
Minutes
YES
0-59
, - * /
Hours
YES
0-23
, - * /
Day of month
YES
1-31
, - * ? / L W
Month
YES
1-12 or JAN-DEC
, - * /
Day of week
YES
1-7 or SUN-SAT
, - * ? / L #
Year
NO
empty, 1970-2099
, - * /
特殊字符:
, 枚举
(cron="7,9,23 * * * * ?") 表示任意时刻的 7、9、23秒启动这个任务。
- 范围
(cron="7-20 * * * * ?") 表示7到20秒之间,每秒启动一次该任务。
/ 步长
(cron=&q ...
RabbitMQ延时队列实现定时任务
RabbitMQ延时队列(实现定时任务)比如有一个未付款订单,超过一定时间后,系统自动取消订单并释放占有的商品。
可以使用spring 的 schedule 定时任务轮询数据库,但是使用这种方式会极其消耗系统内存、增加数据库压力并且存在较大的时间误差
以上问题可以使用 RabbitMQ 的消息TTL和死信 Exchange 结合,下单后,如果30分钟未支付就会关闭订单和解锁库存,不需要全表扫描
消息的TTL(Time To Live)
消息的TTL就是消息的存活时间
RabbitMQ 可以对队列和消息分别设置TTL
对队列设置就是队列没有消费者连接着的保留时间,也可以对每一个单独的消息做单独的设置。超过了这个时间,我们认为这个消息就死了,称之为死信。
如果队列设置了,消息也设置了,那么会取最小的。所以一个消息如果被路由到不同的队列中,这个消息死亡的时间有可能不一样(不同队列设置)。可以通过设置消息的 expiration 字段或者 x-message-ttl 属性来设置时间,两者都是一样的效果。
Dead Letter Exchanges(DLX)
一个消息在满足如下条件下, ...
接口幂等性-学习笔记
接口幂等性什么是幂等性接口幂等性就是用户对同一操作发起的一次请求或多次请求的结果是一致的,不会应为多次点击而产生问题,例如:支付场景,用户购买了商品支付和扣款成功,但是返回结果的时候网络异常,此时钱已经扣了,用户再次点击按钮,此时会进行第二次扣款,返回结果成功,用户查询余额发现多扣钱了,流水记录变成了两条,这就是没有保证接口的幂等性产生的问题。
可能出现幂等性问题的情况例如用户点击了多次按钮
用户页面回退后再次提交
微服务之间互相调用是,由于网络等其它原因,导致请求失败,feign 出发重试机制
什么情况下需要幂等以SQL为例,有些操作是天然幂等的。
select * from TableNmae where id = ?,无论执行多少次都不会改变状态,是天然幂等的。
update table set col1=1 where col2=2 无论执行多少次状态都是一直的,也是幂等操作
delete from user where userId = 1 多次操作,结果一致,这是具备幂等性的操作
insert into user(userId, name) values(1, ' ...
Feign远程调用丢失请求头问题
在业务中,需要使用A、B两个模块,这些模块使用了SpringSession共享Session数据。在B模块中的业务需要用户登录后才能操作。当A调用B的业务时,在B模块中获取不到用户的Session信息,导致B模块判定该请求用户没有登录导致A模块拿不到所需数据。问题是A模块可以拿到该用户的登录信息并且,已经使用了SpringSession进行共享Session数据。
找出问题原因使用Feign发送远程调用
当请求进到B服务时被其登录验证拦截器拦截,试图去Session中拿登录信息时,结果为 null(已确定登录)
我们都知道,session的原理是需要通过 cookie 中的某个值(jesessionid)来确定一个Session对象,在B模块中拿不到用户数据是因为无法通过指定cookie来获取这个到Session对象。
为了解决这个问题,需要Debug一下Feign的流程。
Feign 流程查询发送请求,来到远程调用代码打断点,setup into 进去检查

目的地(destination)
当消息发送者发送消息后,将由消息代理接管,消息代理保证消息传递到指定目的地。
消息队列主要有两种形式的目的地
队列(queue):点对点消息通信(point-to-point)
主题(topic):发布(publish)/订阅(subscribe)消息通信
点对点:
消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息内容,消息读取后被移出队列
消息只有唯一的发送者和接收者,但并不是说只能有一个接收者
发布订阅模式
发送者(发布者)发送消息到主题,多个接收者(订阅者)监听(订阅)这个主题,那么就会在消息到达时同时收到消息
JMS(Java Message Service)Java消息服务:
基于JVM消息代理的规范。ActiveMQ、HornetMQ是JMS实现
AMQP(Advanced Message Queuing Protocol)
高级 ...
VMware 网络配置
VMware 网络配置运行 dhcpd 命令分配一个 ip 地址。
通过 ifconfig 或 ip addr 命令拿到刚刚分配的IP:192.168.135.128(以你自己的为准)
修改 /etc/sysconfig/network-scripts/ifcfg-ens33 文件
将原来的 BOOTPROTO=dhcp 修改为 BOOTPROTO=static ,目的是使用我们指定的ip作为默认IP
添加 ONBOOT=yes
指定我们刚刚分配的IP IPADDR=192.168.135.128
设置子网腌码,一般是255.255.255.0,NETMASK=255.255.255.0
最后设置网关,通过 cat /Library/Preferences/VMware\ Fusion/vmnet8/nat.conf 查看vmware给我们分配的网关
也可以通过ifconfig命令查看网关: