一、why spring cloud?

单体应用不能满足需求了,所以要搞微服务。在当下的互联网应用中,业务体系不断发展变化,用户体量和性能要求远非传统行业所能比拟。现在的互联网应用承载的业务功能的复杂度、用户访问的并发量,以及快速迭代的开发要求,已远远超出了传统单体系统的设计和开发要求。如何高效地实现系统扩展性、伸缩性,以及维护性,成为一个非常现实且亟待解决的难题。

二、怎样实现微服务架构?

将一个单体系统拆分成多个服务,这时候我们面对的就是一个分布式系统。在分布式系统中,我们可以根据业务边界拆分出一批独立的服务,这些独立的服务就相当于一个个单体系统。但这在缓解系统扩展性、伸缩性和维护性上的一系列问题的同时,也引入了系统的复杂性。除了跨进程通信所带来的网络传输三态性和异构性等固有特性,我们还不得不考虑如下所示的种种典型问题。

服务实例太多怎么办?
服务调用关系太杂乱怎么办?
服务访问出错了怎么办?
配置信息散落在各个服务中怎么办?
服务调用链路太长怎么办?

微服务架构本质上也是一种分布式系统,但它在具备通用分布式系统的功能特性之外,还包含了一些特有组件,这些特有组件能够解决分布式系统所面临的上述问题。

典型的微服务组件以及解决的问题

  • 服务治理:为了有效管理分布式系统中存在的大量服务实例,微服务架构引入了服务发现和服务注册机制,使得服务实例的管理变得自动化、透明化。

  • API 网关:为了降低服务客户端与服务提供者之间的耦合度,更好地简化调用过程,微服务架构专门提供了一个 API 网关,用来优化面向客户端的 API 设计。

  • 服务容错:为了解决服务访问出错问题,微服务架构中提供了服务隔离、服务熔断和服务回退等面向服务调用端的有效容错机制。

  • 配置中心:为了更好地组织和管理散落在各个服务中的配置信息,微服务架构提供了一个配置中心来集中化管理。

  • 链路跟踪:为了高效监控服务调用的健康状态以及全链路的数据流转,微服务架构提供了链路跟踪机制,来对各个服务之间的调用过程进行统一管理。

微服务的三大要素

微服务架构的第一要素:业务建模

微服务架构设计首要的切入点为服务建模。为什么我们首先需要考虑的是这个要素呢?因为微服务架构与传统 SOA 等技术体系有本质区别,就是其服务的粒度和服务本身的面向业务和组件化特性。针对服务建模,我们首先需要明确服务的类别,以及服务与业务之间的关系,尽可能明确领域的边界。

那么如何开展开发服务建模工作呢?针对服务建模,推荐使用领域驱动设计(Domain Driven Design,DDD)方法,通过识别领域中的各个子域、判断这些子域是否独立、考虑子域与子域的交互关系,从而明确各个界限上下文(Boundary Context)之间的边界。
另一方面,服务建模本质上是一个为了满足业务需求,并通过技术手段将这些业务需求转换为可实现服务的过程。服务围绕业务能力建模,而业务能力往往体现的是一种分层结构。

业务体系中的服务分成如下几种类型:基础服务、通用服务、定制服务和其他服务等。

微服务架构的第二要素:技术体系

包括服务通信、服务治理、服务路由、服务容错、服务网关、服务配置、服务安全和服务监控

1. 服务通信

网络通信是任何分布式系统的基础组件。网络通信本身涉及面很广,对于微服务架构而言,我们关注的是网络连接模式、I/O 模型和服务调用方式。

2.服务治理

在微服务架构中,服务治理可以说是最为关键的一个技术组件,因为各个微服务需要通过服务治理实现自动化的注册和发现。

你可以想象一下,如果系统中服务数量不是很多,那么我们有很多办法可以获取这些服务的 IP 地址、端口等信息,管理起来也不是很复杂。但当服务数量达到一定量级时,可能连开发人员自己都不知道系统中到底存在多少个服务,也不知道系统中当前到底哪些服务已经变得不可用。这时候,我们就需要引入独立的媒介来管理服务的实例,这个媒介一般被称为服务注册中心。

服务注册中心是保存服务调用所需的路由信息的存储仓库,也是服务提供者和服务消费者进行交互的媒介,充当着服务注册和发现服务器的作用。诸如 Dubbo、Spring Cloud 等主流的微服务框架都基于 ZookeeperEureka 等分布式系统协调工具构建了服务注册中心。

3.服务路由

我们现在已经通过注册中心构建了一个多服务的集群化环境中,当客户端请求到达集群,如何确定由哪一台服务器进行请求响应呢?这就是服务路由问题。可以认为负载均衡是最常见的一种路由方案,常见的客户端/服务器端负载均衡技术都可以完成服务路由。Spring Cloud 等主流的微服务框架也都内置了 Ribbon 等客户端负载均衡组件。

