上篇博文我们介绍了Nacos的基本概念以及进行了安装,相信大家已经对Nacos有了基本认识,其实说白了Nacos就是分布式注册中心和分布式配置中心的集合体。这篇博文我们介绍Nacos的第一个特性,服务的注册与发现,也就是分布式注册中心的核心功能。
什么是服务注册与发现
服务注册与发现是来自于微服务架构的产物。在传统的架构系统中,服务的数量较少,一般使用静态配置的方式实现服务信息的配置。而伴随着微服务架构的发展,服务实例的数量和网络地址都是动态变化的,此时对系统运维提出了巨大的挑战。面对成百上千的服务实例,为保障系统能够正常的运行,必须需要有一个中心化的组件来完成对各个服务的整合、管理等。服务提供者能够通过注册中心注册服务,服务消费者通过注册中心调用服务,完成整个请求调用。
在微服务架构中服务注册与发现组件是必不可少的,常用的服务协调器有:Eureka、Zookeeper、Etcd,Consule等。相信大家对其中一些组件有一定的认识,甚至使用经验。
服务注册与发现的原理
服务注册与发现是是针对于三大角色的:①:服务提供者 ②:服务消费者 ③:注册中心
针对他们之间的关系描述就是服务的注册与发现的运行原理:
1、各微服务在服务启动的时候,服务提供者将服务的网络地址(IP地址和端口),服务名称,服务自身状态以及访问协议等信息注册到注册中心,注册中心存储该数据
2、服务消费者从注册中心查询到服务提供者的实例信息,并通过该地址调用服务提供者的接口
3、各个微服务与注册中心通过一定的机制通信(例如心跳检测机制),如果注册中心与某微服务长时间无法通信,就会注销该实例,即该服务对应的实例会被注册中心剔除
4、微服务网络地址发生变化(例如增加实例或IP变动等),会重新注册到注册中心,这样,服务消费者就无需人工修改提供者的网络地址了
如下图所示:
了解了服务注册与发现的原理,我们看一下nacos是如何实现的服务注册与发现。
服务注册
创建项目
我们先了解一下 Spring Cloud 应用如何接入 Nacos Discovery。
-
首先,修改 pom.xml 文件,引入 Nacos Discovery Starter。
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
在nacos-discovery-provider8081 项目的 /src/main/resources/application.properties 配置文件中配置 Nacos Server 地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
-
使用 @EnableDiscoveryClient 注解开启服务注册与发现功能
@SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
-
完成以上配置后,编写Controller
@RestController
public class HelloWorldController {
@GetMapping("/hello")
public String hello() {
return "hello Nacos Discovery";
}
}
5.启动应用,支持 IDE 直接启动和编译打包后启动。
- IDE直接启动:找到 nacos-discovery-provider8081项目的主类
ProviderApplication
,执行 main 方法启动应用。 - 打包编译后启动:在 nacos-discovery-provider8081 项目中执行
mvn clean package
将工程编译打包,然后执行java -jar nacos-discovery-provider8081.jar
启动应用。
验证
验证之前,我们需要启动nacos服务,以及服务提供者,例如:
此时我们可以看到,nacos-discovery-provider已经成功注册到nacos了。
Nacos管理页面查看我们的服务
Nacos接口查询服务
我也可以通过Nacos提供的接口的查询服务。在浏览器中输入此地址 http://127.0.0.1:8848/nacos/v1/ns/catalog/instances?serviceName=nacos-discovery-provider&clusterName=DEFAULT&pageSize=10&pageNo=1&namespaceId=
,并点击跳转,可以看到服务节点已经成功注册到 Nacos Server。
通过管理页面以及接口返回的信息,我们可以看到服务注册中心保存了服务提供者的哪些相关信息。
服务发现
创建项目
-
首先,修改 pom.xml 文件,引入 Nacos Discovery Starter。
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency>
-
在nacos-discovery-consumer8082 项目的 /src/main/resources/application.properties 配置文件中添加基本配置信息
server.port=8082 spring.application.name=nacos-discovery-consumer spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
-
使用 @EnableDiscoveryClient 注解开启服务注册与发现功能
@SpringBootApplication @EnableDiscoveryClient public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
-
完成以上配置后,编写TestController。
@RestController
public class TestController {
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping("/test")
public String test() {
// 通过spring cloud common中的负载均衡接口选取服务提供节点实现接口调用
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-discovery-provider");
String url = serviceInstance.getUri() + "/hello/" + "xiaoliang";
RestTemplate restTemplate = new RestTemplate();
return restTemplate.getForObject(url, String.class);
}
}
-
启动应用,支持 IDE 直接启动和编译打包后启动。
-
IDE直接启动:找到 nacos-discovery-consumer8082 项目的主类
ConsumerApplication
,执行 main 方法启动应用。 -
打包编译后启动:在 nacos-discovery-consumer8082 项目中执行
mvn clean package
将工程编译打包,然后执行java -jar nacos-discovery-consumer8082.jar
启动应用。
-
验证
-
同上,在Nacos管理页面同样可以看到我们服务消费者,不再贴图
-
在浏览器地址栏中输入 http://127.0.0.1:8082/test,点击跳转,可以看到浏览器显示了 nacos-discovery-provider8081 返回的消息 “Hello xiaoliang , Welcome to Nacos Discovery!!!”,证明服务已经生效。
总结
1、nacos实现服务的注册与发现非常的简单,只需要引入jar包,并配置nacos服务地址即可。
2、服务消费者调用服务提供者时,我们是通过LoadBalancerClient
接口来获取的服务实例。下篇博文,我们解锁多种服务调用的姿势,并对服务的负载均衡进行深入的介绍。
代码示例
本文示例读者可以通过查看下面仓库的中的nacos-discovery-provider8081
和nacos-discovery-consumer8082
项目:
如果您对这些感兴趣,欢迎star、follow、收藏、转发给予支持!