Clay 的技术空间

用进废退 | 艺不压身

大纲

服务雪崩效应

服务雪崩概述

微服务之间进行 RPC 或者 HTTP 调用时,一般都会设置 调用超时失败重试等机制来确保服务的成功执行,这看上去很美好,但如果不考虑服务的熔断和限流,它就是造成服务雪崩的元凶。假设有两个访问量比较大的服务 A 和 B,这两个服务分别依赖 C 和 D,其中 C 和 D 服务都依赖 E 服务(如下图),这就是所谓的扇出。A 和 B 不断地调用 C 和 D,处理客户请求和返回需要的数据;当 E 服务不能提供服务的时候,C 和 D 的 超时重试机制会被执行;由于新的请求不断的产生,会导致 C 和 D 对 E 服务的调用大量的积压,产生大量的调用等待和重试调用,会慢慢耗尽 C 和 D 的系统资源(CPU 或者内存等),然后 C 和 D 服务跟着也 down 掉。A 和 B 服务会重复 C 和 D 的遭遇,导致系统资源耗尽,然后服务也 down 掉了,最终整个服务都不可访问,造成了服务雪崩。

hystrix-snow

阅读全文 »

大纲

OpenFeign 介绍

Feign 的概述

在使用 Spring Cloud 开发微服务应用时,各个服务提供者都是以 HTTP 接口的形式对外提供服务,因此在服务消费者调用服务提供者时,底层通过 HTTP Client 的方式访问。此时可以使用 JDK 原生的 URLConnection、Apache 的 HTTP Client、Netty 的异步 HTTP Client 或者 Spring 的 RestTemplate 去实现服务间的调用。但是最方便、最优雅的方式是通过 Feign 进行服务间的调用。Feign 是由 Netflix 开发的一个声明式的 Web 服务客户端,它的出现使开发 Web 服务客户端变得很简单。Feign 同时也是一款声明式、模板化的 HTTP 客户端。更多介绍可参考:Feign 项目

OpenFeign 的概述

Spring Cloud OpenFeign 对 Feign 进行了二次封装,使得在 Spring Cloud 中使用 Feign 的时候,可以做到使用 HTTP 请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程访问,更感知不到在访问 HTTP 请求。Spring Cloud OpenFeign 增强了 Feign 的功能,使 Feign 有限支持 Spring MVC 的注解,如 @RequestMapping 等。OpenFeign 的 @FeignClient 注解可以解析 Spring MVC 的 @RequestMapping 注解下的接口,并通过 AOP 中的动态代理来产生实现类,在实现类中做负载均衡并调用其他服务,同时默认集成了 Ribbon 与 Hystrix。OpenFeign 基本上就是当前微服务之间调用的事实标准。更多介绍可参考:Spring Cloud OpenFeign 项目Spring Cloud OpenFeign 官方文档Spring Cloud OpenFeign 官方中文教程

阅读全文 »

大纲

前言

Swagger 是一系列 RESTful API 的工具,通过 Swagger 可以获得项目的⼀种交互式 API 文档。Swagger 的目标是为 RESTful API 定义一个标准的、与语⾔言无关的接口,使人和计算机在看不到源码、或者看不到文档、或者不能通过网络流量检测的情况下,能发现和理解各种服务的功能。当服务通过 Swagger 定义,用户就能通过少量的实现逻辑与远程的服务互动。

版本说明

Swagger 的版本发展历史

Swagger 从 3.0 版本开始更名为 OpenAPI,通常所说的 Swagger 一般指的是 Swagger 2.x 版本,而 OpenAPI 则指的是 Swagger 3.x 版本。简而言之,Swagger2 是 OpenAPI 规范的前身,Swagger3 是 OpenAPI 规范的官方正式版本。更具体地说,Swagger3 引入了对 OpenAPI 的支持,提供了更简洁的依赖引入方式,接口地址有所改变,注解系统进行了更新,并对 Docket 配置进行了优化。Swagger3 实现了零配置和自动配置支持,同时兼容旧版注解,但文档页面地址和接口地址在不同版本间不兼容。

阅读全文 »

前言

SpringBoot 配置文件中的数据库账户、密码等敏感数据不能明文展示,否则代码泄露的话,数据库的数据会被恶意利用。

加密算法

  • Jasypt Spring Boot 2.x 默认使用的加密算法是 PBEWithMD5AndDES,其中的 IV 生成器是 org.jasypt.iv.NoIvGenerator
  • Jasypt Spring Boot 3.x 默认使用的加密算法是 PBEWITHHMACSHA512ANDAES_256,其中的 IV 生成器是 org.jasypt.iv.RandomIvGenerator

添加 Maven 坐标

1
2
3
4
5
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.4</version>
</dependency>
阅读全文 »

前言

官方教程

ELK 介绍

ELK 简介

