使用 Nacos 做注册中心

越来越多的国内公司使用 SpringCloudAlibaba 技术,其产品 Nacos 功能强大,同时具有注册中心和配置中心的功能。前面的博客已经介绍了如何安装部署 Nacos ,本篇博客就使用之前部署好的 Nacos 集群(当然你也可以部署并使用单节点的 Nacos),介绍 Java 程序代码如何使用 Nacos 作为注册中心。

回顾上篇博客,Nacos 集群需要至少 3 个节点,搭建完成后,其实访问任何一个节点都是可以的,为了实现负载均衡,采用 80 端口转发了 http 的请求,采用 1080 端口转发了 grpc 的请求。nginx 所在的服务器防火墙需要开通 80 端口和 1080 端口。需要注意的是防火墙需要开通 grpc 的端口,否则 java 程序连接 nacos 时会报错。

在了解了之前已经部署好的 Nacos 集群之后,下面我们就开始写代码,在博客最后会提供源代码下载。


一、搭建工程

新建一个 SpringCloud 工程,名称为 nacos_discovery ,结构如下图所示:

image

common_pojo 是一个公用模块,主要就是一些实体类。

consumer_app 是消费者,采用 ribbon 客户端负载均衡访问 2 个 provider 提供的接口。

provider_app1 和 provider_app2 是两个提供者,提供接口给消费者进行负载均衡调用,代码基本相同。

其中 consumer_app 、provider_app1 、provider_app2 这 3 个微服务会注册到 nacos 中。

本博客使用的依赖版本如下:(需要注意版本之间的兼容性,否则可能会出问题)

  • SpringBoot 的版本为 2.3.12.RELEASE

  • SpringCloud 版本为 Hoxton.SR10

  • SpringCloud Alibaba 的版本为 2.2.9.RELEASE


二、使用 Nacos 作为注册中心

以 provider_app1 为例,介绍如何使用 Nacos 作为注册中心,主要分 2 步:

1. 在父工程和子工程中引入依赖包

官方的 SpringCloud 没有集成 SpringCloud Alibaba,因此在父工程和子工程中都需要引入额外的 jar 包。

父工程需要引入 SpringCloud Alibaba 的管理依赖来确定版本, 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">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.jobs</groupId>
    <artifactId>nacos_discovery</artifactId>
    <version>v1.0</version>
    <modules>
        <module>consumer_app</module>
        <module>provider_app1</module>
        <module>provider_app2</module>
        <module>common_pojo</module>
    </modules>
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.12.RELEASE</version>
        <relativePath/>
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!-- 引入 springCloud 依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Hoxton.SR10</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--引入 springCloud alibaba 依赖-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.9.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>
</project>

子工程 provider_app1 的 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>
        <artifactId>nacos_discovery</artifactId>
        <groupId>com.jobs</groupId>
        <version>v1.0</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>provider_app1</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--引入自己项目工程中的 common_pojo 依赖包-->
        <dependency>
            <groupId>com.jobs</groupId>
            <artifactId>common_pojo</artifactId>
            <version>v1.0</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>

2. 在 application.yml 中配置 nacos 的连接信息

子工程 provider_app1 的 application.yml 内容如下:

server:
  port: 9091
spring:
  application:
    name: provider
  cloud:
    nacos:
      # 配置 Nacos 的 ip 和 端口
      server-addr: 192.168.216.129:80
      # 配置登录的 账号 和 密码
      username: nacos
      password: nacos

logging:
  level:
    com.jobs: debug

Ok,这就完成使用 Nacos 作为注册中心的所有操作了,很简单吧。剩下的工作就是把 consumer_app 和 provider_app2 也按照上面的步骤 2 配置一下即可,然后启动所有的微服务,即可在 nacos 中查看已经注册的微服务:

image

从上图中可以发现:微服务 consumer 和 provider 都已经注册到了 nacos 中,其中 provider 注册了 2 个示例,点击 provider 后面的详情菜单可以看到具体的两个实例,如下图所示:

image


三、Nacos 的负载均衡策略

对于 Ribbon 来说,如果没有对负载均衡策略进行配置的话,默认是轮询策略。SpringCloud Alibaba 的 Nacos 的默认负载均衡策略是随机策略。如果需要使用 Nacos 的负载均衡规则,需要进行额外的配置。比如对本篇博客的 customer_app 来说,能够调用的微服务只有一个:provider ,因此在 customer_app 的 application.yml 中,如果想调用 provider 微服务接口采用 nacos 的负载均衡策略时,只需要进行如下配置即可:

server:
  port: 8888
spring:
  application:
    # 微服务的名称
    name: consumer
  cloud:
    nacos:
      # 配置 Nacos 的 ip 和 端口
      server-addr: 192.168.216.129:80
      # 配置登录的 账号 和 密码
      username: nacos
      password: nacos

#针对具体的服务,配置使用 nacos 的负载均衡策略(随机策略)
#当前项目中接口提供者的服务名称是 provider
#如果去掉以下的配置,则默认使用 ribbon 的轮训策略
provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule

logging:
  level:
    com.jobs: debug

OK,使用 Nacos 作为注册中心非常简单,已经介绍完毕。由于本篇博客使用的技术,如 SpringCloud 和 Ribbon 等在之前的博客都已经介绍过,因此这里就不再赘述,详细内容可以下载并查看源代码。

本篇博客的源代码下载地址为:https://files.cnblogs.com/files/blogs/699532/nacos_discovery.zip

posted @ 2023-05-22 17:21  乔京飞  阅读(10586)  评论(0编辑  收藏  举报