SpringCloud 相关概念解析

本贴最后更新于 1364 天前,其中的信息可能已经斗转星移

  • Eureka 相关:首先 Eureka 分为 Server 和 Client,其中 Server 可以为单节点,也可以为多节点,其中多节点主要是为了防止该节点坏掉之后所有节点都不能使用。
  • Eureka Server:首先,单节点 Server 的话,主要有以下配置:
# eureka.client.fetch-registry: 表示是否从 Eureka Server 获取注册信息,默认为true。如果这是一个单点的 Eureka Server,不需要同步其他节点的数据,设为false
    fetch-registry: false
    # eureka.client.register-with-eureka: 表示是否将自己注册到 Eureka Server, 默认为true。由于当前应用就是 Eureka Server, 因此设为 false
    register-with-eureka: false
    # 设置 Eureka Server 所在的地址,查询服务和注册服务都需要依赖这个地址
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

其中 fetch-registry 代表是否需要从 Eureka Server 中获取所有服务的注册信息,由于是单点的服务注册中心,他自己本身就有了所有的注册信息,不需要从其他注册中心节点中获取。register-with-eureka 代表是否将该服务注册到服务中心,由于自己就是服务中心,因此不注册。service-url 代表服务注册中心的地址,也就是将本服务注册到哪个位置,不是自己向外提供服务的地址。

  • 多节点的 Eureka Server:多节点的配置如下:

    ---
    spring:
      application:
        name: ad-eureka
      profiles: server1
    server:
      port: 8000
    eureka:
      instance:
        hostname: server1
        prefer-ip-address: false
      client:
        service-url:
          defaultZone: http://server2:8001/eureka/,http://server3:8002/eureka/
    
    ---
    spring:
      application:
        name: ad-eureka
      profiles: server2
    server:
      port: 8001
    eureka:
      instance:
        hostname: server2
        prefer-ip-address: false
      client:
        service-url:
          defaultZone: http://server1:8000/eureka/,http://server3:8002/eureka/
    
    ---
    spring:
      application:
        name: ad-eureka
      profiles: server3
    server:
      port: 8002
    eureka:
      instance:
        hostname: server3
        prefer-ip-address: false
      client:
        service-url:
          defaultZone: http://server1:8000/eureka/,http://server2:8001/eureka/
    

    由于三个节点都是注册中心,但是需要不断的保持三个注册中心的注册信息一直,因此某个节点需要一直向另外两个节点发送请求进行实时更新。因此以 server1 为例,他首先需要将自己注册为 server2 和 server3 的服务,并且不断将 server2 和 server3 中的信息更新到自己中来。那么 fetch-registry 和 register-with-eureka 都默认为 true。server1 的 service-url 写的是 server2 和 server3 的地址。

  • Eureka Client:我认为我们可以把所有的除了注册中心以外的所有服务都看作为 Client。但是 client 本身又可以分为纯粹的服务消费者,既有消费又有服务。对于单纯的服务消费者,可以不将自己注册到 Eureka Server 中,因为不会有其他服务调用该服务。

  • Ribbon:客户端的负载均衡,只要是如果相同的服务存在于不同的服务器中,客户端访问的时候会通过负载均衡算法选择一个服务进行调用。

  • Hystrix:服务熔断。设想以下过程:如果服务 A 调用 B,B 调用服务 C,C 调用服务 D。如果此时服务 D 出现错误,那么服务 ABC 的请求均处在一个延迟状态,这样由于一个单个服务导致所有的请求处于延迟状态最终导致资源耗尽,最终导致服务不可用与系统不可用。这种现象称为“雪崩”。服务熔断就是为了解决该问题,Hystrix 提供的保护机制主要分为断路器和线程隔离等机制。

  • 断路器机制:当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝), 向调用方返回一个错误响应, 而不是长时间的等待。这样就不会使得线程因调用故障服务被长时间占用不释放,避免了故障在分布式系统中的蔓延。

  • 线程隔离机制:它会为每一个依赖服务创建一个独立的线程池,这样就算某个依赖服务出现延迟过高的情况,也只是对该依赖服务的调用产生影响, 而不会拖慢其他的依赖服务。

  • Hystrix 提供几个熔断关键参数:滑动窗口大小(20)、 熔断器开关间隔(5s)、错误率(50%)。每当 20 个请求中,有 50% 失败时,熔断器就会打开,此时再调用此服务,将会直接返回失败,不再调远程服务。直到 5s 钟之后,重新检测该触发条件,判断是否把熔断器关闭,或者继续打开。

  • Feign:Feign 是一种负载均衡的 HTTP 客户端, 使用 Feign 调用 API 就像调用本地方法一样,从避免了调用目标微服务时,需要不断的解析/封装 json 数据的繁琐。下面给出 Feign 的用法。

  • 首先 Feign 是一个 HTTP 的客户端,因此 feign 一般是写在你要调用某个服务的地方。加入你要在 A 服务中调用 B 服务,那么 feign 是写在 A 服务中的。

  • 建立一个 FeignClient:其中 sponsor 就是请求的服务,该服务是注册到 Eureka Server 中的。

    @FeignClient(value = "eureka-client-ad-sponsor",
            fallback = SponsorClientHystrix.class)
    public interface SponsorClient {
    
        @RequestMapping(value = "/ad-sponsor/get/adPlan",
                method = RequestMethod.POST)
        CommonResponse<List<AdPlan>> getAdPlans(
                @RequestBody AdPlanGetRequest request);
    }
    

    这里的 Client 类可以和 Service 看做同层,需要注入到 Controller 中进行调用。

  • Controller 调用:可以直接将 Client 注入到 Controller 中,然后直接调用。

    @IgnoreResponseAdvice
        @PostMapping("/getAdPlans")
        public CommonResponse<List<AdPlan>> getAdPlans(
                @RequestBody AdPlanGetRequest request
        ) {
            log.info("ad-search: getAdPlans -> {}",
                    JSON.toJSONString(request));
            return sponsorClient.getAdPlans(request);
        }
    

    注入的过程省略。

  • 在该服务的启动类中,需要加入一个 @EnableFeignClients 注解,代表该类是一个 Feign 客户端。

  • 调用的服务长什么样子:

    @PostMapping("/get/adPlan")
        public List<AdPlan> getAdPlanByIds(
                @RequestBody AdPlanGetRequest request) throws AdException {
            log.info("ad-sponsor: getAdPlanByIds -> {}",
                    JSON.toJSONString(request));
            return adPlanService.getAdPlanByIds(request);
        }
    

    调用的服务就是正常的一个向外暴露的接口。但是要注意,feignClient 中调用的 url 和这里的接口 url 要保持一致。这样才能通过 feign 调用到该服务。

  • Zuul:API 网关,外层调用的所有调用均需要通过 Zuul,也就是整个系统的大门,从外部想要进入必须通过该大门,在 API 网关服务上进行统一调用来对微服务接口做前置过滤,以实现对微服务接口的拦截和校验。

  • Zuul 和 Feign 的关系:Zuul 主要是把控外部调用的请求,即从外部进入到系统的请求。Feign 主要控制的是各个微服务之间的调用请求。例如一个小区,Zuul 是小区的大门,控制人从外部进入到小区内。Feign 类似于各个楼栋的大门,负责小区内部各个楼栋之间的调用关系。Zuul 和 Feign 都支持 Ribbon 和 Hystrix,也即是负载均衡和服务熔断。

  • Spring Cloud Config:是一个解决分布式系统的配置管理方案。它包含了 Client 和 Server 两个部分,server 提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client 通过接口获取数据、并依据此数据初始化自己的应用。简单来说,使用 Spring Cloud Config 就是将配置文件放到统一的位置管理(比如 GitHub),客户端通过接口去获取这些配置文件。在 GitHub 上修改了某个配置文件,应用加载的就是修改后的配置文件。修改了配置文件,希望不用重启来动态刷新配置,配合 Spring Cloud Bus 使用。

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    938 引用 • 1456 回帖 • 163 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Webswing

    Webswing 是一个能将任何 Swing 应用通过纯 HTML5 运行在浏览器中的 Web 服务器,详细介绍请看 将 Java Swing 应用变成 Web 应用

    1 引用 • 15 回帖 • 633 关注
  • TensorFlow

    TensorFlow 是一个采用数据流图(data flow graphs),用于数值计算的开源软件库。节点(Nodes)在图中表示数学操作,图中的线(edges)则表示在节点间相互联系的多维数据数组,即张量(tensor)。

    20 引用 • 19 回帖 • 1 关注
  • 又拍云

    又拍云是国内领先的 CDN 服务提供商,国家工信部认证通过的“可信云”,乌云众测平台认证的“安全云”,为移动时代的创业者提供新一代的 CDN 加速服务。

    21 引用 • 37 回帖 • 506 关注
  • 思源笔记

    思源笔记是一款隐私优先的个人知识管理系统,支持完全离线使用,同时也支持端到端加密同步。

    融合块、大纲和双向链接,重构你的思维。

    18132 引用 • 66897 回帖
  • JWT

    JWT(JSON Web Token)是一种用于双方之间传递信息的简洁的、安全的表述性声明规范。JWT 作为一个开放的标准(RFC 7519),定义了一种简洁的,自包含的方法用于通信双方之间以 JSON 的形式安全的传递信息。

    20 引用 • 15 回帖 • 18 关注
  • Gitea

    Gitea 是一个开源社区驱动的轻量级代码托管解决方案,后端采用 Go 编写,采用 MIT 许可证。

    4 引用 • 16 回帖 • 7 关注
  • 持续集成

    持续集成(Continuous Integration)是一种软件开发实践,即团队开发成员经常集成他们的工作,通过每个成员每天至少集成一次,也就意味着每天可能会发生多次集成。每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽早地发现集成错误。

    14 引用 • 7 回帖
  • NGINX

    NGINX 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 NGINX 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。

    311 引用 • 546 回帖 • 57 关注
  • Kafka

    Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是现代系统中许多功能的基础。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。

    35 引用 • 35 回帖
  • uTools

    uTools 是一个极简、插件化、跨平台的现代桌面软件。通过自由选配丰富的插件,打造你得心应手的工具集合。

    5 引用 • 13 回帖
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    131 引用 • 1114 回帖 • 153 关注
  • C

    C 语言是一门通用计算机编程语言,应用广泛。C 语言的设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器码以及不需要任何运行环境支持便能运行的编程语言。

    83 引用 • 165 回帖 • 58 关注
  • CodeMirror
    1 引用 • 2 回帖 • 108 关注
  • jQuery

    jQuery 是一套跨浏览器的 JavaScript 库,强化 HTML 与 JavaScript 之间的操作。由 John Resig 在 2006 年 1 月的 BarCamp NYC 上释出第一个版本。全球约有 28% 的网站使用 jQuery,是非常受欢迎的 JavaScript 库。

    63 引用 • 134 回帖 • 744 关注
  • Eclipse

    Eclipse 是一个开放源代码的、基于 Java 的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。

    75 引用 • 258 回帖 • 625 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 1 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    5 引用 • 26 回帖 • 489 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖
  • 数据库

    据说 99% 的性能瓶颈都在数据库。

    330 引用 • 612 回帖
  • Git

    Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

    204 引用 • 357 回帖 • 1 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    53 引用 • 85 回帖 • 3 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 405 关注
  • FFmpeg

    FFmpeg 是一套可以用来记录、转换数字音频、视频,并能将其转化为流的开源计算机程序。

    22 引用 • 31 回帖 • 13 关注
  • Openfire

    Openfire 是开源的、基于可拓展通讯和表示协议 (XMPP)、采用 Java 编程语言开发的实时协作服务器。Openfire 的效率很高,单台服务器可支持上万并发用户。

    6 引用 • 7 回帖 • 87 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    185 引用 • 318 回帖 • 353 关注
  • SpaceVim

    SpaceVim 是一个社区驱动的模块化 vim/neovim 配置集合,以模块的方式组织管理插件以
    及相关配置,为不同的语言开发量身定制了相关的开发模块,该模块提供代码自动补全,
    语法检查、格式化、调试、REPL 等特性。用户仅需载入相关语言的模块即可得到一个开箱
    即用的 Vim-IDE。

    3 引用 • 31 回帖 • 66 关注
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    70 引用 • 532 回帖 • 706 关注