Spring cloud 实战微服务

                              Spring cloud 实战微服务

                                    第一章   微服务架构简介

   一.首先介绍下传统的架构

      单体架构

             


     一个归档包(例如war格式)包含了应用所有功能的应用程序,我们通常称之为单体应用。架构单体应用的方法论,我们称之为单体应用架构。

缺点:

1. 复杂性高

      整个项目包含的模块非常多,模块的边界模糊,依赖关系不清晰,代码质量参差不齐,混乱地堆砌在一起……整个项目非常复杂。每次修改代码都心惊胆战,甚至添加一个简单的功能,或者修改一个BUG都会造成隐含的缺陷。

2. 技术债务

      随着时间推移、需求变更和人员更迭,会逐渐形成应用程序的技术债务,并且越积越多。“不坏不修(Not broken,don’t fix)”,这在软件开发中非常常见,在单体应用中这种思想更甚。已使用的系统设计或代码难以修改,因为应用程序的其他模块可能会以意料之外的方式使用它。  

3. 部署频率低

       随着代码的增多,构建和部署的时间也会增加。而在单体应用中,每次功能的变更或缺陷的修复都会导致我们需要重新部署整个应用。全量部署的方式耗时长、影响的范围大、风险高,这使得单体应用项目上线部署的频率较低。而部署频率低又导致两次发布之间会有大量的功能变更和缺陷修复,出错概率比较高。     

 4. 扩展能力受限

      单体应用只能作为一个整体进行扩展,无法结合业务模块的特点进行伸缩。例如,应用中有的模块是计算密集型的,它需要强劲的CPU;有的模块则是IO密集型的,需要更大的内存。由于这些模块部署在一起,我们不得不在硬件的选择上做出妥协。

5. 阻碍技术创新

      单体应用往往使用统一的技术平台或方案解决所有问题,团队的每个成员都必须使用相同的开发语言和框架,想要引入新的框架或技术平台会非常困难。例如,一个使用Struts 2构建的、100万行代码的单体应用,如果想要换用Spring MVC,切换成本无疑是非常高的。    

微服务架构

     http://www.martinfowler.com/articles/microservices.html

In short, the microservice architectural style is an approach to developing a single application as a suite of small services, each running in its own process and communicating with lightweight mechanisms, often an HTTP resource API. These services are built around business capabilities and independently deployable by fully automated deployment machinery. There is a bare minimum of centralized management of these services, which may be written in different programming languages and use different data storage technologies.

 翻译:简而言之,微服务架构风格这种开发方法,是以开发一组小型服务的方式来开发一个独立的应用系统的。其中每个小型服务都运行在自己的进程中,并经常采用HTTP资源API这样轻量的机制来相互通信。这些服务围绕业务功能进行构建,并能通过全自动的部署机制来进行独立部署。这些微服务可以使用不同的语言来编写,并且可以使用不同的数据存储技术。对这些微服务我们仅做最低限度的集中管理。

微服务特性:

从中我们可以看到,微服务架构应具备以下特性: 

1. 每个微服务可独立运行在自己的进程里;

2. 一系列独立运行的微服务共同构建起整个系统;

3. 每个服务为独立的业务开发,一个微服务只关注某个特定的功能,例如订单管理、用户管理等;

4. 微服务之间通过一些轻量的通信机制进行通信,例如通过REST API进行调用;

5. 可以使用不同的语言与数据存储技术;

6. 全自动的部署机制。

微服务架构的优点与挑战

      1. 易于开发和维护

 一个微服务只关注一个特定的业务功能,所以它的业务清晰、代码量较少。开发和维护单个微服务相对是比较简单的。而整个应用是由若干个微服务构建而成的,所以整个应用也会维持在可控状态。

2. 单个微服务启动较快

单个微服务代码量较少,所以启动会比较快。

3. 局部修改容易部署

单体应用只要有修改,就得重新部署整个应用,微服务解决了这样的问题。一般来说,对某个微服务进行修改,只需要重新部署这个服务即可。

4. 技术栈不受限

在微服务中,我们可以结合项目业务及团队的特点,合理地选择技术栈。例如某些服务可使用关系型数据库MySQL;某些微服务有图形计算的需求,我们可以使用Neo4J;甚至可以根据需要,部分微服务使用Java开发,部分微服务使用NodeJS进行开发。

5. 按需伸缩

