开源项目地址:weiit - NO.1的数字化零售SaaS开源方案商(Java企业级开源SaaS服务商)
1.1 软件架构演进
软件架构的发展经历了从单体结构、垂直架构、SOA 架构到微服务架构的过程。
1.1.1 单体架构
特点:
1、所有的功能集成在一个项目工程中。
2、所有的功能打一个 war 包部署到服务器。
3、应用与数据库分开部署。
4、通过部署应用集群和数据库集群来提高系统的性能。
优点:
1、项目架构简单,前期开发成本低,周期短,小型项目的首选。
缺点:
1、全部功能集成在一个工程中,对于大型项目不易开发、扩展及维护。
2、系统性能扩展只能通过扩展集群结点,成本高、有瓶颈。
3、技术栈受限。
1.1.2 垂直架构
特点:
1、以单体结构规模的项目为单位进行垂直划分项目即将一个大项目拆分成一个一个单体结构项目。
2、项目与项目之间的存在数据冗余,耦合性较大,比如上图中三个项目都存在客户信息。
3、项目之间的接口多为数据同步功能,如:数据库之间的数据库,通过网络接口进行数据库同步。
优点:
1、项目架构简单,前期开发成本低,周期短,小型项目的首选。
2、通过垂直拆分,原来的单体项目不至于无限扩大。
3、不同的项目可采用不同的技术。
缺点:
1、全部功能集成在一个工程中,对于大型项目不易开发、扩展及维护。
2、系统性能扩展只能通过扩展集群结点,成本高、有瓶颈。
1.1.3 SOA 架构
特点:
1、基于 SOA 的架构思想将重复公用的功能抽取为组件,以服务的方式给各系统提供服务。
2、各项目(系统)与服务之间采用 webservice、rpc 等方式进行通信。
3、ESB 企业服务总线作为项目与服务之间通信的桥梁。
优点:
1、将重复的功能抽取为服务,提高开发效率,提高系统的可重用性、可维护性。
2、可以针对不同服务的特点制定集群及优化方案。
3、采用 ESB 减少系统中的接口耦合。
缺点:
1、系统与服务的界限模糊,不利于开发及维护。
2、虽然使用了 ESB,但是服务的接口协议不固定,种类繁多,不利于系统维护。
3、抽取的服务的粒度过大,系统与服务之间耦合性高。
1.1.1 微服务架构
特点:
1、将系统服务层完全独立出来,并将服务层抽取为一个一个的微服务。
2、微服务遵循单一原则。
3、微服务之间采用 RESTful 等轻量协议传输。
优点:
1、服务拆分粒度更细,有利于资源重复利用,提高开发效率。
2、可以更加精准的制定每个服务的优化方案,提高系统可维护性。
3、微服务架构采用去中心化思想,服务之间采用 RESTful 等轻量协议通信,相比 ESB 更轻量。
4、适用于互联网时代,产品迭代周期更短。
缺点:
1、微服务过多,服务治理成本高,不利于系统维护。
2、分布式系统开发的技术成本高(容错、分布式事务等),对团队挑战大。
1.2 什么是微服务
为适应企业的业务发展,提高软件研发的生产力,降低软件研发的成本,软件架构也作了升级和优化,将一个独立的系统拆分成若干小的服务,每个小服务运行在不同的进程中,服务与服务之间采用 http 轻量协议(比如流行的 RESTful)传输数据,每个服务所拥有的功能具有独立性强、高内聚的特点,这样的设计就实现了单个服务的高内聚,服务与服务之间的低耦合效果,这一个一个的小服务就是微服务,基于这种方法设计的系统架构即微服务架构。
1.3 Spring Cloud 技术栈
1.3.1 微服务的技术栈
负载均衡,网关路由:高可用、集群部署,校验、请求转发、服务集成。
服务治理:服务注册、发现。
容错:避免雪崩。
监控跟踪:监控资源利用、服务响应、容器资源利用情况。
消息总线:消息队列、异步通信。
配置管理:统一配置管理。
1.3.2 Spring Cloud 是什么
Spring Cloud 为开发人员构建微服务架构提供了完整的解决方案,SpringCloud 是若干个框架的集合,它包括 spring-cloud-config、spring-cloud-bus 等近 20 个子项目,它提供了服务治理、服务网关、智能路由、负载均衡、断路器、监控跟踪、分布式消息队列、配置管理等领域的解决方案。
1.3.3 Spring Cloud 技术栈
微服务的兴起出现了很多优秀的公司和技术:
服务治理:Dubbo(阿里巴巴)、Dubbox(当当)、Eureka(Netflix)等 。
配置管理:Disconf(百度)、QConf(360)、Diamood(淘宝)等 。
服务跟踪:Hydra(京东)、Zipkin(Twitter)、Sleuth(Spring Cloud)等 。
Spring Cloud 提供一站式的微服务架构解决方案,如下图:
1.3.4 为什么使用 Spring Cloud
微服务架构的优点表明它可以提高我们的生产力,但是分布式系统本身的技术成本问题给互联网那些创业型公司不少的挑战,阿里、百度等巨头所提供的微服务技术只是解决其中某个问题,而整合封装这些优秀的技术恐怕是 Spring 最擅长的领域了,Spring Cloud 也正因为此而诞生。
使用 Spring Cloud 来构建微服务架构可以省去你整合各家技术的成本,Spring Cloud 为我们构建微服务架构提供了一站式的解决方案,就好比当初 Spring 诞生是为解决 EJB 企业应用开发的众多问题而提供的一站式轻量级企业应用开发解决方案一样,随着使用 Spring Cloud 公司数量的增加,相信微服务将被 Spring Cloud 一统江湖。
1.3.5 Netflix 公司介绍
Spring Cloud 的很多技术来源于 Netfix(https://netflix.github.io/),摘自百度百科的信息如下:
2 开发环境
2.1 Java8
Spring Cloud 是基于 Java 构建,本课程使用 Java8 作为基础平台。
2.2 Maven
优秀的架构离不开优秀的项目构建工具,采用 Maven 来构建(使用 apache-maven-3.3.9-bin)。
2.3 Spring Boot
Spring Cloud 是基于 Spring Boot 构建,使用 Spring Boot 1.5.4 版本。
?
| 12345 | <parent>``<groupId>org.springframework.boot</groupId>``<artifactId>spring-boot-starter-parent</artifactId>``<version>``1.5``.``4``.RELEASE</version>``</parent>
|
2.4 Spring Cloud
Spring Cloud 为了避免和各子项目的版本名称混淆,它采用伦敦地铁站命名。
使用 Dalston.SR3 版本。
?
| 123456789101112 | <!-- 导入Spring Cloud的依赖管理 -->``<dependencyManagement>``<dependencies>``<dependency>``<groupId>org.springframework.cloud</groupId>``<artifactId>spring-cloud-dependencies</artifactId>``<version>Dalston.SR3</version>``<type>pom</type>``<scope>``import``</scope>``</dependency>``</dependencies>``</dependencyManagement>
|
2.5 MySQL
MySQL 作为数据库的第二把交椅甚至直逼 Oralce 这个老大,在互联网开发中 MySQL 的应用是最广泛的。本课程采用 MySQL5 来构建架构。
2.6 IDEA
IntelliJ IDEA 功能的强大及易用性不亚于 Eclipse,据统计其使用人数已直逼 Eclipse,成为老大指日可待。
3 服务治理
3.1 什么是服务治理
微服务架构的缺点中最主要的就是由于微服务数量众多导致维护成本巨大,服务治理为解决此问题而产生的。服务治理的作用是让维护人员从人工维护中解放出来,由服务自维护,微服务作为服务提供方主动向服务治理中心注册,服务的消费方通过服务治理中心查询需要的服务并进行调用。
如下图:
3.2 Spring Cloud Eureka
Spring Cloud Eureka 是对 Netflix 公司的 Eureka 的二次封装,它实现了服务治理的功能,Spring Cloud Eureka 提供服务端与客户端,服务端即是服务注册中心,客户端完成服务的注册与发现。服务端和客户端均采用 Java 语言编写(Eureka 支持多语言)。
如下图显示了 Eureka Server 与 Eureka Client 的关系:
3.3 架构
3.4 实战
3.4.1 流程图
3.4.2 开发并部署 Eureka Server
1、创建 Spring Boot 工程
2、在 pom.xml 中添加依赖(spring boot 、spring cloud、Eureka Server)
3、配置 application.yml
4、部署两台 Eureka Server,并且互相注册,实现高可用。
注意:如果没有设置 Eureka Server 的复制结点 eureka 默认会找 8761 端口。
1.1.1 开发用户信息服务
用户信息服务实现用户信息查询、用户注册、用户信息修改等功能。
开发用户信息服务采用 Spring Boot、SpringMVC、Mybatis 架构,数据库采用 MySqL5。
3.4.3 服务注册
服务注册完成将用户信息服务注册到 Eureka Server 中,供服务消费方查询。
1、在用户信息服务中配置 Eureka 服务中心地址及用户信息服务名称。
2、在 SpringBoot 的启动类中添加注解 @EnableDiscoveryClient
3、注意 Eureka 服务中心地址配置两个,因为有两台 Eureka 服务中心。
4、用户服务注册中心启动两个服务,为后边测试负载均衡准备。
4 负载均衡
4.1 什么是负载均衡
负载均衡是微服务架构中必须使用的技术,通过负载均衡来实现系统的高可用、集群扩容等功能。负载均衡可通过硬件设备及软件来实现,硬件比如:F5、Array 等 ,软件比如:LVS、Nginx 等 。
如下图是负载均衡的架构图:
用户请求先到达负载均衡器(也相当于一个服务),负载均衡器根据负载均衡算法将请求转发到微服务。负载均衡算法有:轮训、随机、加权轮训、加权随机、地址哈希等方法,负载均衡器维护一份服务列表,根据负载均衡算法将请求转发到相应的微服务上,所以负载均衡可以为微服务集群分担请求,降低系统的压力。
4.2 Spring Cloud Ribbon
Spring Cloud Ribbon 是基于客户端的负载均衡工具,负载均衡分为服务端负载均衡和客户端负载均衡,3.1 小节的图形指的是服务端负载均衡,客户端负载均衡与服务端负载均衡的区别在于客户端要维护一份服务列表,Ribbon 从 Eureka Server 获取服务列表,Ribbon 根据负载均衡算法直接请求到具体的微服务,中间省去了负载均衡服务。
如下图是 Ribbon 负载均衡的流程图:
1、在消费微服务中使用 Ribbon 实现负载均衡,Ribbon 先从 Eureka Server 中获取服务列表。
2、Ribbon 根据负载均衡的算法进行负载均衡,将请求转发到其它微服务。
4.3 实战
4.3.1 开发单点登录服务
单点登录服务提供用户登录、用户退出等功能。
单点登录服务需要调用用户信息服务查询用户信息。
单点登录服务采用 Spring Boot、SpringMVC 开发。
4.3.2 服务发现
单点登录服务需要从 EurekaServer 查询用户信息服务。
1、配置 Eureka Server 服务地址。
2、在 SpringBoot 的启动类中添加注解 @EnableDiscoveryClient
4.3.3 Ribbon 编程
1、定义 RestTemplate 对象
2、配置 @LoadBalanced
3、设置负载均衡算法。
4、使用 RestTemplate 调用微服务。
5 容错保护
5.1 什么是容错保护
容错保护是指微服务在执行过程中出现错误并从错误中恢复的能力。微服务容错性不好很容易导致雪崩效应,什么是雪崩效应?摘自百度百科中的定义:
微服务的雪崩效应表现在服务与服务之间调用,当其中一个服务无法提供服务可能导致其它服务也死掉,比如:单点登录服务调用用户信息服务查询用户信息,由于用户信息服务无法提供服务导致单点登录服务一直等待,从而导致用户登录、用户退出功能无法使用,像这样由一个服务所引起的一连串的多个服务无法提供服务即是微服务的雪崩效应。
5.2 Spring Cloud Hystrix
Spring Cloud Hystrix 是基于 Netflix 的开源框架 Hystrix 的整合,它实现了断路器、线程隔离、信号隔离等容错功能。
下图是 Hystrix 断路器示意图:
5.3 实战
1. 要在服务消费方添加 hystrix。
2、使用 Hystrix 实现容错。
3、在 Spring boot 的启动类上添加 @enableHystrix 注解
6 服务网关
6.1 什么是服务网关
服务网关是在微服务前边设置一道屏障,请求先到服务网关,网关会对请求进行过滤、校验、路由等处理。有了服务网关可以提高微服务的安全性,校验不通过的请求将被拒绝访问。
前边介绍的 Ribbon 客户端负载均衡技术可以不用经过网关,因为通常使用 Ribbon 完成微服务与微服务之间的内部调用,而对那些对外提供服务的微服务,比如:用户登录、提交订单等,则必须经过网关来保证微服务的安全。
6.2 Spring Cloud Zuul
Spring Cloud Zuul 是整合 Netflix 公司的 Zuul 开源项目实现的微服务网关,它实现了请求路由、负载均衡、校验过滤等 功能。
6.3 实战
1、部署用户信息服务 A、单点登录服务 B, 每个服务部署至少两台机器。
2、将用户信息服务 A、单点登录服务 B 注册到 EurekaServer 中。
3、开发并部署 zuul。
4、在 zuul 中配置路由
5、可以定义 filter,需要集成 zuul 提供 filter 类,进行校验拦截。
6、在 spring boot 的启动类中配置注解
7、根据上边的路由配置访问微服务。
凡是以 /sso/ 打头的请求,路由到 microservice-sso 微服务。
6.4 总结
zuul 网关,不仅提供对外服务访问 ,微服务也可以通过 zuul 请求其它的微服务。