如何零基础搭建一套微服务框架(Spring Boot+Dubbo+Docker+Jenkins)

所需积分/C币:20 2018-08-20 17:29:18 271KB PDF

如何零基础搭建一套微服务框架(Spring Boot+Dubbo+Docker+Jenkins)
你的业务发展到一定程度的时候,你会发现一个问题——无论怎么增加节 点,貌似整个集群性能的提升效果并不明显了。这时候,你就需要使用微 服务结构了。 微服务结构 先来对前面的知识点做个总结。 从单机结构到集群结构,你的代码基本无需要作任何修改,你要做的仅仅 是多部署几台服务器,每台服务器上运行相同的代码就行了。但是,当你 要从集群结构演进到微服务结构的时候,之前的那套代码就需要发生较大 的改动了。所以对于新系统我们建议,系统设计之初就采用微服务架构, 这样后期运维的成本更低。但如果一套老系统需要升级成微服务结构的 话,那就得对代码大动干戈了。所以,对于老系统而言,究竟是继续保持 集群模式,还是升级成微服务架构,这需要你们的架构师深思熟虑、权衡 投入产出比。 OK,下面开始介绍所谓的微服务 微服务就是将一个完整的系统,按照业务功能,拆分成一个个独立的子系 统,在微服务结构中,每个子系统就被称为“服务”。这些子系统能够独立 运行在Web容器中,它们之间通过RPC方式通信。 举个例子,假设需要开发一个在线商城。按照微服务的思想,我们需要按 照功能模块拆分成多个独立的服务,如:用户服务、产品服务、订单服 务、后台管理服务、数据分析服务等等。这一个个服务都是一个个独立的 项目,可以独立运行。如果服务之间有依赖关系,那么通过RPC方式调 用 这样的好处有很多 1.系统之间的耦合度大大降低,可以独立开发、独立部署、独立测试, 系统与系统之间的边界非常明确,排错也变得相当容易,开发效率大 大提升。 2.系统之间的耦合度降低,从而系统更易于扩展。我们可以针对性地扩 展某些服务。假设这个商城要搞一次大促,下单量可能会大大提升, 因此我们可以针对性地提升订单系统、产品系统的节点数量,而对于 后台管理系统、数据分析系统而言,节点数量维持原有水平即可。 3.服务的复用性更高。比如,当我们将用户系统作为单独的服务后,该 公司所有的产品都可以使用该系统作为用户系统,无需重复开发。 那么问题来了,当采用微服务结构后,一个完整的系统可能有很多独立的 子系统组成,当业务量渐渐发展起来之后,而这些子系统之间的关系将错 综复杂,而且为了能够针对性地增加某些服务的处理能力,某些服务的背 后可能是一个集群模式,由多个节点构成,这无疑大大增加了运维的难 度。微服务的想法好是好,但开发、运维的复杂度实在是太高。为了解决 这些问题,阿里巴巴的 Dubbo就横空出世了。 知识点2: Dubbo Dubbo是一套微服务系统的协调者,在它这套体系中,一共有三种角色, 分别是:服务提供者(下面简称提供者)、服务消费者(下面简称消费 者)、注册中心。 你在使用的时候需要将 Dubbo的ja包引入到你的项目中,也就是每个服务 都要引入Dubo的ja包。然后当这些服务初始化的时候,Dubo就会将当 前系统需要发布的服务、以及当前系统的P和端口号发送给注册中心,注 册中心便会将其记录下来。这就是服务发布的过程。与此同时,也是在系 统初始化的时候,Dubo还会扫描一下当前系统所需要引用的服务,然后 向注册中心请求这些服务所在的和端口号。接下来系统就可以正常运行 。当系统A需要调用系统B的服务的时候,A就会与B建立起一条RPC信 道,然后再调用B系统上相应的服务。 这,就是 Dubbo的作用。 知识点3:容器化部署 当我们使用了微服务架构后,我们将一个原本完整的系统,按照业务逻辑 拆分成一个个可独立运行的子系统。为了降低系统间的耦合度,我们希望 这些子系统能够运行在独立的环境中,这些环境之间能够相互隔离 在 Docker岀现之前,若使用虚拟机来实现运行环境的相互隔离的话成本较 高,虛拟机会消耗较多的计算机硬件/软件资源。 Docker不仅能够实现运 行环境的隔离,而且能极大程度的节约计算机资源,它成为一种轻量级 的“虚拟机”。 知识点4:自动化构建 当我们使用微服务架构后,随着业务的逐渐发展,系统之间的依赖关系会 日益复杂,而且各个模块的构建顺序都有所讲究。对于一个小型系统来 说,也许只有几个模块,那么你每次采用人肉构建的方式也许并不感觉麻 烦。但随着系统业务的发展,你的系统之间的依赖关系日益复杂,子系统 也逐渐增多,每次构建一下你都要非常小心谨慎,稍有不慎整个服务都无 法正常启动。而且这些构建的工作很oW,但却需要消耗大量的精力,这 无疑降低了开发的效率。不过没关系, Jenkins就是来帮助你解决这个问 题的。 我们只需在Jeηkins中配置好代码仓库、各个模块的构建顺序和构建命 令,在以后的构建中,只需要点击“立即构建”按钮, Jenkins就会自动到 你的代码仓库中拉取最新的代码,然后根据你事先配置的构建命令进行构 建,最后发布到指定的容器中运行。你也可以让 Jenkins定时检查代码仓 库版本的变化,一旦发现变动就自动地开始构建过程,并且让 Jenkins在 构建成功后给你发一封邮件。这样你连“立即构建”的按钮也不需要按,就 能全自动地完成这一切构建过程。 实战动手篇 1.学习目标 接下来我会带着大家,以一个在线商城为例,搭建一套能够自动化部署的 微服务框架。这个框架能做如下几件事情 1.基于 SpringBoot快速开发 我们将选择目前热度很高的 SpringBoot,最大限度地降低配置复杂 度,把大量的精力投入到我们的业务开发中来。 2.基于 Dubbo的微服务化 我们会使用阿里巴巴的开源框架Dubo,将我们的系统拆分成多个独 立的微服务,然后用Dubb来管理所有服务的发布和引用。有了 Dubbo之后,调用远程服务就像调用一个本地函数一样简单, Dubbo 帮我们完成远程调用背后所需要的一切。 3.基于 Docker的容器化部署 由于使用了微服务架构后,我们的系统将会由很多子系统构成。为了 达到多个系统之间环境隔离的目的,我们可以将它们部署在多台服务 器上,可这样的成本会比较高,而且每台服务器的性能可能都没有充 分利用起来。所以我们很自然地想到了虚拟机,在同一台服务器上运 行多个虚拟机,从而实现环境的隔离,每个虚拟机上运行独立的服 务。然而虚拟机的隔离成本依旧很高,因为它需要占用服务器较多的 硬件资源和软件资源。所以,在微服务结构下,要实现服务环境的隔 离, Docker是最佳选择。它比虚拟机更加轻量级,占用资源较少,而 且能够实现快速部署。 4.基于 Jenkins的自动化构建 当我们采用了微服务架构后,我们会发现这样一个问题。整个系统由 许许多多的服务构成,这些服务都需要运行在单独的容器中,那么每 次发布的复杂度将非常高。首先你要搞清楚这些服务之间的依赖关 系、启动的先后顺序,然后再将多个子系统挨个编译、打包、发布。 这些操作技术难度低,却又容易岀错。那么有什么工具能够帮助我们 解决这些问题呢?答案就是—Jeηkⅰns。它是一款自动化构建的工 具,简单的来说,就是我们只需要在它的界面上按一个按钮,就可以 实现上述一系列复杂的过程。 2项目背景介绍 本文我以一个大家都非常熟悉的在线商城作为例子,一步步教大家如何搭 建微服务框架,它有如下功能 产品管理产品的增删改查。 ●订单管理订单的增删改查、购物车功能。 用户管理用户的登录、注册、权限管理、收货地址等等。 ·数据分析提供对本系统数据分析的功能。 注意:本文的IDE使用的是 intelliJ IDeA,推荐大家也用这个,用了都说 好,用了你就会爱上它 3.创建项目的组织结构 在动手之前,我先来说一说这一步的目标: 创建一个 Maven project,命名为“Gaox}” 这个 Project由多个 Module构成,每个Moue对应着“微服务”的一个 子系统,可独立运行,是一个独立的项目。这也是目前主流的项目组 织形式,即多模块项目。 在 GaoxI这个项目下创建各个子模块,每个自模块都是一个独立的 Spring Boot项目: o Gaoxi-User用户服务 o Gaox-Oder订单服务 o Gaoxi- Product产品服务 o gaoxi- Analysis数据分析服务 o gaoxi- Controller本系统的控制层,和以往三层结构中的 Controller层的作用一样,都是用作请求调度,只不过在微服务 架构中,我们将它抽象成一个单独的系统,可以独立运行。 o gaoxi- Common- Service- Facade它处于本系统的最底层,被所 有模块依赖,一些公用的类库都放在这里。 o Gaoxi- Redis我们将 Redis封装成一个单独的服务,运行在独立的 容器中,当哪一个模块需要使用 Redis的时候,仅需要引入该服 务即可,就免去了各种繁琐的、重复的配置。而这些配置均在 Gaoxi- Redis系统中完成了。 下面开始动手 3.1创建 Project NeW-个 Project 选择 Spring Initialize 设置 grouped、 artifact、 version <groupId>com. gaoxi</groupId> <artifactid>gaoxi</artifactId> <version>0.0.1-SNAPSHOT</version> Project创建完毕!接下来在 Project下面创建 Module 32创建Modu|e ·在 Project上 New module 和刚才一样,选择 Spring InitialiZe,设置 grouped、 artifact、 version 依次创建好所有的 Module,如下图所示 3.3构建模块的依赖关系 目前为止,模块之间没有任何联系,下面我们要通过pom文件来指定它们 之间的依赖关系,依赖关系如下图所示: Gaoxi-User、 Gaoxi- Analysis、 Gaoxi- Product、 Gaoxi- Order这四个系统 相当于以往三层结构的 Service层,提供系统的业务逻辑,只不过在微服 务结构中, Service层的各个模块都被抽象成一个个单独的子系统,它们 提供RPC接口供上面的Gaox- Contro‖er调用。它们之间的调用由 Dubbo来 完成,所以它们的pom文件中并不需要作任何配置。而这些模块和 Gaoxi- Common- Service- Facade之间是本地调用,因此需要将 CaoxI- Common- Service- Facade打成jar包,并让这些模块依赖这个jar,因此就需要在所有 模块的pom中配置和Gaox- common- Service- Facade的依赖关系 此外,为了简化各个模块的配置,我们将所有模块的通用依赖放在 Project 的ρom文件中,然后让所有模块作为ρ roject的子模块。这样子模块就可以 从父模块中继承所有的依赖,而不需要自己再配置了。 下面开始动手 首先将 Common- Service- Facade的打包方式设成jar 当打包这个模块的时候, Maven会将它打包成jar,并安装在本地仓库 中。这样其他模块打包的时候就可以引用这个jar。 <groupId>com. gaoxi</groupId> cartifactId>gaoxi-common-service-facade</artifactId> <version>0.0.1</version> packaging>jar</packaging> ●将其他模块的打包方式设为war 除了 Gaoxi- Common- Service- Facade外,其他模块都是一个个可独 立运行的子系统,需要在web容器中运行,所以我们需要将这些模块 的打包方式设成war <groupId>com. gaoxi</groupId> <art主fact工d> gaol-user</ artifact工d> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging> 在总pom中指定子模块 modules标签指定了当前模块的子模块是谁,但是仅在父模块的pom 文件中指定子模块还不够,还需要在子模块的pom文件中指定父模块 是谁。 <modules> <module>Gaoxi-Analysis</ module> <module>Gaoxi-Order</module> <module>Gaoxi-Product</module> <module>Gaoxi-User</module> <module>Gaoxi-Redis</module> <module>Gaoxl-Controller</module> <module>Gaoxi-Common-Service-Facade</module> </modules> 在子模块中指定父模块 parent> <groupId>com. gaoxi</groupid> cartifactId>gaoxi</artifactid> <version>0.0.1-SNAP SHOT</version> <relativePath>./pom. xml</relativePath> </parent> 到此为止,模块的依赖关系配置完毕!但要注意模块打包的顺序。由 于所有模块都依赖于 Gaoxi- Commonη- Servie- Facade模块,因此在构建 模块时,首先需要编译、打包、安装 Gaoxi- Common- Servie- Facade, 将它打包进本地仓库中,这样上层模块才能引用到。当该模块安装 毕后,再构建上层模块。否则在构建上层模块的时候会岀现找不到 Gaoxi- Common- Servie- Facade中类库的问题 3.4在父模块的pom中添加所有子模块公用的依赖 <dependencies> - Spring Boot <dependency> <groupId>org. springframework boot</groupId> <artifactId>spring-boot-starters/artifactId> </dependency> <!- Spring MvC--> <dependency> <groupId>org. springframework boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> !- Spring Boot Test <dependency> <groupId>org. springframework boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> !- MyBatis <dependency> <groupId>org. mybatis spring. boot</groupId> sartifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <!- Mysql

...展开详情
img
sethcss

关注 私信 TA的资源

上传资源赚积分,得勋章
    最新推荐