springCloud总览

Spring Cloud总览:

1.1微服务与springcloud

微服务是一种架构风格,将单体应用划分为小型的服务单元,微服务之间使用HTTP的API进行资源访问与操作。

ddfb73747d551d5b2977e13723ffa4e92c0.jpg

                                                        传统的SOA架构

65fa7ac37d651f0066697ebba9ab2621210.jpg

                         微服务架构

1.2 Springcloud 与Netflix

Spring Cloud并不是一个具体的框架,大家可以把它理解为一个工具箱,它提供的各类工具,可以帮助我们快速的构建分布式系统。

Spring Cloud的各个项目基于Spring Boot,将Netflix的多个框架进行封装,并且通过自动配置的方式将这些框架绑定到Spring的环境中,从而简化了这些框架的使用。由于Spring Boot的简便,使得我们在使用Spring Cloud时,很容易的将Netflix各个框架整合进我们的项目中。Spring Cloud下的“Spring Cloud Netflix”模块,主要封装了Netflix的以下项目:

Eureka:基于REST服务的分布式中间件,主要用于服务管理。

Hystrix:容错框架,通过添加延迟阀值以及容错的逻辑,来帮助我们控制分布式系统间组件的交互。

  Feign:一个REST客户端,目的是为了简化Web Service客户端的开发

Ribbon:负载均衡框架,在微服务集群中为各个客户端的通信提供支持,它主要实现中间层应用程序的负载均衡

Zuul:为微服务集群提供过代理、过滤、路由等功能。

1.3 Spring Cloud的主要模块

除了Spring Cloud Netflix模块外,Spring Cloud还包括以下几个重要的模块:

    Spring Cloud Config:为分布式系统提供了配置服务器和配置客户端,通过对它们的配置,可以很好的管理集群中的配置文件。

    Spring Cloud Sleuth:服务跟踪框架,可以与Zipkin、Apache HTrace和ELK等数据分析、服务跟踪系统进行整合,为服务跟踪、解决问题提供了便利。

   Spring Cloud Stream:用于构建消息驱动微服务的框架,该框架在Spring Boot的基础上,整合了“Spring Integration”来连接消息代理中间件。

   Spring Cloud Bus:连接RabbitMQ、Kafka等消息代理的集群消息总线。

2、eureka集群:

           Eureka提供基于REST的服务,在集群中主要用于服务管理。Eureka提供了基于Java语言的客户端组件,客户端组件实现了负载均衡的功能,为业务组件的集群部署创造了条件。使用该框架,可以将业务组件注册到Eureka容器中,这些业务组件可进行集群部署,Eureka主要维护这些服务的列表并自动检查它们的状态。03ecd03735d2f4be1d19593eb3d46f8b7ce.jpg

3、负载均衡ribbon

         详情地址:https://blog.csdn.net/forezp/article/details/74820899

         Springcloud使用的Ribbon主要是用在client端,通过指定的Rule后,访问选定的服务端。Ribbon可以自己设置负载均衡规则,只要实LoadBalancerClient 接口,然后在配置文件设置均衡规则的class文件为这个即可。

         Nginx作为近年来较火的反向代理服务器,安装在目的主机端,主要用于转发客户机请求,后台有多个http服务器提供服务,nginx的功能就是把请求转发给后面的服务器,决定哪台目标主机来处理当前请求。

         还有一个是dubbo。

4d464b2e9ab5525f8eae474caada54c41ac.jpg

4、rest客户端Feign

         使用Feign时,可以使用注解来修饰接口,被注解修饰的接口具有访问Web Service的能力,这些注解中既包括了Feign自带的注解,也支持使用第三方的注解。除此之外,Feign还支持插件式的编码器和解  码  器,使用者可以通过该特性,对请求和响应进行不同的封装与解析。Feign使用的是JDK的动态代理,生成的代理类,会将请求的信息封装,交给feign.Client接口发送请求,而该接口的默认实现类,最终会使用java.net.HttpURLConnection来发送HTTP请求。

5、hystrix 熔断器

         如果提供者发生故障,无法正常访问,消费者为了自保应该使用设置回退方法。而这个熔断器,就是来设置何时使用回退方法。Hystrix可以设置缓存与合并。

有3种情况触发回退(fallback):

  • 断路器被打开。
  •  线程池、队列、信号量满载。
  • 实际执行命令失败。
  • 5a059a3634daa1aa7cae53a1083c7f026f4.jpg

简单说明一下运作流程:

•       第一步:在命令开始执行时,会做一些准备工作,例如为命令创建相应的线程池等。

•       第二步:判断是否打开了缓存,打开了缓存就直接查找缓存并返回结果。

