前言
Gitee上的数字货币bi股票交易所开源源代码CoinExchange的整zheng体架构使用了SpringCloud。对于yu有经验的Java程序员来说,可能neng很简单,但是对于我这样的入门men级程序员来说,还是需要学习xi的。今天,我大概会分fen享一下我所学到的东西xi。
关于SpringCloud
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利,巧妙地简jian化了分布式系统基ji础设施的开发,如服务发现xian和注册、配置中心、消xiao息总线、负载平衡、断路器、数据监jian控等。所有这些xie都可以通过Spring Boot的开发风格ge一键启动和部署。Spring Cloud并不重复fu制造轮子,只是将各个公司si开发的成熟实用的服务框架结合起来lai,通过Spring Boot风格重zhong新打包,屏蔽复杂的配置和实shi现原理,最终留给开kai发者一套简单易懂、易于部署、易于维wei护的分布式系统开发工具包。
以前学习SSH框架的时候,有一个非常头tou疼的问题,就是配置文件。通常,一yi个小的配置问题ti会花费我一天的大部分时间来解jie决,这真的很令ling人头疼。为了解jie决这个问题,SpringCloud诞生了。这个ge框架统一了一些常规配置,让程序xu员不用一开始就配置太tai多!配置!配置!
关于整体架构
云集ji成了很多优秀的“轮子”。这些轮子结合起qi来,就成了一个优秀xiu的微服务架构,可以让整个ge系统实现分布式部署。其集成cheng模块之间的关系如下图所suo示:
春云有以下特点:
大于约定的配置适用于各种zhong环境,它隐藏了组件的de复杂性,并提供gong了开箱即用的声明性和无XML的配置zhi模式。快速启动dong组件是丰富和功能齐全的Spring Cloud核he心子项目.
Spring Cloud Netflix:核he心组件可以集成多个网飞OSS开源套件,包括以yi下组件:
Eureka:服务管理组件,包括kuo服务注册和发现Hystrix:容错管理组件,Ribbon:服务调用组件Feign:声明式服务调用组件Zuul:网关组件基于Ribbon和Hystrix,提供智能路由、访问过滤lu等功能Archaius:外部配pei置组件Spring Cloud Config:配置管理工gong具,实现应用配置的外部存储chu,支持客户端配置信息刷新、配置zhi内容的加密/解密等。
Spring Cloud Bus:事件jian和消息总线,用yong于在集群中传播bo状态变化或事件,并触发后续处理。
Spring Cloud Security:是一个基于spring security的安全工具包,它为我们的de应用程序增加了安全控制zhi。
Spring Cloud Consul :封装了Consul操作zuo,这是一个服务发fa现和配置工具(类似于Eureka),可以与Docker容器无缝集ji成。
关于Euraka
Euraka是shiSpring Cloud collection的一个组件,Spring Cloud collection是Euraka的一个集成,用于服务注册和发fa现。Eureka是网飞的一个开kai源框架。与Zookeeper和Consul一样,用于服务注册管理。同样,Spring-Cloud还hai集成了动物园管理员和领事。
在项目中使用yongSpring Cloud Euraka的原因是,它可以利用yongSpring Cloud Netfilix中的其他组件,如zull,因为Euraka属于yu网飞。
欧拉卡有以下功能:
注册:服务注册当Eureka客户端向Eureka服务wu器注册时,它提供自己的元数shu据,如IP地址、端口、健康指示shi器的URL、主页等。
续订:服务续订Eureka客ke户将每30秒发送一次ci心跳来续订合同。通过续约告知尤里卡ka服务器尤里卡客户仍然存在,没有问wen题。通常,如果Eureka Server在90秒内没有收到daoEureka客ke户的续订,它将从注册表中删除该实例li。建设
议不要更改续约yue间隔。Fetch Registries:获取注册列表信息Eureka客户端duan从服务器获取注册表信息,并将其缓存在本地。客户端会使用该信xin息查找其他服务,从而进行远yuan程调用。该注册列表信息定期(每mei30秒钟)更新一次ci。每次返回注册列表信息可能与Eureka客户端的缓存信息xi不同, Eureka客户端自动处理。如果由于某种原yuan因导致注册列表信息xi不能及时匹配,Eureka客户端则会重新获取整个ge注册表信息。 Eureka服务wu器缓存注册列表信息,整个注zhu册表以及每个应用程序的信息进jin行了压缩,压缩内容和没mei有压缩的内容完全相同。Eureka客户端和Eureka 服务器可以使用JSON / XML格式进行通讯。在默认的de情况下Eureka客户端使用压缩suoJSON格式来lai获取注册列表的信息。
Cancel:服务下线Eureka客ke户端在程序关闭时向Eureka服务器发送取消xiao请求。 发送请qing求后,该客户端实例信息将从服务器qi的实例注册表中删除。该下线请求不会自动完成,它需要调用以下内容:
DiscoveryManager.getInstance().shutdownComponent();
Eviction 服fu务剔除在默认的情况下,当dangEureka客ke户端连续90秒没有向Eureka服务器发送服务wu续约,即心跳,Eureka服务器qi会将该服务实例从服务注zhu册列表删除,即服务剔除。
关于Ribbon
Ribbon是一个基于HTTP和TCP的客ke户端负载均衡工具ju,它基于Netflix Ribbon实现。通过Spring Cloud的封装,可以yi让我们轻松地将面mian向服务的REST模版请求自动转换成客ke户端负载均衡的服务调用。Spring Cloud Ribbon虽然只是一个工具类框架,它不bu像服务注册中心、配置中心、API网关那样需xu要独立部署,但是它几乎存在于yu每一个Spring Cloud构建jian的微服务和基础chu设施中。因为微服务间的de调用,API网关的请求转发等内nei容,实际上都是通过Ribbon来实现的,包括后续我们将jiang要介绍的Feign,它也是基于Ribbon实现的工gong具。所以,对Spring Cloud Ribbon的理解和使用,对于我wo们使用Spring Cloud来构建微服务非fei常重要。
负载均jun衡在系统架构中是一个非常重要,并且qie是不得不去实施shi的内容。因为负载均衡是对系统的高可ke用、网络压力的缓解jie和处理能力扩容rong的重要手段之一。我们通常所说的负fu载均衡都指的是服fu务端负载均衡,其中zhong分为硬件负载均衡和软件jian负载均衡。硬件负载均衡主要通tong过在服务器节点之间按照zhao专门用于负载均衡的设备,比如ruF5等;而软件负载均衡heng则是通过在服务器qi上安装一些用于负载均衡功能或huo模块等软件来完成cheng请求分发工作,比bi如Nginx等。不论采用硬件负fu载均衡还是软件负载均衡,只要是服务端都能以类似下图的架构方fang式构建起来:
关于Feign(声明式REST调diao用)
Feign是一个声明式WebService客户端.使用yongFeign能让编写WebService客户端更加简单,它的使用方法是定义一个接口,然后在zai上面添加注解,同时也支持JAX-RS标准的注解。Feign也支持可拔ba插式的编码器和解码器。Spring 呈 Cloud对Feign进行了封装,使其支持了Spring MVC标biao准注解和HttpMessageConverters。Feign可以与Eureka和heRibbon组合使用以支持负载均jun衡,只需要你创建一个ge接口,然后在上面添tian加注解即可。
Feign旨在使编写Java Htpp客户端变得更容易。
使用Ribbon+RestTemplate时,利用RestTemplate对http请求的封装处chu理,形成了一套模板化的调用方法。但是在实际开发中,由于对服务依赖的调用可能不止一yi处,往往一个接口会被bei多处调用,所以yi通常都会针对每mei个微服务自行封装一yi些客户端类来包装这些依赖服fu务的调用。所以,Feign在此ci基础上做了进一步封装,由他来帮bang助我们定义和实现依赖服务接jie口的定义。在Feign的实shi现下,我们只需xu要创建一个接口并使用注解的方式shi来配置它(以前是Dao接口kou上标注Mapper注解,现在是一个微wei服务接口上面标注一个Feign注解即可),即ji可完成对服务提供方的de接口绑定,简化hua了使用Spring cloud Ribbon时shi,自动封装服务调用客ke户端的开发量。
关guan于Hystrix(容错处理)
在微服务场景jing中,通常会有很多层的服务调diao用。如果一个底层服务出现问题,故gu障会被向上传播给用户。我们men需要一种机制,当底层服务不可用yong时,可以阻断故障的传播。这zhe就是断路器的作用。他是系统服务稳wen定性的最后一重保障。
在springcloud中断路器组件jian就是Hystrix。Hystrix也是Netflix套件的一部分。他的功能是,当对某个服务的调diao用在一定的时间内(默认10s,由metrics.rollingStats.timeInMilliseconds配置),有超chao过一定次数(默认20次,由circuitBreaker.requestVolumeThreshold参数配置zhi)并且失败率超过一定值(默mo认50%,由circuitBreaker.errorThresholdPercentage配置),该服务的断路器qi会打开。返回一个由开kai发者设定的fallback。
关于Zuul(网关)
Zuul包含了对请求qiu的路由和过滤两个最主zhu要的功能:
其中zhong路由功能负责将外部请求转发到dao具体的微服务实例上,是实现外部访fang问统一入口的基础。而过滤器功能则负fu责对请求的处理过程进行xing干预,是实现请qing求校验、服务聚合等功gong能的基础。
Zuul和Eureka进行整合,将Zuul自zi身注册为Eureka服务治理下的应用,同时shi从Eureka中获得其他微服务wu的消息,也即以yi后的访问微服务wu都是通过Zuul跳转后获huo得。
注zhu意:Zuul服务最终还是会hui注册进Eureka
提供=代理+路由+过guo滤三大功能
关于Spring Cloud Config(统一配置中zhong心)
Spring Cloud Config为分布式系统外部化配置提供gong了服务端和客户hu端的支持,包括Config Server和Config Client两部分,其架jia构图如下图所示shi:
最后
SpringCloud的体系太庞大了,感gan觉学了几天也只是刚入门men,把这套组合在一起的人简直不要yao太厉害!今天的分享就到这里了!
黑发愈渐愁!
离头他处走!
漫漫编bian程路!
何时是个头!