Spring Cloud Alibaba 系列之 Nacos 篇(服务注册与发现)

Spring Cloud Alibaba 系列之 Nacos 篇(服务注册与发现)

绿林寻猫
2023-07-26 / 0 评论 / 225 阅读 / 正在检测是否收录...

一、前言

Nacos 是阿里巴巴于2018年7月推出来的一个开源项目,是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos 提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos 的功能包含 Spring Cloud 组件中的 Spring Cloud EurekaSpring Cloud Config ,本篇章先介绍 Nacos 的服务注册与发现功能。

二、环境搭建

Nacos 作为服务注册发现中心,其运行原理与 Spring Cloud Eureka 大致相同,都由注册中心,服务提供者,服务消费者 3 部分组成和运作。如下图:
lkj33n14.png

与 Spring Cloud Eureka 不同的是, Nacos 服务无需开发者引入 Jar 依赖搭建,只需下载 官网 提供的安装包,解压启动即可。

强调一下,安装 Nacos服务需要满足一下条件:

64 bit OS
64 bit JDK 1.8+
Maven 3.2.x+
Nacos官方提供 2 种安装方式:① GitHub 上下载源码,编译安装启动,② 直接下载编译好的安装包。

笔者选择第二种,点击 表情 Nacos releases 选择 1.4.6 版本的 .zip 文件下载。

本地解压,如下图:
lkj3h26g.png

💻 执行如下命令:

cd nacos/bin

# windows 单机模式启动
startup.cmd -m standalone

# linux/mac 
./startup.sh -m standalone

启动成功后,打开浏览器输入 表情 http://localhost:8848/nacos 可以访问Nacos后台管理界面,默认账户 nacos/nacos,如下图:
lkj3hfvy.png
至此 Nacos 服务注册中心环境搭建成功。

三、实战演练

注册中心服务搭建完成,现在开始搭建服务提供者和服务消费者。我们搭建如下 3 个项目:

项目端口说明
springCloudAlibabaDemo-pom 类型的父项目
nacos-discovery-provider18001子项目,服务提供者
nacos-discovery-consumer28001子项目,服务消费者

3.1 搭建父工程

创建名为 springCloudAlibabaDemo 的 Maven 项目,修改 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>

    <groupId>com.demo</groupId>
    <artifactId>nacos</artifactId>
    <version>1.0.0</version>

    <name>maven</name>
    <url>https://www.maven.vip</url>
    <description>demo</description>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <modules>
        <module>nacos-discovery-provider</module>
        <module>nacos-discovery-consumer</module>
    </modules>
    <packaging>pom</packaging>

    <dependencyManagement>
        <dependencies>
            <!-- spring boot 依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.2.5.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- spring cloud 依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR3</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>

            <!-- spring cloud alibaba 依赖-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <source>${java.version}</source>
                    <target>${java.version}</target>
                    <encoding>${project.build.sourceEncoding}</encoding>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>public</id>
            <name>aliyun nexus</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </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>

3.2 搭建服务提供者

创建名为 nacos-discovery-provider 的 Maven 子项目。
📜 修改 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">
    <parent>
        <groupId>com.demo</groupId>
        <artifactId>nacos</artifactId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
    <artifactId>nacos-discovery-provider</artifactId>

    <description>
        服务提供者
    </description>
    <properties>
        <java.version>1.8</java.version>
        <!--编译项目不生成测试类也不进行测试-->
        <maven.test.skip>true</maven.test.skip>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- nacos 服务注册与发现依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

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

</project>

📜 创建 application.yml

server:
  port: 18001
spring:
  application:
    # 应用名
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        # 注册中心地址
        server-addr: 127.0.0.1:8848
      # 连接注册中心的账号和密码 以下是默认账密
      username: nacos
      password: nacos

📜 编写提供接口:

@RestController
@RequestMapping("api")
public class IndexController {

    @RequestMapping("hello/{content}")
    public String hello(@PathVariable("content") String content){
        return "hello,"+content;
    }
}

📜 修改启动类:

@EnableDiscoveryClient
@SpringBootApplication
public class NacosDiscoveryProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosDiscoveryProviderApplication.class, args);
    }

}

在启动类上添加@EnableDiscoveryClient注解。

运行服务提供者,再次访问 🎈 http://localhost:8848/nacos ,效果图如下:
lkj3tv09.png

至此服务注册成功。

3.3 搭建服务消费者

创建名为 nacos-discovery-consumer 的 Maven 项目。

📜 修改 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">
    <parent>
        <groupId>com.demo</groupId>
        <artifactId>nacos</artifactId>
        <version>1.0.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <packaging>jar</packaging>
    <artifactId>nacos-discovery-consumer</artifactId>

    <description>
        服务消费者
    </description>
    <properties>
        <java.version>1.8</java.version>
        <!--编译项目不生成测试类也不进行测试-->
        <maven.test.skip>true</maven.test.skip>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- ribbon 依赖,实现客户端负载均衡 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
            <version>2.2.2.RELEASE</version>
        </dependency>

        <!-- nacos 服务注册与发现依赖 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

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

</project>

表情 注意:SpringCloudAlibaba 依然采用 Ribbon 作为负载均衡客户端访问远程服务。

📜 创建 application.yml

server:
  port: 28001
spring:
  application:
    # 应用名
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        # 注册中心地址
        server-addr: 127.0.0.1:8848
      # 连接注册中心的账号和密码 以下是默认账密
      username: nacos
      password: nacos

📜 创建消费接口:

@RestController
@RequestMapping("open")
public class IndexController {

    @Autowired
    private RestTemplate restTemplate;


    @RequestMapping(value = "{content}")
    public String hello(@PathVariable String content) {
        // url = http://服务提供者的应用名称/接口名称/参数
        return restTemplate.getForObject("http://nacos-provider/api/hello/" + content, String.class);
    }
}

📜 修改启动类

@EnableDiscoveryClient
@SpringBootApplication
public class NacosDiscoveryConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosDiscoveryConsumerApplication.class, args);
    }
    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

在启动类上添加@EnableDiscoveryClient注解,同时创建RestTemplate实例并配置负载均衡。

启动后,我们访问消费端接口 🎈 http://127.0.0.1:28001/open/Uncle ,结果如下图:

lkj41kun.png

消费者通过 Nacos 注册中心获取服务提供者的信息,成功调用其接口。

更多详细资料请点击下方的链接进行查看。

四、参考资料

📣 Nacos 官网
📣 Nacos discovery wiki

五、项目源码

📣 源码

0

评论 (0)

取消