上节在K8S集群中部署了Nacos集群,并将Nacos的Web控制台和API以Ingress (nacos.youcomany.com)的形式暴露到了k8s集群外部,便于从外部测试和访问。 这里再次强调Nacos被设计为一个在IDC内部使用的应用组件,而非面向公网环境的产品,因此需要在内部隔离网络中使用,这里为了测试将其暴露到K8S集群外部,如果是生产环境必须做好网络安全策略。

接下来我们将学习如何将服务注册到Nacos,在开始后边的实战之前,先看一下服务治理中关于服务注册和服务发现的一些概念。

1.服务注册和服务发现

服务治理首先要解决的问题就是服务注册于服务发现,解决了这两个问题才可能实现微服务之间的调用问题。

1.1 服务注册

服务注册: 服务注册是指服务在其网络上声明自己上线的过程,一般是在某种服务或数据库中写入数据,这个服务或数据库一般被称作服务注册中心

服务注册中心: 每个服务实例会向注册中心注册自己的信息,一般包含地址、端口、协议、版本等信息。每种服务会有多个实例副本注册到注册中心,注册中心维护每种服务的多个实例列表。同时,注册中心会以某种机制去检查各个服务实例是否可用,如果某个实例已经失效会将其剔除。在某个服务实例关闭时会自动向注册中心注销自己。

常见的服务注册有三种实现方式:

  1. 服务进程内直接包含服务注册模块。即把服务注册的功能写到了服务的源代码中,由服务实例自己完成上线注册和下线注销。这种方式对客户端要求比较高,尤其是众多服务采用不同的语言开发的时候
  2. 由一个伙伴进程(SideCar)来帮助处理服务注册
  3. 由一个中间的调度者来帮助处理服务注册

1.2 服务发现

服务发现: 即服务客户端在其网络上找到其要调用服务的具体连接信息的过程。例如通过查询服务注册中心得到其所调用服务的具体 IP地址和端口。 简单的说,服务发现就是服务或者应用之间互相定位的过程。

使用服务发现后,客户端对服务的调用不再和具体的服务实例地址耦合,而是基于服务发现机制。有以下4种常见的服务发现机制:

  1. 静态配置: 这种实现基本上不用考虑,为了实现服务的高可用需要手动维护服务实例副本的列表,显然不适合微服务架构下众多的服务以及服务治理的自动化需求。
  2. 服务端负载均衡器: 由服务端的负载均衡器通过服务注册中心中的服务实例信息,动态生成或更新负载均衡和代理配置,一般服务注册中心会在服务上线注册、下线注销、失效剔除时推送信息给服务端负载均衡器。这种方式实际上是在服务端实现的服务发现。
  3. 客户端负载均衡器: 由客户端的负载均衡器通过服务注册中心中服务实例信息, 动态生成或更新负载均衡和代理配置。这种方式是在客户端即服务调用方端实现的服务发现。
  4. 客户端集成服务发现: 一般以SDK的形式集成到客户端进程内

2.K8S中的服务注册和发现

K8S中的一个Service资源对象对应微服务。每个Service有唯一的名字,一个ClusterIP,一个端口。 K8S中的Pod资源对象中运行的容器对应服务实例,通过Pod上的标签Label和Service上定义的标签选择器Label Selector将Service与Pod关联,通过Service内建的负载均衡机制,对Service的调用将转发到Pod的容器中。 K8S中的服务注册是在Pod创建时由调度者Kubernetes完成的。K8S中的服务发现采用的是服务端负载均衡器,服务注册中心为Kubernetes(后端持久化存储etcd)

3.Spring Cloud中的服务注册和发现

Spring Cloud对微服务提供了完整的解决方案和统一抽象,按照微服务的功能特性: 服务治理、负载均衡、服务间调用通信、服务配置中心、服务网关、分布式链路追踪、消息总线、消息时间驱动、分布式事务等,提供了一系列组件,被称为Spring Cloud全家桶。 全家桶中的功能组件还支持使用第三方实现的某个组件单独替换,只要第三方组件是遵循Spring Cloud Common的抽象实现的。

Spring Cloud在服务治理的组件上有以下三种选择:

  • Consul - Spring Cloud官方的spring-cloud-consul项目支持使用Consul作为服务治理组件的功能
  • Nacos - 需要借助Spring Cloud Alibaba组件库
  • Eureka - 需要使用Spring Cloud Netflix组件库

当然由于"某些原因",在最新版本的Spring Cloud中Netflix组件库已经逐渐被移除。

我们在这里对Spring Cloud服务注册和服务发现的学习将使用Spring Cloud Alibaba组件的Nacos。

Nacos是Spring Cloud Alibaba提供的服务发现和配置管理的解决方案。Nacos是用Java开发的,通过Spring Cloud Alibaba可以很好的与Spring Cloud整合。 如果项目的所有微服务都是用Java开发的,那么使用Nacos作为服务发现可能会使一个不错的选择。

Nacos的服务注册采用的是由"服务进程内直接包含服务注册模块,由服务实例自己完成上线注册和下线注销。",这与K8S服务注册方案中"由一个中间调度者K8S来帮助处理服务注册"是不同的。