作者张晋涛,API7.ai 云原生技术专家,Apache APISIX PMC 成员,Apache APISIX Ingress Controller 项目维护者。

原文链接

云原生场景下是否需要服务发现

背景

微服务架构是当前最为流行的应用架构之一。

应用被拆分为多个服务组件,通过相互配合共同完成业务的具体逻辑和功能。

随着应用规模的增加和微服务拆分粒度的不同,一套系统内会包含很多个服务组件。

要让这些组件之间可以很好的协同,并且能彼此识别到,通常都需要引入服务注册和发现组件。

之前我们写了一篇文章专门来介绍微服务架构中的服务发现,

What Is Service Discovery in Microservices - API7.ai

简单来说,通过引入了服务发现组件,微服务架构中的组件,只需要关注其他组件的名称即可,而无需关注其他组件的部署位置,或者部署 IP 等信息。

通过服务发现组件可以动态的进行获取。

Kubernetes 中的服务发现

在 Kubernetes 环境中,Pod 是最小的调度单元。

而且在 Kubernetes 中,Pod 的 IP 不具备持久性,常常会发生变更。彼此协同的组件,一旦 IP 发生变更,很难再很好的配合工作。

所以将业务部署在 Kubernetes 环境中,如何能适配这种动态的环境就显的更加重要了。

Kubernetes 考虑到了这方面的诉求,它默认提供了基于 DNS 的服务发现机制。

Kubernetes 中有一个概念叫作 Service,它类似于反向代理的作用。客户端仅仅需要知道 Service 的存在,而无需关注它背后的 Pod 的变化,每个 Service 都会分配一个持久化的 ClusterIP 。

这样在业务组件的 Pod IP 发生变化的时候,其他组件仍然可以正常的通过 Service 的 ClusterIP 进行协同。

同时,Kubernetes 中的 Service 会自动的在集群内的 DNS 中添加一条 A 记录。

它的形式类似于:

my-svc.my-namespace.svc.cluster-domain.example

客户端可以进行相同 namespace 或者跨 namespace 的解析,这就大大的方便了需要协同工作的组件之间进行服务发现。

但是,对于传统的微服务架构,正如本文开头提到的那样,通常是利用服务注册和发现组件来实现服务间协同配合的。

想要完全适配 Kubernetes 环境中基于 DNS 的这种服务发现机制,需要一定的改造成本。

所以,如果想要较低的改造成本,那就需要继续保持原有的服务注册和发现机制。

在这个大前提下,迁移至 Kubernetes 中的服务,如何对外暴露给客户端使用呢?

APISIX Ingress 如何与注册中心联动

APISIX Ingress 是 Kubernetes 中的一种 Ingress Controller 实现,使用 APISIX 作为数据面代理组件,

支持通过 Ingress,自定义 CRD,Gateway API 等方式进行代理规则的配置。

同时也提供了与服务注册和发现组件的集成,可以方便的与服务发现组件进行联动。

将注册在其中的服务代理出来,提供给客户端使用。

这一节将具体进行介绍。

APISIX 对服务发现的支持

APISIX 是一个高性能,全动态的云原生 API 网关,提供了 80+ 开箱即用的插件,涵盖了绝大多数用户的使用场景,其中一个很优秀的能力就是与服务发现组件的集成。

APISIX 可以和以下服务发现组件进行集成使用:

  • Consul
  • DNS
  • Eureka
  • Nacos

仅需要在 APISIX 的配置文件中添加如下配置即可(以 DNS 为例):

discovery:
dns:
servers:
- "127.0.0.1:8600" # use the real address of your dns server

这样,在配置上游的时候,APISIX 便可通过服务发现组件动态的解析出实际的上游地址信息,并进行请求的代理。

APISIX Ingress 如何做

APISIX Ingress 使用 APISIX 作为数据面代理组件。

