注意
希望本系列的教程不管是该spring boot生态系列的原创文章还是Netty RPC的文章,感兴趣的小伙伴能够在PC端阅读,一起探讨学习优化,因为app端阅读源代码的体验并不是很高,影响阅读体验,本章并没有源代码,不过从下一章就会有部分代码的贴出,希望大家能够收藏,常看~感谢
前言
一.Dubbo
作为国内最早的RPC调用框架的典范,在13年开始风靡至今,Dubbo它有的不仅仅是远程服务调用的功能,还能有部分服务治理的功能,并且它是由国内巨头 阿里巴巴 开发,由阿里的工程师背书,它的java代码治理也是业界的典范,性能也是无法诟病,核心三大能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现
虽然期间,由于阿里巴巴内部组织架构的调整,Dubbo停止维护了很长时间,但是从去年Dubbo开始被新的团队重新开始维护,并孵化成Apache的顶级项目,官网地址如下,所以用一个经典的框架去学习RPC是一个很好的选择
再附上,那个RPC那个经典的RPC调用流程图,一图恒久远,知识永流传
二.Sentinel
现在 微服务 化国内盛行,不管是在java还是golang的微服务调用生态过程中,为了防止突发流量和并发,或者为了防止部分请求调用链路过长或者因为某种原因,请求处理的时间比较长,或者占用的资源比较多,或者在请求的时候,系统正在FGC,所以在微服务调用中,一个灵魂的设置就是 超时 ,不要忽视这个超时限制,这样可以后来的请求全部hold住,然后请求堆积,最后拖垮整个系统,所以流量的控制,请求超时的控制,在微服务的架构中,必不可少,阿里巴巴的Sentinel和Netflix的Hystrix更是流量整理的翘楚。
Hystrix是老牌的限流熔断地工具,由国外大佬公司Netflix开源,一直以来的地位也是很稳固,不过最近听说不再维护,而且源代码也是Rxjava写的,看源代码的门槛比较高,而我们国内的阿里巴巴在去年开源了Sentinel,一个轻量级的流量控制,熔断降级的类库,并且在今年开始支持集群限流,并且支持控制台,可以显性地看到当前的系统流量
而且它无缝支持spring boot和Duubo,从生态体系上,更加具有亲和性,血缘上就是亲戚,更加本土化,官网地址如下
核心特性如下图,我们也会将其整合到spring boot2.x中去,并且整合我们的dubbo调用
三.配置中心Nacos
CICD的普及,代码配置集中化管理,同样的代码,不同的环境却有不同的配置,现在已经变成了一种趋势,本地不再有大量的properties配置文件,或者yml配置文件,所有的配置都在远端,都在配置中心,项目在启动的时候,第一步就是根据系统配置的配置中心的地址和当前的环境变量,例如“dev”(开发环境),“test”(测试环境),“pre”(预发布环境),”prd”(生产环境) 来进行http或者tcp请求去动态获取配置KV值,环境变量信息你在本地开发的时候,可以使用System.setProperty的方法进行配置,在运维人员的手上只需要加一个启动参数就可以完成不同环境的配置KV信息的加载。
Nacos的官网地址如下
阿里巴巴开源的Nacos,可以完成上述的开发的基本要求,并且它提供的功能比上述的更加强大
1.它可以和zookeeper,etcd等一样提供服务发现的功能
2.它是一个提供管理页面的并且能够动态替换KV的配置中心
3.它无缝支持云化,支持docker,kubernetes等容器云平台
我们可以使用Nacos来整合我们的spring boot2.x系统,做到企业级应用的脚手架工程了,并且也会去学习其中的源码,做到心中有数,先附上Nacos的基本架构图和组件图,大家可以去官网,先去简单地了解一下其基本的架构和使用方式,以后我们细嗅蔷薇~
四.消息中间件RocketMQ
消息中间件在我们日常开发中,已经成了一个必不可少的工具了,掌握消息中间件是一个合格的业务开发工程师的必要技能,它能提供的最大的两个特性就是,系统解耦和流量削峰,在我所认识到具体的业务中有如下使用的方式来优化业务系统的关系
1.定时异步计算系统,自己是消息的生产者,自己也是消息的消费者,把非常复杂的逻辑计算处理切割成多个阶段,这样就可以做成多阶段计算,每个计算的阶段业务逻辑相对独立,相互不影响,假设你的系统有100个实例,也就有100个生产者,100个消费者,因为消息中间件的出现,你的系统自然而然就变成了分布式计算系统了,最大程度地提高系统的可用性和每个系统实例的参与度,提供计算的整体性能
2.支付异步通知回调,做过微信和 支付宝 的支付接口开发的同学都知道,客户完成支付之后,支付宝和微信都会异步通知后台系统的支付结果,如果通知失败,支付宝和微信都会进行重试,都会每隔5s,1mins,15mins ,1hour, 1day ,90days不断地通知,直到收到你的系统确认成功消费的通知,才会停止,做到最大努力通知,达到数据最终一致性,虽然不知道内部的实现原理,但是这个使用消息中间件可以完美地解决这样的问题,但可以想象支付宝和微信的支付量,消息中间件的延迟消息的部署实例数应该是一个恐怖的量,但这个不是我们需要考虑的
3.系统解耦,例如订单系统和 财务系统 ,订单系统把一些订单的系统通过MQ扔给财务系统,不需要关心财务系统的处理逻辑,就可以完整订单模块的逻辑处理,并返回数据给用户了,后续的一些给财务的支付订单数据,并不需要实时做处理,并且在一定程度上允许消费失败,只需要消息消费者设置失败重试等,或者一些其他的手段来控制
消息中间件的产品很多,例如ActiveMQ,RabbitMQ,kafka,RocketMQ等等,本文不去讨论各个中间件的好坏,每个产品都有它的特定和长处,我第一次接触到RocketMQ的时候是15年,当时RcoketMQ基本上也属于半死状态,比Dubbo好一点,虽然当时有人维护,但是当时文档不全,源代码中各种僵尸代码,各种代码不可达,而且当时有人是这么说的“RocketMQ只能阿里能用,因为它的运维过于复杂,各种系统优化配置不是外部公司能够驾驭的”,所以当时学的人很多,实际生产运用的人不多,后来阿里巴巴把其捐给了Apache,慢慢地孵化成了apache顶级项目,代码的健壮性和一些新特性也被加了进来,用的公司也是越来越多,所以我们也会整合rocketMQ到我们的spring boot脚手架中,并且学习RocketMQ的一些核心设计和其核心功能的实现原理,不单单做整合也要做到知其所以然
RocketMQ目前的官网地址如下
五.MYSQL,Redis,Elasticsearch
目前国内互联网用的最多的关系型数据库应该是MySQL,面试问的最多的也是MySQL,例如主从原理, 索引 优化,B+树,索引下推,数据库锁,存储引擎,MySQL的执行计划等等,Spring boot2.x使用MySQL最多的方式还是使用MyBatis加 数据库连接池 的方式使用,数据库连接池高性能的目前主流的有2种,一个是阿里巴巴开源的Druid,一个是HikariCP,我们到时候都会一一整合
Redis也是我们在平时开发中用的非常多的工具,它能够做 缓存 ,减少DB的压力,能够做分布式锁,并提供丰富的数据结构,常用的有5大类型的数据结构,平时开发中也是用的最多,还提供了布隆过滤器,HyberLoglog,BitMap等等的实用的工具,而且面试中,Redis也是必问的一个重要的知识点,5大数据类型底层数据结构,pipeline,单线程模型快的原因,主从原理,Sentinel哨兵机制,缓存雪崩,缓存无底洞,Redis部署的注意点等等都是面试中必问的热点,所以Redis也是我们整合到Spring boot2.X的重点
整合到Spring boot 我们一般不会整合的特别重,在java中一般使用jedis,lettuce,两个实现类上主要是连接到redis服务端的方式不一样,还有一个是线程安全的问题,在大家熟知的开发中jedis用的比较多,功能也比较完善,jedisPool更是我们经常用的,所以我们在整合的时候,应该会整合基本实现,具体使用结合具体的业务场景
Elasticsearch 说起Elasticsearch,不得不佩服它的成功,它的所属公司已经上市了,希望国内的PingCAP也能上市成功吧,Elasticsearch是目前最火的搜索引擎了,它是一个基于 JSON 的分布式搜索和分析引擎,目前用的公司也是越来越多,它的底层是Lucene,不过它屏蔽了Lucene的具体实现,提供了DSL语法,并且提供分布式存储,大大提升了搜索的扩展性和可用性,我来说说近几年我自己使用Elasticsearch的体会吧
1.最简单的它可以当做数据库来使用,所有字段不需要进行分词,所有查询使用Term匹配,这样做的好处就是可以保存千万级甚至数十亿级数据,这样可以解决使用Mysql分表分库不能聚合的问题
2.它是非常优秀的搜索引擎,它提供了大量的简单的查询语法,参数是json,只要按照它的语法就能够查询符合你需求的数据,并且支持插件式的分词方法,支持pinyin,ik等等目前主流的中文分词插件,并且配置方式非常灵活,可以通过设置mapping,mapping类似数据库的建表语句,定义好每个字段的类型和属性,本菜鸟在多个项目使用ES来做搜索,效果和反响都很好,达到预期的效果
3.数据分析,Elasticsearch做数据分析也是非常强大,提供各式各样的纬度和方式来达到数据分析的效果,并且与Kibana整合,提供非常炫酷的数据展示功能
本教程也会将elasticsearch整合到spring boot2.x中,但是并不会使用spring-boot-data的方式,而是使用原生的方式,使用elasticsearch提供的原生jar包,这样做的原因是这样足够轻量, api 也是比较易懂,并且方便扩展,并且讲解elasticsearch的一些基本原理和使用的时候注意事项,方便大家在工作中更加快速的上手Elasticsearch
六.ShardingSphere
ShardingSphere目前国内比较火的分表分库的中间件成熟解决方案,我也只是用过ShardingJDBC,其他的我也没有在实战项目中使用过,它的定位应该是轻量级Java数据库JDBC层框架,我们到时候也会根据实际的场景去使用,整合spring boot和ShardingSphere,完成各类场景的分表分库的使用,这个框架我用的也不是非常多,算是和大家一起学习
ShardingSphere官网
最后再附上一个SharingJDBC的基本架构图
七.整个系统docker和kubernetes部署
在过去的一年,上班的时候一直坐在运维小伙伴的旁边,也或多或少的学习了一点Docker和kubernetes的知识,再加上自己利用业余时间学习了一下docker和kubernetes的基本使用,并且现在很多中间件都提供了上云的支持,所以我们可以尝试将我们上述的所有的一套东西,完整上云,体验一下系统从开发到上线的基本流程和原理,这样能够更加开阔自己的视野和系统规范能力
小结
这是本java系列教程的基础大纲,估计全部写完应该要耗费数月之久,我们不仅仅要做整合,部分的原理我们也要掌握,docker的基本原理,基本网络原理也要基本掌握,各个组件的核心组件和原理也要一一掌握,在整合这些常用的工业级框架的时候,也能够了解其周边的产品,将这些点串化,网状化,形成完整的知识体系,增加我们实战的能力,也可以在无形中增加自己面试的能力
注意:如果上述内容很多小伙伴关注的话,麻烦大家加一个关注,方便以后再PC端看系列教程的文章,因为接下来的文章我会贴部分核心的代码实现,在PC端查询会更加方便,并且也是我们原创写作的动力,谢谢~