1.什么是 Nacos?

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
是Spring Cloud A 中的服务注册发现组件,类似于Consul、Eureka,同时它又提供了分布式配置中心的功能,这点和Consul的config类似,支持热加载。

2.Nacos 的关键特性包括:

①.服务发现和服务健康监测
②.动态配置服务,带管理界面,支持丰富的配置维度。
③.动态 DNS 服务
④.服务及其元数据管理

3.Nacos下载

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
64 bit JDK 1.8+;
Maven 3.2.x+;

Nacos下载地址

这里我们 以版本 1.4.2 为例

4.运行Nacos

下载完Nacos的包解压完之后,我们进入conf目录
修改 application.properties 配置 文件信息
在最后面添加如下内容:

# mysql配置
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=你的数据库密码

创建 一个 数据库 nacos_config 将 此目录下的 nacos-mysql.sql 文件 导入到 MySQL数据库中

1.png

进入到 bin 目录
Linux/Unix/Mac
启动命令(standalone代表着单机模式运行,非集群模式):

sh startup.sh -m standalone

Windows
启动命令:

cmd startup.cmd

或者双击startup.cmd运行文件。

PS:Nacos 1.4.0以下使用的mysql驱动是8.0以下的,1.4.0以上使用的驱动就是8.0以上的了,所以大家在使用nacos的时候要注意与mysql的对应版本问题。
如果想让 1.4.0 以下的版本也支持 MySQL 8.0 的话 提供 一个非常简单的办法
在 nacos 与 bin 文件夹同级 新建 一个plugins文件夹 然后 在建一个 mysql 文件夹, 将MySQL8.0的驱动jar包放里面就行了。如下图:
1.png
2.png

3.png

当然也可以 将 Nacos的源码下载下来 替换原来的 mysql maven依赖 然后重新编译

启动成功后浏览器输入 http://localhost:8848/nacos Nacos默认端口为8848(珠穆朗玛峰高度)
默认账号密码为 nacos nacos
1.png

5.编码

我们需要做两个服务注册到Nacos中去,然后用其中的一个服务去调另一个服务。

新建一个多模块的SpringBoot工程如下图:
1.png

服务提供者nacos-discovery-provider
服务消费者nacos-discovery-consumer

这里用到的版本信息为
spring-boot 2.4.3
spring-cloud 2020.0.1
spring-cloud-alibaba 2.2.5.RELEASE
nacos 1.4.2

主pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tuanzix</groupId>
    <artifactId>demo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>pom</packaging>
    <name>demo</name>

    <properties>
		<spring-boot.version>2.4.3</spring-boot.version>
		<spring-cloud.version>2020.0.1</spring-cloud.version>
		<spring-cloud-alibaba.version>2.2.5.RELEASE</spring-cloud-alibaba.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <!--项目子模块-->
    <modules>
		<module>nacos-discovery-provider</module>
		<module>nacos-discovery-consumer</module>
    </modules>

    <dependencies>

		<!--bootstrap 启动器-->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-bootstrap</artifactId>
		</dependency>


		<!--配置文件处理器-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <optional>true</optional>
        </dependency>


        <!--Lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <scope>provided</scope>
        </dependency>

        <!--测试依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!--spring cloud alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!--web 模块-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>${spring-boot.version}</version>
                <exclusions>
                    <!--排除tomcat依赖-->
                    <exclusion>
                        <artifactId>spring-boot-starter-tomcat</artifactId>
                        <groupId>org.springframework.boot</groupId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <finalName>${project.name}</finalName>
        <resources>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>${spring-boot.version}</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.0</version>
                <configuration>
                    <target>${maven.compiler.target}</target>
                    <source>${maven.compiler.source}</source>
                    <encoding>UTF-8</encoding>
                    <skip>true</skip>
                </configuration>
            </plugin>
            <plugin>
                <groupId>pl.project13.maven</groupId>
                <artifactId>git-commit-id-plugin</artifactId>
                <version>2.2.5</version>
            </plugin>
        </plugins>
    </build>

	<repositories>
		<repository>
			<id>aliyun</id>
			<name>aliyun</name>
			<url>http://maven.aliyun.com/nexus/content/groups/public</url>
		</repository>
	</repositories>

	<pluginRepositories>
		<pluginRepository>
			<id>public</id>
			<name>aliyun nexus</name>
			<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
			<releases>
				<enabled>true</enabled>
			</releases>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</pluginRepository>
	</pluginRepositories>