我们可以根据需求,实现细粒度的扩展。例如:系统中的某个微服务遇到了瓶颈,我们可以结合这个微服务的业务特点,增加内存、升级CPU或者是增加节点。

微服务架构的挑战

1. 运维要求较高 
更多的服务意味着更多的运维投入。在单体架构中,只需要保证一个应用的正常运行;而在微服务中,需要保证几十甚至几百个服务的正常运行与协作,这给项目的运维带来了很大的挑战。
 
2. 分布式固有的复杂性
使用微服务构建的是分布式系统。对于一个分布式系统,系统容错、网络延迟、分布式事务等都给我们带来了很大的挑战。
 
3. 接口调整成本高
微服务之间通过接口进行通信。如果修改某一个微服务的API,可能所有使用了该接口的微服务都需要做调整。
 
4. 重复劳动

很多服务可能都会使用到相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这一功能,从而导致代码重复。

微服务设计原则

单一职责原则
ref:
https://en.wikipedia.org/wiki/SOLID_(object-oriented_design)
 
服务自治原则
服务自治,是指每个微服务应该具备独立的业务能力、依赖与运行环境。
 
轻量级通信原则
轻量级的定义指: 
 
接口明确原则

每个服务的对外接口应该明确定义,并尽量保持不变。

Spring cloud简介    可以参考官网   http://projects.spring.io/spring-cloud/

开始使用Spring Cloud实战微服务

     1.spring cloud是什么

    快速构建分布式系统的工具集

  2.Spring Cloud特点

   约定优于配置
   开箱即用、快速启动
   适用于各种环境
   轻量级的组件
   组件的支持很丰富,功能很齐全
   选型中立

服务注册与发现

  1.创建调用关系的微服务  

     创建存在调用关系的微服务,调用关系如下

    服务消费者   调用别的微服务的微服务

    服务提供者   提供API的微服务


     


使用Eureka实现服务注册与发现        

      

https://github.com/netflix/eureka

  服务发现组件:Eureka

Eureka简介

    Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务发现功能。
 

Eureka 项目相当活跃,代码更新相当频繁,目前最新的版本是1.5.5。Eureka 2.0的版本也正在紧锣密鼓地开发中,2.0将会带来更好的扩展性,并且使用细粒度的订阅模型取代了基于拉取的模型

Eureka 原理

   Region和Zone的关系 
 
上图是来自Eureka官方的架构图,大致描述了Eureka集群的工作过程。由于图比较复杂,可能比较难看懂,这边用通俗易懂的语言翻译一下:
 
- Application Service 就相当于本书中的服务提供者(用户微服务),Application Client就相当于本书中的服务消费者(电影微服务);
- Make Remote Call,可以简单理解为调用RESTful的接口;
- us-east-1c、us-east-1d等是zone,它们都属于us-east-1这个region;
 
由图可知,Eureka包含两个组件:Eureka Server 和 Eureka Client。
 
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。
 
Eureka Client是一个Java客户端,用于简化与Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robin)负载算法的负载均衡器。
 
在应用启动后,将会向Eureka Server发送心跳(默认周期为30秒)。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。
 
Eureka Server之间将会通过复制的方式完成数据的同步。(详见Eureka高可用章节)
 
Eureka还提供了客户端缓存的机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。
 
综上,Eureka通过心跳检测、健康检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

 

客户端负载均衡Ribbon

https://github.com/netflix/ribbon


Ribbon是什么

Ribbon是Netflix发布的云中间层服务开源项目,其主要功能是提供客户端侧负载均衡算法。Ribbon客户端组件提供一系列完善的配置项如连接超时,重试等。简单的说,Ribbon是一个客户端负载均衡器,我们可以在配置文件中列出Load Balancer后面所有的机器,Ribbon会自动的帮助你基于某种规则(如简单轮询,随机连接等)去连接这些机器,我们也很容易使用Ribbon实现自定义的负载均衡算法。
 
下图展示了Eureka使用Ribbon时候的大致架构:
 
 

Ribbon工作时分为两步:第一步先选择 Eureka Server, 它优先选择在同一个Zone且负载较少的Server;第二步再根据用户指定的策略,在从Server取到的服务注册列表中选择一个地址。其中Ribbon提供了多种策略,例如轮询round robin、随机Random、根据响应时间加权等。


以上:是对微服务的简单介绍,想学习的可以参考Spring cloud官网,Spring cloud源码:点击打开链接

 

猜你喜欢

转载自blog.csdn.net/qq_39736103/article/details/80922782