Spring Cloud 微服务实践 (0) - 开篇闲话

用户头像
xiaoboey
关注
发布于: 2020 年 09 月 16 日
Spring Cloud 微服务实践(0) - 开篇闲话

我在 《人生修炼秘籍》一文中曾说到,最初来InfoQ是准备写微服务方面的一些项目实践经验,没想到过了一个月才有时间来把这个债还上。



封面图片由 Gerd AltmannPixabay上发布

1、起心动念

为什么要写这一系列的文章呢?给自己一个理由先



写Spring Cloud相关的内容,最初就是想记录一下我在搭开发框架时的一些尝试和抉择,因为时间长了,即使你自己一个一个字符敲出来的代码,也得“细思量”才能“恍然大悟”。好记性不如烂笔头啊^_^



其次,对项目团队的开发成员来说,有一个从头细说的文档,那也是比开会巴拉巴拉讲得口干舌燥要好。



然后对我个人而言,就是修自己的“知行合一”:实践“费曼学习法”,把自己学到的知识分享出来,在分享(传授)的过程中巩固和加深对知识的理解。



2、从0到n,先易后难

从0到1,从入门到精通,从xxx到xxx



这一系列叫“Spring Cloud 项目实践”,就是从头开始构建项目再慢慢演化的意思,到最后得到一个可以用在生产环境的Spring Cloud微服务开发框架。



从我个人学习的心路历程来说,喜欢先易后难,先有一个能上手的东西是最好不过了,然后再去慢慢探索深究。如果一来就给一个五脏俱全的Spring Cloud开发脚手架,部署什么的都要弄半天,那实在是有点让人发怵,并且你还不知道有些什么坑等着你去踩。



所以我会尽量用简单的方式来搭建和讲解,并且贯彻我在写代码方面的一个经验:大道至简。简单的才是最好的,才是稳定可靠的。很多时候,如果你自己都觉得你这个代码很复杂,需要写很多注释来解释你的代码,那可能是思路错了,或者是代码的组织结构需要调整了。



软件开发也有一个KISS原则,Keep It Simple and Stupid,所以前期的文章我会尽量简化,只保留最基本的步骤和代码,或者说采取我认为可能大家更容易理解的方式,把那些扩展或者优化用分支的方式进行讲解。



3、不要为了微服务而微服务

微服务是一种软件开发技术,顾名思义,就是把原来我们写在单体应用里大而全的服务,拆分为相对独立小而美的服务来进行开发部署。在微服务体系中,服务是细粒度的,体现在“微”字上。



微服务架构带来了很多好处,主要是可伸缩性、业务解耦和独立部署。细粒度的服务给人的感觉是更容易驾驭,从团队协作来说,业务拆分后,每个人的着眼点更小更具体,更容易实现。从部署上来说,可以给耗资源的服务更多的资源倾斜,结合Kubernetes这类容器编排应用,使得系统的性能扩展变得很简单。



但是从整体看,微服务也增加了系统的复杂度,因为我们的系统既要化整为零,也要合零为整,业务拆分得越细越复杂。说到底微服务只是一种开发技术,你最终交付出来的还是一个完整的软件系统,开发和运维Team玩得再牛,终端用户也是无感的,他也不关心你用的什么方式开发。所以软件团队对微服务的采用,还是得仁者见仁智者见智,不能为了微服务而微服务。



这里说微服务增加了系统的难度,除了业务的拆分需要仔细考虑,还因为类似Spring Cloud这样的微服务框架,把微服务架构上的很多东西也带到了代码开发上来。比如服务调用的负载均衡,比如用户认证和访问控制,虽然Spring Cloud做了封装和简化,但开发的时候你还是会分心去处理它,不能完全只关注业务。微软主导的开源项目 Dapr 有可能是微服务的发展方向,它试图简化微服务的开发,把微服务架构方面的东西都剥离出来成为基础设施,开发只需关注具体的业务实现,但是Dapr离投入生产环境使用还早,可以跟踪关注一下。