•       第三步:判断断路器是否打开,如果打开了,就表示链路不可用,直接执行回退方法。结合本章开头的例子,可理解为“基础服务”模块不可用,“服务A”模块直接执行回退,响应用户请求。

•       第四步:判断线程池、信号量(计数器)等条件,例如像线程池超负荷,则执行回退方法,否则,就去执行命令的内容。

•       第五步:执行命令,计算是否要对断路器进行处理,执行完成后,如果满足一定条件,则需要开启断路器。如果执行成功,则返回结果,反之则执行回退。

6、网关zuul

         如果集群提供了API或者Web服务,需要与外部进行通信,比较好的方式是添加一个网关,将集群的服务都隐藏到网关后面。这样的做法,对于外部客户端来说,无需关心集群的内部结构,只需关心网关的位置等信息;对于Spring Cloud集群来说,不必过多的暴露服务,提升了集群的安全性。Netflix提供了自己的解决方案:Zuul。Zuul是Netflix的一个子项目,Spring Cloud将Zuul做进一步的实现与封装,整合到spring-netflix项目中,为微服务集群提供过代理、过滤、路由等功能。

994cd4c24aa3a26fdbfd5d7223b385694a8.jpg 

@EnableZuulProxy注解,开启该注解后,在Spring容器初始化时,会将Zuul的相关配置初始化,其中包含一个Spring Boot的bean:ServletRegistrationBean,该类主要用于注册Servlet。Zuul提供了一个ZuulServlet类,在Servlet的service方法中,执行各种Zuul过滤器(ZuulFilter)。

ZuulServlet的service方法接收到请求后,会执行“pre”阶段的过滤器,再执行“routing”阶段的过滤器,最后执行“post”阶段的过滤器。其中“routing”的过滤器,会将请求转发到“源服务”,源服务可以是第三方的Web服务,也可以是Spring Cloud的集群服务。在执行pre和routing阶段的过滤器时,如果出现异常,则会执行“error”过滤器。整个过程的HTTP请求、HTTP响应、状态等数据,都会封装到一个RequestContext的对象中。

在springcloud集群中使用zuul:

9c639b23d8a823629244623ab822ec0d4bc.jpg

7、消息代理RabbitMQ、kafaka

目前在市面上有许多消息代理中间件(下面简称为消息代理),例如ActiveMQ、RabbitMQ、Kafka等,在使用这些框架时,我们需要调用它们的API,用来发送、接收消息

db6f87805832b155fa672077e4026200a67.jpg

消息代理主要用于接收和转发消息,可以把它看作邮局,消息生产者看作是寄件人,消息消费者是收件人,我们将一信件放到邮箱中,邮递员最终会把信件送达给收件人,RabbitMQ等框架,就是进行着邮箱、邮递员和邮局的工作,但它们处理的不是信件,而是“消息”。

RabbitMQ支持多种协议,其中最为重要的,是高级消息队列协议(AMQP),AMQP是“Advanced Message Queuing Protocol”的缩写,它定义了“消息客户端”与“消息代理中间件”之间的通信协议。

Kafka是Apache下的一个用于处理数据流的分布式消息框架,它拥有水平扩展、容错、高效等特性,可以使用该框架来实现以下功能:

  • 构建在系统间进行实时数据传输的通道。
  • 构建对数据流行转换或响应的实时应用。

  Kafka的整体结构与RabbitMQ类似,消息生产者向Kafka服务器发送消息,Kafak接收消息后,再投递给消费者。在Kafka中,生产者消息会被发送到Topic中,Topic保存着各类的数据,每一条数据都使用键、值进行保存。每一个Topic下都包含一个或多个物理分区(Partition),这些分区维护着消息的内容和索引,它们有可能被保存在不同的服务器上面。对于客户端来说,无须关心数据如何被保存,只需要关心将消息发往哪个Topic。

@Input("myInput")

SubscribableChannel myInput();

@StreamListener("myInput")

  public void receive(byte[] msg) {

   System.out.println("接收到的消息:  " + new String(msg));

 }

8、Zipkin简介

   Zipkin是一个分布式的跟踪系统,主要用于收集、管理微服务所产生的数据。Zipkin的设计基于Google Dapper。在实际应用时,我们需要让各个微服务,向Zipkin服务器报告过程数据。对于Spring Cloud来说,已经提供了几个模块来实现数据报告功能,我们仅需要加入依赖,以及做简单配置,即可实现向Zipkin“写入”数据。

  Zipkin在得到这些数据后,提供了数据查询、分析的功能,这些图形化的功能,可以让我们对微服务的调用过程、处理时间、依赖关系等数据一目了然。

 

参考地址:

https://my.oschina.net/JavaLaw

代码地址:https://github.com/honelypig/spring-cloud

 

转载于:https://my.oschina.net/905042249/blog/2120735

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值