作为流行的微服务框架,Spring Could实用但不完美,比如说它只针对Java语言,坚持REST协议做微服务间的通讯等。


Spring Cloud虽然集成了众多组件,可以构建一个完整的微服务应用,但是其中的各个组件却并非完美无缺,很多组件在实际应用中都存在诸多不足和缺陷。因此,需要我们对其中的一些组件进行替换和修改,方能构建一个强大、灵活、健壮的微服务架构应用。

配置中心

Spring Cloud Config可以说是Spring Cloud家族中实现最Low的一个组件,直接采用了本地存储/SVN/Git的方式进行存储。同时,Spring Cloud Config也缺乏一个完整的可视化管理查询后台,当存在比较复杂的权限管理和版本管理需求时,Spring Cloud Config会显得非常力不从心。如果需要在配置修改后,能自动进行配置信息推送的话,使用Spring Cloud Config也无法满足要求,需要自行编写代码进行实现。

目前开源社区中,已经有了很多的开源配置中心实现方案,同时很多公司也自研了自己的配置中心方案。包括淘宝的统一配置中心Diamond(已经多年未更新)、百度的分布式配置管理平台Disconf、携程的开源分布式配置中心Apollo、360的分布式配置管理工具QConf等等。

注册中心

作为Spring Cloud的服务注册中心,从分布式CAP理论来看,Eureka采用是AP型设计,强调的是注册中心的高可用性。和Dubbo常用的服务注册中心ZooKeeper相比,ZooKeeper则是采用的CP型设计,强调的是注册中心数据的一致性。

Eureka的设计确实简单易用,但是默认没有实现对注册中心数据的持久化。同时,在极端场景下,也会出现多个Eureka注册中心节点数据不一致,甚至服务注册数据丢失的情况。当然,从分布式CAP理论来看,理论上是没办法做到同时兼顾CAP三点的。目前也有一些互联网公司对Eureka进行了改造,支持了数据的持久化,但是尚不能完整的支持CAP的全部要求。

API网关

API网关可以说是微服务需求最多,也是最有难点的一个组件。Spring Cloud中集成的Zuul应该说更多的是实现了服务的路由功能,对于负载均衡等其他功能,需要结合Ribbon等组件来实现。对于很多个性化的需求,需要开发者自己来进行编码实现。

和大部分基于Java的Web应用类似,Zuul也采用了Servlet架构,因此Zuul处理每个请求的方式是针对每个请求是用一个线程来处理。同时,由于Zuul是基于JVM的实现,因此性能也会在高并发访问场景下成为瓶颈。虽然网上一些文章评测Zuul和Nginx性能接近,但是在性能要求较高的场景下,JVM的内存管理和垃圾回收问题,仍然是一个很大的问题。所以在实际的应用场景中,通常会采用在多个Zuul几点前面再添加一层Nginx或者OpenResty来进行代理。

为了解决Zuul的性能问题,Netflix将自己的网关服务Zuul进行了升级,新的Zuul 2将HTTP请求的处理方式从同步变成了异步,并且新增诸如HTTP/2、websocket等功能。但是遗憾的是,开源版本的Zuul 2一直处于难产状态中,始终没有和大家正式见面。

熔断器

微服务中对于服务的限流、降级、熔断的需求是多种多样的,需要在API网关和各个具体服务接口中分别进行控制,才能满足复杂场景下微服务架构的应用需求。

单独使用Spring Cloud中的Hystrix无法完整的满足上述的复杂需求,需要结合API网关,并通过Kubernetes对资源、进程和命名空间来提供隔离,并通过部分自定义编码方能实现对全部服务的限流、降级、熔断等需求。

监控系统

无论是Spring Cloud中集成的Spring Cloud Sleuth,还是集成经典的ELK,都只是对日志级别的追踪和监控。在大中型微服务应用架构中,尤其是基于JVM的项目,还需要添加APM的监控机制,才能保证及时发现各种潜在的性能问题。

APM整体上主要完成3点功能:1.日志追踪、2.监控报警、3.性能统计。目前,国内外商业版本的APM方案已经有很多,开源版本的APM方案也开始丰富起来。国内开源的APM方案主要有:大众点评的CAT和Apache孵化中的SkyWalking。这里给大家重点推荐下SkyWalking,SkyWalking是针对分布式系统的应用性能监控系统,特别针对微服务、Cloud Native和容器化(Docker、Kubernetes、Mesos)架构,项目的关注度和发展速度都很快,中文文档资料也比较齐全。

浅谈服务治理、微服务与Service Mesh(二): Spring Cloud从入门到精通到放弃

