Clay 的技术空间

用进废退 | 艺不压身

SpringBoot

SpringBoot 站点

SpringBoot 特性

  1. 创建独立的 Spring 应用程序
  2. 嵌入的 Tomcat,无需部署 WAR 文件,适用于准生产环境
  3. 简化 Maven 配置
  4. 自动配置 Spring
  5. 提供生产就绪型功能,如指标、健康检查、外部配置
  6. 开箱即用,无需 XML 配置
阅读全文 »

Eclipse 在线安装阿里巴巴 Java 开发规约插件

打开 Eclipse –> Help –> Install New Software,填写插件的 URL 地址: https://p3c.alibaba.com/plugin/eclipse/update, 然后根据界面提示一步步安装,最后重启 Eclipse。安装成功后,工具栏会新增下图所示的图标。可以通过右键菜单、Toolbar 按钮两种方式手动触发代码检测,同时结果面板中可以对部分实现了 QuickFix 功能的规则进行快速修复。

alibaba-p3c-1

alibaba-p3c-2

阅读全文 »

大纲

JUC 介绍

JDK 5 中增加了并发大师 Doug Lea 的并发库,这一引进给 Java 线程的管理和使用提供了极大的便利性。在 Java 5 提供的 java.util.concurrent(简称 JUC)包中,增加了在并发编程中很常用的实用工具类,用于定义类似于线程的自定义子系统,包括线程池、异步 IO 和轻量级任务框架。JUC 提供了可调的、灵活的线程池,还提供了设计用于多线程上下文中的 Collection(即线程安全的集合类)实现等。常用的 JUC 包有以下几个:

  • java.util.concurrent
    • java.util.concurrent.locks
    • java.util.concurrent.atomic
阅读全文 »

方案一

Hexo 官方推荐的部署方案,是在先本地编写 MarkDown 源文件,然后在本地构建静态资源文件,最后同步静态资源文件到服务器。

方案一

阅读全文 »

Redis 内存管理

如何查看 Redis 的内存使用情况

使用 Redis 的 INFO 命令,可以获取有关 Redis 服务器的内存信息,命令如下:

1
info memory

其中与内存使用情况相关的输出信息如下:

  • used_memory:已使用的内存
阅读全文 »

大纲

Gateway 的流量控制

Gateway 的限流概述

在开发高并发系统时可以用三把利器来保护系统:缓存、降级和限流。缓存的目的是提升系统访问速度和增大系统处理的容量,是抗高并发流量的 “银弹”;而降级是当服务出现问题或者影响到核心流程时,需要暂时将其屏蔽掉,待高峰过去之后或者问题解决后再打开;而有些场景并不能用缓存和降级来解决,比如稀缺资源(秒杀、抢购)、写服务(如评论、下单)、频繁的复杂查询等,因此需要有一种手段来限制这些场景的并发 / 请求量,即限流。限流的目的是通过对并发访问 / 请求进行限速或者对一个时间窗口内的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务(定向到错误页或友好的展示页)、排队或等待(比如秒杀、评论、下单等场景)、降级(返回兜底数据或默认数据)。主流的中间件都会有单机限流框架,一般支持两种限流模式:控制速率和控制并发。Spring Cloud Zuul 通过第三方扩展 spring-cloud-zuul-ratelimit 也可以支持限流。Spring Cloud Gateway 是一个 API 网关中间件,网关是所有请求流量的入口;特别是像天猫双十一、双十二等高并发场景下,当流量迅速剧增,网关除了要保护自身之外,还要限流保护后端应用。常见的限流算法有漏桶和令牌桶,计数器也可以进行粗暴限流实现。对于限流算法,可以参考 Guava 中的 RateLimiter、Bucket4jRateLimitJ 等项目的具体实现。下面将介绍如何基于 Bucket4j、Gateway 内置的限流过滤器工厂(RequestRateLimiterGatewayFilterFactory)、CPU 使用率实现限流,点击下载完整的案例代码。

阅读全文 »

大纲

前言

版本说明

在本文中,默认使用的 Spring Cloud 版本是 Finchley.RELEASE,对应的 Spring Boot 版本是 2.0.3,特别声明除外。

Gateway 基于服务发现的路由规则

Gateway 服务发现路由的概述

