要了解微服务我们首先需要了解一下软件发展的背景,我们早期的系统都是单体架构,即所有的功能代码都打到都放到同一个jar包或者war中。
在互联网发展初期,由于用户量少以及业务不算庞大,所以这种架构在使用过程中没有出现问题。
随着互联网的快速发展,用户基数不断扩大,业务不断发展壮大,我们的单体系统出现了下面几个问题:
牵一发动全身
的bug
。正是这种种原因,所以我们就需要通过微服务架构,按照业务和数据表的维度进行圈表,确定服务拆分方案,解耦并重构各个功能模块划分出,独立、自治、可复用的微服务架构。从而解决上述所有问题。
Spring Cloud Alibaba
是阿里巴巴提供的一套微服务解决方案,通过Spring Cloud
体系结合阿里自研开源中间件确保用户可以通过少量注解和配置即可快速搭建出一套微服务应用系统。
从Spring Cloud Alibaba
系列组件图中我们可以看到阿里为我们提供了如下强大功能的组件:
Spring Cloud Alibaba
算是如今比较常用的微服务框架,本系列文章是参考GitHub
项目https://github.com/samkakkk/cloud-alibaba结合个人所学整合一个系列教程。
由于文章涉及的知识点较多,所以笔者就以此文章对系列教程进行一个概括性的介绍。
为了保证在开发或生产环境都能做到快速部署我们开发的服务,我们首先需要了解一下docker
,通过docker容器化应用的特点,我们只需简单的配置加命令,即可在任意环境下完成统一的微服务系统搭建。
教程的第一篇文章是对docker的基础入门教程,文章包含docker简介、基本专有名词概念扫盲、并通过几个简单的实战案例带读者了解docker
基本安装和使用。
CSDN文章地址:
docker入门小结
个人网站地址:
docker入门小结
随着需要docker
部署的服务逐渐增加,使用docker命令部署服务变得非常麻烦,所以我们引入docker-compose
,通过docker-compose
实现一份配置配置文件结合镜像文件快速完成多服务部署。
在docker-compose
的教程中,我们首先会介绍一下docker-compose
的基本概念,介绍docker-compose
常见指令和操作命令,并通过一个简单web应用带读者了解docker-compose
的实际操作。
CSDN文章地址:
使用docker编排容器
个人网站地址:
使用docker编排容器
通过上文的介绍我们了解的docker-compose
常见操作,然后我们基于docker-compose
完成Nacos
、Sentinel
、MySQL
容器的编排,并部署到服务器中。
CSDN文章地址:
基于docker-compose部署微服务基本环境
个人网站地址:
基于docker-compose部署微服务基本环境
通过docker系列文章,我们完成的项目基础环境的搭建,然后我们就可以基于Spring Boot框架
快速落地我们所需要的订单服务、库存服务、用户服务,并将服务注册到Nacos
上。
CSDN文章地址:
注册服务到nacos
个人网站地址:
注册服务到nacos
微服务架构下,某些功能可能需要跨服务调用,这就使得我们的调用就需要进行HTTP
协议进行网络交互,如果每一次远程调用我们都需要编写一堆HTTP连接代码并手动处理返回值格式,这对于Java
开发来说简直就是灾难。
所以我们引入openFeign
,通过openFeign
我们即可通过几条简单的配置和接口即可实现远程调用犹如本地调用一样简单。
CSDN文章地址:
微服务远程调用openFeign整合
个人网站地址:
微服务远程调用openFeign整合
我们在开发过程中分为开发和生产环境,为了方便我们的配置在不同环境中能够快速切换,我们专门花了一篇文章讲解Nacos
为我们提供的三种环境配置隔离的方式,并完成开发环境和生产环境的配置隔离。
CSDN文章地址:
微服务配置隔离
个人网站地址:
微服务配置隔离
我们的业务可能会在不同的服务中来回调用,这就使得我们的服务间的事务变得无法统一管理,所以我们集成了seata
完成对微服务的分布式事务的管理。
文章首先基于docker
完成seata
环境搭建,确保seata
成功搭建后我们会将seata
注册到nacos
,最后我们会基于一个用户下单的功能给读者展示seata是如何保证最终一致性的。
CSDN文章地址:
基于docker整合seata
个人网站地址:
基于docker整合seata
我们的服务是以不同端口号运行的,所以为了方便前端统一调用以及后端统一鉴权管理,我们整合了gateway
,通过gateway
完成所有服务路由配置和负载均衡策略确保服务调用的统一以及服务高可用。
CSDN文章地址:
整合服务网关gateway
个人网站地址:
整合服务网关gateway
花费了大量时间完成功能的开发,终于可以将第一版本代码部署到服务器上,本篇文章会通过maven
插件将本地应用打包成镜像推送到云服务器上,然后通过docker-compose
将镜像构建成容器。
CSDN文章地址:
基于docker容器化部署微服务
个人网站地址:
基于docker容器化部署微服务
碍于服务器配置,老版本的Nacos
对内存占用过大,所以我们必须对nacos
通过JVM
参数调整堆区大小进行调整,由于项目开发初期用的是1.1.x
版本,docker
并不支持JVM
参数调整,查阅官方文档将Nacos
升级为1.4.2
,再调整堆区内存以节省服务器内存。
CSDN文章地址:
记一次Nacos容器升级调优
个人网站地址:
记一次Nacos容器升级调优
我们现在使用openFeign
进行远程调用时,客户端都是采用默认的HttpURLConnection
,所以本篇文章就通过调整openFeign
客户端并通过Jmeter压测查看不同客户端性能,完成远程调用性能调优。
CSDN文章地址:
基于压测进行Feign调优
个人网站地址:
基于压测进行Feign调优
对于生产环境监控是非常有必要的,我们的请求基本是要结果网关,所以我们通过gatway拦截器获取用户请求参数和服务响应结果以及接口请求耗时等信息,为了方便后续可以定期监控这些数据,我们引入mongodb完成监控数据采集和保存。
CSDN文章地址:
Gateway全局异常处理及请求响应监控
个人网站地址:
Gateway全局异常处理及请求响应监控
我们在日常使用中发现seata
遇到错误都会进行回滚补偿,且压测时发现在多服务间使用seata性能非常差,所以我们引入rocketMQ
服务间的调用解耦从而提高系统性能,并通过消息队列错误重试机制确保消息最大可能性交付确保支付功能的可靠性。
CSDN文章地址:
基于RocketMQ实现分布式事务
个人网站地址:
基于RocketMQ实现分布式事务
完成功能开发测试后,为了部署环境统一,我们还是采用docker-compose编排一套MQ的配置并部署到服务器上。
CSDN文章地址:
RocketMQ容器化最佳实践
个人网站地址:
RocketMQ容器化最佳实践
我们现在对docker
的操作都是基于命令行的,为了完成一个操作经常需要结合好几条命令才能做到,为了简化操作,我们引入docker
图形化工具Portainer
,并基于Portainer
搭建了一个redis sentinel
的例子让读者了解Portainer
的基本操作和使用。
CSDN文章地址:
Docker图形化界面工具Portainer最佳实践
个人网站地址:
Docker图形化界面工具Portainer最佳实践
Spring Cloud Alibaba 新一代微服务解决方案
高并发系统实战派:集群、Redis缓存、海量存储、Elasticsearch、RocketMQ、微服务、持续集成等 短评