当前位置: 首页 > article >正文

Spring Cloud 使用 Nacos 注册中心

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。

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

服务提供者

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

添加依赖

添加nacos-provider项目的pom依赖

<?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 地址,以及服务名称:

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注解,开启服务注册功能。

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

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的依赖。

<?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 配置。

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 注解开启服务注册功能。

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映射为本地方法调用。

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

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-addrNacos Server 启动监听的ip地址和端口
服务名spring.cloud.nacos.discovery.service${spring.application.name}给当前的服务命名
服务分组spring.cloud.nacos.discovery.groupDEFAULT_GROUP设置服务所处的分组
权重spring.cloud.nacos.discovery.weight1取值范围 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常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
AccessKeyspring.cloud.nacos.discovery.access-key云账号名
SecretKeyspring.cloud.nacos.discovery.secret-key云账号密码
Metadataspring.cloud.nacos.discovery.metadata使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息
日志文件名spring.cloud.nacos.discovery.log-name
集群spring.cloud.nacos.discovery.cluster-nameDEFAULT配置成Nacos集群名称
接入点spring.cloud.nacos.discovery.enpointUTF-8地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否集成Ribbonribbon.nacos.enabledtrue一般都设置成true即可
是否开启Nacos Watchspring.cloud.nacos.discovery.watch.enabledtrue可以设置成false来关闭 watch
注册的IP地址类型spring.cloud.nacos.discovery.ip-typeIPv4可以配置IPv4和IPv6两种类型


http://www.kler.cn/a/396555.html

相关文章:

  • 源码解析-Spring Eureka(更新ing)
  • 【洛谷】T539823 202411D Phoenix
  • NFS-Ganesha 核心架构解读
  • 麒麟kysec安全
  • 等保测评怎么做?具体流程是什么?
  • 如何修改npm包
  • 从基础到进阶,Dockerfile 如何使用环境变量
  • stm32在linux环境下的开发与调试
  • nacos-operator在k8s集群上部署nacos-server2.4.3版本踩坑实录
  • 数据结构 -- 二叉搜索树
  • 十一:HTTP 状态码详解:解读每一个响应背后的意义
  • 【论文复现】图像风格迁移技术
  • 新手教学系列——善用 VSCode 工作区,让开发更高效
  • 自定义实体类中DateTime属性的序列化格式
  • CSP-X2024山东小学组T2:消灭怪兽
  • IO流实用案例:用字节流--输入流(Inpustream)、输出流(OutputStream)写一个拷贝图片的案例--超简单!
  • Oracle故障处理:ora-12514 与 ora-28547
  • npm install命令报错:npm ERR Could not resolve dependency npm ERR peer…
  • Springboot RabbitMq 集成分布式事务问题
  • SQL,力扣题目1194,锦标赛优胜者
  • Java学习Day60:回家!(ElasticStatic)
  • 《Probing the 3D Awareness of Visual Foundation Models》论文解析——多视图一致性
  • 【WPF】Prism库学习(一)
  • Go语言的零值可用性:优势与限制
  • 微服务即时通讯系统的实现(客户端)----(1)
  • lab2:docker基础实战