SpringCloud 相关概念解析

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

  • 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 应用程序开发提供集成的框架。

    941 引用 • 1458 回帖 • 150 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖 • 5 关注
  • Elasticsearch

    Elasticsearch 是一个基于 Lucene 的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful 接口。Elasticsearch 是用 Java 开发的,并作为 Apache 许可条款下的开放源码发布,是当前流行的企业级搜索引擎。设计用于云计算中,能够达到实时搜索,稳定,可靠,快速,安装使用方便。

    116 引用 • 99 回帖 • 267 关注
  • sts
    2 引用 • 2 回帖 • 149 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 1 关注
  • Hexo

    Hexo 是一款快速、简洁且高效的博客框架,使用 Node.js 编写。

    21 引用 • 140 回帖 • 25 关注
  • 以太坊

    以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统。以太坊是一个平台和一种编程语言 Solidity,使开发人员能够建立和发布下一代去中心化应用。 以太坊可以用来编程、分散、担保和交易任何事物:投票、域名、金融交易所、众筹、公司管理、合同和知识产权等等。

    34 引用 • 367 回帖 • 2 关注
  • 分享

    有什么新发现就分享给大家吧!

    242 引用 • 1747 回帖 • 1 关注
  • gRpc
    10 引用 • 8 回帖 • 54 关注
  • 负能量

    上帝为你关上了一扇门,然后就去睡觉了....努力不一定能成功,但不努力一定很轻松 (° ー °〃)

    85 引用 • 1201 回帖 • 450 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖
  • 开源中国

    开源中国是目前中国最大的开源技术社区。传播开源的理念,推广开源项目,为 IT 开发者提供了一个发现、使用、并交流开源技术的平台。目前开源中国社区已收录超过两万款开源软件。

    7 引用 • 86 回帖 • 1 关注
  • LeetCode

    LeetCode(力扣)是一个全球极客挚爱的高质量技术成长平台,想要学习和提升专业能力从这里开始,充足技术干货等你来啃,轻松拿下 Dream Offer!

    209 引用 • 72 回帖 • 3 关注
  • OnlyOffice
    4 引用 • 26 关注
  • MySQL

    MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是最流行的关系型数据库管理系统之一。

    675 引用 • 535 回帖
  • 资讯

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

    53 引用 • 85 回帖
  • JWT

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

    20 引用 • 15 回帖 • 17 关注
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖
  • 百度

    百度(Nasdaq:BIDU)是全球最大的中文搜索引擎、最大的中文网站。2000 年 1 月由李彦宏创立于北京中关村,致力于向人们提供“简单,可依赖”的信息获取方式。“百度”二字源于中国宋朝词人辛弃疾的《青玉案·元夕》词句“众里寻他千百度”,象征着百度对中文信息检索技术的执著追求。

    63 引用 • 785 回帖 • 253 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖 • 1 关注
  • 一些有用的避坑指南。

    69 引用 • 93 回帖
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 685 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 395 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 126 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    16 引用 • 53 回帖 • 123 关注
  • IPFS

    IPFS(InterPlanetary File System,星际文件系统)是永久的、去中心化保存和共享文件的方法,这是一种内容可寻址、版本化、点对点超媒体的分布式协议。请浏览 IPFS 入门笔记了解更多细节。

    20 引用 • 245 回帖 • 229 关注
  • Pipe

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

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

    131 引用 • 1114 回帖 • 152 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 424 关注