SpringCloud-第一章 入门 单体应用架构 vs 微服务架构 在说SpringCloud之前,首先要陈述一下单体应用架构和微服务架构。
一个归档包,包含所有功能的应用程序叫单体应用 。在系统初期或者系统本身的复杂度不高,采用单体应用架构是合理的。它比较容易部署、维护、测试,大多数功能的实现,采用函数本地调用,所以说从架构合理性和性能角度考量,都是一个合理的方案。
但随着系统的复杂度越来越高,引入越来越多的功能,技术团队扩张,越来越多的人加入到系统的研发过程中。慢慢的,单体应用变得越来越臃肿,可维护性、灵活性逐渐降低,如果没有良好的编程规范约束和工程规范,一定会留下不少的技术债务(俗称”埋雷”),以上这些问题(当然还有其他的问题)共同导致了维护成本越来越高。
以上这些问题,相信大家在工作中,一定会经常碰到。那么如何解决单体应用架构的问题呢?微服务 应运而生,微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务都运行在自己的进程中,服务间采用轻量级通信机制,一系列独立运行的微服务共同构建起整个系统。
微服务虽然有很多吸引人的地方,但它并不是免费的午餐,使用它是有代价的。
1、运维成本较高:更多的服务,意味着更多的运维投入。在单体架构中,只需要保证一个应用的正常运行。而在微服务中,需要保证几十甚至几百个服务正常运行与协作,这给运维带来了很大的挑战。
2、分布式固有的复杂性:使用微服务架构即是分布式系统。对于一个分布式系统,系统容错、网络延迟、分布式事务等都会带来巨大的挑战。
3、接口调整成本高:微服务之间通过接口通信,如果修改某一个微服务的API,可能所有使用了该接口的微服务都需要做调整。
4、重复劳动:很多服务可能都会使用到相同的功能,而这个功能并没有达到分解为一个微服务的程度,这个时候,可能各个服务都会开发这一功能,从而导致代码重复。
虽然微服务有如上的缺点,但是瑕不掩瑜,为了更好的应用微服务,可以选择SpringCloud作为开发框架。
SpringCloud 上一章讲述了微服务的产生背景和微服务的优势和劣势,本章讲述应用SpringCloud生态,如何合理的搭建一套健壮,好维护的微服务的系统。
SpringBoot SpringCloud是基于SpringBoot构建的,因此它延续了SpringBoot的契约模式以及开发方式。SpringBoot的出现,解决了Java应用配置繁杂的缺点,整合了最优秀的中间件,使得基于Java的应用开发和部署十分简单。
Eureka 服务中心 没有服务中心,那么服务的调用必须采用硬编码的模式,那么每次服务的扩容,缩容,新的服务上线,都需要所有的服务上线,这显然是不合理的。
Eureka是一款开源的服务发现组件,https://github.com/Netflix/eureka
Eureka的功能:
1、Eureka集群
2、Eureka用户认证
3、Eureka自我保护模式
4、Eureka健康检查
Eureka最佳实践 如下图所示,要关注如下的参数
Renews threshold: 这个指标的计算是应用的数量int(count 2 0.85),图中实例正好是三个eureka-server实例,故而结果为5。
Renews(last min): 这个指标的含义是一分钟内接收到的心跳数量。如果renews(last min) < Renews threshold,则会触发Eureka的自我保护机制。
Instances currently registered with Eureka: 展示此时注册中心管理的应用及实例数量
Ceneral Info:最重要的是registered-replicas,available-replicas, 正常情况下unavailable-replicas是不应该有值的,如果有值,说明有replica不能使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 server: port: 8760 spring: profiles: active: peer0 application: name: eureka-server eureka: server: eviction-interval-timer-in-ms: 3000 responseCacheUpdateIntervalMs: 3000 enable-self-preservation: true client: registry-fetch-interval-seconds: 5 healthcheck: enabled: true serviceUrl: defaultZone: http://eureka1:8761/eureka/,http://eureka2:8762/eureka/ dashboard: path: /eurekaui instance: hostname: eureka0 lease-expiration-duration-in-seconds: 15 lease-renewal-interval-in-seconds: 5 preferIpAddress: false ribbon: ServerListRefreshInterval: 1000 management: metrics: export: prometheus: enabled: true step: 1 m descriptions: true endpoint: metrics: enabled: true prometheus: enabled: true health: show-details: always endpoints: web: exposure: include: "*"
Ribbon 实现客户端负载均衡 Ribbon是Netflix发布的负载均衡器。Ribbon的github地址,https://github.com/Netflix/ribbon
在Spring Cloud中,当Ribbon与Eureka配合使用时,Ribbon可自动从Eureka Server获取服务提供者地址列表,并基于负载均衡算法,请求其中一个服务提供者实例。
Feign 实现声明式REST调用 Feign是Netflix开发的声明式、模板化的HTTP客户端,其灵感来自Retrofit,JAXRS-2.0以及WebSocket。Feign可帮助我们更加便捷、优雅的调用HTTP API。https://github.com/OpenFeign/feign
Hystrix 微服务容错处理 Hystrix是Netflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性和容错性。
SpringCloudGateway 网关服务 https://github.com/spring-cloud/spring-cloud-gateway
Apollo 配置中心 https://github.com/ctripcorp/apollo
Sleuth和Zipkin实现微服务跟踪 https://github.com/spring-cloud/spring-cloud-sleuth