Spring Could 问题的更多相关文章

  1. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  2. 玩转spring boot——快速开始

    开发环境: IED环境:Eclipse JDK版本:1.8 maven版本:3.3.9 一.创建一个spring boot的mcv web应用程序 打开Eclipse,新建Maven项目 选择quic ...

  3. Spring基于AOP的事务管理

                                  Spring基于AOP的事务管理 事务 事务是一系列动作,这一系列动作综合在一起组成一个完整的工作单元,如果有任何一个动作执行失败,那么事务 ...

  4. [Spring]IoC容器之进击的注解

    先啰嗦两句: 第一次在博客园使用markdown编辑,感觉渲染样式差强人意,还是github的样式比较顺眼. 概述 Spring2.5 引入了注解. 于是,一个问题产生了:使用注解方式注入 JavaB ...

  5. 学习AOP之透过Spring的Ioc理解Advisor

    花了几天时间来学习Spring,突然明白一个问题,就是看书不能让人理解Spring,一方面要结合使用场景,另一方面要阅读源代码,这种方式理解起来事半功倍.那看书有什么用呢?主要还是扩展视野,毕竟书是别 ...

  6. 学习AOP之深入一点Spring Aop

    上一篇<学习AOP之认识一下SpringAOP>中大体的了解了代理.动态代理及SpringAop的知识.因为写的篇幅长了点所以还是再写一篇吧.接下来开始深入一点Spring aop的一些实 ...

  7. 学习AOP之认识一下Spring AOP

    心碎之事 要说知道AOP这个词倒是很久很久以前了,但是直到今天我也不敢说非常的理解它,其中的各种概念即抽象又太拗口. 在几次面试中都被问及AOP,但是真的没有答上来,或者都在面上,这给面试官的感觉就是 ...

  8. 为什么做java的web开发我们会使用struts2,springMVC和spring这样的框架?

    今年我一直在思考web开发里的前后端分离的问题,到了现在也颇有点心得了,随着这个问题的深入,再加以现在公司很多web项目的控制层的技术框架由struts2迁移到springMVC,我突然有了一个新的疑 ...

  9. Spring之旅(2)

    Spring简化Java的下一个理念:基于切面的声明式编程 3.应用切面 依赖注入的目的是让相互协作的组件保持松散耦合:而AOP编程允许你把遍布应用各处的功能分离出来形成可重用的组件. AOP面向切面 ...

  10. Spring之旅

    Java使得以模块化构建复杂应用系统成为可能,它为Applet而来,但为组件化而留. Spring是一个开源的框架,最早由Rod Johnson创建.Spring是为了解决企业级应用开发的复杂性而创建 ...

随机推荐

  1. 使用vux实现上拉刷新的总结

    最近公司在研发app,选择了基于Vue框架的vux组件库,现总结在实现上拉刷新功能遇到的坑: 1.问题:只刷新一次,解决方法:需要自己手动重置状态 this.scrollerStatus.pullup ...

  2. pyDay17

    1.用filter求素数. 埃拉托色尼筛选法. #!/usr/bin/env python3 # -*- coding: utf-8 -*- def _odd_iter(): n = 1 while ...

  3. bzoj1610 / P2665 [USACO08FEB]连线游戏Game of Lines

    P2665 [USACO08FEB]连线游戏Game of Lines 第一次写快读没判负数....(捂脸) 暴力$O(n^2)$求斜率,排序判重. 注意垂直方向的直线要特判. end. #inclu ...

  4. git仓库迁移的两种解决方案

    Git仓库迁移而不丢失log的方法 要求能保留原先的commit记录,应该如何迁移呢? 同时,本地已经clone了原仓库,要配置成新的仓库地址,该如何修改呢? 注意:如果使用了代码审核工具Gerrit ...

  5. ubinize的用法

    1.ubinize支持哪些选项 Usage: ubinize [options] <ini-file> Generate UBI images. An UBI image may cont ...

  6. js的原型继承

    <script> //动物(Animal),有头这个属性,eat方法 //名字这个属性 //猫有名字属性,继承Animal,抓老鼠方法 function Animal(name){ thi ...

  7. python 清空列表

    # lst = ["篮球","排球","乒乓球","足球","电子竞技","台球" ...

  8. 安装基础版的kinetic

    没有gui工具 sudo apt-get install ros-kinetic-ros-base

  9. spark 都用了哪些开源东东

    直接上干货 commons-cli http://www.ibm.com/developerworks/cn/java/j-lo-commonscli/ guava http://www.cnblog ...

  10. 先对结果集排序然后做update、delete操作

    --先排序然后删除第n条数据delete from scott.emp where empno in (select empno                   from (select *    ...