首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Spring Cloud 使用 Nacos 注册中心

Spring Cloud 使用 Nacos 注册中心

原创
作者头像
不惑
发布2023-12-28 15:16:20
发布2023-12-28 15:16:20
3390
举报
文章被收录于专栏:GoboyGoboy

Nacos Discovery

服务注册发现

服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于 服务的动态扩缩容。

Nacos Discovery Starter 可以帮助我们将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。

除此之外,Nacos Discovery Starter 也将服务实例自身的一些元数据信息,例如 host,port,健康检查URL,主页等注册到 Nacos 。

如何引入

如果要在项目中使用 Nacos 来实现服务发现,使用 group ID 为 com.alibaba.cloud 和 artifact ID 为 spring-cloud-starter-alibaba-nacos-discovery 的 starter。

代码语言:xml
复制
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

服务提供者

基于上一篇GoboyCloud的基础上进行开发。其中,GoboyCloud 作为父项目,服务提供者nacos-provider作为子项目。

添加依赖

添加nacos-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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <groupId>com.cloud.goboy</groupId>
        <artifactId>goboycloud</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-provider</name>
    <description>Spring Cloud Nacos Provider</description>
    <packaging>jar</packaging>


    <dependencies>
        <!-- 引入nacos 注册中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

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

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <finalName>${project.name}</finalName>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

其中,依赖 spring-cloud-starter-alibaba-nacos-discovery 是用于连接 Nacos Server 注册中心。

添加YML

bootstrap.yml 配置 Nacos Server 地址,以及服务名称:

代码语言:yml
复制
server:
  port: 9088

spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:9001
        group: goboy

spring.application.name是服务名称,这个名称会在 Nacos 控制台服务列表上展示。

添加启动类

在 Spring Boot 启动主类添加@EnableDiscoveryClient注解,开启服务注册功能。

代码语言:javascript
复制
package com.cloud.goboy.provider;

import com.alibaba.nacos.api.exception.NacosException;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableDiscoveryClient
@SpringBootApplication
public class NacosProviderApplication {
    public static void main(String[] args) {
         SpringApplication.run(NacosProviderApplication.class, args);
    }
}

添加Controller

代码语言:javascript
复制
package com.cloud.goboy.provider.controller;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderController {
    private static final Logger logger = LoggerFactory.getLogger(ProviderController.class);

    @GetMapping("/provider/{str}")
    public String provider(@PathVariable String str) {
        logger.info("服务提供者...... {}", str);
        return str;
    }

}

服务消费者

添加依赖

添加服务消费者nacos-consumer的依赖。

代码语言:javascript
复制
<?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">
    <parent>
        <artifactId>goboycloud</artifactId>
        <groupId>com.cloud.goboy</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>nacos-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-consumer</name>
    <description>Spring Cloud Nacos Consumer</description>
    <packaging>jar</packaging>

    <dependencies>
        <!-- 引入nacos 注册中心-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

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

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

        <!--远程客户端调用服务Feign-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <finalName>${project.name}</finalName>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

其中,依赖 spring-cloud-starter-openfeign 用于使用 feign 客户端调用服务接口。

添加YML

nacos-consumerbootstrap.yml 配置。

代码语言:javascript
复制
server:
  port: 9044

spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:9001
        group: goboy

其中,服务名称为 nacos-consumer

添加启动类

在启动主类添加 @EnableFeignClients 注解启用 feign 客户端的使用。

添加 @EnableDiscoveryClient 注解开启服务注册功能。

代码语言:javascript
复制
package com.cloud.goboy.consumer;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication
public class NacosConsumerApplication {
    public static void main(String[] args) {
         SpringApplication.run(NacosConsumerApplication.class, args);
    }
}

使用注解@FeignClient定义 feign 客户端,将远程服务http://nacos-provider/provider映射为本地方法调用。

代码语言:javascript
复制
package com.cloud.goboy.consumer.service;

import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@FeignClient("nacos-provider")
public interface ProviderClient {

    @GetMapping(value = "/provider/{str}")
    String provider(@PathVariable String str);

}

Feign 客户端能将服务名称 nacos-provider 映射为 nacos-provider 的地址。

这是由于 nacos-consumernacos-provider 都已经注册到了 Nacos Server 的注册中心。

nacos-consumer 可以从注册中心获取 nacos-provider 的 ip 及端口好。

nacos-consumer 提供 Controller 接口,可以调用 nacos-provider 接口。

添加Controller

代码语言:javascript
复制
package com.cloud.goboy.consumer.controller;

import com.cloud.goboy.consumer.service.ProviderClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ConsumerController {
    private static final Logger logger = LoggerFactory.getLogger(ConsumerController.class);

    @Autowired
    private ProviderClient providerClient;

    @GetMapping("/consumer/{str}")
    public String consumer(@PathVariable String str) {
        logger.info("服务消费者...... {}", str);
        return providerClient.provider(str);
    }
}

通过 @Autowired 注解注入,使用ProviderClient 定义的 feign 客户端。通过 feign 客户端进行远程服务接口调用。

启动服务发现

通过实现一个简单的 service 接口,演示如何在 Spring Cloud 项目中启用 Nacos 的服务发现功能,如下图示:

启动 nacos-consumernacos-provider 后,可以在 Nacos 控制台的服务列表中显示出两个服务

测试验证

调用接口 http://localhost:9044/consumer/hello返回

hello

FAQ

关于 Nacos Starter 更多的配置项信息

更多关于 spring-cloud-starter-alibaba-nacos-discovery 的 starter 配置项如下所示:

配置项

Key

默认值

说明

服务端地址

spring.cloud.nacos.discovery.server-addr

Nacos Server 启动监听的ip地址和端口

服务名

spring.cloud.nacos.discovery.service

${spring.application.name}

给当前的服务命名

服务分组

spring.cloud.nacos.discovery.group

DEFAULT_GROUP

设置服务所处的分组

权重

spring.cloud.nacos.discovery.weight

1

取值范围 1 到 100,数值越大,权重越大

网卡名

spring.cloud.nacos.discovery.network-interface

当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址

注册的IP地址

spring.cloud.nacos.discovery.ip

优先级最高

注册的端口

spring.cloud.nacos.discovery.port

-1

默认情况下不用配置,会自动探测

命名空间

spring.cloud.nacos.discovery.namespace

常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

AccessKey

spring.cloud.nacos.discovery.access-key

云账号名

SecretKey

spring.cloud.nacos.discovery.secret-key

云账号密码

Metadata

spring.cloud.nacos.discovery.metadata

使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息

日志文件名

spring.cloud.nacos.discovery.log-name

集群

spring.cloud.nacos.discovery.cluster-name

DEFAULT

配置成Nacos集群名称

接入点

spring.cloud.nacos.discovery.enpoint

UTF-8

地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址

是否集成Ribbon

ribbon.nacos.enabled

true

一般都设置成true即可

是否开启Nacos Watch

spring.cloud.nacos.discovery.watch.enabled

true

可以设置成false来关闭 watch

注册的IP地址类型

spring.cloud.nacos.discovery.ip-type

IPv4

可以配置IPv4和IPv6两种类型

我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Nacos Discovery
    • 服务注册发现
    • 如何引入
  • 服务提供者
    • 添加依赖
    • 添加YML
    • 添加启动类
    • 添加Controller
  • 服务消费者
    • 添加依赖
    • 添加YML
    • 添加启动类
    • 添加Controller
  • 启动服务发现
    • 测试验证
  • FAQ
    • 关于 Nacos Starter 更多的配置项信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档