再进行与服务发现组件集成的时候,我们考虑了两种模式。

  • 控制面集成:在 Ingress Controller 中配置服务发现组件,并进行配置的解析,将最终结果发送至 APISIX 进行代理;
  • 数据面集成: 在 APISIX 数据面配置服务发现组件,代理时,由数据面进行配置解析和代理;

这两种方案各有优势,但考虑到配置的实时更新,还有方案的成熟度,我们最终选择了数据面集成的方案。

用户使用这种方案时,可以以更加低成本的方式进行接入,而且这种方案已经非常成熟了,经过了大量的生产验证。

在 APISIX Ingress 中如何使用这种方案呢?

首先确保在 APISIX 的配置中已经包含了正确的服务发现组件的配置,以下用 DNS 为例:

discovery:
dns:
servers:
- "10.96.0.10:53"

创建 ApisixUpstream 资源,它的 discovery 相关的配置根据实际情况进行修改,比如此处设置了 type: dns 和具体要代理的 serviceName:

# httpbin-upstream.yaml
apiVersion: apisix.apache.org/v2
kind: ApisixUpstream
metadata:
name: httpbin-upstream
spec:
discovery:
type: dns
serviceName: httpbin.default.svc.cluster.local

最后创建一个 ApisixRoute 资源,它的 upstreams 引用刚才创建的 ApisixUpstream 资源即可:

# httpbin-route.yaml
apiVersion: apisix.apache.org/v2
kind: ApisixRoute
metadata:
name: httpbin-route
spec:
http:
- name: rule1
match:
hosts:
- local.httpbin.org
paths:
- /*
upstreams:
- name: httpbin-upstream

将上述资源都正确创建后,通过 local.httpbin.org 访问,即可访问到 DNS 中已经注册了的 httpbin.default.svc.cluster.local 了。

收益和展望

通过这种集成,对于已经使用了服务注册发现组件的用户场景,可以非常方便的通过 APISIX Ingress 将其中的服务暴露给客户端使用。

大多数 Ingress Controller 都是没有提供这种集成方案的,这也可以增加 APISIX Ingress 的应用场景。

希望 APISIX Ingress 可以更好的满足用户实际业务场景的需求。

关于 API7.ai 与 APISIX

API7.ai 是一家提供 API 处理和分析的开源基础软件公司,于 2019 年开源了新一代云原生 API 网关 -- APISIX 并捐赠给 Apache 软件基金会。此后,API7.ai 一直积极投入支持 Apache APISIX 的开发、维护和社区运营。与千万贡献者、使用者、支持者一起做出世界级的开源项目,是 API7.ai 努力的目标。

借助 APISIX Ingress,实现与注册中心的无缝集成的更多相关文章

  1. Dubbo-Admin管理平台和Zookeeper注册中心的搭建(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubb ...

  2. Zookeeper注册中心和Dubbo-Admin管理平台的搭建

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  3. SpringCloudConfig与SpringCloudEureka 注册中心与配置中心高可用的意义

    所有的配置会缓存在本地,远程配置中心DOWN机,不影响本地使用,只是无法重新请求服务端获取配置的更新. 不管是注册中心的高可用,还是配置中心的高可用.本质上都是保证服务能注册上去或者能从配置中心获取配 ...

  4. Dubbo-Admin管理平台和Zookeeper注册中心的搭建(只支持jdk7)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubb ...

  5. Dubbo学习总结(3)——Dubbo-Admin管理平台和Zookeeper注册中心的搭建

    ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提供的功 ...

  6. kubernetes部署spring cloud注册中心 Eureka

    系统环境 java JDK 1.8 Docker 18.09.6 kubernetes 1.16 创建Eureka Server 1.Maven引入相应的jar 引入 SpringBoot 做基础框架 ...

  7. Spring Cloud服务注册中心交付至kubernetes

    前言 服务发现原则: 各个微服务在启动时,会将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息 服务消费者可以从服务发现组件中查询到服务提供者的网络地址,并使用该地址来远程调用服务 ...

  8. 使用 Nocalhost 开发 Kubernetes 中的 APISIX Ingress Controller

    本文作者:黄鑫鑫 - Nocalhost 项目核心开发者 腾讯云 CODING DevOps 研发工程师.硕士毕业于中山大学数据科学与计算机学院,曾负责过平安云主机及国家超算中心容器云平台等相关业务, ...

  9. 这个Dubbo注册中心扩展,有点意思!

    今天想和大家聊聊Dubbo源码中实现的一个注册中心扩展.它很特殊,也帮我解决了一个困扰已久的问题,刚刚在生产中用了,效果很好,迫不及待想分享给大家. Dubbo的扩展性非常灵活,可以无侵入源码加载自定 ...

  10. 自研分布式高性能RPC框架及服务注册中心实践笔记【原创】【开源】

    痛点 1. bsf底层依赖springcloud,影响bsf更新springboot新版本和整体最新技术版本升级. 2. eureka已经闭源,且框架设计较重,同时引入eureka会自行引入较多spr ...

随机推荐

  1. L02.从图灵机到通用计算机

    将程序载入到内存(存储器)中,用一个指针指向它, 再载入到cpu(控制器)中进行解释执行   *(取指执行,产生结果) 取指执行 = 控制器从存储器中取出数据后,分析指令,运算器执行逻辑运算. PC= ...

  2. IT工具知识-08:如何使用Openwrt下的SMB服务(第一次使用时)?

    0.背景知识 使用固件:Lean的R20.5.9由flippy打包 需要软件:ssh客户端(我用的xshell),浏览器(最好是chrome内核) 1.使用教程 1.1 注释掉SAMBA模板中的某条指 ...

  3. 初识MPC

    MPC调研报告 ​ 这是一篇关于MPC的调研报告,主要介绍了我对MPC领域的一些基础认识.全文按照这样的方式组织:第一节我介绍了什么是MPC以及MPC的起源:第二节介绍了MPC领域常用的一些符号和安全 ...

  4. JSON反序列化接口的问题

    今天在使用JSON序列化类时出现问题,原来类中有一个接口,在反序列化时不知道接口的实体是什么 public class Device : IComparer {         private str ...

  5. 2019.11.14 typeScript环境搭建

    当前环境为windows系统,在VSCode下搭建typeScript环境.在mac系统下同window系统一样,只是安装好ts环境后可能会报tsc命令不能使用的错误,这个时候需要找到tsc命令所在的 ...

  6. System.IO.IOException:“找不到资源“views.buttonstylepage.xaml”。”

    初学作为记录(事发场景): WPFDemo的程序集中,定义了一个Views文件夹,该文件夹放一些页面Page.UI层面的东西.用Frame空间做导航的时候,始终报一个错误   //   System. ...

  7. Https交互原理

    Http超文本传输协议 基于tcp和Ip实现的一种可靠的传输协议,可靠的保证了客户端和服务器之间的传输不会丢失,但是却没办法保证传输数据的安全性. Https是Http的升级版本,用于解决Http数据 ...

  8. 原生JS及jQuery中事件委托的写法

    在绑定节点事件处理程序时遇到的问题: 每个 函数都是对象,都会占用内存:内存中的对象越多,性能就越差. 其次,必须事先指定所有事件处理程 序而导致的 DOM访问次数,会延迟整个页面的交互就绪时间. 采 ...

  9. 单机Linux下搭建MongoDB副本集-三节点

    前言说明 Linux下安装MongoDB副本集我基本上是一次搭建,几百年不再碰,也记不住具体的命令,偶尔需要搭建都是直接网上找的教程. 有些教程很精简,有些又版本不一样,所以索性我整合下别人的教程,把 ...

  10. uniapp微信小程序解析详情页的四种方法

    一.用微信文档提供的RICH-TEXT 官方文档:微信文档rich-text 这种是直接使用: <!-->content是API获取的html代码</--> <rich- ...