Spring Cloud 对 Zuul 进行封装处理之后,当通过 Zuul 访问后端微服务时,基于服务发现的默认路由规则是:http://zuul_host:zuul_port/微服务在Eureka上的ServiceId/**。Spring Cloud Gateway 在设计的时候考虑了从 Zuul 迁移到 Gateway 的兼容性和迁移成本等,Gateway 基于服务发现的路由规则和 Zuul 的设计类似,但是也有很大差别。Spring Cloud Gateway 基于服务发现的路由规则,在不同注册中心下其差异如下:

  • 如果把 Gateway 注册到 Consul 上,通过网关转发服务调用,服务名称默认小写,不需要做任何处理
  • 如果把 Gateway 注册到 Zookeeper 上,通过网关转发服务调用,服务名称默认小写,不需要做任何处理
  • 如果把 Gateway 注册到 Eureka 上,通过网关转发服务调用,访问网关的 URL 是 http://Gateway_HOST:Gateway_PORT/大写的ServiceId/**,其中服务名称默认必须是大写,否则会抛 404 错误;如果服务名要用小写访问,可以在属性配置文件里面加 spring.cloud.gateway.discovery.locator.lowerCaseServiceId=true 配置解决

特别注意

  • 将 Gateway 注册到服务注册中心后,为了在外部可以通过服务名称让 Gateway 转发服务调用,需要在配置文件中设置 spring.cloud.gateway.discovery.locator.enabledtrue,表示 Gateway 需要与服务发现组件进行结合使用。
  • 配置之后就可以通过服务名称(serviceId)将请求转发到具体的服务实例。比如 http://localhost:8080/cloud-payment-service/pay/list,其中 http://localhost:8080 是 Gateway 的访问地址,cloud-payment-service 是服务名称。
阅读全文 »

大纲

Reactor 与 WebFlux 介绍

Reactor 是什么

为了应对高并发的服务器端开发,在 2009 年 的时候,微软提出了一个更优雅地实现异步编程的方式 - Reactive Programming,中文名是响应式编程或者叫反应式编程。随后,其它技术也迅速地跟上了脚步,像 ES6 通过 Promise 引入了类似的异步编程方式。Netflix 和 TypeSafe 公司也提供了 RxJava、Scala、Akka 技术,让 Java 平台也有了能够实现响应式编程的框架,现在比较熟知的 Hystrix 就是以 RxJava 为基础开发的。到了 2017 年,虽然已经有不少公司在实践响应式编程,但整体来说应用范围依旧不大,主要原因在于缺少简单易用的技术将响应式编程推广普及,诸如 MVC 框架、HTTP 客户端、数据库技术等整合。终于,在 2017 年 9 月 28 日,Spring 5 正式发布,而 Spring 5 其最大的意义就是将响应式编程技术的普及向前推进一大步。在背后支持 Spring 5 响应式编程的框架正是 Reactor,它是由 Pivotal 公司(开发 Spring 等技术的公司)开发的,实现了 Reactive Programming 思想,符合 Reactive Streams 规范(Reactive Streams 是由 Netflix、TypeSafe、Pivotal 等公司发起的)的一项技术。Reactive 与 Servlet 的技术栈对比图如下:

spring-webflux-view

阅读全文 »

大纲

Consul 的介绍

Consul 是什么

作为集群系统的灵魂,服务治理框架一直都受架构师的青睐。随着微服务思想的普及,越来越多的服务治理框架如雨后春笋般冒了出来。除了 Eureka,HashiCorp 公司的 Consul 也让诸多架构师青睐有加。Consul 是一个分布式高可用的服务网格(Service Mesh)解决方案,提供包括服务发现、配置和分段功能在内的全功能控制平面。这些功能中的每一个都可以根据需要单独使用,也可以一起使用以构建完整的服务网格。简单来说,Consul 是一个分布式高可用的系统服务发现与配置工具,它跟 Eureka 的核心功能一样,但略有不同:

  • Consul 使用 Go 语言编写,以 HTTP 方式对外提供服务
  • Consul 支持多数据中心,这是它的一大特色
  • Consul 提供了可视化的 Web 界面
  • Consul 的一致性协议是 CP(Raft)
  • Consul 除了服务发现之外,还有一些别的功能,例如配置功能
阅读全文 »

大纲

大纲

前言

版本说明

在下面的的教程中,使用的 Spring Cloud 版本是 Finchley.RELEASE,对应的 Spring Boot 版本是 2.0.3,特别声明除外。

Config 高可用

对于线上的生产环境,通常对其都是有很高的要求,其中高可用是不可或缺的一部分,必须要保证服务是可用状态,才能保证系统更好地运行,这是业务稳定的保证。

Config 客户端高可用

对于客户端的高可用,这里的方案主要还是用 File 的形式,本质与 “客户端回退” 的思路大体一致。客户端高可用主要是解决当服务端不可用的情况下,客户端依然可以正常启动。从客户端的角度出发,不是增加配置中心的高可用性,而是降低客户端对配置中心的依赖程度,从而提高整个分布式架构的健壮性。客户端加载配置的高可用流程图如下,点击下载完整的案例代码。

阅读全文 »