SpringCloud微服务

架构演进

单体架构

Monolithic

单体只是表明系统中主要的过程调用都是进程内调用,不会发生进程间通信,仅此而已。

​ 首先单体架构并不是一个“反派角色”。单体架构,在整个软件架构演进的历史进程里,是出现时间最早、应用范围最广、使用人数最多、统治历史最长的一种架构风格。“单体”这个名称,是在微服务开始流行之后才“事后追认”所形成的概念。

​ 对于小型系统—即单台机器就足以支撑良好运行的系统,单体不仅仅易于开发、易于测试、易于部署且由于系统中各个功能、模块、方法的调用过程都是进程内调用,不会发生进程间通信(IPC,可以认为RPC属于IPC的一种特例),因此也是运行效率最高的一种架构风格,完全不应该被贴上反派角色的标签。

SOA

SOA架构(Service-Oriented Architecture)

面向服务的架构是一次具体地、系统性地成功解决分布式服务主要问题的架构模式

​ SOA,将应用程序不同功能单元(称为服务)通过定义良好的接口和契约联系起来。这些服务是独立的、可复用的组件,可以在不同的系统和应用程序中被调用,以实现特定的业务功能。

​ 但是,在处理大规模复杂系统时,由于倾向于构建企业级的服务总线(ESB)连接各个服务,导致整个架构变得非常复杂。随着业务的增长和服务数量的增加,ESB会称为一个庞大而复杂的中心枢纽,其中包含大量的消息转换、路由规则配置,使得系统的维护和理解成本极高。

​ 到这里,“如何使用多个独立的分布式服务共同构建一个更大型的系统”,“让开发人员不必关心服务是远程还是本地,都能够透明地调用服务或者访问资源”,引出了微服务

微服务时代

微服务架构(Microservices)

微服务是一种通过多个小型服务来构建单个应用的架构风格,这些服务围绕业务能力而非特定的技术标准构建。各个服务都可以采用不同的编程语言,不同的数据存储技术,运行在不同进程之中。服务采取轻量级的通信机制和自动化的部署机制实现通信与运维。

​ 一开始,微服务是作为SOA的一种变体被提出来的,后来成为了经过不停地更新、蜕变发展才有了现代微服务。文章《Microservices: A Definition of This New Architectural Term》中是这样描写的:“通过多个小型组合来构建单个应用的架构风格,这些服务围绕业务能力而非特定的技术标准来构建。各个服务可以采用不同的编程语言,不同的数据存储技术,运行在不同的进程之中。服务采取轻量级的通信机制和自动化的部署机制实现通信与运维”。

后面还有后微服务时代和无服务时代先不做了解。

以上全是来自对 凤凰架构中的简单摘要,以了解为何要应用微服务,为何要学习微服务。

SpringCloud

注:暂时先将了解先不实践,了解完后需要不上实践代码以及过程。

是微服务架构落地的一套技术栈,其中大多数技术都是基于Netflix(奈飞)公司的技术进行二次研发。

包括以下技术点:

  • Eureka-服务注册与发现
  • Ribbin-服务负载均衡
  • Feign-服务之间的通讯
  • Hystrix-服务的线程隔离以及断路器
  • Zuul-服务网关
  • Stream-实现MQ的使用
  • Config-动态配置
  • Sleuth-服务追踪

服务注册与发现

服务注册中心:把所有服务的信息都告诉服务注册中心(Eureka、Consul、Nacos、Zookeeper)

Eureka帮助我们维护所有服务的信息,以便服务之间的相互调用

服务负载均衡

Ribbin是帮助我们实现服务和服务负载均衡,Ribbin属于客户端负载均衡(服务端负载均衡)

客户端负载均衡:customer客户模块,将2个Search模块信息全部拉取到本地的缓存,在customer中自己做一个负载均衡的策略,选中某一个服务。

服务端负载均衡:在注册中心中,直接根据你指定的负载均衡策略,帮你选中一个指定的服务信息,并返回。

服务间调用

Feign 帮助我们实现面向接口编程,直接调用其他服务,简化开发。

服务隔离断路

Hystrix解决服务雪崩问题

  1. 降级机制:当某一个服务出现超时,资源不足出现了异常时,可执行一个降级方法,返回一个拖底数据
  2. 隔离:提供了一个Hystrix线程池,信号量,和Tomcat的线程池相互隔离
  3. 熔断:当某个服务的失败率达到一定的阈值时,自动触发降级
  4. 缓存:请求缓存的功能

服务网关

Zuul

GateWay

  • 客户端维护大量的ip和port信息,直接访问指定服务
  • 认证和授权操作,需要在每一个模块中都添加认证和授权的操作
  • 项目的迭代,服务要拆分,服务要合并,需要客户端进行大量的变化
  • 统一的把安全性校验都放在Zuul中

image-20241125162555869

多语言支持

Sidecar

在SpringCloud的项目中,需要接入一些非Java的程序,第三方接口,无法接入eureka,hystrix,feign等等组件。启动一个代理的微服务,代理微服务去和非Java的程序或第三方接口交流,通过代理的微服务去计入SpringCloud的相关组件。

服务间消息传递

Stream就是在消息队列的基础上,对其进行封装,让咱们更方便的去操作MQ消息队列(Kafka、RabbitMQ)。

服务的动态配置

  • 配置文件分散在不同的项目中,不方便维护。
  • 配置文件的安全问题。
  • 修改完配置文件,无法立即生效。

所以有了一个统一的动态配置

服务追踪

在整个微服务架构中,微服务很多,一个请求可能需要调用很多很多的服务,最终才能完成一个功能,如果说,整个功能出现了问题,在这么多的服务中,如何去定位到问题的所在点,出现问题的原因是什么。

Sleuth可以获得到整个服务链路的信息。

Zipkin通过图形化界面去看到信息。

Sleuth将日志信息存储到数据库中。

架构图(大概)

image-20241125170551473