服务注册和服务发现

本文不详细解释名词 “服务注册和服务发现” ,如果不了解,可以在先在网上搜索相关资料文档。

这里先从一个简单例子来开始介绍:
在微服务架构中,服务之间相互调用 是很常见的操作。
例如:ServceA 需要调用 ServiceB
那么就需要解决一个问题:ServiceA 怎么知道 ServiceB 的访问地址?




K8S集群环境

如果应用程序部署在K8S集群中,那么可以直接使用 K8S 内置的 “服务注册和服务发现” 能力。

简单来说,K8S体系中,

  • 它内置实现了一个DNS服务
  • 服务创建时,会指定一个 服务名称,例如: serviceb
  • “部署”(POD)启动时会自动将自己分配到的IP和端口注册到DNS服务中,假设:172.20.1.161:80
  • 服务会根据“标签”和“部署”关联在一起
  • 应用程序通过 服务名称 就可以访问到 具体的服务,例如:http://serviceb 可到达:http://172.20.1.161:80

说明:这和 JAVA Spring Cloud 的实现差异较大,不要被那种方式【洗脑】了。

到这里,还有一个小问题需要解决:

  • 服务名称,它是在部署时指定的,通常是由运维人员指定
  • 在开发代码阶段,开发人员不知道 最终的 服务名称 是什么,所以不能在代码中硬编码 http://ServiceB/aa/bb.aspx 这样的调用地址。

因此,在使用Nebula开发框架时,需要在配置服务中添加一个全局配置参数:

ServiceB_url = http://xxxxxxxxxxxxxxxxxxxx

然后这样编写代码:

string url = Setting.GetSetting("ServiceB_url") + "/aa/bb.aspx";

实际部署时,即使运维人员将 ServiceB 取名为 serviceXX 也无妨,他只要在配置服务中添加一个全局配置参数就可以了:

ServiceB_url = http://serviceb

简单理解就是:使用参数名称来找到服务的调用地址。




开发环境

开发环境可以很简单,就是一台开发机器(本地电脑),没有K8S,也不需要docker。

此时各个服务直接运行在操作系统中,它们会监听各自的端口号,所以它们有一个 IP+PORT 的访问方式。

在这个环境中,直接将这些服务的访问方式指定在配置中即可,例如(假设本机地址是 192.168.1.100):

ServiceA_url = http://192.168.1.100:3008
ServiceB_url = http://192.168.1.100:4008

回头再看下前面的代码

string url = Setting.GetSetting("ServiceB_url") + "/aa/bb.aspx";

此时就得到一个在开发环境中可以使用的具体调用地址:

http://192.168.1.100:4008/aa/bb.aspx