SpringCloud 相关概念解析

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

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

    943 引用 • 1460 回帖 • 3 关注

相关帖子

欢迎来到这里!

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

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

推荐标签 标签

  • frp

    frp 是一个可用于内网穿透的高性能的反向代理应用,支持 TCP、UDP、 HTTP 和 HTTPS 协议。

    20 引用 • 7 回帖 • 2 关注
  • 资讯

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

    55 引用 • 85 回帖 • 1 关注
  • Node.js

    Node.js 是一个基于 Chrome JavaScript 运行时建立的平台, 用于方便地搭建响应速度快、易于扩展的网络应用。Node.js 使用事件驱动, 非阻塞 I/O 模型而得以轻量和高效。

    139 引用 • 269 回帖 • 28 关注
  • 钉钉

    钉钉,专为中国企业打造的免费沟通协同多端平台, 阿里巴巴出品。

    15 引用 • 67 回帖 • 335 关注
  • Pipe

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

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

    132 引用 • 1114 回帖 • 126 关注
  • SSL

    SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS 与 SSL 在传输层对网络连接进行加密。

    70 引用 • 193 回帖 • 419 关注
  • OnlyOffice
    4 引用 • 3 关注
  • 深度学习

    深度学习(Deep Learning)是机器学习的分支,是一种试图使用包含复杂结构或由多重非线性变换构成的多个处理层对数据进行高层抽象的算法。

    53 引用 • 40 回帖 • 2 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    223 引用 • 474 回帖
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 27 关注
  • TGIF

    Thank God It's Friday! 感谢老天,总算到星期五啦!

    288 引用 • 4485 回帖 • 664 关注
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    524 引用 • 4601 回帖 • 700 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 216 关注
  • ReactiveX

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

    1 引用 • 2 回帖 • 161 关注
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 387 关注
  • sts
    2 引用 • 2 回帖 • 197 关注
  • Scala

    Scala 是一门多范式的编程语言,集成面向对象编程和函数式编程的各种特性。

    13 引用 • 11 回帖 • 139 关注
  • Hexo

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

    21 引用 • 140 回帖 • 3 关注
  • 负能量

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

    88 引用 • 1235 回帖 • 410 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    166 引用 • 595 回帖
  • 安全

    安全永远都不是一个小问题。

    200 引用 • 816 回帖
  • SpaceVim

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

    3 引用 • 31 回帖 • 104 关注
  • 链书

    链书(Chainbook)是 B3log 开源社区提供的区块链纸质书交易平台,通过 B3T 实现共享激励与价值链。可将你的闲置书籍上架到链书,我们共同构建这个全新的交易平台,让闲置书籍继续发挥它的价值。

    链书社

    链书目前已经下线,也许以后还有计划重制上线。

    14 引用 • 257 回帖
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 604 关注
  • Vditor

    Vditor 是一款浏览器端的 Markdown 编辑器,支持所见即所得、即时渲染(类似 Typora)和分屏预览模式。它使用 TypeScript 实现,支持原生 JavaScript、Vue、React 和 Angular。

    354 引用 • 1823 回帖 • 1 关注
  • 学习

    “梦想从学习开始,事业从实践起步” —— 习近平

    171 引用 • 512 回帖
  • 招聘

    哪里都缺人,哪里都不缺人。

    190 引用 • 1057 回帖