精华内容
下载资源
问答
  • 服务注册
    千次阅读 多人点赞
    2022-06-26 12:59:15

    在这里插入图片描述

    🔎这里是【秒懂·云原生】,关注我学习云原生不迷路
    👍如果对你有帮助,给博主一个免费的点赞以示鼓励
    欢迎各位🔎点赞👍评论收藏⭐️

    👀专栏介绍

    【秒懂·云原生】 目前主要更新微服务,一起学习一起进步。

    👀本期介绍

    主要介绍Spring Cloud Alibaba —— 服务注册与配置中心

    服务注册与配置中心

    Nacos 英文全称为 Dynamic Naming and Configuration
    Service,是一个由阿里巴巴团队使用 Java 语言开发的开源
    项目。
    Nacos 是一个更易于帮助构建云原生应用的动态服务发
    现、配置和服务管理平台(参考自 Nacos 官网)。
    Nacos 的命名是由 3 部分组成:

    组成部分全称描述
    Nanaming/nameServer即服务注册中心,与Spring Cloud Eureka 的功能类似。
    coconfiguration即配置中心,与 SpringCloud Config+SpringCloud Bus 的功能类似。
    sservice即服务,表示 Nacos 实现的服务注册中心和配置中心都是以服务为核心的。

    我们可以将 Nacos 理解成服务注册中心和配置中心的组合
    体,它可以替换 Eureka 作为服务注册中心,实现服务的注
    册与发现;还可以替换 Spring Cloud Config 作为配置中
    心,实现配置的动态刷新。
    Nacos 作为服务注册中心经历了十年“双十一”的洪峰考验,
    具有简单易用、稳定可靠、性能卓越等优点,可以帮助用户
    更敏捷、容易地构建和管理微服务应用。
    Nacos 支持几乎所有主流类型“服务”的发现、配置和管理:

    • Kubernetes Service
    • gRPC & Dubbo RPC Service
    • Spring Cloud RESTful Service

    Nacos 的特性

    Nacos 提供了一系列简单易用的特性,能够帮助我们快速
    地实现动态服务发现、服务配置等功能。

    服务发现

    Nacos 支持基于 DNS 和 RPC 的服务发现。当服务提供者
    使用原生 SDK、OpenAPI 或一个独立的 Agent TODO 向
    Nacos 注册服务后,服务消费者可以在 Nacos 上通过 DNS
    TODO 或 HTTP&API 查找、发现服务。

    服务健康监测

    Nacos 提供对服务的实时健康检查,能够阻止请求发送到
    不健康主机或服务实例上。Nacos 还提供了一个健康检查
    仪表盘,能够帮助我们根据健康状态管理服务的可用性及流
    量。

    动态配置服务

    动态配置服务可以让我们以中心化、外部化和动态化的方
    式,管理所有环境的应用配置和服务配置。
    动态配置消除了配置变更时重新部署应用和服务的需要,让
    配置管理变得更加高效、敏捷。
    配置中心化管理让实现无状态服务变得更简单,让服务按需
    弹性扩展变得更容易。
    Nacos 提供了一个简洁易用的 UI 帮助我们管理所有服务和
    应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发
    布、一键回滚配置以及客户端配置更新状态跟踪在内的一系
    列开箱即用的配置管理特性,帮助我们更安全地在生产环境
    中管理配置变更和降低配置变更带来的风险。

    动态 DNS 服务

    Nacos 提供了动态 DNS 服务,能够让我们更容易地实现负
    载均衡、流量控制以及数据中心内网的简单 DNS 解析服
    务。
    Nacos 提供了一些简单的 DNS APIs TODO,可以帮助我们
    管理服务的关联域名和可用的 IP:PORT 列表。

    服务及其元数据管理

    Nacos 能让我们从微服务平台建设的视角管理数据中心的
    所有服务及元数据,包括管理服务的描述、生命周期、服务
    的静态依赖分析、服务的健康状态、服务的流量管理、路由
    及安全策略、服务的 SLA 以及 metrics 统计数据。

    Nacos 两大组件

    与 Eureka 类似,Nacos 也采用 CS(Client/Server,客户
    端/服务器)架构,它包含两大组件,如下表。

    组件描述功能
    Nacos ServerNacos 服务端,与Eureka Server 不同,Nacos Server由阿里巴巴团队使用 Java 语言编写并将 Nacos Server 的下载地址给用户,用户只需要直接下载并运行即可。Nacos Server可以作为服务注册中心,帮助Nacos Client 实现服务的注册与发现。
    Nacos Server可以作为配置中心,帮助Nacos Client在不重启的情况下,实现配置的动态刷新。
    Nacos ClientNacos 客户端,通常指的是微服务架构中的各个服务,由用户自己搭建,可以使用多种语言编写。Nacos Client 通过添加依赖spring-cloudstarter-alibabanacosdiscovery,在服务注册中心(NacosServer)中实现服务的注册与发现。
    Nacos Client通过添加依赖spring-cloudstarteralibabanacosconfig,在配置中心(NacosServer)中实现配置的动态刷新。

    Nacos 服务注册中心

    Nacos 作为服务注册中心可以实现服务的注册与发现,流
    程如下图
    在这里插入图片描述
    在图 中共涉及到以下 3 个角色:

    • 服务注册中心(Register Service):它是一个 Nacos Server,可以为服务提供者和服务消费者提供服务注册和发现功能。
    • 服务提供者(Provider Service):它是一个 Nacos Client,用于对外服务。它将自己提供的服务注册到服务注册中心,以供服务消费者发现和调用。
    • 服务消费者(Consumer Service):它是一个 Nacos Client,用于消费服务。它可以从服务注册中心获取服务列表,调用所需的服务。

    Nacos 实现服务注册与发现的流程如下:

    1. 从 Nacos 官方提供的下载页面中,下载 Nacos Server
      并运行。
    2. 服务提供者 Nacos Client 启动时,会把服务以服务名
      (spring.application.name)的方式注册到服务注册中
      心(Nacos Server);
    3. 服务消费者 Nacos Client 启动时,也会将自己的服务注
      册到服务注册中心;
    4. 服务消费者在注册服务的同时,它还会从服务注册中心
      获取一份服务注册列表信息,该列表中包含了所有注册
      到服务注册中心上的服务的信息(包括服务提供者和自
      身的信息);
    5. 在获取了服务提供者的信息后,服务消费者通过 HTTP
      或消息中间件远程调用服务提供者提供的服务。
      在这里插入图片描述
    更多相关内容
  • 服务注册中心---服务发现nacos

    万次阅读 2021-07-15 16:05:09
    英文全称Dynamic Naming and Configuration Service,Na为naming/nameServer即注册中心,co为configuration即注册中心,service是指该注册/配置中心都是以服务为核心。服务在nacos是一等公民 二、有了Eureka为啥还要...

    一、什么是nacos

    英文全称Dynamic Naming and Configuration Service,Na为naming/nameServer即注册中心,co为configuration即注册中心,service是指该注册/配置中心都是以服务为核心。服务在nacos是一等公民
    在这里插入图片描述

    二、有了Eureka为啥还要用nacos?两者区别是什么?

    具体可看这篇文章 很形象

    三、下载安装

    可参考里面的下载安装流程 比较简单

    四、nacos原理

    在这里插入图片描述
    Nacos注册中心分为server与client,server采用Java编写,为client提供注册发现服务与配置服务。而client可以用多语言实现,client与微服务嵌套在一起,nacos提供sdk和openApi,如果没有sdk也可以根据openApi手动写服务注册与发现和配置拉取的逻辑
    注册中心原理
    在这里插入图片描述
    配置中心原理
    在这里插入图片描述

    五、nacos使用

    1. 首先配置NameSpace
      在这里插入图片描述
      如图所示,在控制台的 服务管理-命名空间-新建命名空间按钮可以创建新的命名空间,命名空间创建后,会在列表显示命名空间ID,这个ID后面会用在服务的配置文件中
    2. 在服务上配置注册、配置中心
      以springcloud为例,首先用maven导入nacos clinet的依赖:
    <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
                <version>0.2.1.RELEASE</version>
                <exclusions>
                    <exclusion>
                        <groupId>com.alibaba.nacos</groupId>
                        <artifactId>nacos-client</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>0.2.1.RELEASE</version>
                <exclusions>
                    <exclusion>
                        <groupId>com.alibaba.nacos</groupId>
                        <artifactId>nacos-client</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
    

    3.先导入springcloud的alibaba-nacos-config和alibaba-nacos-discovery两个依赖,这两个依赖是用于nacos clinet与cloud结合的工具,0.2.x对应springboot 2.x.x ,0.1.x对应springboot 1.x.x。这两个组件可以和各种版本的nacos-client结合。把其中的nacos-clinet依赖给排除,引入想要引入的nacosclinet版本,如下:

      <!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client -->
            <dependency>
                <groupId>com.alibaba.nacos</groupId>
                <artifactId>nacos-client</artifactId>
                <version>1.0.1</version>
            </dependency>
    

    4.在bootstrap.properties上添加配置中心的配置

    spring.cloud.nacos.config.server-addr=nacos.e.189.cn:80
    spring.cloud.nacos.config.namespace=命名空间id
    

    5.在application-xxx.properties新增如下配置

    spring.cloud.nacos.discovery.server-addr=nacos.e.189.cn:80
    spring.cloud.nacos.discovery.namespace=命名空间id
    

    扩展:
    在这里插入图片描述
    在这里插入图片描述

    如果springboot启动类没有@EnableDiscover注解则加上
    完成如上更改,即可使用Nacos注册/配置服务

    六、服务间feign调用

    1. 通过配置更改动态刷新参数
      普通application参数在配置中心直接配置皆可,如果需要可以动态刷新的配置,需要在相应类上加上@RefreshScope注解,示例如下,当在nacos配置中心更改配置后,方法getId的值也会刷新
    @RefreshScope
    public class IdEntity {
        @Value("${id}")
        private int id;
        public int getId(){
            return this.id;
        }
    }
    

    配置中心参数修改/设置
    如下两张图:在nacos控制台的配置管理-配置列表中顶部选择相应的命名空间,点击列表右上角的加号新增配置,Data ID 为 项目名-{spring.profiles.active}.properties,Group如果在bootstrap.properties中不指定则填默认的DEFAULT_GROUP,描述写该配置的描述,配置内容填写Properties格式或者Yaml格式
    在这里插入图片描述

    在这里插入图片描述

    七、nacos其他功能介绍与使用

    控制台手动上下线实例
    在控制台的服务管理-服务列表选择一个服务点击详情,在下方的集群列表可以看到有上线/下线按钮,点击即可以对该实例执行上线/下线操作,下线后的实例不会被请求
    在这里插入图片描述
    配置实例权重
    可以通过手动配置权重来控制流量,当一个集群内两个实例,权重越高,到达该实例的请求比例越多
    在这里插入图片描述
    权重的初始值是1
    配置保护阈值
    保护阈值的范围是0~1
    服务的健康比例=服务的健康实例/总实例个数
    当服务健康比例<=保护阈值时候,无论实例健不健康都会返回给调用方
    当服务健康比例>保护阈值的时候,只会返回健康实例给调用方
    在服务管理-服务列表选择一个服务点击详情可以配置
    在这里插入图片描述

    总结

    如果你使用nacos后和Eureka对比 你会发现nacos好像只用修改配置就可以替换Eureka 无缝支持SpringCloud 会直接注册成功 并且各个服务间是正常使用的 虽然只是单独的服务注册发现功能 但是却足够说明nacos天生就无缝衔接SpringCloud生态 当然所有东西有利必有弊

    展开全文
  • 在微服务架构或分布式环境下,服务注册与发现技术不可或缺​,这也是程序员进阶之路必须要掌握的核心技术之一,本文通过图解的方式带领大家轻轻松松掌握。 一、引入服务注册与发现组件的原因 先来看一个问题,...

    本文 Github/javamap 已收录,有Java程序员进阶技术知识地图以及我的系列文章,欢迎大家Star。

    在微服务架构或分布式环境下,服务注册与发现技术不可或缺​,这也是程序员进阶之路必须要掌握的核心技术之一,本文通过图解的方式带领大家轻轻松松掌握。

     

    一、引入服务注册与发现组件的原因

    先来看一个问题,假如现在我们要做一个商城项目,作为架构师的你应该怎样设计系统的架构?你心里肯定在想:这还不容易直接照搬淘宝的架构不就行了。但在现实的创业环境中一个项目可能是九死一生,如果一开始投入巨大的人力和财力,一旦项目失败损失就很大。

    作为一位有经验的架构师需要结合公司财力、人力投入预算等现状选择最适合眼下的架构才是王道。大型网站都是从小型网站发展而来,架构也是一样。

    任何一个大型网站的架构都不是从一开始就一层不变的,而是随着用户量和数据量的不断增加不断迭代演进的结果。

    在架构不断迭代演进的过程中我们会遇到很多问题,技术发展的本质就是不断发现问题再解决问题,解决问题又发现问题

     

    单体架构

    在系统建立之初可能不会有特别多的用户,将所有的业务打成一个应用包放在tomcat容器中运行,与数据库共用一台服务器,这种架构一般称之为单体架构。

    在初期这种架构的效率非常高,根据用户的反馈可以快速迭代上线。但是随着用户量增加,一台服务的内存和CPU吃紧,很容易造成瓶颈,新的问题来了怎么解决呢?

     

    应用与数据分离

    随着用户请求量增加,一台服务器的内存和CPU持续飙升,用户请求响应时间变慢。这时候可以考虑将应用与数据库拆开,各自使用一台服务器,你看问题又解决了吧。

    突然有一天扫地阿姨不小心碰了电线,其中一台服务器掉电了,用户所有的请求都报错,随之而来的是一系列投诉电话。

     

    集群部署

    单实例很容易造成单点问题,比如遇到服务器故障或者服务能力瓶颈,那怎么办?聪明的你肯定想到了,用集群呀。

    集群部署是指将应用部署在多个服务器或者虚机上,用户通过服务均衡随机访问其中的一个实例,从而使多个实例的流量均衡,如果一个实例出现故障可以将其下线,其他实例不受影响仍然可以对外提供服务。

    随着用户数量快速增加,老板决定增加投入扩大团队规模。开发团队壮大后效率并没有得到显著的提高,以前小团队可以一周迭代上线一次,现在至少需要两到三周时间。

    业务逻辑越来越复杂,代码间耦合很严重,修改一行代码可能引入几个线上问题。架构师意识到需要进行架构重构。

     

    微服务架构

    当单体架构演进到一定阶段后开发测试的复杂性都会成本增加,团队规模的扩大也会使得各自工作耦合性更严重,牵一发而动全身就是这种场景。

    单体架构遇到瓶颈了,微服务架构就横空出世了。微服务就是将之前的单体服务按照业务维度进行拆分,拆分粒度可大可小,拆分时机可以分节奏进行。最佳实践是先将一些独立的功能从单体中剥离出来抽成一个或多个微服务,这样可以保障业务的连续性和稳定性。

     

    如上图将一个商用应用拆分为六个独立微服务。六个微服务可以使用Docker容器化进行多实例部署。

    架构演化到这里遇到了一个难题,如果要查询用户所有的订单,用户服务可能会依赖订单服务,用户服务如何与订单服务交互呢?订单服务有多个实例该访问哪一个?

    通常有几种解决办法:

    (1)服务地址硬编码

    服务的地址写死在数据库或者配置文件,通过访问DNS域名进行寻址路由。

    服务B的地址硬编码在数据库或者配置文件中,服务A首先需要拿到服务B的地址,然后通过DNS服务器解析获取其中一实例的真实地址,最后可以向服务B发起请求。

    如果遇到大促活动需要对服务实例扩容,大促完需要对服务实例进行下线,运维人员要做大量的手工操作,非常容易误操作。

    (2)服务动态注册与发现

    服务地址硬编码还有一个非常致命的问题,如果一台实例挂了,运维人员可能不能及时感知到,导致一部分用户的请求会异常。

    引入服务注册与发现组件可以很好解决上面遇到的问题,避免过多的人工操作。

     

    架构演进总结

    在单体架构中一个应用程序就是一个服务包,包内的模块通过函数方法相互调用,模型足够简单,根本没有服务注册和发现一说。

    在微服务架构中会将一个应用程序拆分为多个微服务,微服务会部署在不同的服务器、不同的容器、甚至多数据中心,微服务间要相互调用,服务注册和发现成为了一个不可或缺的组件。

     

    二、服务注册与发现基本原理

    服务注册与发现是分为注册和发现两个关键的步骤。

    服务注册:服务进程在注册中心注册自己的元数据信息。通常包括主机和端口号,有时还有身份验证信息,协议,版本号,以及运行环境的信息。

    服务发现:客户端服务进程向注册中心发起查询,来获取服务的信息。服务发现的一个重要作用就是提供给客户端一个可用的服务列表。

     

    服务注册

    服务注册有两种形式:客户端注册和代理注册。

    客户端注册

    客户端注册是服务自己要负责注册与注销的工作。当服务启动后注册线程向注册中心注册,当服务下线时注销自己。

    这种方式的缺点是注册注销逻辑与服务的业务逻辑耦合在一起,如果服务使用不同语言开发,那需要适配多套服务注册逻辑。

    代理注册

    代理注册由一个单独的代理服务负责注册与注销。当服务提供者启动后以某种方式通知代理服务,然后代理服务负责向注册中心发起注册工作。

    这种方式的缺点是多引用了一个代理服务,并且代理服务要保持高可用状态。

     

    服务发现

    服务发现也分为客户端发现和代理发现。

    客户端发现

    客户端发现是指客户端负责向注册中心查询可用服务地址,获取到所有的可用实例地址列表后客户端根据负载均衡算法选择一个实例发起请求调用。

    这种方式非常直接,客户端可以控制负载均衡算法。但是缺点也很明显,获取实例地址、负载均衡等逻辑与服务的业务逻辑耦合在一起,如果服务发现或者负载平衡有变化,那么所有的服务都要修改重新上线。

    代理发现

    代理发现是指新增一个路由服务负责服务发现获取可用的实例列表,服务消费者如果需要调用服务A的一个实例可以直接将请求发往路由服务,路由服务根据配置好的负载均衡算法从可用的实例列表中选择一个实例将请求转发过去即可,如果发现实例不可用,路由服务还可以自行重试,服务消费者完全不用感知。

     

    心跳机制

    如果服务有多个实例,其中一个实例出现宕机,注册中心是可以实时感知到,并且将该实例信息从列表中移出,也称为摘机。

    如何实现摘机?业界比较常用的方式是通过心跳检测的方式实现,心跳检测有主动被动两种方式。

    被动检测是指服务主动向注册中心发送心跳消息,时间间隔可自定义,比如配置5秒发送一次,注册中心如果在三个周期内比如说15秒内没有收到实例的心跳消息,就会将该实例从列表中移除。

    上图中服务A的实例2已经宕机不能主动给注册中心发送心跳消息,15秒之后注册就会将实例2移除掉。

    主动检测是注册中心主动发起,每隔几秒中会给所有列表中的服务实例发送心跳检测消息,如果多个周期内未发送成功或未收到回复就会主动移除该实例。

     

     

    三、业界常用的服务注册与发现组件对比

    了解服务注册与发现的基本原理后,如果你要在项目中使用服务注册与发现组件,当面对众多的开源组件该如何进行技术选型?

    在互联网公司里,有研发实力的大公司一般会选择自研或者基于开源组件进行二次开发,但是对于中小型公司来说直接选用一款开源软件会是一个不错的选择。

    常用的注册与发现组件有eureka,zookeeper,consul,etcd等,由于eureka在2018年已经宣布放弃维护,这里就不再推荐使用了。

    下面结合各个维度对比一下各组件。

    组件

    优点

    缺点

    接口类型

    一致性算法

    zookeeper

    1.功能强大,不仅仅只是服务发现;

    2.提供watcher机制可以实时获取服务提供者的状态;

    3.广泛使用,dubbo等微服务框架已支持;

    1.没有健康检查;

    2.需要在服务中引入sdk,集成复杂度高;

    3.不支持多数据中心;

    sdk

    Paxos

    consul

    1.开箱即用,方便集成;

    2.带健康检查;

    3.支持多数据中心;

    4.提供web管理界面;

    不能实时获取服务变换通知

    restful/dns

    Raft

    etcd

    1.开箱即用,方便集成;

    2.可配置性强

    1.没有健康检查;

    2.需配合三方工具完成服务发现功能;

    3.不支持多数据中心;

    restful

    Raft

    从整体上看consul的功能更加完备和均衡。接下来以consul为例详细介绍一下。

     

    四、Consul——值得推荐的服务注册与发现开源组件

    简单认识一下Consul

    Consul是HashiCorp公司推出的开源工,使用Go语言开发,具有开箱即可部署方便的特点。Consul是分布式的、高可用的、 可横向扩展的用于实现分布式系统的服务发现与配置。

    Consul有哪些优势?

    • 服务注册发现:Consul提供了通过DNS或者restful接口的方式来注册服务和发现服务。服务可根据实际情况自行选择。
    • 健康检查:Consul的Client可以提供任意数量的健康检查,既可以与给定的服务相关联,也可以与本地节点相关联。
    • 多数据中心:Consul支持多数据中心,这意味着用户不需要担心Consul自身的高可用性问题以及多数据中心带来的扩展接入等问题。

    Consul的架构图

    Consul 实现多数据中心依赖于gossip protocol协议。这样做的目的:

    • 不需要使用服务器的地址来配置客户端;服务发现是自动完成的。
    • 健康检查故障的工作不是放在服务器上,而是分布式的。

     

    Consul的使用场景

    Consul的应用场景包括服务注册发现服务隔离服务配置等。

    服务注册发现场景中consul作为注册中心,服务地址被注册到consul中以后,可以使用consul提供的dns、http接口查询,consul支持health check。

    服务隔离场景中consul支持以服务为单位设置访问策略,能同时支持经典的平台和新兴的平台,支持tls证书分发,service-to-service加密

    服务配置场景中consul提供key-value数据存储功能,并且能将变动迅速地通知出去,借助Consul可以实现配置共享,需要读取配置的服务可以从Consul中读取到准确的配置信息。

     

    -- END --

    日常求赞:你好技术人,先赞后看养成习惯,你的赞是我前进道路上的动力,对我非常重要。

    加油技术人!

    简介: 博主从华中科技大学硕士毕业,是一个对技术有追求,对生活有激情的程序员。几年间浪迹于多个一线互联网大厂,具有多年开发实战经验。

    微信搜索公众号【爱笑的架构师】,我有技术和故事,等你来。

    文章持续更新,在 Github/javamap 中可以看到我归档的系列文章,有面试经验和技术干货,欢迎Star。

     

    展开全文
  • Dubbo系列之服务注册与发现

    万次阅读 2019-07-21 20:02:02
    文章目录一、分布式基本理论1.1、分布式基本定义1.2 架构发展演变1.3、RPC简介二、Dubbo理论简介三、Dubbo环境搭建3.1 Zookeeper搭建3.2 Dubbo管理页面搭建四、Dubbo服务注册发现例子4.1、业务场景4.2、api工程创建...

    一、分布式基本理论

    1.1、分布式基本定义

    《分布式系统原理与范型》定义:
    “分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”
    分布式系统(distributed system)是建立在网络之上的软件系统。

    1.2 架构发展演变

    架构的发展是由最初的单一应用架构构建的,一般就是ORM框架方便数据库操作。

    不过随着系统越来越复杂,单一应用架构会变得难以维护,所以架构逐渐演变出了垂直应用架构,所谓垂直应用架构其实就是安装业务模板进行拆分,比如可以安装业务将一个电商系统分为订单模块,用户信息管理模块,商品管理模块等等,这时候MVC框架就派上用场,MVC框架可以协助系统更好的按业务拆分,不过业务拆分后虽然是比单一应用架构更好维护了。

    不过随着系统越来约复杂,发现很多共用的模块很难复用起来,这时候分布式服务架构登场了,分布式架构是将一些核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,当应用需要时,就去服务中心调服务就可以,而实现这种服务注册的肯定是RPC框架了。

    当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率,这时候就需要流动计算架构(SOA)[ Service Oriented Architecture],用于提高机器利用率的资源调度,SOA是一个治理中心,综上所述,到目前,软件系统架构演变经历了:单一应用架构->垂直应用架构->分布式应用架构->流动计算架构,下面Dubbo官网的图片可以很好的描述
    在这里插入图片描述

    1.3、RPC简介

    RPC概念
    RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,他是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。

    RPC核心模块
    RPC有两个核心模块:通信和序列化

    二、Dubbo理论简介

    Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

    官网:
    http://dubbo.apache.org/

    在这里插入图片描述
    Dubbo的服务治理:
    在这里插入图片描述

    Dubbo原理图片,图片来自Dubbo官网:

    在这里插入图片描述

    Dubbo角色:

    • Provider:暴露服务的服务提供者

    • Container:服务运行的容器

    • Consumer:调用远程服务的消费者

    • Registry:服务注册和发现的注册中心

    • Minitor:统计服务调用次数和时间的监控中心

    调用过程:

    下面根据我的理解说明一下

    • 0:服务器容器负责启动、加载、运行服务提供者

    • 1:服务提供者在启动后就可以向注册中心暴露服务

    • 2:服务消费者在启动后就可以向注册中心订阅想要的服务

    • 3:注册中心向服务消费者返回服务调用列表

    • 4:服务消费者基于软负载均衡算法调用服务提供者的服务,这个服务提供者有可能是一个服务提供者列表,调用那个服务提供者就是根据负载均衡来调用了

    • 5:服务提供者和服务消费者定时将保存在内存中的服务调用次数和服务调用时间推送给监控中心

    三、Dubbo环境搭建

    3.1 Zookeeper搭建

    搭建Zookeeper,首先是搭建分布式架构的注册中心Zookeeper,当然也可以用Redis等等来做服务注册中心,不过本博客只介绍Zookeeper的,因为没有linux服务器,所以只介绍window版的搭建

    • 1、下载Zookeeper:
      网址 https://archive.apache.org/dist/zookeeper/zookeeper-3.4.13/

    • 2、解压Zookeeper
      解压Zookeeper之后,运行bin目录里的zkServer.cmd,发现报错了,提示找不到配置文件,所以需要继续步骤3

    • 3、配置Zookeeper
      因为Zookeeper的conf文件夹下面只提供zoo_sample.cfg文件,需要自己修改命名为zoo.cfg

    对于配置文件需要注意:

    dataDir=./ 临时数据存储的目录(可写相对路径)

    clientPort=2181 zookeeper的端口号

    • 4、使用zkCli.cmd测试
      修改配置文件后,重新启动zkServer.cmd,启动bin目录下面的zkCli.cmd,很显然这是个客户端程序,注意zkServer.cmd是服务端程序,必须启动

    ok,简单在zkCli.cmd敲几个命令测试一下:
    ls /:列出zookeeper根下保存的所有节点
    create –e /testNode 12345678:创建一个testNode节点,值为12345678
    get /testNode:获取/testNode节点的值

    3.2 Dubbo管理页面搭建

    搭建了服务注册中心后,就需要搭建Dubbo-admin了,最近看了一下,dubbo的Github项目已经进行了更新,管理平台已经做了比较大的改动,而我学习的时候,平台是比较简单的,所以本dubbo-admin搭建是以旧版master的为准,不过以学习为目的的,只需要知道具体原理和操作技巧就可以

    • 下载dubbo-admin
      去下载一下dubbo-admin,可以找主干master分支的,找到dubbo-admin,git clone到本地
      https://github.com/apache/incubator-dubbo-ops

    因为我搭建时候(ps:不是博客写作时间),dubbo还没做比较大改动,所以我以比较旧的版本为例子,现在新的具体参考dubbo官方的教程,本博客只是做记录

    • 修改dubbo-admin

    修改 src\main\resources\application.properties 指定zookeeper地址
    在这里插入图片描述

    • Maven package dubbo-admin
    mvn clean package -Dmaven.test.skip=true
    
    • 运行dubbo-admin的jar

    maven打包之后,就去target里找到jar,然后cmd运行

    java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
    

    运行成功之后,访问: http://127.0.0.1:7001,输入默认的账号密码root/root,登录成功

    在这里插入图片描述

    四、Dubbo服务注册发现例子

    经典例子:

    4.1、业务场景

    某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址;
    我们现在 需要创建两个服务模块进行测试

    模块功能
    订单服务模块创建订单等
    用户服务模块查询用户地址等
    • 测试预期结果:
      订单服务web模块在A服务器,用户服务模块在B服务器,A可以远程调用B的功能

    4.2、api工程创建

    创建工程:
    建议将服务接口,服务模型,服务异常等均放在 API 包中,因为服务模型及异常也是 API 的一部分,同时,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。

    创建一个API工程,将实体类和接口都放在api工程

    maven新建一个shop-api-common工程:

    用户地址DTO类:

    package com.test.dubbo.bean;
    import java.io.Serializable;
    public class UserAddress implements Serializable {
    	
    	private Integer id;
        private String userAddress; //用户地址
        private String userId; //用户id
        private String consignee; //收货人
        private String phoneNum; //电话号码
        private String isDefault; //是否为默认地址    Y-是     N-否
        
        public UserAddress() {
    		super();
    	}
        
    	public UserAddress(Integer id, String userAddress, String userId, String consignee, String phoneNum,
    			String isDefault) {
    		super();
    		this.id = id;
    		this.userAddress = userAddress;
    		this.userId = userId;
    		this.consignee = consignee;
    		this.phoneNum = phoneNum;
    		this.isDefault = isDefault;
    	}
    	
    	public Integer getId() {
    		return id;
    	}
    	public void setId(Integer id) {
    		this.id = id;
    	}
    	public String getUserAddress() {
    		return userAddress;
    	}
    	public void setUserAddress(String userAddress) {
    		this.userAddress = userAddress;
    	}
    	public String getUserId() {
    		return userId;
    	}
    	public void setUserId(String userId) {
    		this.userId = userId;
    	}
    	public String getConsignee() {
    		return consignee;
    	}
    	public void setConsignee(String consignee) {
    		this.consignee = consignee;
    	}
    	public String getPhoneNum() {
    		return phoneNum;
    	}
    	public void setPhoneNum(String phoneNum) {
    		this.phoneNum = phoneNum;
    	}
    	public String getIsDefault() {
    		return isDefault;
    	}
    	public void setIsDefault(String isDefault) {
    		this.isDefault = isDefault;
    	}
    }
    
    

    用户信息服务接口:

    package com.test.dubbo.service;
    
    import java.util.List;
    
    import com.test.dubbo.bean.UserAddress;
    
    /**
     * 用户服务
     */
    public interface UserService {
    	
    	/**
    	 * 按照用户id返回所有的收货地址
    	 * @param userId
    	 * @return
    	 */
    	public List<UserAddress> getUserAddressList(String userId);
    
    }
    
    

    订单信息服务接口:

    
        package com.test.dubbo.service;
    
    import java.util.List;
    
    import com.test.dubbo.bean.UserAddress;
    
    public interface OrderService {
    	
    	/**
    	 * 初始化订单
    	 * @param userId
    	 */
    	public List<UserAddress> initOrder(String userId);
    
    }
    
    
    

    ok,创建好api工程

    4.3、服务提供者工程

    要实现服务提供,配置文件主要需要配置如下:
    在这里插入图片描述

    Dubbo提供者加载过程(Dubbo容器的启动):
    在这里插入图片描述
    Spring加载xml配置之后暴露服务的过程:
    在这里插入图片描述
    Exporter方法主要是打开socket的监听,接收客户的请求

    ok,理解了上面的理论知识后,继续创建一个user-service-provider工程:

    • maven配置:
    <!-- 引入dubbo -->
    		<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
    		<dependency>
    			<groupId>com.alibaba</groupId>
    			<artifactId>dubbo</artifactId>
    			<version>2.6.2</version>
    		</dependency>
    		<!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 -->
    		<dependency>
    			<groupId>org.apache.curator</groupId>
    			<artifactId>curator-framework</artifactId>
    			<version>2.12.0</version>
    		</dependency>
    
    • resources加一个提供者的配置文件provider.xml
    
        <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
    		http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    
    	<!-- 1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) -->
    	<dubbo:application name="user-service-provider"></dubbo:application>
    	
    	<!-- 2、指定注册中心的位置 -->
    	<!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> -->
    	<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
    	
    	<!-- 3、指定通信规则(通信协议 通信端口) -->
    	<dubbo:protocol name="dubbo" port="20882"></dubbo:protocol>
    	
    	<!-- 4、暴露服务   ref:指向服务的真正的实现对象 -->
    	<dubbo:service interface="com.test.dubbo.service.UserService" 
    		ref="userServiceImpl01" timeout="1000" version="1.0.0">
    		<dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method>
    	</dubbo:service>
    
    	<!--统一设置服务提供方的规则  -->
    	<dubbo:provider timeout="1000"></dubbo:provider>
    
    	<!-- 服务的实现 -->
    	<bean id="userServiceImpl01" class="com.test.dubbo.service.impl.UserServiceImpl"></bean>
    
    	<!-- 连接监控中心 -->
    	<dubbo:monitor protocol="registry"></dubbo:monitor>
    	
    </beans>
    
    
    
    • 加个业务实现类:
    package com.test.dubbo.service.impl;
    
    import java.util.Arrays;
    import java.util.List;
    
    import com.test.dubbo.bean.UserAddress;
    import com.test.dubbo.service.UserService;
    
    public class UserServiceImpl implements UserService {
    
    	//@Override
    	public List<UserAddress> getUserAddressList(String userId) {
    		UserAddress address1 = new UserAddress(1, "北京市昌平区", "1", "李老师", "010-56253825", "Y");
    		UserAddress address2 = new UserAddress(2, "深圳市宝安区", "1", "王老师", "010-56253825", "N");
    		return Arrays.asList(address1,address2);
    	}
    
    }
    
    
    • 启动服务提供者,注册到Zookeeper:
      启动服务提供者有两种方法,一种是IOC启动:
    package com.test.dubbo;
    
    import java.io.IOException;
    
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class MainApplication {
    	
    	public static void main(String[] args) throws IOException {
    		ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml");
    		ioc.start();
    		
    		System.in.read();
    	}
    
    }
    
    

    另外一种是调dubbo的Main类,启动:

    dubbo的main函数:
    com.alibaba.dubbo.container.Main
    com.alibaba.dubbo.container.spring.SpringContainer

    服务注册成功,可以去dubbo-admin看

    在这里插入图片描述
    查看服务接口的详细信息:

    在这里插入图片描述

    4.4、服务消费者工程

    然后服务已经注册了,现在创建一个消费者工程order-service-comsumer

    • maven加上配置
    <!-- 引入dubbo -->
    		<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
    		<dependency>
    			<groupId>com.alibaba</groupId>
    			<artifactId>dubbo</artifactId>
    			<version>2.6.2</version>
    		</dependency>
    		<!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 -->
    		<dependency>
    			<groupId>org.apache.curator</groupId>
    			<artifactId>curator-framework</artifactId>
    			<version>2.12.0</version>
    		</dependency>
    
    
    • 消费者配置文件:
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    	xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
    		http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
    		http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
    	<context:component-scan base-package="com.test.dubbo.service.impl"></context:component-scan>
    
    
    	<dubbo:application name="order-service-consumer"></dubbo:application>
    	
    	<dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
    	
    	<!--  配置本地存根-->
    	
    	<!--声明需要调用的远程服务的接口;生成远程服务代理  -->
    	<!-- 
    		1)、精确优先 (方法级优先,接口级次之,全局配置再次之)
    		2)、消费者设置优先(如果级别一样,则消费方优先,提供方次之)
    	-->
    	<!-- timeout="0" 默认是1000ms-->
    	<!-- retries="":重试次数,不包含第一次调用,0代表不重试-->
    	<!-- 幂等(设置重试次数)【查询、删除、修改】、非幂等(不能设置重试次数)【新增】 -->
    	<dubbo:reference interface="com.test.dubbo.service.UserService" 
    		id="userService" timeout="5000" retries="3" version="*">
    		<!-- <dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method> -->
    	</dubbo:reference>
    		
    	<!-- 配置当前消费者的统一规则:所有的服务都不检查 -->
    	<dubbo:consumer check="false" timeout="5000"></dubbo:consumer>
    
    	<dubbo:monitor protocol="registry"></dubbo:monitor>
    	<!-- <dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor> -->
    	
    </beans>
    
    
    • 订单服务类:
    package com.test.dubbo.service.impl;
    
    import java.util.List;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    
    import com.test.dubbo.bean.UserAddress;
    import com.test.dubbo.service.OrderService;
    import com.test.dubbo.service.UserService;
    
    /**
     * 让服务消费者去注册中心订阅服务提供者的服务地址
     */
    @Service
    public class OrderServiceImpl implements OrderService {
    
    	@Autowired
    	UserService userService;
    	@Override
    	public List<UserAddress> initOrder(String userId) {
    		System.out.println("用户id:"+userId);
    		//查询用户的收货地址
    		List<UserAddress> addressList = userService.getUserAddressList(userId);
    		for (UserAddress userAddress : addressList) {
    			System.out.println(userAddress.getUserAddress());
    		}
    		return addressList;
    	}
    }
    
    • IOC启动
      同样也是可以ioc启动,或者Dubbo提供的Main类启动:
    package com.test.dubbo;
    
    import java.io.IOException;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    import com.test.dubbo.service.OrderService;
    
    public class MainApplication {
    	
    	@SuppressWarnings("resource")
    	public static void main(String[] args) throws IOException {
    		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml");
    		OrderService orderService = applicationContext.getBean(OrderService.class);
    		orderService.initOrder("1");
    		System.out.println("调用成功....");
    		System.in.read();
    	}
    
    }
    
    

    调用成功,console打印:

    
    用户id:1
    北京市昌平区
    深圳市宝安区
    调用成功....
    

    在这里插入图片描述

    在这里插入图片描述

    展开全文
  • Nacos 服务注册的原理

    千次阅读 2020-09-07 10:35:00
    Nacos 服务注册需要具备的能力: 服务提供者把自己的协议地址注册到Nacos server 服务消费者需要从Nacos Server上去查询服务提供者的地址(根据服务名称) Nacos Server需要感知到服务提供者的上下线的变化 服务...
  • 服务注册发现 服务注册发现的作用 感知服务端的变化,获取最新服务节点的连接信息。 服务注册发现的处理流程 **服务注册:**服务提供方将对外暴露的接口发布到注册中心内,注册中心为了检测服务的有效状态,一般会...
  • Eureka服务注册中心搭建

    万次阅读 2019-01-18 14:10:58
    单机模式Eureka注册中心搭建 引入Eureka-Server依赖 创建启动类 添加配置 高可用Eureka注册中心搭建 双节点注册中心 修改配置文件 修改hosts文件 启动测试 多节点注册中心 修改配置文件 启动测试 常见...
  • 1.服务注册 2.服务发现 项目结构如下: 配置文件 pom.xml <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId>
  • v3 #ephemeral: false namespace: dev 原来是我配置了namespace,但是我一直选择的是public命名空间,所以要么删除 namespace: dev这行代码 要么创建dev的命名空间 我的环境是 Nacos源码单机启动,创建服务连接 ...
  • 最近在做分布式细粒度权限控制,...使用Nacos作为服务注册中心和配置中心,在服务注册时把服务的接口信息放入服务元数据里,其他需要使用这些接口信息的服务只需要监听服务注册事件并取出服务实例内的接口信息即可。
  • dubbo服务与zookeeper服务注册中心

    千次阅读 热门讨论 2018-04-23 21:37:51
    1.表现层和服务层是如何实现通信的 2.什么是dubbo 3.dubbo的作用 4.dubbo框架  4.1 节点角色说明:  4.2 调用关系说明: 5.dubbo在工程中的配置,即发布服务  5.1 服务的提供者端配置  5.2 服务的消费者端配置...
  • nacos服务注册流程

    千次阅读 2020-04-26 10:13:07
    nacos的客户端已经搭建好了,那么客户端是怎么将服务注册到注册中心去的呢。 1、 如果对springboot自动配置原理有一定了解的话,那么第三方框架一般都会通过spi的方式来初始化自己包中的bean。比如mybatis与spring...
  • 如何理解服务注册和服务发现

    千次阅读 2019-05-06 11:49:28
    服务注册、服务注册表、服务发现 三者的关系是:通过服务注册机制将启动服务的信息上传至服务注册表,服务发现机制通过服务注册表实时获取可用服务的信息。 服务注册的方式包括:自注册和第三方注册。自注册的意思...
  • 前段时间为了方便项目的快速部署,我便将其项目部署到了docker中,后来有一次项目调试的时候我发现我在本地启动的项目,无法通过fegin调用我部署在docker里面的服务 我就立刻去nacos里查看项目的启动情况,突然发现...
  • Consul服务注册与服务发现机制

    千次阅读 多人点赞 2019-06-25 15:43:02
    1、什么是服务注册中心? 顾名思义,假设你有一个分布式系统,里面包含了多个服务,部署在不同的机器上,然后这些不同机器上的服务之间要互相调用。 举个现实点的例子吧,比如电商系统里的订单服务需要调用库存...
  • 1.有了解过dubbo的都知道dubbo分为...查阅相关资料之后可以发现dubbo提供的服务注册方式不仅仅xml配置,还有API配置,注解配置,属性配置,其实,细心的你可以发现,xml配置最终也是转化为java代码实现,只是dubbo帮...
  • Ubuntu 18.04服务注册方法

    千次阅读 2019-01-25 10:15:10
    背景 systemd is now used for user sessions. System sessions had already been provided by systemd in previous Ubuntu releases. Ubuntu-18.04用 systemctl 命令来...比如以前启动mysql服务,命令为:...
  • 什么是服务注册、服务发现 两种服务注册方式 两种服务发现方式 常见的第三方注册工具 后记 前言 好一阵子没有更新了,有些小伙伴在后台问我有没有更新,看来大家还是挺喜欢看我的文章的嘛。主要是这段是间忙着复习...
  • ASP.NET CORE的服务注册方法

    千次阅读 2019-09-05 11:21:14
    首先是编辑接口 完了之后就是实现接口的方法 在之后就是在Startup类的ConfigureServices方法中注册,我目前的理解就是让某个接口绑定给某个控制器,然后该控制器就能使用这个接口里...在服务注册之后就能在每个控...
  • go 使用consul实现服务注册发现

    万次阅读 2020-02-09 16:36:29
    既然是学习使用consul实现服务注册发现,目标自然是实现一个程序,可以通过consul,发现另一个程序。 为此我准备了3个机器: 1.云服务器A(ubuntu):运行consul agent 2.云服务器B(ubuntu):运行一个服务,并...
  • Springboot构建的微服务,如果想用Consul来进行服务注册、发现等,已经有成熟的starter封装了相关逻辑,可以直接使用。 最近有粉丝咨询,Python的Web服务如何注册到Consul上? 今天工作之余,就写一下吧。 服务实例 ...
  • 服务发现和服务注册

    千次阅读 2018-06-10 10:17:52
    一 硬编码问题1 适用场景有局限:如果服务提供者的网络地址(IP和端口)发生了变化,将会影响服务消费者。例如,用户微服务的网络地址发生了变化,就需要修改电影微服务的配置,并重新发布,这显然不可取。2 无法...
  • 本地启动的子服务注册到远程 zk注册中心,上报了localhost / 127.0.0.1,而不是本机ip,导致网关无法访问子服务。 前置 检查:windows本地端口是否已开放 控制面板-防火墙(需要改动的地方) 在命令提示...
  • zookeeper实现服务注册与发现

    万次阅读 2019-04-30 22:08:42
    为了使服务之间能够互相通信,需要有一个协调系统来管理这些服务,以便这些服务能够互相找到对方,这就是服务注册以发现机制。这个协调系统有时也被称作“注册中心”; 下面,我们将基于zookeeper来实现服务注册...
  • nacos整合gateway网关注册不了在使用nacos注册的时候发现不了网关服务 在使用nacos注册的时候发现不了网关服务 服务显示已经启动成功,而且已经注入到nacos中 但是在nacos服务列表中并没有当前这个服务 我的配置...
  • zookeeper实现服务注册的原理

    千次阅读 2018-06-26 16:58:02
    服务提供者在启动的时候,会在ZooKeeper上注册服务。所谓注册服务,其实就是在ZooKeeper的/dubbo/com.foo.BarService/providers节点下创建一个子节点,并写入自己的URL地址,这就代表了com.foo.BarService这个服务的...
  • consul服务注册常见bug

    千次阅读 2018-12-17 22:02:11
    java的项目使用consul一般来讲都是通过spring-cloud-consul进行使用,spring-cloud帮助我们封装了consu的服务注册,服务发现等操作,但是在使用过程中还是出现了不少问题在这里记录下. serverId重复导致consul注册中心...
  • consul+docker实现服务注册

    万次阅读 2019-04-08 17:46:51
    注册中心: 每个服务提供者向注册中心登记自己的服务,将服务名与主机Ip,端口等一些附加信息告诉注册中心,注册中心按服务名分类组织服务清单。如A服务运行在192.168.1.82:3000,192.168.1.83:3000实例上。那么...
  • Eureka采用了CS的设计架构,Eureka Server服务端作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用Eureka Client客户端连接到Eureka Server服务端并维持心跳的连接,这样系统的维护人员就...
  • 微服务架构中服务注册与发现

    万次阅读 2017-04-08 00:53:17
    想象一下,如果你在写代码调用一个有REST API或Thrift API的服务,你的代码需要知道一个服务实例的网络地址(IP地址和端口)。运行在物理硬件上的传统应用中,服务实例的网络地址是相对静态的,你的代码可以从一个很...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,287,591
精华内容 515,036
关键字:

服务注册