ELK 是 Elasticsearch + Logstash + Kibana 的简称。

  • Elasticsearch 是一个分布式的搜索和分析引擎,可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch 基于 Lucene 开发,现在是使用最广的开源搜索引擎之一。
  • Logstash 简单来说就是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端,与此同时这根管道还可以根据不同的需求在中间加上滤网,Logstash 提供了很多功能强大的滤网以满足各种应用场景。
  • Kibana 是一个开源的分析与可视化平台,设计出来用于和 Elasticsearch 一起使用的。开发者可以使用 Kibana 搜索、查看、交互存放在 Elasticsearch 索引里的数据,并使用各种不同的图标、表格、地图显示,Kibana 能够很轻易的展示高级数据分析与可视化。
阅读全文 »

大纲

Ribbon 介绍

Ribbon 是什么

Ribbon 是 Netflix 公司开发的一个负载均衡组件,诞生于 2013 年 1 月,一直是 Netflix 活跃度较高的项目,由 Pivotal 公司将其整合进 Spring Cloud 生态。Ribbon 是一个基于 HTTP 和 TCP 的客户端负载均衡工具,通过 Spring Cloud 的封装,可以轻松地将面向服务的 REST 模板请求自动转换成客户端负载均衡的服务调用。 此外,Ribbon 拥有丰富的负载均衡策略、重试机制、支持多协议的异步与响应式模型、容错、缓存与批次处理等功能。Ribbon 虽然只是一个工具类框架,它不像服务注册中心、配置中心、API 网关那样需要独立部署,但是它几乎存在于每一个 Spring Cloud 构建的微服务和基础设施中。 因为微服务间的调用,API 网关的请求转发等内容实际上都是通过 Ribbon 来实现的,Feign、Zuul 已经集成了 Ribbon,更多介绍可参考:Ribbon 项目Ribbon 官方英文文档Spring Cloud Ribbon 官方中文文档

Ribbon 与负载均衡

负载均衡(Load Balance),即利用特定方式将流量分摊到多个操作单元上的一种手段,它对系统吞吐量与系统处理能力有着质的提升,当今极少企业没有用到负载均衡器或是负载均衡策略。常见的负载均衡实现有 Nginx 与 LVS,且不管它们的使用方式,工作在什么层次,本质还是对流量的疏导。业界对于负载均衡有不少分类,最常见的有软负载与硬负载,代表产品是 Nginx 与 F5;还有一组分类最能体现出 Ribbon 与传统负载均衡的差别,那就是集中式负载均衡与进程内负载均衡。集中式负载均衡指位于因特网与服务提供者之间,并负责把网络请求转发到各个提供单位,这时候 Nginx 与 F5 就可以归为一类,也可以称是服务端负载均衡。进程内负载均衡是指从一个实例库选取一个实例进行流量导入,在微服务的范畴内,实例库一般存储在 Zookeeper、Eureka、Consul、etcd 这样的注册中心,而此时的负载均衡器就是类似 Ribbon 的 IPC(Inter-Process Communication,进程间通信)组件,因此进程内负载均衡也叫做客户端负载均衡。

阅读全文 »

持久化

什么是持久化

持久化(Persistence),即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。

持久化的实现方式

  • 快照方式持久化:在某时刻把所有数据进行完整备份,例如:MySQL 的 Dump 方式、Redis 的 RDB 方式
  • 写日志方式持久化:把用户执行的所有写指令(增删改)备份到文件中,还原数据时只需要把备份的所有指令重新执行一遍即可,例如:MySQL 的 Binlog、Redis 的 AOF、Hbase 的 HLog
阅读全文 »

优化生产环境中的 Tomcat 服务器涉及多个方面,包括性能调优、资源管理、安全性增强和稳定性保障。

性能调优

内存设置

  • 调整 JVM 内存参数

    • 设置合适的初始堆大小(-Xms)和最大堆大小(-Xmx),根据服务器的物理内存配置。典型设置如下:
      1
      2
      -Xms2048m
      -Xmx4096m
  • 调整方法区大小

    • 对于 Java 7 及以前版本,可以设置永久代大小(-XX:PermSize-XX:MaxPermSize)。
    • 对于 Java 8 及以后版本,可以调整元空间大小(-XX:MetaspaceSize-XX:MaxMetaspaceSize)。
阅读全文 »

安装环境介绍

环境名称版本
linuxCentOS Linux release 7.7.1908 (Core)
docker-ce19.03.8
docker-compose1.24.0-rc1
docker imagevimagick/privoxy:latest

初始目录结构

  • 目录结构
1
2
3
4
5
~/fig/privoxy/
├── docker-compose.yml
└── privoxy/
├── user.action
└── user.filter
阅读全文 »

前言

实现流程

创建钉钉群机器人后,得到 Webhook 与 Secret。Java 代码 实现 Admin 的 Notifier 接口,当监听到 Admin 服务状态变更后,直接调用 Webhook 发送消息给钉钉群机器人,群成员就可以收到报警消息通知,这个过程与 Github 的 Webhook 实现流程一致。

钉钉官方文档

值得一提的是,本文使用的是钉钉提供的 自定义机器人 接口,而不是 开发企业内部机器人 接口,同时 Webhook 里包含的 access_token 不存在有效期(永久有效),即不需要定时刷新 access_token

阅读全文 »