项目准备阶段
本章中,我们将开始一个大型实战项目——博客网站。通过“以战代练”的方式来学习如何构建Spring Cloud微服务架构,让读者走出理论的丛林,在实践中玩转微服务架构。
我们知道,在正式开始搭建框架之前,首先应分析项目需求,再进行原型和UI设计,接着设计数据库结构,最后根据项目特点进行技术选型。本章将依次为大家介绍框架搭建前的准备事宜。
项目介绍
- 相信大家都使用过博客,一个完整的博客网站大多包括以下功能。
- 博客列表:通过搜索或者分类展示用户发布的博客列表。
- 评论点赞:每个用户都可以对博客进行评论或点赞。
- 博客收藏:用户可以对自己喜欢的博客进行收藏,方便下次阅读。
- 个人中心:包含用户自己发布的博客列表、账号管理、收藏管理、评论管理等功能。
通过本实战练习,读者将学习到如何搭建注册中心、配置中心和服务网关,了解各服务间如何通信,学会负载均衡的运用,能够通过Elasticsearch实现博客搜索,学会消息队列的使用,明白如何制定安全策略来保证博客的安全性,能够利用容器技术发布Spring Cloud集群等。
需求分析
想要实现任何一个应用,第一步应该做需求分析。产品经理需要从用户那里获得第一手需求,并进行整理,经过不断地沟通,最终确定完整需求后进行产品设计。
那么,针对本书要开发的博客网站,先来看一下如图5-1所示的流程图,这个图更方便我们分析具体功能。
通过图5-1,可以分析出本博客网站的大致功能。
- 首页会展示一些通过后台管理系统置顶的博客,也可以记录用户浏览习惯,推送一些用户可能感兴趣的博客。
- 通过首页可以进入分类列表,根据分类展示该分类下的博客。
- 点击博客,可以进入指定的博客详情页。登录用户可以对博客评论、点赞和收藏。口首页会设置一个搜索功能,根据用户输入模糊搜索博客列表。
- 用户可以在博客网站进行注册并登录,通过首页可以进入个人中心页,其中用户可以发表博客、维护账户、管理收藏夹。
以上就是通过流程图分析的简单的功能需求,通过需求分析,我们就可以设计产品并画出原型图。
产品设计
产品设计阶段是整个网站开发最重要的阶段,产品设计的成败往往决定着网站的成败。一个好的项目开发,产品设计阶段需要占到整个项目进度的50%甚至更多,才能保证整个项目开发的合理性。
一个优秀的产品应遵循以下几个原则。
- 用户至上。在设计产品时,我们必须从用户的角度出发,增强用户体验,保证用户以最少的操作完成最多的事情。
- 功能优于炫酷的界面。这条原则和上一条原则并不冲突,因为用户在使用产品时,首先注重该产品功能,其次才是产品的美观。不能一味追求炫酷的界面而忽视了产品功能及用户体验。
- 产品的迭代性。任何一个产品都不可能一蹴而就,需要经过长期的迭代才能逐步完善产品,因此在设计时应考虑产品的迭代开发。
除此之外,我们在设计产品时还应注意权衡用户体验与开发人员的开发成本,在尽可能保证用户体验的前提下,减少开发难度。
根据5.2节的需求分析,可以使用Axure设计出如图5-2到图5-4的原型图。
由于篇幅有限,无法将所有原型界面列举出来。要看全部原型设计界面,请自行下载本文的配套资料。本文配套资源可从图灵社区(iTuring.cn)本文主页免费注册下载。
架构方案分析
对于后端开发人员来说,最重要的莫过于对项目进行架构方案分析,包括技术选型、架构图设计、技术架构搭建等。那么,本节将针对博客网站分析出一套行之有效的微服务架构方案。
技术选型
针对本项目,本文采用微服务架构,选择Spring Cloud作为博客网站的微服务解决方案。
本文写作之时,Spring Cloud官方的最新版本为Finchley.RELEASE,而Spring Boot的最新版本为2.0.3.RELEASE,本文亦采用此版本。
架构图设计
确定好技术方案后,在创建应用前,我们需要设计项目的架构图,以便将来搭建框架时能够保证架构清晰明了。图5-5展示了博客网站的整体架构思路。
架构图将业务分为几个模块:用户管理((user )、博客管理( blog)、评论管理(comment)、分类管理( category )和搜索引擎( search )。每个模块对应不同的场景,它们分别注册到注册中心( register )中,通过服务网关( gateway)对外提供服务,将配置信息都保存到Git仓库,通过配置中心( config )拉取配置。
本项目采用MySQL数据库,缓存方面采用Redis并使用Elasticsearch为搜索引擎提供服务。
根据架构图创建工程
本节中,我们将根据架构设计图创建工程,并且添加好对应的依赖。
(1)创建一个名为blog 的父工程,将<packaging>设置为pom,如图5-6所示。
(2)按照架构图5-5所示,在blog工程下分别创建子工程,创建好后的结构如图5-7所示。
其中,register表示注册中心,config表示配置中心,gateway表示服务网关,client包含所有业务模块( blogmgr表示博客管理,category表示分类管理,comment表示评论管理,search表示搜索引擎,user表示用户管理),common表示工程的公共模块,public表示业务模块的公共类库。
(3)根据工程的作用,添加该工程的基本依赖。可以按照以下操作依次进行。在 blog 父工程中引入Spring Boot和 Spring Cloud 版本:
代码语言:javascript复制<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId><version>2.0.3.RELEASE</version>
<relativePath/>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId><version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope></dependency>
</dependencies></dependencyManagement>
在register中添加注册与发现服务模块eurekaserver :
代码语言:javascript复制<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>
</dependencies>
在gateway中添加 Spring Cloud Gateway组件:
代码语言:javascript复制<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</ artifactId>
< / dependency>
在config中添加 Spring Cloud Config组件:
代码语言:javascript复制<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
前面提到了common为工程的公共模块,因此所有工程都需要依赖它,在每个子工程中加入以下依赖:
代码语言:javascript复制<dependency>
<artifactId>common</artifactId>
<groupId>com.lynn.blog</groupId>
<version>1.0-SNAPSHOT</version>
</dependency>
此外,由于从Spring Cloud Finchley开始,客户端服务默认集成了熔断器,所以需要引入hystrix,否则启动会报错;每个模块都可以注册到注册中心,所以要依赖eurekaclient,以便每个模块都能引用;config 为配置中心客户端的依赖包,在后续创建配置中心的环节中需要用到它;为了简化实体类,还应该引入lombok类库。注意要使用lombok,还需要安装相应的 IDEA插件,具体安装方法请参看附录A。因此,在common下添加基本的公共依赖项:
代码语言:javascript复制<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId></ dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId></dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId></dependency>
<dependency>
<groupId>org.projectlombok</groupId><artifactId>lombok</ artifactId>
<version>${lombok.version}</version>
</dependency>
这样我们就完成了基本工程的创建,在后面的章节中,我将以此工程为基础,带领读者完成博客网站的后端开发。
数据库结构设计
在正式开发之前,还要进行数据库的设计。数据库结构设计的好坏,往往也决定着系统应用的扩展性,因此这部分工作也是非常重要的。
根据前面的原型设计,就能很好地设计数据库。经过分析,本博客大致有以下数据库表。
- 用户表:用于存放用户信息,包括账号和密码。
- 分类表:用于存放博客的分类列表。
- 博客表:用于存放博客信息,博客信息都是用户发布的,所以会增加用户ID以关联用户表。
- 评论表:用于存放用户对博客的评论内容。
- 点赞表:用于存放用户对评论的点赞记录。
- 收藏表:用于存放用户收藏的博客列表,通过博客ID关联到博客表。
其对应的数据关系图如图5-8所示。
小结
通过本章的学习,我们了解到一个项目从需求分析、产品设计到最后的架构设计的整套流程。在实际的项目中,无论流程如何改变,这些基本思路是不变的。
本文给大家讲解的内容是springcloud实战:项目准备,构建大型实战项目博客网站
- 下篇文章给大家讲解的是springcloud实战:从公共模块入手搭建一套完整的微服务架构;
- 觉得文章不错的朋友可以转发此文关注小编;
- 感谢大家的支持
本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。