精华内容
下载资源
问答
  • SOA中间件 - 服务自动注册与发现

    千次阅读 2016-07-13 20:59:21
    时序图:

    时序图:


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

    2020-12-15 20:23:25
    1:什么是Eureka Eureka怎么读 Netflix在设计Eureka时,遵循的就是AP原则; Eureka是Netflix的一个子模块,也是核心模块之一。... SpringCloud封装了Netflix公司开发的Eureka模块来实现服务注册与发现(比如.

    1:什么是Eureka

    • Eureka怎么读
    • Netflix在设计Eureka时,遵循的就是AP原则;
    • Eureka是Netflix的一个子模块,也是核心模块之一。Eureka是一个基于REST的服务,用于定位服务,以实现云端中间件服务发现与故障转移,就可以访问到服务,而不需要修改服务调用的配置文件了,功能类似于Dubbo的注册中心,比舅Zookeeper;

    2:原理讲解

    • Eureka的基本架构
      • SpringCloud封装了Netflix公司开发的Eureka模块来实现服务注册与发现(比如Zookeeper);
      • Eureka采用了C-S的架构设计,EurekaServer作为服务注册功能的服务器,他是服务注册中心;
      • 而系统中的其它微服务,使用Eureka的客户端连接到EurekaServer并维持心跳连接。这样系统的维护人员就可以通过EurekaServer来监控系统中各个微服务是否正常运行,SpringCloud的一些其它模块(比如zuul)就可以通过EurekaServer来发现系统中的其它微服务,并执行相关的逻辑;
      • 与Dubbo架构相比
        • Eureka包含两大组件:EurekaServer和Eureka Client
        • EurekaServer提供服务注册功能,各个节点启动后,会在EurekaServer中进行注册,这样Eureka Server中的服务注册表中将会发现所有可用服务节点的信息,服务节点的信息可以直接在界面中直接观察到;
        • Eureka Client是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的,使用轮训负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳(默认周期为30s)。如果Eureka Server在多个心跳周期没有接收某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除掉(默认周期是90s);
      • 三大角色:
        • Eureka Server:提供服务的注册与发现。Zookeeper相当于。
        • Server Provider:将自身服务注册到EurekaServer中,从而使消费方能够找到。
        • Server Consumer:服务消费方从Eureka中获取注册服务列表,从而找到消费服务。

     

     

     

    第一步:导包:

     

     <!--导包-->
         <dependencies>
             <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server -->
             <dependency>
                 <groupId>org.springframework.cloud</groupId>
                 <artifactId>spring-cloud-starter-eureka-server</artifactId>
                 <version>1.4.6.RELEASE</version>
             </dependency>
    
             <!--执部署工具-->
             <dependency>
                 <groupId>org.springframework.boot</groupId>
                 <artifactId>spring-boot-devtools</artifactId>
             </dependency>
         </dependencies>
    
    @SpringBootApplication
    @EnableEurekaServer  //@EnableEurekaServer 服务端的启动类
    public class EurekaServer_7001 {
        public static void main(String[] args) {
            SpringApplication.run(EurekaServer_7001.class,args);
        }
    }
    
    

    配置类:application.yml

    server:
      port: 7001
    
    #Eureka配置
    eureka:
      instance:
        hostname: localhost #Eureka服务端的实例名称
      client:
        register-with-eureka: false #表示是否向Eureka注册中心注册自己,因为自己就是一个服务,所以就不注册
        fetch-registry: false #如果为false,#要不要去注册中心获取其他服务的地址
        service-url:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
    

    运行后的效果:http://localhost:7001/

     

    展开全文
  • 基础概念  在微服务系统中,服务的注册和发现是第一步,常用的有:  Eureka:https://github.com/Netflix/eureka  Zookeeper:... ... 等服务注册与发现中间件,本文以Eureka为例,讲解...

    基础概念


       在微服务系统中,服务的注册和发现是第一步,常用的有:

        Eureka:https://github.com/Netflix/eureka

        Zookeeper:https://zookeeper.apache.org/

        Consul:https://www.consul.io/

      等服务注册与发现中间件,本文以Eureka为例,讲解微服务系统中的服务注册和发现。

    服务发现组件:当微服务启动的时候,会将自己的地址等信息注册到服务发现组件中,这些信息的存储在服务发现组建部分完成;

    服务提供者:微服务系统中接口能力的提供者,会将自己的调用地址等信息注册到服务发现组件中,提供给服务消费者调用;

    服务消费者:从服务发现组件中查询服务提供者的网络地址,并使用该地址调用服务提供者的接口;


     服务注册中心


         使用idea的自动生成工程的功能,注意选择Cloud Discovery中的Eureka Server组件,生成的工程中主要关注两个部分:Application.java(启动类)和application.properties(工程使用的配置文件,支持yaml语法)。

      为了实现服务注册,需要为启动类加上@EnableEurekaServer注解,用于显式声明启动一个服务注册中心。

     1 import org.springframework.boot.SpringApplication;
     2 import org.springframework.boot.autoconfigure.SpringBootApplication;
     3 import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
     4 
     5 @SpringBootApplication
     6 @EnableEurekaServer
     7 public class EurekaserverApplication {
     8 
     9     public static void main(String[] args) {
    10         SpringApplication.run(EurekaserverApplication.class, args);
    11     }
    12 }

      同时需要对相关配置进行修改。

     1 #服务注册中心端口号
     2 server.port=8761
     3 
     4 #域名信息
     5 eureka.instance.hostname=localhost
     6 
     7 #设置是否将自己作为EurekaClient注册到EurekaServer,服务注册中心不作为服务提供者,默认不需要注册
     8 eureka.client.register-with-eureka=false
     9 
    10 #设置是否从EurekaServer获取注册信息
    11 eureka.client.fetch-registry=false
    12 
    13 #与EurekaServer的交互地址,查询和注册服务都依赖这个地址
    14 eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/ 

    服务提供者


        服务注册中心搭建完成之后,需要服务提供者将自己的服务信息注册到服务注册中心中。服务提供者的服务 

     

    转载于:https://www.cnblogs.com/Mr24/p/10229225.html

    展开全文
  • 前言 我个人觉得,中间件的部署与使用是非常难记忆...它主要实现了两个功能,服务注册与发现与自身的负载均衡的集群。 我们可以把他理解为一个没有界面的应用程序,因为没有界面,所以想启动Consul就只能使用命令行了;
  • 摘要: 一个好的服务注册发现中间件,应该是能完整地满足服务开发和治理的基础功能...引言聊起微服务的服务注册与发现,很多人立马就会脱口而出 zk、etcd、consul、eureka 这些组件,进而聊到 CAP 如何取舍,性能如...

    摘要: 一个好的服务注册发现中间件,应该是能完整地满足服务开发和治理的基础功能,然后才是性能和高可用。如果没有想清楚前面的功能,再高的可用性和性能都是浮云。最后,安全也同样重要。下面将从 服务注册、服务发现、容灾和高可用三个大方面来回答这些问题的主流做法。

    引言

    聊起微服务的服务注册与发现,很多人立马就会脱口而出 zk、etcd、consul、eureka 这些组件,进而聊到 CAP 如何取舍,性能如何,高可用和容灾是怎么实现的。

    在这之前,站在组件使用者的角度,我想先问这么几个问题:

    • 注册的 IP 和端口怎么确定 ?
    • 实现服务治理还需要注册哪些信息 ?
    • 如何进行优雅的服务注册与服务下线 ?
    • 注册服务的健康检查是如何做的 ?
    • 当服务有节点退出或新的节点加入时,订阅者能不能及时收到通知 ?
    • 我能方便地查看某个应用发布和订阅了哪些服务,以及所订阅的服务有哪些节点吗 ?

    看完这些问题后,您也许会发现,对于服务注册与发现,首先应该关注的是服务注册发现本身的功能,然后才是性能和高可用。

    一个好的服务注册发现中间件,应该是能完整地满足服务开发和治理的基础功能,然后才是性能和高可用。如果没有想清楚前面的功能,再高的可用性和性能都是浮云。最后,安全也同样重要。

    • 服务端的性能如何 ?
    • 服务发现的容灾策略是怎样的 ?
    • 当我的应用和服务发现中心的网络连接出现问题时,会对我的调用产生什么影响 ?
    • 服务注册中心某台机器宕机或者全部宕机时,会对我的调用产生什么影响 ?
    • 服务注册和发现的链路安全吗,有没有做好权限控制 ?

    下面将从 服务注册、服务发现、容灾和高可用三个大方面来回答这些问题的主流做法。

    最后会介绍一下 ANS(Alibaba Naming Service) , ANS 综合了这些解决方案中的优点,并在 EDAS(阿里巴巴企业级分布式应用服务) 中输出,目前完全免费!

    服务注册

    注册的 IP 和端口怎么确定 ?

    IP 如何确定

    主流的 IP 获取有这几种方法。

    • 最简单粗暴的方式,手动配置需要注册的IP。当然这种方式基本无法在生产环境使用,因为微服务基本都是支持水平扩容多机部署的,在配置中写死 IP 地址的方式无法支持一份代码水平扩容,会给运维带来极大的成本。
    • 通过遍历网卡的方式去获取,找到第一个不为本地环回地址的 IP 地址。绝大多数情况下,这个方式比较好用,dubbo 等框架采用的就是这种方法。
    • 在一些网络规划比较好的标准化机房中,我们还可以通过手动指定网卡名,即 interfaceName 的方式来指定使用哪一块网卡所对应的 IP 地址进行注册。
    • 当上述三种方式都不能有效解决问题的时候,有一个方法就是直接与服务注册中心建立 socket 连接,然后通过socket.getLocalAddress() 这种方式来获取本机的 IP。

    端口如何确定

    端口的获取,没有标准化的方案。

    • 如果是 RPC 应用,启动的时候都有一个配置来指定服务监听的端口, 注册的时候直接使用配置项的端口值。
    • 传统的 WEB 容器所提供的 HTTP 的应用,同样也存在一个配置文件来配置容器的监听端口,注册时候直接使用配置项的端口值。
    • 特别的,在 Java 应用的 Spring Boot 框架中,可以通过 EmbeddedServletContainerInitializedEvent. getEmbeddedServletContainer().getPort()来获取。(Spring Boot 版本为 1.x)。

    实现服务治理还需要注册哪些信息 ?

    简单地将 IP 和 port 信息注册上去,可以满足基本的服务调用的需求,但是在业务发展到一定程度的时候,我们还会有这些需求:

    • 想知道某个 HTTP 服务是否开启了 TLS。
    • 对相同服务下的不同节点设置不同的权重,进行流量调度。
    • 将服务分成预发环境和生产环境,方便进行AB Test功能。
    • 不同机房的服务注册时加上机房的标签,以实现同机房优先的路由规则。

    这些高级功能的实现,本质上是依赖于客户端调用时候的负载均衡策略和调用策略,但是如果服务元数据没有注册上来,也只能是巧妇难为无米之炊。一个良好的服务注册中心在设计最初就应该支持这些扩展字段。

    如何进行优雅的服务注册与服务下线 ?

    优雅发布

    虽然服务注册一般发生在服务的启动阶段,但是细分的话,服务注册应该在服务已经完全启动成功,并准备对外提供服务之后才能进行注册。

    • 有些 RPC 框架自身提供了方法来判断服务是否已经启动完成,如 Thrift ,我们可以通过 Server.isServing() 来判断。
    • 有一些 RPC 框架本身没有提供服务是否启动完成的方式,这时我们可以通过检测端口是否已经处于监听状态来判断。
    • 而对于 HTTP 服务,服务是否启动完毕也可以通过端口是否处于监听状态来判断。
    • 特别的,在 Java 应用的 Spring Boot 框架中,可以通过事件通知的形式来通知容器已经启动完毕, EmbeddedServletContainerInitializedEvent 事件来通知容器已经启动完成 (Spring Boot 版本为 1.x)。

    优雅下线

    绝大多数的服务注册中心都提供了健康检查功能,在应用停止后会自动摘除服务所对应的节点。但是我们也不能完全依赖此功能,应用应该在停止时主动调用服务注册中心的服务下线接口。

    • 在 Java 应用中,通用的服务下线接口调用一般使用 JVM Shutdown Hook 的方式来实现。
    • 特别的,在 Java 应用中的 Spring 框架中,可以通过 Spring Bean LifeCycle 来实现应用停止时主动调用服务下线接口。
    • 当然上述两种方式还不够优雅,因为不能确保不出现 kill -9 这种粗暴的停止方式,而且应用调用服务下线接口也是尝试去调用,对于网络不通等异常场景并没有做异常处理。因此,调用客户端仍应该做好负载均衡与 failover 的处理。
    • 更优雅的方式,先将即将停止的应用所对应的权重调成 0,此时上游将不再调用此应用。这时候的停止应用的操作对服务订阅者完全没有影响,当然这种场景需要订阅者实现按权重的负载均衡和运维部署工具深度结合。

    服务的健康检查是如何做的 ?

    健康检查分为客户端心跳和服务端主动探测两种方式。

    • 客户端心跳
    • 客户端每隔一定时间主动发送“心跳”的方式来向服务端表明自己的服务状态正常,心跳可以是 TCP 的形式,也可以是 HTTP 的形式。
    • 也可以通过维持客户端和服务端的一个 socket 长连接自己实现一个客户端心跳的方式。
    • ZooKeeper 并没有主动的发送心跳,而是依赖了组件本身提供的临时节点的特性,通过 ZooKeeper 连接的 session 来维持临时节点。

    但是客户端心跳中,长连接的维持和客户端的主动心跳都只是表明链路上的正常,不一定是服务状态正常。

    服务端主动调用服务进行健康检查是一个较为准确的方式,返回结果成功表明服务状态确实正常。

    • 服务端主动探测
    • 服务端调用服务发布者某个 HTTP 接口来完成健康检查。
    • 对于没有提供 HTTP 服务的 RPC 应用,服务端调用服务发布者的接口来完成健康检查。
    • 可以通过执行某个脚本的形式来进行综合检查。

    服务端主动探测也存在问题。服务注册中心主动调用 RPC 服务的某个接口无法做到通用性;在很多场景下服务注册中心到服务发布者的网络是不通的,服务端无法主动发起健康检查。

    所以如何取舍,还是需要根据实际情况来决定,根据不同的场景,选择不同的策略。

    服务发现

    怎么找到服务发现服务端的地址?

    • 在应用的配置文件中指定服务注册中心的地址,类似于 zookeeper 和 eureka。
    • 指定一个地址服务器的地址,然后通过这个地址服务器来获取服务注册中心的地址,地址服务器返回的结果会随着服务注册中心的扩缩容及时更新。

    当服务有节点退出或新的节点加入时,订阅者如何及时收到通知 ?

    很经典的 Push 和 Pull 问题。

    Push 的经典实现有两种,基于 socket 长连接的 notify,典型的实现如 zookeeper;另一种为 HTTP 连接所使用 Long Polling。

    但是基于 socket 长连接的 notify 和基于 HTTP 协议的 Long Polling 都会存在notify消息丢失的问题。

    所以通过 Pull 的方式定时轮询也必不可少,时间间隔的选择也很关键,频率越高服务注册中心所承受的压力也越大。需要结合服务端的性能和业务的规模进行权衡。

    还有一种方式,真实的 Push,客户端开启一个 UDP server,服务注册中心通过 UDP 的方式进行数据推送,当然这个也受限于网络的连通性。

    我能方便地查看我发布和订阅了哪些服务,订阅的服务有哪些节点吗 ?

    • 一个好的产品,用户使用体验和运维体验必须是优雅的,如果查看本机发布和订阅的服务,只能通过查看日志,甚至是 jmap 的方式来获取,显然体验非常糟糕。
    • 服务注册中心应该提供了丰富的接口,支持根据应用名、IP、订阅服务名、发布服务名,来进行多层次的组合查询。
    • 同时,客户端的内存里,同样也应该保留服务发布与订阅的各种信息,并提供方式供人方便地查询。
    • 比如在 Java 中的 Spring Boot 的应用,可以结合 actuator endpoint,通过 HTTP 的方式来提供本机服务查询功能,查询此应用发布的服务,以及订阅的服务及各服务的对应节点。

    容灾和高可用

    性能如何

    当服务节点数越来越多时,服务注册中心的性能会成为瓶颈,这时候就需要通过水平扩容来提升服务注册中心集群的性能。

    • 对于那些采用了类 Paxos 协议的强一致性的组件,如ZooKeeper,由于每次写操作需要过半的节点确认。水平扩容不能提升整个集群的写性能,只能提升整个集群的读性能。
    • 而对于采用最终一致性的组件来说,水平扩容可以同时提升整个集群的写性能和读性能。

    客户端容灾策略

    1. 首先,本地内存缓存,当运行时与服务注册中心的连接丢失或服务注册中心完全宕机,仍能正常地调用服务。
    2. 然后,本地缓存文件,当应用与服务注册中心发生网络分区或服务注册中心完全宕机后,应用进行了重启操作,内存里没有数据,此时应用可以通过读取本地缓存文件的数据来获取到最后一次订阅到的内容。
    3. 最后,本地容灾文件夹。正常的情况下,容灾文件夹内是没有内容的。当服务端完全宕机且长时间不能恢复,同时服务提供者又发生了很大的变更时,可以通过在容灾文件夹内添加文件的方式来开启本地容灾。此时客户端会忽略原有的本地缓存文件,只从本地容灾文件中读取配置。

    服务端容灾与高可用

    • 当有新节点加入集群时,节点启动后能自动添加到地址服务器中,并通过地址服务器找到其他节点,自动从其他节点同步数据,以达到数据的最终一致性。
    • 当某个节点宕机时,此服务注册中心节点的信息会自动地址服务器中摘除,客户端能及时感知到此节点已下线。

    服务端的无状态性保证了服务的容灾和高可用可以做的很薄。

    服务端安全是如何做的 ?

    链路安全,对于使用 HTTP 连接的服务注册中心,保护链路安全的最好方式是使用 HTTPS。而使用 TCP 连接的服务注册中心来说,由于应用层协议一般使用的是私有协议,不一定存在现成的 TLS 支持方案。

    在业务安全方面,应该在每一次的发布、订阅、心跳,都带上鉴权的信息就行验签和鉴权,确保业务信息的安全性。

    Alibaba Naming Service

    ANS (Alibaba Naming Service) 是阿里巴巴中间件团队将多年业务实践沉淀打磨的开源产品。在服务注册与发现方面,ANS 综合了上述解决方案中的优点,是最适合云原生应用的服务注册与发现组件。 
    ANS 服务已经在 EDAS(阿里巴巴企业级分布式应用服务) 上线,目前已经提供 Spring Cloud Ans Starter 方便 Spring Cloud 用户直接使用一个安全的可靠的商业版服务注册与发现功能。ANS 能完美地支持 Eureka 的特性,而且目前完全免费!更多信息参见 EDAS 帮助文档

    原文链接

    展开全文
  • 使用Nacos实现服务注册与发现 自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注。虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是...
  • Eureka是基于REST的服务,用于定位服务,以实现云端中间件层服务发现和故障转移,服务注册与发现对于微服务来说是非常重要的,有了服务注册与发现,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用...
  • 服务注册与发现对于微服务架构来说是非常重要的,由来服务发现与注册,只需要使用服务的标识符,就可以访问到服务,而不需要修改服务调用的配置文件了。功能类似于dubbo的注册中心,比如Zookeeper Spring...
  • Nacos服务注册与发现 1.Nacos的作用?(Eureka同等作用) Nacos是Alibaba开源的作为配置中心及服务发现的中间件。   用于发现、配置和管理微服务,一个更易于构建云原生应用的动态服务发现、配置管理、服务元数据...
  • 搭建微服务框架(SC服务注册与发现) 本文源地址:https://yanzhenyidai.com/#/squid/squid-2.1-sc-server Github地址:SQuid 服务注册中心-Nacos Nacos是阿里开源的一款注册中心中间件,详细介绍可以访问Nacos...
  • 如何注册与发现?         接触 Spring久 了,就会发现 Spring 最擅长的事情就是抽象和封装。所以我们听到最多的就是今天整合这个功能、明天整合那个中间件,把流行的好用...
  • 虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少团队的支持;同时,由于Spring Cloud Alibaba中的几项主要功能都直指Netflix OSS中的重要组件,而后者...
  • 虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少团队的支持;同时,由于Spring Cloud Alibaba中的几项主要功能都直指Netflix OSS中的重要组件,而后者...
  • 虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少团队的支持;同时,由于Spring Cloud Alibaba中的几项主要功能都直指Netflix OSS中的重要组件,而后者...
  • 虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少团队的支持;同时,由于Spring Cloud Alibaba中的几项主要功能都直指Netflix OSS中的重要组件,而后者...
  • 服务注册与发现的中心接口及参数介绍 服务的提供者将服务发布到注册中心,服务的使用着到 注册中引用服务。 Dubbo 的注册中心提供了多种实现,其实现是基于 dubbo 的 spi 的扩展机制的, 使用着可以直接实现自己的...
  • 虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭借阿里中间件团队的背景,还是得到不少团队的支持;同时,由于Spring Cloud Alibaba中的几项主要功能都直指Netflix OSS中的重要组件,...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 204
精华内容 81
关键字:

服务注册与发现中间件