另一方面,负载均衡的出发点更多的是提供服务分发而不是解决路由问题,常见的静态、动态负载均衡算法也无法实现精细化的路由管理。这时候我们就可以采用路由规则。路由规则常见的实现方案是白名单或黑名单,即把需要路由的服务地址信息(如服务 IP)放入可以控制是否可见的路由池中进行路由。同样,路由规则也是微服务开发框架的一项常见功能。

4.服务容错

对于分布式环境中的服务而言,服务在自身失败引发生错误的同时,还会因为依赖其他服务而导致失败。除了比较容易想到和实现的超时、重试和异步解耦等手段之外,我们需要考虑针对各种场景的容错机制。

业界存在一批与服务容错相关的技术组件,包括以失效转移 Failover 为代表的集群容错策略,以线程隔离、进程隔离为代表的服务隔离机制,以滑动窗口、令牌桶算法为代表的服务限流机制,以及服务熔断机制。而从技术实现方式上看,在 Spring Cloud 中,这些机制部分包含在下面要介绍的服务网关中,而另一部分则被提炼成单独的开发框架,例如专门用于实现服务熔断的 Spring Cloud Circuit Breaker 组件。

5.服务网关

服务网关也叫 API 网关,封装了系统内部架构,为每个客户端提供一个定制的 API。在微服务架构中,服务网关的核心要点是,所有的客户端和消费端都通过统一的网关接入微服务,在网关层处理所有的非业务功能。

在功能设计上,服务网关在完成客户端与服务器端报文格式转换的同时,它可能还具有身份验证、监控、缓存、请求管理、静态响应处理等功能。另一方面,也可以在网关层制定灵活的路由策略。针对一些特定的 API,我们需要设置白名单、路由规则等各类限制。我们会基于 Netflix Zuul 和 Spring Cloud Gateway 这两种网关对这些功能分别展开介绍。

6.服务配置

在微服务架构中,考虑到服务数量和配置信息的分散性,一般都需要引入配置中心的设计思想和相关工具。与注册中心一样,配置中心也是微服务架构中的基础组件,其目的也是对服务进行统一管理,区别在于配置中心管理的对象是配置信息而不是服务的实例信息。

为了满足以上要求,配置中心通常需要依赖分布式协调机制,即通过一定的方法确保配置信息在分布式环境中的各个服务中能得到实时、一致的管理。可以采用诸如 Zookeeper 等主流的开源分布式协调框架来构建配置中心。当然,像 Spring Cloud 也提供了专门的配置中心实现工具 Spring Cloud Config。

7.服务安全

在对微服务架构的学习过程中,服务安全是一块非常重要但又容易被忽视的内容。一般意义上的访问安全性,都是围绕认证和授权这两个核心概念来展开的。也就是说我们首先需要确定用户身份,然后再确定这个用户是否有访问指定资源的权限。站在单个微服务的角度讲,我们系统每次服务访问都能与授权服务器进行集成以便获取访问 Token。站在多个服务交互的角度讲,我们需要确保 Token 在各个微服务之间的有效传播。另一方面,服务内部,我们可以使用不同的访问策略限制服务资源的访问。

在实现微服务安全访问上,我们通常使用 OAuth2 协议来实现对服务访问的授权机制,使用 JWT 技术来构建轻量级的认证体系。Spring 家族也提供了 Spring Security 和 Spring Cloud Security 框架来完整这些组件的构建。

8.服务监控

在微服务架构中,当服务数量达到一定量级时,我们难免会遇到两个核心问题。一个是如何管理服务之间的调用关系?另一个是如何跟踪业务流的处理过程和结果?这就需要构建分布式服务跟踪机制。

分布式服务跟踪机制的建立需要完成调用链数据的生成、采集、存储及查询,同时也需要对这些调用链数据进行运算和可视化管理。这些工作不是简单一个工具和框架能全部完成,因此,在开发微服务系统时,我们通常会整合多个开发框架进行链路跟踪。例如,在 Spring Cloud 中,就提供了 Spring Cloud Sleuth 与 Zipkin 的集成方案。

微服务架构的第三要素:研发过程

微服务架构的第三个要素是研发过程,这点怎么理解?实际上,过程转变与技术体系建设有密切关联,所以对于微服务架构而言,最后一个要素就是研发过程。Martin Fowler 在介绍微服务架构时,同样也提出了围绕“业务功能”组织团队的研发管理理念。

当寻找把一个大的应用程序进行拆分的方法时,研发过程通常都会围绕产品团队、项目管理、大前端和服务器端团队而展开,这些团队也就是通常所说的职能团队。任何一个需求,无论大小,都将导致跨团队协作,从而增加沟通和协作成本。而微服务架构则倾向围绕业务功能的组织来分割服务,而不是面向某项技术能力。因此,团队是跨职能的特征团队,每个服务都围绕着业务进行构建,并且能够被独立部署到生产环境。

