从零搭建一个Spring Cloud项目需要考虑什么?

良心公众号

关注不迷路

最近,菜鸡尝试自己搭了一个Spring Cloud的DEMO,在此将搭建过程中的一些体会分享给大家,给小伙伴们作为参考,同时作为菜鸡自己的踩坑记录,避免重复踩坑。

在进行具体的分享之前,先交代一下背景。

  • 为什么是Spring Cloud?

    随着微服务概念深入人心,Spring Cloud提供的一整套微服务解决方案也为人所熟知。

    先上一段官话,Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发框架。

    听起来是不是贼6!软件领域发展至今,微服务是一个大趋势,而在这个大趋势下产生的新问题,Spring Cloud给出了可以应用于线上环境的解决方案,而且是一整套!此时应该说一句,Spring Cloud真香!

    说一句题外话,Spring Cloud所提供的组件,其背后蕴含的解决问题的思想是非常值得学习的。如果仅限于跟着官网简介用用注解,改改配置,那么这么好的学习机会就浪费了。

    值得一提的是,菜鸡在本文中提的Spring Cloud是广义的Spring Cloud,包括Spring Cloud Alibaba。

然后,交代一下相关的开发环境,避免小伙伴们因为开发环境不同而踩坑。

  • 介绍一下DEMO所用的基本开发环境。

    • 操作系统版本:CentOS 7.6 64位

    • JDK版本:JDK 11.0.7,截至目前,JDK11是继JDK8之后的最新LTS版本

    • 数据库:MySql 8.0.20,截至目前,最新版是MySql 8.0.21,选用最新版的上一个稳定版本

    • Spring Cloud Hoxton.SR5,截至目前,最新版是Hoxton.SR6,选用最新版的上一个稳定版本

    • Spring Boot 2.2.5 Release,注意,Spring Cloud与Spring Boot版本之间是有依赖关系的,不能随意选取。

      对于此,Spring Cloud官网cloud.spring.io给出的建议是Spring Cloud Hoxton.SR5Spring Boot 2.2.4 Release。

      那么问题来了,为什么菜鸡没有听从官网的建议呢?其实菜鸡并不是特立独行,根据以往经验,按照官网的建议能最大限度地避免踩坑。

      但是再经过实践之后,菜鸡发现这两个版本搭配起来会出问题,有经验的小伙伴都知道,Spring Cloud提供了gateway作为服务网关的一种解决方案,但在这两个版本搭配之下,gateway无法正常启动。将Spring Boot版本省至 2.2.5 Release之后,便解决了这个问题。

      目前菜鸡已经给spring-cloud-gateway提了一个issue。

接下来,就是本文的重头戏了,有关于Spring Cloud微服务框架搭建项目的详情。

  • 介绍一下DEMO组件选取的基本思路。

    • 大方向上尽可能主流,一方面,主流是经过了大量的实际场景验证的,证明了其可用性;另一方面,如果出了问题,也会有较多的参考资料。

    • 版本上尽可能选择稳定版本,避免掉入不必要的坑。

    • 在保证前两条的前提下,尽可能新。一方面,新技术替代老技术是有其合理性的,比如说,新技术的应用会给系统带来更稳定的表现,或者更高的性能,或者更丰富的应用场景,又或者更适配的解决方案……

      另一方面,DEMO的性质不同于实际的线上服务,新技术应用的过程也是学习的过程,因此,技术选型不宜过于保守。

  • 介绍一下DEMO的组件选取。

    微服务架构服务治理(注册与发现),服务网关,配置中心等一系列组件,每种组件有不止一种选择,在此介绍一下菜鸡是如何选择的,以及是出于什么考虑。

    • 注册中心:eureka VS nacos

      从零搭建一个Spring Cloud项目需要考虑什么?

      从该表可以看出,nacos在功能上和性能上都比eureka要有进步,但由于开源时间相较于eureka较晚,目前在线上环境应用并不广泛,而eureka经过了大量线上服务验证。

      另一个值得考虑的因素是,eureka进入了维护阶段,而nacos则蒸蒸日上。基于上述考量,菜鸡在DEMO中选取了nacos。

    • 服务网关:zuul VS gateway

      这个毫无悬念,zuul已经是上一代的网关了。

      zuul构建于Servlet 2.5,兼容3.x,使用阻塞式API,不支持websockets。

      gateway构建于Spring 5+,基于Spring Boot 2.x 响应式非阻塞API,支持websockets。

      因此,菜鸡选择了gateway作为服务网关。也正是因为选择了gateway,才机缘巧合出现了上文提到的问题。

    • 配置中心:nacos VS apollo

      在这里,菜鸡曾一度有些纠结,其实apollo是一款很优秀的配置中心,功能比nacos更全面。

      但由于nacos打通了注册中心和配置中心,部署方便,拥有apollo的大部分功能,而且性能略优于apollo。最后,菜鸡选择了nacos。

    • 服务调用:菜鸡选用了新一代的服务调用组件,openfeign

    • 服务降级:菜鸡选用了Spring Cloud Alibaba的服务降级组件,sentinel

到此为止,一个基于Spring Cloud的微服务系统脚手架就此诞生了。后续就是业务逻辑的书写,以及针对特殊场景的处理,比如说,高并发,高可用,大数据场景下,如何保证系统正常工作。

菜鸡将会根据DEMO的后续进展,针对具体问题讨论针对的解决方案。

从零搭建一个Spring Cloud项目需要考虑什么?

学习 | 工作 | 分享

从零搭建一个Spring Cloud项目需要考虑什么?

????长按关注“有理想的菜鸡

只有你想不到,没有你学不到