Nacos简介
什么是Nacos
Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流且管理。
Nacos帮助您更敏捷和容易地构建、交付和管理微服务平台。Nacos是构建以“服务’‘为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。
Nacos全景图
一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。很明显,是阿里巴巴旗下来源为了解决动态服务发现、配置管理和服务管理的组件。

理解nacos 服务治理(注册中心)

注册中心
nacos 服务治理 也称注册中心、也叫服务发现
官方的解释是
服务发现及管理
动态服务发现对以服务为中心的(例如微服务和云原生)应用架构方式非常关键。Nacos支持DNS-Based和RPC-Based(Dubbo、gRPC)模式的服务发现。Nacos也提供实时健康检查,以防止将请求发往不健康的主机或服务实例。借助Nacos,您可以更容易地为您的服务实现断路器。
发现和管理微服务,nacos也具有配置中心的功能,但本文主要强调注册中心的功能
Nacos = 服务注册中心 + 服务配置中心 = Eureka + Spring Cloud Config + Spring Cloud Bus + Kafka/RabbitMQ
如官方图所示

服务提供者------服务注册----》注册中心
服务消费者------服务发现-----》注册中心
服务消费者-------服务调用-----》服务提供者
服务注册:每个服务单元向注册中心登记自己提供服务非常小信息
服务发现:服务调用方向服务注册中心,并获取所有服务实例清单,实现对具体服务实例的访问
常用注册中心 Zookeeper(doubble推荐)
Eureka(自带的建立可以直接采用idea–》—》spring initializr—》 Cloud Discovery - Eureka Server)
Consul
Nacos
Nacos = eureka+config
既可以做注册发现,还加上配置
依赖文件中同时配置注册中心、配置中心
<!--注册中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--配置中心客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
服务发现的搭建(SpringBoot框架搭建nacos)
1、添加依赖
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>nacos-discovery-spring-boot-starter</artifactId>
<version>${latest.version}</version>
</dependency>
2、在 application.properties 中配置 Nacos server 的地址:
nacos.discovery.server-addr=127.0.0.1:8848
3、SpringBoot启动类
@SpringBootApplication
public class NacosDiscoveryApplication {
public static void main(String[] args) {
SpringApplication.run(NacosDiscoveryApplication.class, args);
}
}
4、使用 @NacosInjected 注入 Nacos 的 NamingService 实例(核心)
Nacos对于服务注册和发现的支持是通过NamingService接口来实现的,对应的实现类是NacosNamingService。
nacos作为注册中心客户端的接口就是namingService,即名字服务。
需要写的代码,这一步骤,只需要这些
@Controller
@RequestMapping("discovery")
public class DiscoveryController {
@NacosInjected
private NamingService namingService;
@RequestMapping(value = "/get", method = GET)
@ResponseBody
public List<Instance> get(@RequestParam String serviceName) throws NacosException {
return namingService.getAllInstances(serviceName);
}
}
==============下面的为分析
使用 @NacosInjected 注入 Nacos 的 NamingService 实例:
@NacosInjected
private NamingService namingService;
服务消费方通过
namingService.getAllInstances(serviceName)
来实现服务发现,主动拉取服务。
public List<Instance> getAllInstances(String serviceName, String groupName, List<String> clusters, boolean subscribe) throws NacosException {
ServiceInfo serviceInfo;
if (subscribe) { // 是否订阅了服务
// 从缓存或注册中心获取服务信息
serviceInfo = hostReactor.getServiceInfo(NamingUtils.getGroupedName(serviceName, groupName), StringUtils.join(clusters, ","));
} else {
// 直接从注册中心获取服务
// getServiceInfoDirectlyFromServer方法很简单,直接调用serverProxy.queryList(下面会讲)获取服务,
serviceInfo = hostReactor.getServiceInfoDirectlyFromServer(NamingUtils.getGroupedName(serviceName, groupName), StringUtils.join(clusters, ","));
}
List<Instance> list;
if (serviceInfo == null || CollectionUtils.isEmpty(list = serviceInfo.getHosts())) {
return new ArrayList<Instance>();
}
return list;
}
=================分析结束
5、测试
再次访问 curl http://localhost:8080/discovery/get?serviceName=example,此时看到以上内容,那么nacos服务发现就测试成功了。
[
{
"instanceId": "127.0.0.1-8080-DEFAULT-example",
"ip": "127.0.0.1",
"port": 8080,
"weight": 1.0,
"healthy": true,
"cluster": {
"serviceName": null,
"name": "",
"healthChecker": {
"type": "TCP"
},
"defaultPort": 80,
"defaultCheckPort": 80,
"useIPPort4Check": true,
"metadata": {}
},
"service": null,
"metadata": {}
}
]
服务发现的搭建(SpringCloud框架搭建nacos)
1、添加依赖
discovery就是nacos发现的意思。
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${latest.version}</version>
</dependency>
2、在 application.properties 中配置 Nacos server 的地址:(服务提供者)
server.port=8070
spring.application.name=service-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
server.port是服务端口,spring.application.name则是dataId拼接组成的一部分
3、使用@EnableDiscoveryClient 开启服务注册发现功能(服务提供者)
NacosProviderApplication 功能是启动该服务提供者,并且带了Hello Nacos Discovery测试实例,来测试它是服务提供者,并且启动成功了,正常使用
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
@RestController
class DemoController {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
}
4、在 application.properties 中配置 Nacos server 的地址:(服务消费者)
server.port=8080
spring.application.name=service-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
5、使用@EnableDiscoveryClient 开启服务注册发现功能(服务消费者)
给 RestTemplate 实例添加 @LoadBalanced 注解,开启 @LoadBalanced 与 Ribbon 的集成。( Ribbon 本地负载均衡,在调用微服务接口的时候,会在注册中心上获取注册信息服务列表后缓存到JVM 本地,从而在本地实现RPC远程 服务调用技术。)(Ribbon是Netflix开发的客户端负载均衡器,为Ribbon配置服务提供者地址列表后,Ribbon就可以基于某种负载均衡策略算法,自动地帮助服务消费者去请求提供者。Ribbon默认为我们提供了很多负载均衡算法,例如轮询、随机等,我们也可以实现自定义负载均衡算法)
服务消费者执行http://localhost:8080/echo/2050**,因为8080端口是消费者服务的端口,请求到RestTemplate的getForObject方法,自动拼接参数**http://service-provider/echo/2050**,然后请求到服务提供者去了,输出Hello Nacos Discovery 加上2050传过来的,那么就是Hello Nacos Discovery 2050**
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
@RestController
public class TestController {
private final RestTemplate restTemplate;
@Autowired
public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
public String echo(@PathVariable String str) {
return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
}
}
}
6、测试
启动 ProviderApplication 和 ConsumerApplication ,调用 http://localhost:8080/echo/2050,返回内容为 Hello Nacos Discovery 2050。
下载与配置持久化到Mysql
实现
Nacos官方文档:
Nacos下载地址:
选择指定的稳定版本进行下载,这里是Windows,所以选择zip包进行下载