spring cloud学习笔记01相关推荐

  1. Spring Cloud 学习笔记(1 / 3)

    Spring Cloud 学习笔记(2 / 3) Spring Cloud 学习笔记(3 / 3) - - - 01_前言闲聊和课程说明 02_零基础微服务架构理论入门 03_第二季Boot和Clou ...

  2. Spring Cloud 学习笔记(3 3)

    Spring Cloud 学习笔记(1 / 3) Spring Cloud 学习笔记(2 / 3) - - - 108_Nacos之Linux版本安装 109_Nacos集群配置(上) 110_Nac ...

  3. Spring Cloud 学习笔记(3 / 3)

    Spring Cloud 学习笔记(1 / 3) Spring Cloud 学习笔记(2 / 3) - - - 108_Nacos之Linux版本安装 109_Nacos集群配置(上) 110_Nac ...

  4. Spring Cloud 学习笔记(四)-Spring Cloud Hystrix

    Spring Cloud 学习笔记(四)-Spring Cloud Hystrix 由于前一阵子项目的原因,今天才继续弄上,今天想学习一下Hystrix组件 这个组件还挺抽象的,最开始我一直没太明白, ...

  5. Spring Cloud 学习笔记(2 / 3)

    Spring Cloud 学习笔记(1 / 3) Spring Cloud 学习笔记(3 / 3) - - - 56_Hystrix之全局服务降级DefaultProperties 57_Hystri ...

  6. Vue + Spring Boot 学习笔记01:实现用户登录功能

    Vue + Spring Boot 学习笔记01:实现用户登录功能 一.创建后端Spring Boot项目Book Management 二.创建前端Vue项目bm-vue 三.修改后端项目Book ...

  7. Spring Cloud 学习笔记(2 3)

    Spring Cloud 学习笔记(1 / 3) Spring Cloud 学习笔记(3 / 3) - - - 56_Hystrix之全局服务降级DefaultProperties 57_Hystri ...

  8. Spring Cloud学习笔记—网关Spring Cloud Gateway官网教程实操练习

    Spring Cloud学习笔记-网关Spring Cloud Gateway官网教程实操练习 1.Spring Cloud Gateway介绍 2.在Spring Tool Suite4或者IDEA ...

  9. Spring Cloud学习笔记

    Spring Cloud学习笔记 相关代码地址:https://github.com/gongxings/spring-cloud-study.git 一.工程环境搭建 spring cloud版本: ...

  10. Spring Cloud学习笔记【十二】Hystrix的使用和了解

    Spring Cloud学习笔记[十二]Hystrix的使用和了解 Hystrix [hɪst'rɪks],中文含义是豪猪,因其背上长满棘刺,从而拥有了自我保护的能力.本文所说的Hystrix是Net ...

最新文章

  1. Python Data Structures
  2. 统计学习方法笔记 -- Boosting方法
  3. mpp新增一个字段_如何快速新增百万测试数据?
  4. leetcode算法题--矩阵中的幸运数
  5. 使用Flash读取COOKIE
  6. 从申请流程到选校解读,献给所有Bioscience本硕博!
  7. eclipse java字体 太小,如何在Eclipse for Java文本编辑器中更改字体大小?
  8. oracle中print,oracle中print_table存储过程实例介绍
  9. Firefox 将添加画中画功能
  10. 求推荐民法论文选题?
  11. 查看linux系统版本命令
  12. 【数据挖掘】使用R语言进行聚类分析
  13. 24合1芯片RK628D替代龙讯LT6911C/东芝TC358749XBG/HDMI TO MIPI...
  14. linux文件名补全,Linux中10个关于命令行自动补全的技巧
  15. 北美常见水果与蔬菜的中英文对照
  16. 【IOS篇】Cocos2d-x 集成Chartboost广告
  17. 【敬伟ps教程】平移、缩放、移动、选区
  18. 创新突破,索爱S5耳机实现空间音频和动态头部跟踪
  19. JPA中MySQLSyntaxErrorException问题解决方案
  20. 手风琴页面html,滑动手风琴的制作(只涉及HTML+css)

热门文章

  1. Ubuntu Server 18.04 安装
  2. Advances in adversarial attacks and defenses in computer vision: A survey论文解读
  3. 数据--第32课 -二叉树的定义
  4. java中构造器的调用顺序
  5. 使用Spring自定义注解实现任务路由
  6. XenApp/XenDesktop 7.12新功能LHC解读
  7. lintcode:Add Binary 二进制求和
  8. HDU1150Machine Schedule(二分图最大匹配的DFS解法)
  9. 【C++】对象作为函数参数【原创技术】
  10. 核心JavaScript——词法结构