疯狂创客圈 Java 高并发【 亿级流量聊天室实战】实战系列 【博客园总入口 】
架构师成长+面试必备之 高并发基础书籍 【Netty Zookeeper Redis 高并发实战 】
Crazy-SpringCloud 微服务脚手架 &视频介绍:
Crazy-SpringCloud 微服务脚手架,是为 Java 微服务开发 入门者 准备的 学习和开发脚手架。并配有一系列的使用教程和视频,大致如下:
高并发 环境搭建 图文教程和演示视频,陆续上线:
中间件 | 链接地址 |
---|---|
Linux Redis 安装(带视频) | Linux Redis 安装(带视频) |
Linux Zookeeper 安装(带视频) | Linux Zookeeper 安装, 带视频 |
Windows Redis 安装(带视频) | Windows Redis 安装(带视频) |
RabbitMQ 离线安装(带视频) | RabbitMQ 离线安装(带视频) |
ElasticSearch 安装, 带视频 | ElasticSearch 安装, 带视频 |
Nacos 安装(带视频) | Nacos 安装(带视频) |
Crazy-SpringCloud 微服务脚手架 图文教程和演示视频,陆续上线:
组件 | 链接地址 |
---|---|
Eureka | Eureka 入门,带视频 |
SpringCloud Config | springcloud Config 入门,带视频 |
spring security | spring security 原理+实战 |
Spring Session | SpringSession 独立使用 |
分布式 session 基础 | RedisSession (自定义) |
重点: springcloud 开发脚手架 | springcloud 开发脚手架 |
SpingSecurity + SpringSession 死磕 (写作中) | SpingSecurity + SpringSession 死磕 |
小视频以及所需工具的百度网盘链接,请参见 疯狂创客圈 高并发社群 博客
Spring Cloud是基于Spring Boot构建的,其版本也是有对应关系的,在构建项目时,注意版本之间的对应关系,版本对不上会有问题。
Spring Cloud | Spring Boot |
---|---|
Camden | 1.4.x |
Dalston | 1.5.x |
Edgware | 1.5.x |
Finchley | 2.0.x |
Greenwich | 2.1.x |
Hoxton | 2.2.x |
Spring Cloud 包含了一系列的子组件,如 Spring Cloud Config、Spring Cloud Netflix、Spring Cloud Openfeign等,为了防止与这些子组件的版本号混淆,Spring Cloud 的版本号全部使用英文单词形式命名。具体来说 Spring Cloud 的版本号使用了英国伦敦地铁站的名称来命名,并按字母 A-Z 次序发布版本,其第一个版本叫做 “Angel”,第二个版本叫做"Brixton" ,依次类推。另外,在解决了一个严重的 BUG 后,Spring Cloud 会发布一个 “service Release” 版本(小版本),简称 SRX 版本,其中X是顺序的编号, 比如 “Finchley.SR4” 是 Finchley 版本的第 4 个小版本。
很多时候,大家做技术选型时,非常喜欢选用最高版本来开发,但是对于 Spring 全家桶的选择来说,高版本不一定是最佳选择。比如,目前最高的 Spring Cloud Hoxton 版本是基于 Spring Boot 2.2 构建,Spring Boot 2.2 又基于 Spring Framework 5.2 构建,也就是说,这是一次整体的大版本的升级。大家的在项目上都会用到非常多、非常多的第三方组件,总会有一些组件没有来得及做配套升级而不能兼容 Spring Boot 2.2 或 Spring Framework 5.2,如果贸然整体升级,会给项目开发带来各种各样的莫名奇妙的疑难杂症、甚至是线上的潜在 Bug。除此之外,Spring Cloud 高版本大量推荐了不少自家新组件,但是这些新组件没有经过大规模的使用,其功能尚待完善,以负载均衡组件为例,Spring Cloud Hoxton 所推荐的自家组件 spring-cloud-loadbalancer 在功能上和 ribbon 相比,就弱得非常、非常多。
实际上,Spring Cloud Finchley 到 Greenwich 版本的升级很小,可以说微乎其微,主要是做了 JAVA 11 的兼容,而生产场景中 Java 8 才是各大项目的选择主流,毕竟,Java 11 (2019年4月之后的升级补丁)已经不完全免费 。当然, Java 8 和 Java 11 一样,2019年4月之后的补丁版本也面临收费问题,但是 Java 8 自 2014 年 3 月 18 发布起,截止目前已经被使用和维护了很多年,已经是非常的成熟和稳定了。
综上所述,本书推荐并选用 Spring Cloud Finchley 作为学习、研究、和使用的版本,并且推荐使用的子版本为 Finchley.SR4 。具体的 Maven 依赖坐标如下:
org.springframework.cloud
spring-cloud-dependencies
Finchley.SR4
pom
import
org.springframework.boot
spring-boot-dependencies
2.0.8.RELEASE
import
pom
无论是单体应用还是分布式应用,如果从零开始,都会有很多基础性的、重复性的工作需要做,比如用户认证,比如 session 管理等等,有了开发脚手架,这块基础工作就可以省去,直接按照脚手架的规范进行业务模块的开发即可。
笔者看了开源平台的不少开源的脚手架,很少是适用于直接拿来做业务模块开发的,要么封装的过于重量级而不好解耦,要么就是业务模块分包不清晰而不方便开发,所以,本着简洁和清晰的原则,疯狂创客圈推出了自己的微服务开发脚手架 crazy-springcloud,其大致的模块和功能如下图所示。
这里对疯狂创客圈 crazy-springcloud 微服务开发脚手架的模块分包进行说明,具体如下:
crazymaker-server -- 根项目
│ ├─cloud-center -- 微服务的基础设施中心
│ │ ├─cloud-eureka -- 注册中心
│ │ ├─cloud-config -- 配置中心
│ │ ├─cloud-zuul -- 网关服务
│ │ ├─cloud-zipkin -- 监控中心
│ ├─crazymaker-base -- 公共基础依赖模块
│ │ ├─base-common -- 普通的公共依赖,如 utils 类的公共方法
│ │ ├─base-redis -- 公共的 redis 操作模块
│ │ ├─base-zookeeper -- 公共的 zookeeper 操作模块
│ │ ├─base-session -- 分布式 session 模块
│ │ ├─base-auth -- 基于 JWT + SpringSecurity 的用户凭证与认证模块
│ │ ├─base-runtime -- 各 provider 的运行时公共依赖,装配的一些通用 Spring IOC Bean 实例
│ ├─crazymaker-uaa --业务模块: 用户认证与授权
│ │ ├─uaa-api -- 用户 DTO、Constants 等
│ │ ├─uaa-client -- 用户服务的 Feign 远程客户端
│ │ ├─uaa-provider -- 用户认证与权限的核心实现,包含controller 层、service层、dao层的代码实现
│ ├─crazymaker-seckill --业务模块: 秒杀练习
│ │ ├─seckill-api -- 秒杀 DTO、Constants 等
│ │ ├─seckill-client -- 秒杀服务的 Feign 远程调用模块
│ │ ├─seckill-provider -- 秒杀服务核心实现,包含controller层、service层、dao层的代码实现
│ ├─crazymaker-demo --业务模块: 练习演示
│ │ ├─demo-api -- 演示模块的 DTO、Constants 等
│ │ ├─demo-client -- 演示模块的 Feign 远程调用模块
│ │ ├─demo-provider -- 演示模块的核心实现,包含controller层、service层、dao层的代码实现
接下来,对业务模块的分包规范,做一个说明。在业务模块如何分包的问题上,实际上大部分企业都有自己的统一规范,这里从职责清晰、方便维护、能快速定位代码的角度出发,将 crazy-springcloud 微服务开发脚手架的每一个业务模块,分成了 {module}-api、 {module}-client、 {module}-provider 三个子模块,三个子模块的具体介绍如下:
(1) {module}-api 子模块定义了一些公共的 Constants 业务常量和 DTO 传输对象,该子模块既被业务模块内部依赖,也会被使用该业务模块的外部所依赖;
(2) {module}-client 子模块定义了一些被外部模块所依赖的 Feign 远程调用客户类,该子模块是专供外部的模块,不能被内部子模块依赖;
(3) {module}-provider 子模块是整个业务模块的核心,也是一个能够独立启动、运行的服务提供者应用,该模块包含涉及到业务逻辑的 controller层、service层、dao层的完整代码实现。
crazy-springcloud 微服务开发脚手架在以下几个维度进行了弱化:
(1)有关部署,没有使用 docker 容器而是使用 shell 脚本,对容器进行了弱化。有多方面的原因:一是本脚手架初心是学习,所使用的部署方式为 shell 脚本而不是 docker,方便大家学习 shell 命令和脚本;二是 Java 和 docker 其实整合得很好,可以稍加配置就一键发布,找点资料就可以掌握; 三是生产环境的部署、甚至是整个自动化构建和部署的工作,实际上属于运维工作,都有专门的运维岗位人员去完成,而部署的核心,任然是 shell脚本。
(2)有关监控,没有对链路监控、JVM性能指标、断路器监控做专门的封装和介绍。有多方面的原因:一是监控的软件太多,如果介绍太全,篇幅又不够,介绍太少又不是大家所用到的; 二是其实都是软件的操作说明,原理性的内容比较少,使用视频的形式比文字形式知识传递的效果会更好。疯狂创客圈后续会推出一些微服务监控的视频,请大家关注社群博客。反过来说,对于一个编程高手来说,如果了解 Spring Cloud 核心原理,那些监控组件基本上都是一碟小菜。
SpringCloud 微服务开发和自验证过程中,大致会涉及到的基础中间件如下:
(1)ZooKeeper
ZooKeeper 是一个分布式的、开放源码的分布式协调应用程序,是大数据框架 Hadoop 和 Hbase的重要组件。在分布式应用中,它能够高可用的提供很多保障数据一致性的能力:分布式锁、选主、分布式命名服务等。crazy-springcloud 脚手架中,高性能的分布式 ID 生成用到了 ZooKeeper 。 有关 ZooKeeper 的原理和使用,请参见《Netty Zookeeper Redis 高并发实战》一书。
(2)Redis
Redis 是一个高性能的缓存数据库。在高并发的场景下,Redis 可以对关系数据库起到很好的补充作用,对提高应用的并发能力和响应速度,可以说举足轻重和至关重要。crazy-springcloud 脚手架中,高性能的分布式 Session 用到了 Redis。 有关 Redis 的原理和使用,请参见《Netty Zookeeper Redis 高并发实战》一书。
(3)Eureka
Eureka 是 Netflix 开发的服务注册和发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS(Amazon 云)的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现 SpringCloud 的服务发现功能。
最后,介绍一下开发和自验证过程中,需要启动的依赖服务。
(4)Spring Cloud Config
Spring Cloud Config 是 Spring Cloud全家桶中最早的配置中心,虽然在生产场景中,很多的企业已经使用 Nacos或者 Consul 整合了配置中心功能,但是 Config 依然适用于 Spring Cloud 项目,通过简单的配置即可使用。
(5) Zuul
Zuul 是 Netflix 开源的内部网关,可以和 Eureka、Ribbon、Hystrix 等组件配合使用,Spring Cloud 对Zuul 进行了整合与增强,使用其作为微服务内部网关,负责对给集群内部各个 provider 服务提供者进行 RPC 路由和请求过滤。
(6)Nginx/Openresty
Nginx 是一个高性能的 HTTP 和反向代理 web服务器,是由伊戈尔·赛索耶夫为俄罗斯访问量第二的 Rambler.ru 站点开发web服务器。Nginx 源代码以类 BSD 许可证的形式发布,其第一个公开版本 0.1.0 发布于2004年10月4日,2011年6月1日其1.0.4 版本发布。Nginx 因高稳定性、丰富的功能集、内存消耗少、并发能力强的而闻名全球,目前得到非常广泛的使用,比如说百度、京东、新浪、网易、腾讯、淘宝等都是其用户。OpenResty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。
以上中间件的配置端口,以及部分中间件的安装和使用视频,大致如下表所示。
中间件 | 端口 | 安装和使用视频 |
---|---|---|
Redis | 6379 | Linux Redis 安装视频 |
zookeeper | 2181 | Linux Zookeeper 安装视频 |
RabbitMQ | 3306 | Linux Zookeeper 安装视频 |
cloud-eureka | 7777 | Eureka 使用视频 |
Spring Cloud Config | 7788 | springcloud Config 使用视频 |
Zuul | 7799 | |
Nginx/Openresty | 80 |
首先介绍一下开发和自验证的系统选型。
对于大部分的开发人员来说,学习和开发都使用 了 windows 环境,在这种情形下,强烈建议使用虚拟机装载 centos 作为自验证环境,为啥要推荐 centos 呢?
(1)提前暴露生产环境下的问题。 基本上90%以上的生产环境上 Java 应用,都使用的是 Linux环境(如 centos)来部署。使用 centos 作为自验证环境,可以提前暴露在生产环境下的潜在问题,避免在 windows 下没有问题的程序,一旦部署到生产环境就出问题(笔者亲历);
(2)学习 shell 命令和脚本。在生产环境定位和解决问题,需要用到基础的 shell 命令和脚本;另外, shell 命令和脚本也是 Java 程序员必知必会的面试题。而使用 centos 作为自验证环境,能方便大家学习 shell 命令和脚本。
当然,可以借助一些工具提高开发效率,比如可以通过 vmware tools 进行 windows 和 centos 之间的工程目录文件夹共享,这一点,在某些所见即所得的开发(比如 Lua 脚本)的开发和调试时,非常方便。
SpringCloud 微服务开发和自验证环境的设置,涉及到两个方面:
(1) 中间件相关的环境变量配置
(2)主机名称的配置
首先,介绍一下中间件相关的环境变量配置。
对于中间件(含 Eureka、Redis、Mysql等)相关的IP地址、端口、用户账号等信息,一般都直接在应用配置文件中明文编码,其实这些信息建议尽量通过操作系统环境变量的方式进行配置。例如,在 bootstrap.yml 中要对 Eureka 的 IP 进行配置,可以使用环境变量 EUREKA_ZONE_HOST ,具体如下:
这些环境变量,包含 Eureka、Redis、RabbitMq 等服务器的IP地址。如果在bootstrap.yml中要对 Eureka 进行配置,可以使用环境变量 EUREKA_ZONE_HOST ,具体如下:
eureka:
client:
serviceUrl:
defaultZone: http://${EUREKA_ZONE_HOST:localhost}:7777/eureka/
上面的写法,通过${EUREKA_ZONE_HOST} 表达式去获取 Eureka 的IP地址。并且,环境变量后面跟着一个冒号和一个默认值,表示如果当前系统环境变量中 EUREKA_ZONE_HOST 为空时,就会使用默认值 localhost 来填充了。
通过环境变量配置中间件的信息,有什么好处呢?一是可以使得配置的切换(如IP切换),多了一层灵活性。二是可以做到不用在配置文件总明文编码一些密码之类的敏感信息,多了一层安全性。
crazy-springcloud 微服务开发脚手架用到的环境变量较多,以 centos 的 /etc/profile 的内容为例,大致如下 :
export DB_HOST=192.168.233.128
export REDIS_HOST=192.168.233.128
export EUREKA_ZONE_HOST=192.168.233.128
export RABBITMQ_HOST=192.168.233.128
export ZOOKEEPER_HOSTS=192.168.233.128
192.168.233.128 是 笔者的自验证环境 centos 虚拟机 IP, Zookeeper、Redis 、Eureka、Mysql、Nginx 都跑在这台虚拟机上,大家在使用跑 crazy-springcloud 微服务开发脚手架之前,需要进行对应的更改。
然后,再介绍一下有关主机名称的配置。
由于笔者在调试过程中,使用直接访问 IP 时使用 Fiddler 工具抓包和查看报文不方便,所以将 IP 地址在 hosts 文件中,都映射成了主机名称,大致会用到了主机名称如下:
127.0.0.1 crazydemo.com
127.0.0.1 file.crazydemo.com
127.0.0.1 admin.crazydemo.com
127.0.0.1 xxx.crazydemo.com
192.168.233.128 eureka.server
192.168.233.128 zuul.server
192.168.233.128 nginx.server
192.168.233.128 admin.nginx.server
组件 | 链接地址 |
---|---|
Eureka | Eureka 入门,带视频 |
SpringCloud Config | springcloud Config 入门,带视频 |
spring security | spring security 原理+实战 |
Spring Session | SpringSession 独立使用 |
分布式 session 基础 | RedisSession (自定义) |
重点: springcloud 开发脚手架 | springcloud 开发脚手架 |
SpingSecurity + SpringSession 死磕 (写作中) | SpingSecurity + SpringSession 死磕 |
crazymaker-uaa | …ing |
crazymaker-seckill | …ing |
cloud-zuul | …ing |
小视频以及所需工具的百度网盘链接,请参见 疯狂创客圈 高并发社群 博客
具体,请关注 Java 高并发研习社群 【博客园 总入口 】
最后,介绍一下疯狂创客圈:疯狂创客圈,一个Java 高并发研习社群 【博客园 总入口 】
疯狂创客圈,倾力推出:面试必备 + 面试必备 + 面试必备 的基础原理+实战 书籍 《Netty Zookeeper Redis 高并发实战》
Netty 源码、原理、JAVA NIO 原理
Java 面试题 一网打尽
疯狂创客圈 【 博客园 总入口 】