下载完成在解压到磁盘某目录
Nacos持久化
防止 Nacos 宕机或重启后数据丢失,Nacos 支持将数据统一持久化到数据库 Mysql(在不配置Nacos持久化到Mysql时,
默认 Nacos 内置了一个嵌入式数据库derby,将一些数据保存到了内置的数据库上,多台 Nacos 就会出现多个内置数据库)。
连接要进行Nacos持久化的Mysql数据库,新建数据库nacos_config
为什么叫nacos_config这个数据库名,因为上面解压之后的Nacos中的conf目录下的nacos-mysql.sql文件中

其默认的数据库名就是nacos_config

新建完数据库之后在此数据库中执行上面的nacos-mysql.sql文件,实现数据库的初始化。
然后再回到Nacos解压目录下的conf目录下的application.properties

将上面这段打开持久化Mysql的代码去掉注释,并将连接到的数据库的url和用户名密码改为自己的。
启动Nacos
然后再回到上面解压目录后的bin目录下

这里的startup.cmd和shtudown.cmd就是在Windows下的启动好关闭命令,但是如果直接双击的话会报错。
这是因为这里Nacos没有配置集群模式,而是使用的单机模式,所以编辑startup.cmd,
将MODE修改为standalone

默认MODE的值是"cluster"
所以在走下面的逻辑时会走集群模式的逻辑
编辑之后,双击startup.cmd

然后打开浏览器访问

默认用户名密码都是nacos
登录成功后

本文使用 文章同步助手 同步