</project>

服务提供者nacos-discovery-provider的pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.tuanzix</groupId>
		<artifactId>demo</artifactId>
		<version>1.0.0-SNAPSHOT</version>
	</parent>

	<artifactId>nacos-discovery-provider</artifactId>

	<dependencies>
		<!--必备: undertow容器-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-undertow</artifactId>
		</dependency>
		<!--必备: spring boot web-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!--必备: 注册中心客户端-->

		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-loadbalancer</artifactId>
		</dependency>

		<!--必备: 配置中心客户端-->
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
		</dependency>

		<!--测试: spring boot test-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
		</dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>


服务消费者nacos-discovery-consumer的pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>com.tuanzix</groupId>
		<artifactId>demo</artifactId>
		<version>1.0.0-SNAPSHOT</version>
	</parent>

	<artifactId>nacos-discovery-consumer</artifactId>

	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<!--必备: undertow容器-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-undertow</artifactId>
		</dependency>
		<!--必备: spring boot web-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!--必备: 注册中心客户端-->

		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-loadbalancer</artifactId>
		</dependency>

		<!--必备: 配置中心客户端-->
		<dependency>
			<groupId>com.alibaba.cloud</groupId>
			<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
		</dependency>

		<!--测试: spring boot test-->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

分别在nacos-discovery-provider项目和nacos-discovery-consumer项目的resources下
新建 bootstrap.yml文件
内容如下图:
nacos-discovery-provider

server:
  port: 6060
spring:
  profiles:
    active: dev
  application:
    name: @artifactId@
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        file-extension: yml
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

nacos-discovery-consumer

server:
  port: 6061

spring:
  profiles:
    active: dev
  application:
    name: @artifactId@
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
      config:
        server-addr: ${spring.cloud.nacos.discovery.server-addr}
        file-extension: yml
        shared-configs:
          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

其中 @artifactId@ 取的是 pom.xml中的标签里面的内容

在nacos-discovery-provider项目下新建一个DemoController.class

package com.tuanzi.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 描述:
 *
 * @author 团子
 * @date 2021/6/25 2:50 下午
 */
@RestController
public class DemoController {




	@GetMapping("/demo")
	public String sayHello(String name){

		return "Hello" + name;
	}

}

在nacos-discovery-consumer项目下新建一个TestController.class

package com.tuanzi.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.net.URI;

/**
 * 描述:
 *
 * @author 团子
 * @date 2021/6/25 2:42 下午
 */
@RestController
public class TestController {


	@Autowired
	private RestTemplate restTemplate;

	@Autowired
	private LoadBalancerClient loadBalancerClient;


	@GetMapping("/test")
	public String test(String name) {

		ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-discovery-provider");

		URI uri = serviceInstance.getUri();

		return restTemplate.getForObject(uri + "/demo?name=" + name, String.class);

	}
}

上面的代码中注入 RestTemplate 会报错 是因为没有这个Ben
我们在 NacosDiscoveryConsumerApplication启动类中 创建一个

	@Bean
	public RestTemplate restTemplate(){
		return new RestTemplate();
	}

最后记得一定要在两个项目的启动类中添加 @EnableDiscoveryClient注解

启动2个项目,我们可以看到已经注册到Nacos中去了,如下图:
2.png

我们浏览器访问一下 http://localhost:6061/test?name=团子
3.png

也达到了我们的结果

源码地址

Q.E.D.