服务注册和服务发现
本文不详细解释名词 “服务注册和服务发现” ,如果不了解,可以在先在网上搜索相关资料文档。
这里先从一个简单例子来开始介绍:
在微服务架构中,服务之间相互调用 是很常见的操作。
例如: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