微服务实践小结

前言

什么是微服务?为什么需要微服务?

要了解微服务我们首先需要了解一下软件发展的背景,我们早期的系统都是单体架构,即所有的功能代码都打到都放到同一个jar包或者war中。
在互联网发展初期,由于用户量少以及业务不算庞大,所以这种架构在使用过程中没有出现问题。

微服务实践小结_第1张图片

随着互联网的快速发展,用户基数不断扩大,业务不断发展壮大,我们的单体系统出现了下面几个问题:

  1. 代码分支管理困难: 因为业务的不断扩展,可能项目组会以业务来划分团队,因为项目开发周期不同,导致不同的团队可能会在同一时间改动同一段功能代码,导致代码分支管理十分混乱,上线时会因为代码合并的冲突导致种种问题。

微服务实践小结_第2张图片

  1. 编译和部署困难: 因为团队中会涉及不同的业务场景可能会集成某些配置文件和系统参数,由于不同模块的开发者没有实时保持沟通,这类现象很可能导致项目在编译和部署启动时出现各种问题。
  2. 数据库连接耗尽:因为单体系统集成了所有的功能,这就意味着所有的功能都依赖同一个数据库,一旦某个功能某段时间有大流量涌入,很可能导致数据库连接资源耗尽。

微服务实践小结_第3张图片

  1. 服务复用困难:项目随着业务迅速发展,导致各个团队某些公用模块很可能会按照自己的方式进行开发,这就意味着新的业务引入需要用到这些功能时,原有某块的代码无法复用。举个例子: 系统中用户中心和支付中心都要用到登录功能,由于业务快速迭代开发两个模块开发者没有及时沟通或者协调好,导致登录功能彼此独立开发,结果新增业务也要用到登录功能但是两个登录功能特性完全不一致,也不符合新增业务的需求,这就导致了现有模块无法复用的尴尬现象。

微服务实践小结_第4张图片

  1. 新增业务困难:这点不必多说,由于业务代码不断堆砌,引入某些功能很可能导致牵一发动全身bug
  2. 发布困难:每次版本发布都需要协调各个项目组不要提交代码,导致功能排期难以协调。
  3. 团队协作成本高:上述所有原因最终问题就是团队协作成本非常高。

正是这种种原因,所以我们就需要通过微服务架构,按照业务和数据表的维度进行圈表,确定服务拆分方案,解耦并重构各个功能模块划分出,独立、自治、可复用的微服务架构。从而解决上述所有问题。

微服务实践小结_第5张图片

Spring Cloud Alibaba是什么?有什么优势?

Spring Cloud Alibaba是阿里巴巴提供的一套微服务解决方案,通过Spring Cloud体系结合阿里自研开源中间件确保用户可以通过少量注解和配置即可快速搭建出一套微服务应用系统。

Spring Cloud Alibaba系列组件图中我们可以看到阿里为我们提供了如下强大功能的组件:

  1. Nacos:服务注册中心和配置中心,对所有服务进行配置和服务调用管理。
  2. Sentinel:流控、系统负载保护、熔断降级等多个维度保护系统稳定性的开源工具。
  3. Dubbo:一款国内应用比较广泛一款高性能RPC框架。
  4. Seata:阿里巴巴的开源产品,一个仅需简单配置和注解即可快速实现分布式事务的综合解决方案。
  5. Rocketmq:开源的分布式消息系统,提供高可靠、低延时的消息发布订阅服务。
  6. Arthas:一款阿里自研的基于字节码增强技术实现动态追踪的强大监控工具。

微服务实践小结_第6张图片

Spring Cloud Alibaba系列文章介绍

Spring Cloud Alibaba算是如今比较常用的微服务框架,本系列文章是参考GitHub项目https://github.com/samkakkk/cloud-alibaba结合个人所学整合一个系列教程。
由于文章涉及的知识点较多,所以笔者就以此文章对系列教程进行一个概括性的介绍。

系列文章导航简介

极简的docker入门

为了保证在开发或生产环境都能做到快速部署我们开发的服务,我们首先需要了解一下docker,通过docker容器化应用的特点,我们只需简单的配置加命令,即可在任意环境下完成统一的微服务系统搭建。

微服务实践小结_第7张图片

