利用ZK来实现一个服务的注册和发现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用ZK来实现一个服务的注册和发现相关的知识,希望对你有一定的参考价值。

参考技术A 利用ZK来实现一个服务的注册和发现小结

一、服务的注册

1、先来安装zk,这里可以在windows环境下安装即可,我们就用一个单节点做测试。不用建集群或者伪集群

2、启动zk-server

3、在项目工程里引入操作ZK的客户端框架 curator

4、通过curator的操作命令来链接zk-server,并创建节点

5、进行服务提供方所提供的服务接口在第4部上所建节点进行服务接口的注册(即服务的暴露)

6、启动服务提供方的监听(用来监听消费方发送来的消息)

7、补充:服务的监听其实质还是通过ServerSockt来获取消息,但是实际当中的一些消息中间件并不会这样用。我们知道现如今高性能的IO通信框架netty已经被广泛使用,采用了同步非阻塞的设计思想,以及多路复用器来完成高并发下的网络通信

二、服务的发现

1、消费方开始调用提供方的服务接口

2、调用方式:1>可以使用jdk动态代理来调用远程方法

2>也可以自己实现一个InvocationHandler,其目的就把远程接口加载到本地,当做本地方法来使用

3、serverceLocator方式

3.1 服务发现步骤

3.2 通过curator来链接zk-server

3.3 访问znode是否存在

3.4 通过zk-api 提供PathChildrenCache、PathChildrenCacheListener来监听znode数据是否有变化

3.5 获取zk-server的ip+port

3.6 通过消费方socket来链接 zk-server 并发送消息

总结:这里的服务注册和发现 完全是用了zk的两个非常重要的特性:znode结构以及事件监听通知机制,我们可以看到

在消费方服务发现里,会有一个监听对应znode的watcher实时动态的负责监听。这里可以理解为:只要znode上有

新的服务方接口,就会通知消费方来调用

缺点:实际项目当中我们知道作为服务注册和发现的组件常用的有ZK、Eureka,而我们并不去优先考虑使用ZK,原因何在?

我们知道ZK\Eureka,这两者都是作为分布式系统当中的一种重要的分布式协调器,而我们所知的二者都满足了分布式系统

CAP理论当中的一个侧重点,ZK主要满足CP,而Euraka是满足AP,这就为ZK不能满足A而带来一定程度的影响,比如当ZK中

master节点挂掉之后,因为集群节点过多,从节点的leader选举占据了大量的时间,而导致zk的不可用,反而大大提升了

系统的风险。

优点:ZK的优点也是基于自身的特点,根据他的特点我们可以去实现一个分布式系统当中常用的 配置管理中心,这里就利用

了他的一致性特点

优化方案,如果服务提供房是一个集群,那么消费方请求可以通过负载均衡,来打到不同的节点上,以防止单一节点过载

SpringCloud01——服务的注册和发现

SpringCloud01——服务的注册和发现

一、微服务的注册和发现

我们在微服务中,往往有服务提供者,服务消费者和服务注册中心。我们之前学习的Zookeeper就是一个注册中心。但是在官方的SpringCloud中,并不推荐使用ZK作为注册中心,我们往往使用eureka

服务提供者,服务消费者,注册中心呈一个三角关系

1.服务提供者将服务注册到中心

2.服务消费者通过注册中心去查找服务

3.查找服务后进行调用

4.服务消费者和服务注册中心保持心跳连接,一旦服务提供者的地址发生改变,注册中心会通知服务消费者

二、注册中心eureka

SpringCloud提供了多种注册中心支持,eureka,zk等,官方推荐eureka

科普:什么是Eureka?
Eureka是Netfix开源的服务发现组件,本身是一个基于Rest的服务。包含Server和Client两部分。SpringCloud将其集成在子项目Spring Cloud Netflix中,从而实现微服务的注册和发现。

2.1.编写Eureka Server

2.1.1.新建一个Spring Starter,导入eureka server

2.1.2.创建一个application.yml,在启动类@EnableEurekaServer

server:
  port: 1111 #服务端口
 
eureka:
  client:
    register-with-eureka: false #是否将自己注册到Eureka服务中,自己本来就是服务无需注册
    fetch-registry: false #是否从Eureka中获取注册信息
    service-url: # Eureka客户端与Eureka服务端交互地址
      defaultZone: http://localhost:$server.port/eureka/

2.1.3.新建一个Spring Starter,导入eureka,编写一个服务

2.1.4.创建一个application.yml,在启动类@EnableDiscoveryClient,去上面那个注册中心去注册发现

server:
  port: 8081 
  
spring:
  application:
    name: microservice-item
    
eureka:
  client:
    register-with-eureka: true
    fetch-registry: true #是否从eureka中获取注册信息,默认true
    service-url:
      defaultZone: http://localhost:1111/eureka/

2.1.5.编写服务(关键代码)

@Service
public class ItemService 
    
    @Autowired
    private RestTemplate restTemplate;
    
    @Autowired
    private DiscoveryClient discoveryClient;
    
    /**
     * 商品微服务进行查询
     * @param id
     * @return
     */
    public Item queryItemById(Long id) 
        List<ServiceInstance> instances = discoveryClient.getInstances("MICROSERVICE-ITEM");
        ServiceInstance serviceInstance = instances.get(0);
        String url="http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/item/"+id;
        return restTemplate.getForObject(url, Item.class);
    

2.2.编写eruka-client

2.2.1.新建一个eruka-client,添加eruka发现组件和web包

2.2.2.编写配置文件application.yml

#服务端口
server:
  port: 8888

#应用名称及验证账号
spring:
  application:
    name: server-text

#注册中心
eureka:
  #  server:
  #    enable-self-preservation: false       #关闭保护机制
  #    eviction-interval-timer-in-ms: 2000   #剔除失效服务间隔,单位毫秒
  client:
    register-with-eureka: true
    fetch-registry: true
    #设置服务注册中心的URL
    service-url:
      defaultZone: http://root:root@eureka-7901:7901/eureka/
  instance:
    hostname: server-text

2.2.3.添加启动类注解

@EnableEurekaClient

2.2.4.启动后发现集群启动正常

以上是关于利用ZK来实现一个服务的注册和发现的主要内容,如果未能解决你的问题,请参考以下文章

聊聊微服务的服务注册与发现

手写rpc服务 | 优化zk注册工具类,完善注册机制

zookeeper服务注册和发现原理

Nacos服务注册与发现的原理

如何实现netty RPC的服务注册与服务发现?

Spring Cloud之整合ZK作为注册中心