开发者学堂课程【Spring Cloud Alibaba Nacos 详解(下):什么是服务发现】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/725/detail/12932
什么是服务发现
内容介绍
一、什么是服务发现
二、主流服务发现与配置中心对比
三、Nacos 简介
四、Nacos 特性
“服务发现”里的“服务”指的是微服务,我们先要了解从单体架构到微服务架构的一个转变,以及微服务架构是一个具体什么样的过程。针对单体架构到微服务架构的一个演变过程以及微服务架构的讲解,可以参考 Nacos 配置管理当中具体这一章节的内容。
一、什么是服务发现
在微服务架构中,整个系统会按职责能力划分为多个服务,通过服务之间协作来实现业务目标。
这样在代码中免不了要进行服务间的远程调用,服务的消费方要调用服务的生产方,为了完成这一请求,消费方需要知道服务生产方的网络位置( IP 地址和端口号)。
我们的代码可以通过读取配置文件的方式读取服务生产方网络位置,如下:
我们通过 Spring boot 技术很容易实现:
Service B(服务生产者)
Service B
是服务的生产者,暴露/service 服务地址,实现代码如下:
@SpringBootApplication
@RestController
public class SpringRestProviderBootstrap {
public static void main(String[] args) {
SpringApplication.run(SpringRestProviderBootstrap.class
,args);
}
@GetMapping(value = "/service")//
暴露服务
public string service(){
return "provider invoke";
}
}
配置文件:
server.port = 56010
Service A(服务消费者)
实现代码:
@SpringBootApplication
@RestController
public class SpringRestConsumerBootstrap{
public static void main(String[] args){
SpringApplication.run(SpringRestConsumerBootstrap.class,args);
}
@Value("${provider.address}")
private String providerAddress;
@GetMapping(value = "/service")
public String service(){
RestTemplate restTemplate = new RestTemplate();
//
调用服务
String providerResult = restTemplate.getForObject("http://" + providerAddress + "/service",String.class);
return "consumer invoke |" + providerResult;
}
}
配置文件:
server.port = 56020
#
服务生产方地址
provider.address = 127.0.0.1:56010
访问 http://127.0.0.1:56020/ service,输出以下内容:
Consumer invoke | provider invoke
仔细考虑一下,此方案对于微服务应用而言行不通。
首先,微服务可能是部署在云环境的,服务实例的网络位置或许是动态分配的。
另外,每一个服务一般会有多个实例来做负载均衡,由于宕机或升级,服务实例网络地址会经常动态改变。
再者,每一个服务也可能应对临时访问压力增加新的服务节点。
正如下图所示:
基于以上的问题,服务之间如何相互感知?服务如何管理?这就是服务发现的问题了。
如下图:
上图中服务实例本身并不记录服务生产方的网络地址,所有服务实例内部都会包含服务发现客户端。
1、在每个服务启动时会向服务发现中心上报自己的网络位置。这样,在服务发现中心内部会形成一个服务注册表,服务注册表是服务发现的核心部分,是包含所有服务实例的网络地址的数据库。
2、服务发现客户端会定期从服务发现中心同步服务注册表,并缓存在客户端。
3、当需要对某服务进行请求时,服务实例通过该注册表,定位目标服务网络地址。若目标服务存在多个网络地址,则使用负载均衡算法从多个服务实例中选择出一个,然后发出请求。
总结一下,在微服务环境中,由于服务运行实例的网络地址是不断动态变化的,服务实例数量的动态变化,因此无法使用固定的配置文件来记录服务提供方的网络地址,必须使用动态的服务发现机制用于实现微服务间的相互感知。
各服务实例会上报自己的网络地址,这样服务中心就形成了一个完整的服务注册表,各服务实例会通过服务发现中心来获取访问目标服务的网络地址,从而实现服务发现的机制。
二、主流服务发现与配置中心对比
目前市面上用的比较多的服务发现中心有: Nacos、Eureka、Consul、Zookeeper。
Nacos 作为服务发现中心,具备更多的功能支持项,且从长远来看 ,Nacos 在以后的版本会支持 。
Spring Cloud+Kubernetes 的组合,填补二者的鸿沟,在两套体系下可以采用同一套服务发现和配置管理的解决方案,,这将大大的简化使用和维护的成本。
另外,Nacos 计划实现Service Mesh,也是未来微服务发展的趋势。
三、Nacos 简介
Nacos 是阿里的一个开源产品,它是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。
官方介绍是这样的:
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和理微服务平台。Nacos 是构建以“服务”为中心的现代应用架构的服务基础设施。
四、Nacos 特性
Nacos 主要提供以下四大功能:
1、服务发现与服务健康检查
Nacos 使服务更容易注册,并通过 DNS 或 HTTP 接口发现其他服务,Nacos 还提供服务的实时健康检查以防止向不健康的主机或服务实例发送请求。
2、动态配置管理
动态配置服务允许您在所有环境中以集中和动态的方式管理所有服务的配置。Nacos 消除了在更新配置时重新部署应用程序,这使配置的更改更加高效和灵活。
3、动态 DNS 服务
Nacos 提供基于 DNS 协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在 Nacos 上的服务以域名的方式暴露端点,让三方应用方便的查阅及发现。
4、服务和元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。
这里1、3、4说明了服务发现的功能特性