4、Spring Cloud的复杂性

从官网 https://spring.io/projects/spring-cloud 可以看到,Spring Cloud的子项目有几十个,每一个都是针对特定问题或者需求的解决方案,虽然有一些是重复的(比如Zuul和Gateway),也有一些是不同厂商的实现,但也足够多了。



实际的微服务方案中,你可以按需选择进行集成。我的建议是不要搞大而全的方案,逐渐演化,不要过度设计。



这里给一个我在实际项目中写文档时用到的图,是在ProcessOn上用一个免费的模板改的,可以体会一下它的复杂性。这还不是Spring Cloud全家桶。



Spring Cloud 的复杂性



5、Spring Cloud的简化方案

我们简化一下,只留下最基本的服务注册与发现、网关和具体业务。



Spring Cloud 简化



服务注册与发现,是微服务架构中必不可少的服务,其他服务启动后都向它报到,主要是告知自己的服务名称和地址,方便服务之间的协作。网关则是微服务整个集群跟外部的边界,外部访问微服务提供的能力都是通过网关进行。其他的业务集群和数据库则是我们熟悉的东西。



后续我们按这个简化版的网络拓扑图,从0开始开发一个能跑起来的Spring Cloud项目。



6、前置基础知识和开发工具

工欲善其事,必先利其器。照理说冲Spring Cloud来的读者大大,应该都是具备相关的基础知识和实践能力的,但也不排除有比较猛冲过头的,所以还是啰嗦讲一下比较好。包括Java基础、Spring Framework、Spring Boot、Git、Maven等。



Java语言方面,学了J2SE就可以了,核心是数据库操作(JDBC)、接口定义、输入/输出、网络编程。



Spring Framework(有时也简称为Spring)需要掌握依赖注入(DI,Dependency Injection)和控制反转(IoC,Inversion of Control)等思想。Spring Framework实现了IoC和AOP容器,可以和很多常用的开源框架(Hibernete、Redis等)集成,对数据库操作(JDBC、JPA)等做了封装和集成,支持声明式事务管理,支持基于Servlet的MVC开发。这里只列举了Spring Framework的一部分常用功能,作为一个发展了这么多年的Java 企业开发的事实标准,用博大精深来形容一点也不过分。建议大家先有个大概的了解,认认路,工作中实际用到时再去深究。



Spring Boot 是对Spring Framework的组装,通过内置默认配置的方式,减少了应用开发的配置,使得可以轻装上阵快速开始,这大概也是取名叫“Boot”的缘由。之前的Spring开发都是基于XML配置的,集成第三方功能时需要配置XML,有些功能库在实现业务时也需要配置XML,比如Hibernate和MyBatis,这导致项目中有大量的XML文件,再想想开发、测试和生产环境的配置多半还不一样,名副其实的XML地狱。后来为了缓解这个情况,Spring还推出了配置类,也就是用Java代码代替XML配置,再过度到现在的Spring Boot,让Java的开发效率大大提升。



Spring Cloud则是基于Spring Boot开发的微服务框架。



所以,Java语言基础、Spring Framework、Spring Boot和Spring Cloud,这四者的关系都是前者是后者的基础,学习时不要跨越中间某个环节直接学后面的内容。



Git是代码的版本管理工具,软件开发离不开代码的版本管理。Maven则是项目的构建工具,是很好的项目辅助工具。集成开发工具(IDE),推荐用Intellij IDEA,或者Eclipse和Visual Code,这不是重点,看个人爱好和缘分(Money)。



下一篇:《Spring Cloud 微服务实践(1) - 用Initializr初始化

发布于: 2020 年 09 月 16 日 阅读数: 77
用户头像

xiaoboey

关注

IT老兵 2020.07.20 加入

资深Coder,爱好钓鱼逮鸟。

评论

发布
暂无评论
Spring Cloud 微服务实践(0) - 开篇闲话