微服务带来的挑战之一:业务微服务化(针对接口采用设计模式),服务注册和调用,负载均衡,服务调用简化。


  • 运维的调整,需要自动化,比如数据迁移,数据采集,业务调度,消息传递等都是需要运维自动化
  • 接口一致性(接口隔离和单一原则/提取公共方法为接口的依赖倒转原则/抽象父类的开闭原则/通过消息中间件的迪米特原则),业务逻辑依赖,需要考虑如下应用场景来解决:
  1. 一是开闭原则(Open Close Principle),强调对扩展开放和对修改关闭。应用场景:当我们的代码架构在迭代演进时,不能去修改原有的代码,而是抽象出父类接口,修改子类即可。
  2. 二是里氏代换原则(Liskov Substitution Principle),强调是父类和子类的关系。应用场景:在定义时使用父类对象,而在运行时再关联子类类型。
  3. 三是依赖倒转原则(Dependence Inversion Principle),强调接口的重要性,接口就是把一些公用的方法和属性声明,然后具体的业务逻辑是可以在实现接口的具体类中实现的。当我们依赖对象是接口时,就可以屏蔽实现这个接口的具体类改变。应用场景:通过抽象(接口或抽象类)使各个类或模块的实现彼此独立,不互相影响,实现模块间的松耦合。
  4. 四是接口隔离原则(Interface Segregation Principles),强调接口的职责要明确,根据职责定义“较小”的接口,不要定义“高大全”的接口。也就是说接口要尽可能的职责单一,暴露给客户端的方法更具有“针对性”,往往使用多个隔离的接口比使用单个接口要好。应用场景:在使用接口时要注意控制接口的粒度,接口定义的粒度不能太细,也不能太粗。
  5. 五是单一职责原则(Single Responsibility Principle),强调一个类只负责一个功能领域中的相应职责,应用场景是一个类是和一组相关性很高的函数、数据的封装,比如单例模式可以降低内存的开销。
  6. 六是迪米特法则(Law of Demeter),强调应该尽量减少对象之间的交互,如果其中的一个对象需要调用另一个对象的某一个方法时,可以通过第三者转发这个调用。应用场景:通过引入一个合理的第三者来降低现有对象之间的耦合度。

分布式复杂性:

  1. 分布式事务:强调服务之间无事务处理,如果需要采用本地消息表进行事务和消息绑定机制。
  2. 异步消息
  3. 网络延迟

应对策略:

  • 团队组织:
  1. 能力资源池:平台,算法,前端,架构,DBA等
  2. 项目管理池:运动,心电,睡眠,影像,体检等
  • 数据库去中心化:分表分区,缓存等
  • 监控和日志组件:服务状态,断路器状态,吞吐量
  • 演进式设计:拆分主体业务为微服务,进行服务治理,分布式配置,服务跟踪等

Spring Cloud解决方案:是基于SpringBoot实现的架构开发工具,具体如下:


(1)Spring Cloud Eureka(服务注册和调用)

我们使用微服务,微服务的本质还是各种API接口的调用,那么我们怎么产生这些接口、产生了这些接口之后如何进行调用那?如何进行管理哪?

答案就是Spring Cloud Eureka,我们可以将自己定义的API 接口注册到Spring Cloud Eureka上,Eureka负责服务的注册于发现,如果学习过Zookeeper的话,就可以很好的理解,Eureka的角色和 Zookeeper的角色差不多,都是服务的注册和发现,构成Eureka体系的包括:服务注册中心、服务提供者、服务消费者。


(2)Spring Cloud Ribbon(客户端负载均衡器

在上Spring Cloud Eureka描述了服务如何进行注册,注册到哪里,服务消费者如何获取服务生产者的服务信息,但是Eureka只是维护了服务生产者、注册中心、服务消费者三者之间的关系,真正的服务消费者调用服务生产者提供的数据是通过Spring Cloud Ribbon来实现的。在(1)中提到了服务消费者是将服务从注册中心获取服务生产者的服务列表并维护在本地的,这种客户端发现模式的方式是服务消费者选择合适的节点进行访问服务生产者提供的数据,这种选择合适节点的过程就是Spring Cloud Ribbon完成的。

Spring Cloud Ribbon客户端负载均衡器由此而来。

(3)Spring Cloud Feign(服务调用简化)

上述(1)、(2)中我们已经使用最简单的方式实现了服务的注册发现和服务的调用操作,如果具体的使用Ribbon调用服务的话,你就可以感受到使用Ribbon的方式还是有一些复杂,因此Spring Cloud Feign应运而生。

Spring Cloud Feign 是一个声明web服务客户端,这使得编写Web服务客户端更容易,使用Feign 创建一个接口并对它进行注解,它具有可插拔的注解支持包括Feign注解与JAX-RS注解,Feign还支持可插拔的编码器与解码器,Spring Cloud 增加了对 Spring MVC的注解,Spring Web 默认使用了HttpMessageConverters, Spring Cloud 集成 Ribbon 和 Eureka 提供的负载均衡的HTTP客户端 Feign。简单的可以理解为:Spring Cloud Feign 的出现使得Eureka和Ribbon的使用更为简单。