精华内容
下载资源
问答
  • Istio:服务发现和Pilot的架构机制

    千次阅读 2020-01-11 23:03:09
    Istio服务发现 Istio服务配置 stio服务发现&规则管理与Kubernetes结合 ShowCase Istio架构&Pilot介绍 Istio架构 Pilot功能 服务发现 服务配置 Istio服务发现 服务发现基本原理 a.app 88.88....

    大纲

    Istio架构&Pilot介绍
    Istio服务发现
    Istio服务配置
    stio服务发现&规则管理与Kubernetes结合
    ShowCase

    Istio架构&Pilot介绍

    Istio架构

    Pilot功能

    • 服务发现
    • 服务配置

    Istio服务发现

    服务发现基本原理
     

    a.app 88.88.88.66
    a.app 88.88.88.77
    a.app 88.88.88.88


    b.app 88.88.88.99
    b.app 88.88.88.55

    SpringCloud的服务(注册与)发现流程

    • 服务注册表:如Springcloud中一般Eureka服务;
    • 服务注册:服务配置文件中配置服务名和本实例地址,实例启动时自动注册到服务注册表;
    • 服务发现:访问目标服务时连服务注册表,获取服务实例列表。根据LB根据策略选择一个服务实例,建立连接去访问。

    Istio服务发现流程

    Istio服务发现流程
    • 服务注册表: Pilot 从平台获取服务发现数据, 并提供统一的服务发现接口。
    • 服务注册:
    • 服务发现: Envoy 实现服务发现,动态更新负载均衡池。在服务请求时使用对应的负载均衡策略将请求路由到对应的后端。

    Pilot服务发现机制的Adapter机制

    Istio服务发现实现:基于 Eureka

    1. Pilot 实现若干服务发现的接口定义
    2. Controller使用EurekaClient来获取服务列表, 提供转换后的标准的服务发现接口和数据结构;
    3. Discoveryserver基于Controller上维护的服务发现数据, 发布成gRPC协议的服务供Envoy使用。
    4. 当 有 服 务 访 问 时 , Envoy 在 处 理Outbound请求时, 根据配置的LB策略,选择一个服务实例发起访问

    Istio 服务发现实现:基于Kubernetes

    1. Pilot 实现若干服务发现的接口定义
    2. Pilot 的Controller List/WatchKubeAPIserver上service、endpoint等资源对象并转换成标准格式。
    3. Envoy从Pilot获取xDS,动态更新
    4. 当有服务访问时, Envoy在处理Outbound请求时,根据配置的LB策略,选择一个服务实例发起访问。

    Kubernetes & Istio 服务模型

    Kuberntes的服务发现

    Istio Upon Kubernetes场景

    Istio Upon Kubernetes场景

    Istio ( upon Kubernetes)服务发现和配置

    Istio ( upon Kubernetes)服务发现和配置

    Istio服务配置管理

    Istio 服务访问规则维护和工作机制

    Istio 服务访问规则维护和工作机制
    • 1. 配置:管理员通过Pilot配置治理规则
    • 2. 下发: Envoy从Pilot获取治理规则
    • 3. 执行:在流量访问的时候执行治理规则

    Istio治理规则

    • VirtualService
    •  DestinationRule
    • Gateway
    •  ServiceEntry
    •  …

    https://istio.io/docs/reference/config/istio.networking.v1alpha3/

    Istio流量规则: VirtualService

    Istio流量规则: VirtualService

    Istio流量规则: DestinationRule

    Istio流量规则: DestinationRule

    Istio流量规则: ServiceEntry & Gateway

    ServiceEntry:

    • 功能: Mesh外的服务加入到服务发现中,向Mesh里面的服务一样的被治理
    • 机制: 将ServiceEntry描述的服务加入到服务发现中;对这些服务的outbound流量进行拦截,进而进行治理

    Gateway:

    • 功能:将mesh内的一个服务发布成可供外部访问。
    • 机制:在入口处部署一个ingress的Envoy,在其上执行服务治理。

    Istio配置规则维护和下发流程

    治理规则定义 Istio VS Envoy
     

    Istio 规则
    Envoy规则

    Istio治理能力执行位置

    Istio服务发现&规则管理与Kubernetes结合

    Kubernetes & Istio 结合

    服务发现和配置管理: Istio+K8S

    服务发现和配置管理: Spring Cloud+K8S

     

    展开全文
  • Prometheus 通过 consul 实现自动服务发现

    万次阅读 多人点赞 2019-11-12 09:23:07
    Consul 是基于 GO 语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。Consul 提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能。之前我们...

    1、Consul 介绍

    Consul 是基于 GO 语言开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能。Consul 提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能。之前我们通过 Prometheus 实现监控,当新增一个 Target 时,需要变更服务器上的配置文件,即使使用 file_sd_configs 配置,也需要登录服务器修改对应 Json 文件,会非常麻烦。不过 Prometheus 官方支持多种自动服务发现的类型,其中就支持 Consul。

    2、环境、软件准备

    本次演示环境,我是在虚拟机上安装 Linux 系统来执行操作,以下是安装的软件及版本:

    • Oracle VirtualBox: 5.1.20 r114628 (Qt5.6.2)
    • System: CentOS Linux release 7.3.1611 (Core)
    • Docker: 18.06.1-ce
    • Prometheus: v2.11.1
    • Consul: 1.6.1

    注意:这里为了方便启动 Prometheus、Consul服务,我使用 Docker 方式启动,所以本机需要安装好 Docker 环境,这里忽略 Docker 的安装过程。其中 Prometheus 安装配置,可以参照之前文章 Prometheus 监控报警系统 AlertManager 之邮件告警,这里着重介绍一下如何启动并配置 Consul 并配置 Prometheus 基于 Consul 实现自动服务发现。

    3、Consul 安装配置

    Consul 安装很方便,官网 提供各个系统版本二进制安装包,解压安装即可,同时也可以通过 Docker 来快速安装。

    3.1、源码安装

    以 Linux 系统为例,源码安装并以开发模式启动一个单节点,下载最新版二进制安装包,解压启动即可。

    $ wget https://releases.hashicorp.com/consul/1.6.1/consul_1.6.1_linux_amd64.zip
    $ unzip consul_1.5.3_linux_amd64.zip
    $ ./consul agent -dev    
    

    启动完毕后,浏览器访问 http://127.0.0.1:8500 地址,即可打开 Consul Web 管理页面。可以看到默认只有 consul 一个 Service,后期我们注册到 Consul 的 Service 都可以从页面上看到,非常直观。
    promethues-consul

    3.2、Docker 安装

    使用 Docker 启动 Consul 单节点服务,直接获取最新版官方镜像 consul:latest 命令如下:

    $ docker run --name consul -d -p 8500:8500 consul
    

    启动完毕后,同上方法验证是否启动成功,这里为了方便演示,我采用 Docker 方式启动 Consul,这里的访问地址为:http://172.30.12.167:8500

    4、API 注册服务到 Consul

    接下来,我们要注册服务到 Consul 中,可以通过其提供的 API 标准接口来添加。那么先注册一个测试服务,该测试数据为本机 node-exporter 服务信息,服务地址及端口为 node-exporter 默认提供指标数据的地址,执行如下命令:

    $ curl -X PUT -d '{"id": "node-exporter","name": "node-exporter-172.30.12.167","address": "172.30.12.167","port": 9100,"tags": ["test"],"checks": [{"http": "http://172.30.12.167:9100/metrics", "interval": "5s"}]}'  http://172.30.12.167:8500/v1/agent/service/register
    

    执行完毕后,刷新一下 Consul Web 控制台页面,可以看到成功注册到 Consul 中。
    promethues-consul
    promethues-consul
    提一下,如果要注销掉某个服务,可以通过如下 API 命令操作,例如注销上边添加的 node-exporter 服务

    $ curl -X PUT http://172.30.12.167:8500/v1/agent/service/deregister/node-exporter 
    

    5、配置 Prometheus 实现自动服务发现

    现在 Consul 服务已经启动完毕,并成功注册了一个服务,接下来,我们需要配置 Prometheus 来使用 Consul 自动服务发现,目的就是能够将上边添加的服务自动发现到 Prometheus 的 Targets 中,增加 prometheus.yml 配置如下:

    ...
    - job_name: 'consul-prometheus'
      consul_sd_configs:
      - server: '172.30.12.167:8500'
        services: []  
    

    说明一下:这里需要使用 consul_sd_configs 来配置使用 Consul 服务发现类型,server 为 Consul 的服务地址,这里跟上边要对应上。 配置完毕后,重启 Prometheus 服务,此时可以通过 Prometheus UI 页面的 Targets 下查看是否配置成功。
    promethues-consul
    可以看到,在 Targets 中能够成功的自动发现 Consul 中的 Services 信息,后期需要添加新的 Targets 时,只需要通过 API 往 Consul 中注册服务即可,Prometheus 就能自动发现该服务,是不是很方便。

    不过,我们会发现有如下几个问题:

    1. 会发现 Prometheus 同时加载出来了默认服务 consul,这个是不需要的。
    2. 默认只显示 job 及 instance 两个标签,其他标签都默认属于 before relabeling 下,有些必要的服务信息,也想要在标签中展示,该如何操作呢?
    3. 如果需要自定义一些标签,例如 team、group、project 等关键分组信息,方便后边 alertmanager 进行告警规则匹配,该如何处理呢?
    4. 所有 Consul 中注册的 Service 都会默认加载到 Prometheus 下配置的 consul_prometheus 组,如果有多种类型的 exporter,如何在 Prometheus 中配置分配给指定类型的组,方便直观的区别它们?

    以上问题,我们可以通过 Prometheus 配置中的 relabel_configs 参数来解决。

    6、配置 relabel_configs 实现自定义标签及分类

    我们先来普及一下 relabel_configs 的功能, Prometheus 允许用户在采集任务设置中,通过 relabel_configs 来添加自定义的 Relabeling 的额过程,来对标签进行指定规则的重写。 Prometheus 加载 Targets 后,这些 Targets 会自动包含一些默认的标签,Target 以 __ 作为前置的标签是在系统内部使用的,这些标签不会被写入到样本数据中。眼尖的会发现,每次增加 Target 时会自动增加一个 instance 标签,而 instance 标签的内容刚好对应 Target 实例的 __address__ 值,这是因为实际上 Prometheus 内部做了一次标签重写处理,默认 __address__ 标签设置为 <host>:<port> 地址,经过标签重写后,默认会自动将该值设置为 instance 标签,所以我们能够在页面看到该标签。
    promethues-consul
    详细 relabel_configs 配置及说明可以参考 relabel_config 官网说明,这里我简单列举一下里面每个 relabel_action 的作用,方便下边演示。

    • replace: 根据 regex 的配置匹配 source_labels 标签的值(注意:多个 source_label 的值会按照 separator 进行拼接),并且将匹配到的值写入到 target_label 当中,如果有多个匹配组,则可以使用 ${1}, ${2} 确定写入的内容。如果没匹配到任何内容则不对 target_label 进行重新, 默认为 replace。
    • keep: 丢弃 source_labels 的值中没有匹配到 regex 正则表达式内容的 Target 实例
    • drop: 丢弃 source_labels 的值中匹配到 regex 正则表达式内容的 Target 实例
    • hashmod: 将 target_label 设置为关联的 source_label 的哈希模块
    • labelmap: 根据 regex 去匹配 Target 实例所有标签的名称(注意是名称),并且将捕获到的内容作为为新的标签名称,regex 匹配到标签的的值作为新标签的值
    • labeldrop: 对 Target 标签进行过滤,会移除匹配过滤条件的所有标签
    • labelkeep: 对 Target 标签进行过滤,会移除不匹配过滤条件的所有标签

    接下来,我们来挨个处理上述问题。

    问题一,我们可以配置 relabel_configs 来实现标签过滤,只加载符合规则的服务。以上边为例,可以通过过滤 __meta_consul_tags 标签为 test 的服务,relabel_config 向 Consul 注册服务的时候,只加载匹配 regex 表达式的标签的服务到自己的配置文件。修改 prometheus.yml 配置如下:

    ...
    - job_name: 'consul-prometheus'
      consul_sd_configs:
        - server: '172.30.12.167:8500'
          services: []  
      relabel_configs:
        - source_labels: [__meta_consul_tags]
          regex: .*test.*
          action: keep
    

    解释下,这里的 relabel_configs 配置作用为丢弃源标签中 __meta_consul_tags 不包含 test 标签的服务,__meta_consul_tags 对应到 Consul 服务中的值为 "tags": ["test"],默认 consul 服务是不带该标签的,从而实现过滤。重启 Prometheus 可以看到现在只获取了 node-exporter-172.30.12.167 这个服务了。
    promethues-consul
    问题二和问题三可以归为一类,就是将系统默认标签或者用户自定义标签转换成可视化标签,方便查看及后续 Alertmanager 进行告警规则匹配分组。不过要实现给服务添加自定义标签,我们还得做一下修改,就是在注册服务时,将自定义标签信息添加到 Meta Data 数据中,具体可以参考 [这里](Consul Service - Agent HTTP API) 官网说明,下边来演示一下如何操作。

    新建 consul-0.json 如下:

    $ vim consul-0.json
    {
      "ID": "node-exporter",
      "Name": "node-exporter-172.30.12.167",
      "Tags": [
        "test"
      ],
      "Address": "172.30.12.167",
      "Port": 9100,
      "Meta": {
        "app": "spring-boot",
        "team": "appgroup",
        "project": "bigdata"
      },
      "EnableTagOverride": false,
      "Check": {
        "HTTP": "http://172.30.12.167:9100/metrics",
        "Interval": "10s"
      },
      "Weights": {
        "Passing": 10,
        "Warning": 1
      }
    }
    

    说明一下:该 Json 文件为要注册的服务信息,同时往 Meta 信息中添加了 app=spring-bootteam=appgroupproject=bigdata 三组标签,目的就是为了方便告警分组使用。执行如下命令进行注册:

    $ curl --request PUT --data @consul-0.json http://172.30.12.167:8500/v1/agent/service/register?replace-existing-checks=1
    

    注册完毕,通过 Consul Web 管理页面可以查看到已注册成功,并且包含了 Meta 信息。
    promethues-consul
    然后修改 prometheus.yml 配置如下:

    ...
    - job_name: 'consul-prometheus'
      consul_sd_configs:
        - server: '172.30.12.167:8500'
          services: []  
      relabel_configs:
        - source_labels: [__meta_consul_tags]
          regex: .*test.*
          action: keep
        - regex: __meta_consul_service_metadata_(.+)
          action: labelmap
    

    解释一下,增加的配置作用为匹配 __meta_consul_service_metadata_ 开头的标签,将捕获到的内容作为新的标签名称,匹配到标签的的值作为新标签的值,而我们刚添加的三个自定义标签,系统会自动添加 __meta_consul_service_metadata_app=spring-boot__meta_consul_service_metadata_team=appgroup__meta_consul_service_metadata_project=bigdata 三个标签,经过 relabel 后,Prometheus 将会新增 app=spring-bootteam=appgroupproject=bigdata 三个标签。重启 Prometheus 服务,可以看到新增了对应了三个自定义标签。
    promethues-consul
    问题四,将自动发现的服务进行分类,本质上跟上边的处理方式一致,可以添加自定义的标签方式,通过标签来区分,二可以通过服务 Tag 来进行匹配来创建不同的类型 exporter 分组。这里我以第二种为例,通过给每个服务标记不同的 Tag,然后通过 relabel_configs 来进行匹配区分。我们来更新一下原 node-exporter-172.30.12.167 服务标签,同时注册一个其他类型 exporter 的服务如下:

    $ vim consul-1.json
    {
      "ID": "node-exporter",
      "Name": "node-exporter-172.30.12.167",
      "Tags": [
        "node-exporter"
      ],
      "Address": "172.30.12.167",
      "Port": 9100,
      "Meta": {
        "app": "spring-boot",
        "team": "appgroup",
        "project": "bigdata"
      },
      "EnableTagOverride": false,
      "Check": {
        "HTTP": "http://172.30.12.167:9100/metrics",
        "Interval": "10s"
      },
      "Weights": {
        "Passing": 10,
        "Warning": 1
      }
    }
    
    # 更新注册服务
    $ curl --request PUT --data @consul-1.json http://172.30.12.167:8500/v1/agent/service/register?replace-existing-checks=1
    
    $ vim consul-2.json
    {
      "ID": "cadvisor-exporter",
      "Name": "cadvisor-exporter-172.30.12.167",
      "Tags": [
        "cadvisor-exporter"
      ],
      "Address": "172.30.12.167",
      "Port": 8080,
      "Meta": {
        "app": "docker",
        "team": "cloudgroup",
        "project": "docker-service"
      },
      "EnableTagOverride": false,
      "Check": {
        "HTTP": "http://172.30.12.167:8080/metrics",
        "Interval": "10s"
      },
      "Weights": {
        "Passing": 10,
        "Warning": 1
      }
    }
    
    # 注册服务
    $ curl --request PUT --data @consul-2.json http://172.30.12.167:8500/v1/agent/service/register?replace-existing-checks=1
    

    说明一下,我们更新了原 node-exporter-172.30.12.167 服务的标签为 node-exporter,同时注册一个新类型 cadvisor-exporter-172.30.12.167 服务,并设置标签为 cadvisor-exporter,以示区别。注册完毕,通过 Consul Web 控制台可以看到成功注册了这两个服务。
    promethues-consul
    最后,我们修改 prometheus.yml 配置如下:

    ...
      - job_name: 'consul-node-exporter'
        consul_sd_configs:
          - server: '172.30.12.167:8500'
            services: []  
        relabel_configs:
          - source_labels: [__meta_consul_tags]
            regex: .*node-exporter.*
            action: keep
          - regex: __meta_consul_service_metadata_(.+)
            action: labelmap
    
      - job_name: 'consul-cadvisor-exproter'
        consul_sd_configs:
          - server: '172.30.12.167:8500'
            services: []
        relabel_configs:
          - source_labels: [__meta_consul_tags]
            regex: .*cadvisor-exporter.*
            action: keep
          - regex: __meta_consul_service_metadata_(.+)
            action: labelmap
    

    这里需要根据每种类型的 exporter 新增一个关联 job,同时 relabel_configs 中配置以 Tag 来做匹配区分。重启 Prometheus 服务,可以看到服务已经按照类型分类了,方便查看。
    promethues-consul
    参考资料

    展开全文
  • Eureka服务发现注册详解

    万次阅读 2019-06-25 16:48:38
    Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以...

    目录

    一、服务发现简介

    二、Eureka简介

    三、Eureka一些特性及配置过程时需要注意的问题

    四、EurekaServer和EurekaClient的作用分析 

    五、Eureka开发实战


    一、服务发现简介

            1.服务提供者、服务消费者、服务发现组件三者之间的关系大致如下:

    • 各个微服务在启动时时,将自己的网络地址等信息注册到服务发现组件上(eureka,zookeeper,Consul,spring cloud alibaba的nacos),服务发现组件会存储这些信息。
    • 服务消费者会从服务发现组件查询服务提供者的网络地址,然后根据该地址调用服务提供者的接口。
    • 各个微服务与服务发现组件使用一定的机制来维持心跳,服务发现组件若发现有服务没有提供心跳,那么服务发现组件会将该服务剔除。
    • 微服务网络地址发生变更(例如实例增减或者IP端口发生变化等),会重新注册到服务发现组件上,使用这种方式,可以避免因网络变化导致服务之间的通讯停止,服务消费者也无须人工的修改网络地址。

    二、Eureka简介

            Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。

            1.Eureka包含两个组件:Eureka Server和Eureka Client。

    Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

    Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询负载算法的负载均衡器。

            2.在应用启动后,Eureka Client会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。

            3.Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

    三、Eureka一些特性及配置过程时需要注意的问题

            1.Eureka能够保证AP,即当Eureka中的某个节点挂掉后,剩余的节点继续仍然可以提供服务的发现与注册服务。而Eureka的客户端在向某个Eureka或者发现了当前的Eureka不可用时,会自动切换到其他的节点,也就是说Eureka的节点是平等的,只要有一台Eureka服务器在,就能保证服务的可以继续被使用。

            2.Eureka的自我保护机制,我们在注册服务时,如发生断网的情况,Eureka不能接收到当前服务的任何心跳请求,Eureka会在默认的90s后,将该服务进行强制剔除,这样就能保证到网络故障时,虽然失去了部分节点,但不会像zookeeper那样会使整个注册服务瘫痪。当网络稳定时,新的实例会同步到其他节点中。

            3.相关配置问题

    服务端的配置如下,不注册自身:

    security:
      basic:
        enabled: true
      user:
        name: user
        password: password123
    eureka:
      client:
        register-with-eureka: false
        fetch-registry: false
        service-url:
          defaultZone: http://user:password123@localhost:8761/eureka

    如果我们需要使用ip地址来配置的话,先添加一行:

       eureka.instance.prefer.IpAddress=true;

    如果我们想要关闭保护机制,则设置以下代码:
    eureka.server.enable-self-preservation=false
    设置eureka剔除服务的时间间隔:
    eureka.server.eviction-interval-timer-in-ms=3000

    需要注意的是要在应用类的头上添加@EnableEurekaServer来启用Eureka服务器。

    接下来:访问Eureka,Url为:http://localhost:8761/

    可以发现eureka注册中心就启动了!!!

    在这里解释一下register-with-eureka=fasle和fetch-registry的用法,如果不指定该属性,服务端会将自身作为一个服务注册到注册中心去,因此我们需要在服务端启动前,指定这两个属性值为false。

    假如我们把以下代码给注释掉,指定一个应用名,重新启动eureka-server端:

    security:
      basic:
        enabled: true
      user:
        name: user
        password: password123
    
    server:
      port: 8888
    
    eureka:
      instance:
        hostname: 192.168.43.246
        prefer-ip-address: true
        instance-id: ${eureka.instance.hostname}:${server.port}
      client:
    #    register-with-eureka: false
    #    fetch-registry: false
        service-url:
          defaultZone: http://user:password123@${eureka.instance.hostname}:${server.port}/eureka
    spring:
      application:
        name: eureka-server
    

    发现eureka-server也注册到eureka上去了!

    注:

        如果使用ip地址来注册时,一定要添加以下两行代码:

        第一种方式: ,使用参数占位符来引用已经配置好的信息:

           eureka.instance.prefer-ip-adderss=true

            eureka.instance.instance-id=${eureka.instance.hostname}:${server.port}

         第二种方式: 使用springcloud来自动获取ip地址: 

         eureka.instance.hostname=${spring.cloud.client.ip-address}
         eureka.instance.instance-id=${eureka.instance.hostname}:${server.port}

    eureka客户端的配置添加上这两行代码,可以发现,添加以上两行代码的服务是以ip地址形式来注册的,没有添加的则以默认的方式来进行注册,即使用的主机名的方式来注册:

    附上使用ip地址注册服务的完整配置:

    eureka服务端:

    security:
      basic:
        enabled: true
      user:
        name: user
        password: password123
    
    server:
      port: 8888
    eureka:
      instance:
        hostname: 192.168.43.246
    #    使用ip地址的方式进行注册
    #    prefer-ip-address: true
    #    instance-id: ${eureka.instance.hostname}:${server.port}
      client:
    #    不注册自身
    #    register-with-eureka: false
    #    fetch-registry: false
        service-url:
          defaultZone: http://user:password123@${eureka.instance.hostname}:${server.port}/eureka
    spring:
      application:
        name: eureka-server
    

    eureka客户端:

    security:
      basic:
        enabled: true
      user:
        name: user
        password: password123
    
    server:
      port: 9999
    spring:
      application:
        name: eurekaClient
    eureka:
      instance:
        hostname: 192.168.43.246
        prefer-ip-address: true
        instance-id: ${eureka.instance.hostname}:${server.port}
      client:
       service-url:
          defaultZone: http://user:password123@${eureka.instance.hostname}:8888/eureka
    

    此处的server-url的端口号要为服务端的端口号。注: 是 deafaultZone, 不是default-zone

     附:使用指定的ip去注册

    客户端配置如下,如果你在pom文件中添加了如下依赖,客户端可以不用在启动类上面添加@EnableEurekaClient注解。只需要在applicantion.properties文件中添加配置即可:

     eureka客户端和eureka服务端:

     <!-- eureka-server-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka-server</artifactId>
                <version>1.2.3.RELEASE</version>
            </dependency>
    
            <!--eureka-client-->
    
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
                <version>1.2.3.RELEASE</version>
            </dependency>

    四、EurekaServer和EurekaClient的作用分析 

            1.  EurekaServer提供服务发现的能力,当有服务来注册时,EurekaServer会将这些服务的信息存储到起来。

            2.  EurekaClient是一个java客户端,可以与服务发现组件来交互。

            3.  续约。微服务启动后,会默认底向EurekaServer发送心跳,默认时间为30s,这样的作用就是续约自己的租约。

            4.  剔除。如果Eureka在一定时间内没有收到客户端的心跳,那么EurekaServer会剔除掉没有发生心跳客户端,默认时间为90s。  

            5. 缓存。EurekaClient会缓存服务器的信息,这种方式的好处是当EurekaServer宕机时,,服务消费者依然可以访问服务。

            6. eureka 服务器默认是将自身注册到服务器里。可以使用如下代码不讲自身注册进去:

    eureka:
      client:
    #    不注册自身
    #    register-with-eureka: false

            7. 如果设置多个eureka时,需要设置 eureka.client.fetchRegistry=true,表示多个服务器之间的数据同步。单个节点直接设置成false即可。

    五、Eureka开发实战

            1. 在Spring Cloud Edgware以及更高的版本中,只需要添加相关依赖,即可自动注册服务到EurekaServer中,在实际的项目中,我们可以直接实现服务消费者连接服务提供者,这样我们可以不用将服务注册到eureka上,以便于调试。

            2.  如果不想将服务注册到EurekaServer上,只需要设置spring.cloud.service-registry.auto-registration.enabled=false,或使用注解@EnableDiscoveryClient(auto-Registry=false)。

              为了便于调试,可以直接使用服务提供者直连服务消费者的方式进行调试,服务调试方法如下。

    1)  在resources目录下新建application-local.yml文件中添加调用各服务的url:

      如果是远程服务的提供者,那么配置网关+地址。

      如果是本地的服务提供者,就是本地的ip地址+端口号。

    2) 启动需要指定profiles文件为local

    展开全文
  • 如何理解服务注册和服务发现

    千次阅读 2019-05-06 11:49:28
    三者的关系是:通过服务注册机制将启动服务的信息上传至服务注册表,服务发现机制通过服务注册表实时获取可用服务的信息。 服务注册的方式包括:自注册和第三方注册。自注册的意思是当服务启动时,服务自动将信息...

    服务注册、服务注册表、服务发现

    三者的关系是:通过服务注册机制将启动服务的信息上传至服务注册表,服务发现机制通过服务注册表实时获取可用服务的信息。

    服务注册的方式包括:自注册和第三方注册。自注册的意思是当服务启动时,服务自动将信息上传至服务注册表,并通过心跳进行同步。第三方注册的意思是通过一个第三方的服务将启动服务的信息上传至服务注册表,并通过一定机制保持更新。缺点是要保证第三方服务的高可用性。

    服务注册表也是一个服务集群,维护了一个数据库,数据库中存储的是可用服务的信息。

    服务发现的意思是当需要使用服务时,通过读取服务注册表获取可用的服务信息,客户端可以通过此信息连接服务器。服务发现的方式包括:客户端服务发现和服务端服务发现。

    详细描述此文章 点击打开 讲的很清楚。

    展开全文
  • 服务发现和服务注册

    千次阅读 2018-06-10 10:17:52
    一 硬编码问题1 适用场景有局限:如果服务提供者的网络地址(IP和端口)发生了变化,将会影响服务消费者。例如,用户微服务的网络地址发生了变化,就需要修改电影微服务的配置,...二 服务发现服务提供者、服务消...
  • 服务注册中心---服务发现nacos

    万次阅读 2021-07-15 16:05:09
    服务在nacos是一等公民 二、有了Eureka为啥还要用nacos?两者区别是什么? 具体可看这篇文章 很形象 三、下载安装 可参考里面的下载安装流程 比较简单 四、nacos原理 Nacos注册中心分为server与client,server采
  • 什么是服务发现

    千次阅读 2018-09-07 11:34:52
    引言 ... 服务发现是什么 服务发现的模式 客户端模式 服务端模式 几种服务发现框架的简介 Eureka 服务注册反注册机制 Consul ...
  • 华为云讲解:2.Istio Pilot 与...文章目录华为云讲解:2.Istio Pilot 与服务发现服务发现看图说话 在Istio里面Service A 访问ServiceB 如何做到的服务发现的实现Istio 结合Kubernetes 做服务发现总结配置管理流量规则...
  • 为什么要使用服务发现

    千次阅读 2018-03-01 16:40:40
    为什么要使用服务发现?假设我们写的代码会调用 REST API 或者 Thrift API 的服务。为了完成一次请求,代码需要知道服务实例的网络位置(IP 地址和端口)。运行在物理硬件上的传统应用中,服务实例的网络位置是相对...
  • 两种服务发现方式 常见的第三方注册工具 后记 前言 好一阵子没有更新了,有些小伙伴在后台问我有没有更新,看来大家还是挺喜欢看我的文章的嘛。主要是这段是间忙着复习算法的一些东西,也不想随便写一篇繁衍。**...
  • 浅谈服务发现

    万次阅读 多人点赞 2017-08-27 09:19:13
    这片文章简单地介绍了服务发现,包括服务发现的两种模式,以及Eureka(偏向于AP)以及Consul(偏向于CP)两个微服务框架。
  • Consul服务注册与服务发现机制

    千次阅读 2019-06-25 15:43:02
    1、什么是服务注册中心? 顾名思义,假设你有一个分布式系统,里面包含了多个服务,部署在不同的机器上,然后这些不同机器上的服务之间要互相调用。...现在订单服务是想要调用库存服务,但是他并不知道库存服务在...
  • 转载出处:​如何实现微服务架构中的服务发现?  原文地址:Service Discovery in a Microservices Architecture 编者按:在『应用架构一团糟?如何将单体应用改造为微服务』一文中,介绍了如何逐步地将单体...
  • 为什么不用ZK来做服务发现

    千次阅读 2016-11-23 14:45:20
    本文作者通过ZooKeeper与Eureka作为 Service发现服务的优劣对比,分享了Knewton在云计算平台部署服务的经验。本文虽然略显偏激,但是看得出Knewton在云平台方面是非常有经验的,这篇文章从实践角度出发分别从云平台...
  • Spring cloud服务发现之服务提供者和服务消费者 1.服务提供者 2.服务提供者 3.启动运行 4.综上 1.服务提供者根据上节讲述的服务注册之Eureka注册中心,这节讲述服务提供者和服务消费者,首先新建一个工程,...
  • 关于Docker的服务发现与注册

    千次阅读 2017-07-26 21:30:38
    服务发现的背景 服务发现并不是新出现的概念,在分布式系统中是一个很基础的概念,并有很长的历史,DNS(域名系统)就是一个很好的例子。但是在最近一段时间,随着Docker和微服务架构的迅速发展,服务连接趋于动态...
  • 深入浅出prometheus之服务发现(sd)

    万次阅读 2018-08-07 11:31:00
    prometheus默认已经支持了很多常用系统的服务发现能力,这一点可以通过官方文档中找到,我这里通过代码说明prometheus服务发现的系统: // 代码源于prometheus/discovery/config/config.go type ...
  • 目录 Netflix Eureka 简介 spring-cloud-netflix简介 Eureka 原理 服务发现 ...1、Eureka 是 Netflix 公司开发的服务发现框架,Spring Cloud 对它提供了支持,将它集成在了自己的spring-cl...
  • Service发现服务(注:WebServices 体系中的UDDI就是个发现服务)的优劣对比,分享了Knewton在云计算平台部署服务的经验。本文虽然略显偏激,但是看得出Knewton在云平台方 面是非常有经验的,这篇文章从实践角度出发...
  • PHP实现consul服务注册与服务发现

    千次阅读 2019-04-18 22:04:31
    本文主要介绍怎么用consul提供的HTTP的API来实现PHP与consul之间的通信,实现服务的注册与发现。 首先官方API:https://www.consul.io/api/index.html 其次我实现的代码:...
  • Eureka和Zookeeper作为服务发现和治理组件的对比,以及他们在各自系统中的作用机制。
  • Kubernetes集群服务发现Service资源LoadBalancer类型详解 1.LoadBalancer类型的service资源概念 LoadBalancer和Nodeport非常相似,目的都是向外暴露一个端口,区别在于LoadBalancer会在集群外部再做一个负载均衡...
  • consul服务发现入门篇

    千次阅读 2016-12-09 18:08:03
    前言:常用的服务发现有 zookeeper:https://zookeeper.apache.org/ etcd:https://coreos.com/etcd/ consul:https://www.consul.io/ consul: 集成了 服务发现、故障检测、多数据中心、K/V存储。 consul安装...
  • springcloud服务发现

    万次阅读 2019-10-15 22:45:30
    下面我们接着上一篇eureka的自我保护继续讲springcloud服务发现 controller层代码: package com.atguigu.springcloud.controller; import java.util.List; import org.springframework.beans.factory....
  • 微服务系统中的服务发现机制

    万次阅读 2016-07-13 00:05:31
    为什么要使用服务发现? 我们可以想象一下,当我们需要远程的访问REST API或者Thrift API时,我们必须得知道服务的网络地址(IP Address和port)。传统的应用程序都是运行在固定的物理机器上,IP Address和端口号...
  • 第四篇:服务发现机制

    万次阅读 2017-07-15 13:58:45
    本文出自Service Discovery in a Microservices Architecture,作者 Chris Richardson, 写于2015年5月19日这是本系列文章的第四篇。 第一篇文章:介绍微服务架构并...本文我们继续探索与服务发现紧密联系的有关问题。
  • 使用Eureka做服务发现(一)

    万次阅读 2017-07-03 09:16:57
    使用Eureka做服务发现 Zookeeper做注册中心的缺陷 Peter Kelley(个性化教育初创公司Knewton的一名软件工程师)发表了一篇文章说明为什么ZooKeeper用于服务发现是一个错误的做法,他主要提出了三个缺点[1]: ...
  • 在云计算和容器化技术发展火热的当下,对于微服务架构,服务注册与发现组件是必不可少的。在传统的服务架构中,服务的规模处于运维人员的可控范围内。当部署服务的多个节点时,一般使用静态配置的方式实现服务信息的...
  • Kubernetes中如何发现服务 如何发现Pod提供的服务如何使用Service发现服务如何使用kube-dns发现服务 kube-dns原理 组成域名格式配置 注:本次分享内容基于Kubernetes 1.2版本! 下面从一个简单的例子开始...
  • Server节点能否在配置文件里配置自身的Server地址? ... Server回收服务信息的自我保护机制是什么?需要注意什么? Server节点间的服务信息同步的流程是怎么样的? 我们就以下图为例来解释上述...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,115,579
精华内容 846,231
关键字:

服务发现