初识spring cloud

197 阅读13分钟

微服务简介

什么是微服务

微服务是一种用于构建分布式应用的架构方案有别于更为传统的单体式方案。

  • 它将一个原本独立的系统拆分成了多个小型服务
  • 服务之间可以通过基于HTTP/HTTPS的RESTful AP进行通信协作,也可以通过RPC协议进行通信协作;
  • 每人功能都被称为一项服务,可以单独构建和部署;
  • 由于使用轻量级通信协议作为基础,所以微服务可以使用不同语言来编写。

微服务系统架构引出的问题

  • 这么多小服务,如何管理他们?(服务治理)
  • 这么多小服务,他们之间如何通讯?(服务调用)
  • 这么多小服务,客户端怎么访问他们?(服务网关)
  • 这么多小服务,一旦出现问题了,应该如何自处理(服务容错)
  • 这么多小服务,一旦出现问题了,应该如何排错(链路追踪)

对于上面的问题,是任何一个微服务设计者都不能绕过去的,因此大部分的微服务产品都针对每大简题提供了相应的组崔莱解决它们。

微服务架构的常见概念

服务治理

服务治理就是进行服务的自动化管理,具体包括:

(1)服务注册与发现:单体服务拆分为微服务后,需要将服务信息存储到某个载体(服务注册);如果微服务之间存在调用依赖,需要得到目标服务的服务地址(服务发现)。

(2)可观测性:需要对众多服务间的调用关系,状态有清晰掌控,包括调用拓扑关系、监控 (Metrics) 、日志 (Logging),调用追踪 (Trace)等。

(3)流量管理:在微服务版本更选过程中,需要根据流量的特征(访问参数等),百分比对微服务间调用进行控制,以完成微服务版本更迭的平滑(灰度发布,蓝绿发布,A/B测试)。

(4)安全:对于业务敏感的微服务,需要对其他服务的访问进行认证与鉴权。

(5)控制:能实时进行服务治理策略向微服务分发。

服务调用

在微服务架构中,通常存在多个服务之间的远程调用的需求。

目前主流的远程调用技术有:

REST(Representational State Transfer)

**·**基于HTTP

**·**一种HTTP调用的格式,更标准,更通用,无论哪种语言都支持http协议

RPC (Remote Promote Call)

**·**基于TCP

**·**一种进程间通信方式,允许像调用本地服务一样调用远程服务

REST 与 RPC的对比

服务网关

API网关字面意思是将所有API调用统一接入到API网关层,由网关层统一接入和输出。

一个网关的基本功能有:统一接入、安全防护、协议适配、流量管控、长短链接支持、容错能力。

服务容错

在微服务当中,一个请求经常会涉及到调用几个服务,如果其中某个服务不可用,没有做服务容错的话,极有可能会造成一连串的服务不可用,这就是雪崩效应。

服务容错的三个核心思想是:

  • 不被外界环境影响
  • 不被上游请求压垮
  • 不被下游响应拖垮

链路追踪

随着微服务架构的流行,服务按照不同的维度进行拆分,一次请求往往需要涉及到多个服务。

因此,就需要对一次请求涉及的多个服务链路进行日志记录,性能监控即链路追踪。

SpringCloud

Spring Cloud是一系列框架的集合。

它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署

Spring cloud并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了套简单易懂、易部署和易维护的分布式系统开发工具包。

Spring cloud Alibaba致力于提供微服务开发的一站式解决方案。

此项目包含开发分布式应用微服务的必需组件,方便开发者通过Spring Cloud编程模型轻松使用这些组件来开发分布式应用服务。

依托Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将Spring Cloud应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。

SpringCloud组成

SpringCloud常用组件

服务发现 —— Netflix Eureka

客服端负载均衡 —— Netflix Ribbon

断路器 —— Netflix Hystrix

服务网关 —— Netflix Zuul、Spring CloudGateway

分布式配置 —— Spring Cloud Config

Spring Cloud Alibaba简介

主要功能:

服务限流降级:默认支持 WebServlet、WebFlux,OpenFeign、RestTemplate、SpringCloud,Gateway, Zuul, Dubbo和RocketMQ限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级 Metrics 监控。

服务注册与发现:适配 Spring Cloud 服务注册与发现标准,默认集成了 Ribbon 的支持。

分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。

消息驱动能力:基于 Spring Cloud Stream 为微服务应用构建消息驱动能力。

分布式事务:使用@GlobalTransactional 注解,高效并且对业务零侵入地解决分布式事务问题。

阿里云对象存储:阿里云提供的海量、安全、低成本高可靠的云存储服务支持在任何应用、任何时间住何地点荐储和访荷在意类型的数据。

分布式任条调度:提供秒级、精准、高可靠、高可用任务调度服务。同时提的定时(基于 Cron 表达式)供分布式的任务执行模型,如网格任务。网格任务支持海量子务场局分配到所有Worker (schedulerx-client) 上执行。

阿里云短信服务:覆盖全球的短信服务,友好、高效智能的互联化通讯能力,帮助企业迅速搭建客户触沃通道。

主要组件

Sentinel: 把流量作为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Nacos:一个更易于构建云原生应用的动态服务发现配置管理和服务管理平台

RocketMQ:一款开源的分布式消息系统,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。

Dubbo: Apache Dubbom 是一款高性能 Java RPC框架。

Seata: 阿里巴巴开源产品,一个易于使用的高性能微服务分布式事务解决方案。

Alibaba Cloud ACM:一款在分布式架构环境中对应用配置进行集中管理和推送的应用配置中心产品。

