【译】带有微服务和服务发现的应用层

398 阅读5分钟

本文阐述了应用层中微服务的服务发现工作,以及应用层与微服务和服务发现的完整概念。

内容表

  1. 什么是应用层?
  2. 应用层的一些功能
  3. 什么是微服务?
  4. 什么是服务发现?
  5. 为什么使用服务发现?
  6. 服务发现的DNS方法的实施
  7. 服务发现的DNS方法的局限性
  8. 使用ZooKeeper的服务发现的一个简单实现

这是系统设计中的一个重要主题。我们现在将深入研究它。

什么是应用层?

OSI模型中的第七层是应用层。应用层直接与应用程序互动,并提供常见的网络应用服务,如FTP,DNS,HTTP,SMTP和TELNET。

OSI-Model

当你能够将网络层与应用层分开时,你就能够轻松地进行扩展,并在这两层上独立进行必要的改变。单一责任原则,即一个类应该有一个单一的责任,不能超过一个,可以适用于发生在应用层的服务。这个原则有助于从事小型服务的团队合作,更多的计划,并迅速成长。单一责任原则有助于减少耦合,增加简单性,使工作更容易。

异步处理器也被称为工作者,有助于实现应用层的异步性。例如,一个消费者应用程序处理来自Oracle Event Hub云服务主题的事件。工作者应用程序也可以用来调用外部应用程序和API。

应用层的一些功能

应用层的一些功能是。

  • 它有助于开发基于网络的应用程序。
  • 应用层为电子邮件转发提供了基础,并为sotrage提供了便利。
  • 它还允许用户检索、管理和访问远程计算机中的文件。

什么是微服务?

microservice

微服务是云计算性质的架构方法,其中一个单一的应用程序是由许多可独立部署的小型服务组成。它不同于传统的单体架构,在这种架构中,应用程序的所有业务逻辑都保存在一个地方。微服务使复杂的企业应用的敏捷开发和轻松交付成为可能。微服务比传统的单片式架构更受欢迎,因为使用微服务可以更容易地管理和扩展大型代码库。以下是微服务的主要特点。

  • 微服务通常有自己的技术栈,有自己的数据库和数据管理模型。
  • 微服务通过REST API、事件流和消息经纪人相互通信。

什么是服务发现?

服务发现是应用程序能够在网络上找到微服务的方式,反之亦然。

为什么使用服务发现?

当你写一些代码,需要调用一个具有REST API的服务时,你的代码需要知道该服务的网络位置,以便成功地进行请求。相比之下,在物理硬盘上运行的应用程序不需要服务发现,因为找到服务实例比较容易。

然而,在基于云的微服务应用中,很难定位服务实例的网络位置。这是因为微服务中的服务实例由于自动缩放、故障和升级而动态地分配网络位置。因此,客户端必须有一个准确的服务发现机制。

有两种服务发现的模式。

  1. 客户端服务发现。

Client-Side-Discovery

在客户端发现中,想要被发现的服务在发现服务器上注册。现在,发现服务器知道所有注册服务的地址。当客户端对一个特定的服务(如微服务3)提出请求时,发现服务器向客户端提供所请求服务的URL。从这里,客户端直接调用Microservice 3的API。

  1. 服务器端发现

Server-Side-Discovery-2

所有想被发现的微服务都在发现服务器上注册,就像在客户端发现一样。客户端为一个服务向发现服务器提出请求,例如,微服务1。然后,发现服务器将请求转发给微服务1,而客户端不与微服务直接联系。

服务发现的DNS方法的实现

在这个实现中,客户端在DNS方法中使用DNS库进行服务发现。每个微服务在DNS区域文件中收到一个条目,并做一个DNS查询来寻找微服务。在某些情况下,当微服务被相应配置时,可以使用一个代理,如NGINX,它可以定期检查DNS的状态以进行服务发现。这种方法适用于任何语言,需要最小的代码修改。

服务发现的DNS方法的局限性

  • DNS不提供实时视图。因此,当不同的客户有不同的缓存语义时,调整TTL是不够的。
  • 由于添加和删除区域文件是很昂贵的,所以有一个管理区域文件的操作开销。
  • 还需要为弹性和健康检查添加额外的基础设施,这最终会使DNS方法变得复杂。

使用ZooKeeper的服务发现的一个简单实现

ZooKeeper是一个Apache项目,它提供了一个分布式的一致的分层配置存储。它可以用来维护配置信息,命名,提供分布式同步,并提供组服务。所有这些服务都以某种形式被分布式应用所使用。Zookeper是注册和查询服务的几种方式之一。其他用于相同目的的应用程序包括etcd、consul、Kubernetes和Netflix Eureka。

**注意:**下面的代码是用Java实现的。

服务注册

String znode = "/services/" + name;

if (curatorFramework.checkExists().forPath(znode) == null) {
    curatorFramework.create().creatingParentsIfNeeded().forPath(znode);
}

String znodePath = curatorFramework
        .create()
        .withMode(CreateMode.EPHEMERAL_SEQUENTIAL)
        .forPath(znode+"/_", uri.getBytes());

uriToZnodePath.put(uri, znodePath);

服务发现

String znode = "/services/" + name;

List<String> uris = curatorFramework.getChildren().forPath(znode);
return new String(curatorFramework.getData().forPath(ZKPaths.makePath(znode, uris.get(0))));

通过OpenGenus的这篇文章,你一定对微服务和服务发现的应用层有了完整的认识。