教程的第一篇文章是对docker的基础入门教程,文章包含docker简介、基本专有名词概念扫盲、并通过几个简单的实战案例带读者了解docker基本安装和使用。

CSDN文章地址:

docker入门小结

个人网站地址:

docker入门小结

随着需要docker部署的服务逐渐增加,使用docker命令部署服务变得非常麻烦,所以我们引入docker-compose,通过docker-compose实现一份配置配置文件结合镜像文件快速完成多服务部署。

微服务实践小结_第8张图片

docker-compose的教程中,我们首先会介绍一下docker-compose的基本概念,介绍docker-compose常见指令和操作命令,并通过一个简单web应用带读者了解docker-compose的实际操作。

CSDN文章地址:

使用docker编排容器

个人网站地址:

使用docker编排容器

通过上文的介绍我们了解的docker-compose常见操作,然后我们基于docker-compose完成NacosSentinelMySQL容器的编排,并部署到服务器中。

CSDN文章地址:

基于docker-compose部署微服务基本环境

个人网站地址:

基于docker-compose部署微服务基本环境

将服务注册到Nacos

通过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完成所有服务路由配置和负载均衡策略确保服务调用的统一以及服务高可用。

微服务实践小结_第9张图片

CSDN文章地址:

整合服务网关gateway

个人网站地址:

整合服务网关gateway

容器化部署

花费了大量时间完成功能的开发,终于可以将第一版本代码部署到服务器上,本篇文章会通过maven插件将本地应用打包成镜像推送到云服务器上,然后通过docker-compose将镜像构建成容器。

CSDN文章地址:

基于docker容器化部署微服务

个人网站地址:

基于docker容器化部署微服务

升级Nacos完成应用调优

碍于服务器配置,老版本的Nacos对内存占用过大,所以我们必须对nacos通过JVM参数调整堆区大小进行调整,由于项目开发初期用的是1.1.x版本,docker并不支持JVM参数调整,查阅官方文档将Nacos升级为1.4.2,再调整堆区内存以节省服务器内存。

CSDN文章地址:

记一次Nacos容器升级调优

个人网站地址:

记一次Nacos容器升级调优

调整openFeign客户端

我们现在使用openFeign进行远程调用时,客户端都是采用默认的HttpURLConnection,所以本篇文章就通过调整openFeign客户端并通过Jmeter压测查看不同客户端性能,完成远程调用性能调优。

CSDN文章地址:

基于压测进行Feign调优

个人网站地址:

基于压测进行Feign调优

gateway监控

对于生产环境监控是非常有必要的,我们的请求基本是要结果网关,所以我们通过gatway拦截器获取用户请求参数和服务响应结果以及接口请求耗时等信息,为了方便后续可以定期监控这些数据,我们引入mongodb完成监控数据采集和保存。

CSDN文章地址:

Gateway全局异常处理及请求响应监控

个人网站地址:

Gateway全局异常处理及请求响应监控

基于消息中间件优化分布式事务性能

我们在日常使用中发现seata遇到错误都会进行回滚补偿,且压测时发现在多服务间使用seata性能非常差,所以我们引入rocketMQ服务间的调用解耦从而提高系统性能,并通过消息队列错误重试机制确保消息最大可能性交付确保支付功能的可靠性。

CSDN文章地址:

基于RocketMQ实现分布式事务

个人网站地址:

基于RocketMQ实现分布式事务

完成功能开发测试后,为了部署环境统一,我们还是采用docker-compose编排一套MQ的配置并部署到服务器上。

CSDN文章地址:

RocketMQ容器化最佳实践

个人网站地址:

RocketMQ容器化最佳实践

docker图形化管理工具

我们现在对docker的操作都是基于命令行的,为了完成一个操作经常需要结合好几条命令才能做到,为了简化操作,我们引入docker图形化工具Portainer,并基于Portainer搭建了一个redis sentinel的例子让读者了解Portainer的基本操作和使用。

CSDN文章地址:

Docker图形化界面工具Portainer最佳实践

个人网站地址:

Docker图形化界面工具Portainer最佳实践

参考文献

Spring Cloud Alibaba 新一代微服务解决方案

高并发系统实战派:集群、Redis缓存、海量存储、Elasticsearch、RocketMQ、微服务、持续集成等 短评

你可能感兴趣的:(微服务,docker,微服务,spring,cloud,容器)