Alibaba Cloud OSS: 阿里云对象存储服务 (ObiectStorage Service,简称OSS是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在何任何时间、任何地点存储和访问任意类型的数据

Alibaba Cloud Schedulerx: 阿里中间件团队开发的款分布式任务调度产品,提供秒级、精准、高可靠富可用的定时(基于Cron表达式任务调度服务。

Alibaba Cloud SMS: 覆盖全球的短信服务,友好高效、智能的互联化通讯能力,帮助企业迅速搭建客触达通道

微服务注册,配置和调用

服务注册和发现

服务注册和发现是服务治理最核心最基本模块。

服务注册:在服务治理框架中,会构建一个**注册中心,**每个服务单元向注册中心登记自己提供服务的详细信息,并在注册中心形成一张服务的清单。

·服务注册中心需要以心跳的方式去监测清单中服务是否可用,如果不可用,需要在服务清单中别除不可用的服务。

服务发现:服务调用方向服务注册中心咨询服务,并获取所有服务实例清单,实现对具体实例的访问。

服务注册中心

服务注册中心是微服务架构非常重要的一个组件,在微服务架构里主要起到了协调者的作用

注册中心一般包含如下几个功能:

服务发现:

**·**服务注册:保存服务提供者和服务调用者的信息

**·**服务订阅:服务调用者订阅服务提供者的信息,注册中心向订阅者推送提供者的信息

服务配置:

**·**配置订阅:服务提供者和服务调用者订阅微服务相关的配置。

**·**配置下发:主动将配置推送给服务提供者和服务调用者

服务健康检测

**·**检测服务提供者的健康情况,如果发现异常,执行服务别除

常见的服务注册中心

Zookeeper

zookeeper是一个分布式服务框架,是Apache Hadoop的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等

Eureka

Eureka是Springcloud Netflix中的重要组件主要作用就是做服务注册和发现。但是现在已经闭源。

Consul

Consul是基于GO语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册服务发现和配置管理的功能。

Consul的功能都很实用,主要包括:服务注册1发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等特性。

Consul本身只是一个二进制的可执行文件,所以安装和部署都非常简单,只需要从官网下载后,在执行对应的启动脚本即可

Nacos

Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

它是 Spring cloud Alibaba 组件之一,负责服务注册发现和服务配置,可以这样认为nacos=eureka+config。

服务配置

微服务架构下关于配置文件的一些问题:

配置文件相对分散。

**·**在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散在各个微服务中,不好统一配置和管理。

配置文件无法区分环境

**·**微服务项目可能会有多个环境,例如:测试环境、预发布环境生产环境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动维护,这比较困难。

配置文件无法实时更新

**·**我们修改了配置文件之后,必须重新启动微服务才能使配置生效这对一个正在运行的项目来说是非常不友好的。

基于上面这些问题,我们就需要配置中心的加入来解决这些问题。

设计思路:

  • 首先把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。
  • 当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。
  • 当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动态更新。

常用的服务配置中心

Apollo

Apollo是由携程开源的分布式配置中心。

特点:

  • 配置更新之后可以实时生效;
  • 支持灰度发布功能,并且能对所有的配置进行版本管理、操作审计等功能;
  • 提供开放平台API,并且资料写的很详细
Disconf

Disconf是由百度开源的分布式配置中心。

它是基于Zookeeper来实现配置变更后实时通知和生效的。

Spring Cloud Config

这是Spring cloud中带的配置中心组件

它和Spring是无缝集成,使用起来非常方便并且它的配置存储支持Git。

不过它没有可视化的操作界面,配置的生效也不是实时的,需要重启或去刷新

Nacos

这是Sping Cloud alibaba技术栈中的一个组件,它既是服务注册中心,也是服务配置中心。

作为服务配置中心具有以下功能:

支持配置动态刷新

  • 只需要在需要动态读取配置的类上添加@RefreshScope注解即可

支持配置共享

  • 同一个微服务的不同环境 (dev、test、prod) 之间共享配置
  • 同组中不同微服务之间共享配置

支持配置隔离

  • Nacos中有Namespace,Namespace下又有Group,Group下注册具体服务,不同隔离级别下的服务不可访问,做到沙箱隔离效果。

服务调用

服务调用除了调用的协议选择问题外,还有调用的负载均衡问题。

通俗的讲,负载均衡就是将负载 (工作任务,访问请求)进行分摊到多个操作单元(服务器、组件)上进行执行。

根据负载均衡发生位置的不同,一般分为:

  • 服务端负载均衡:指的是负载均衡机制在服务提供者一方,比如常见的nginx负载均衡
  • 客户端负载均衡:指的是负载均衡机制在服务请求的一方,也就是在发送请求之前已经选好了由哪个实例处理请求

在微服务调用关系中,一般会选择客户端负载均衡,也就是在服务调用的一方来决定服务由那个提供者执行。

基于Feign的负载均衡服务调用

Feign是Spring Cloud提供的一个声明式的伪Http客户端

调用远程服务就像调用本地服务一样,只需要创建一个调用服务的客户端接口,并在主类上添加一个@EnableFeignClients注解即可。

Feign默认集成了Ribbon,因此就实现了负载均衡服务调用的效果。

关于Ribbon

Ribbon是Spring Cloud的一个组件,它可以让我们使用一个注解就能轻松的搞定负载均衡

在RestTemplate的Bean的生成方法上添加@LoadBalanced注解

然后,通过restTemplate实例调用微服务

@Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }

Ribbon支持的负载均衡策略

Ribbon内置了多种负载均衡策略,其顶级接为com.netflix.loadbalancer.IRule。