使用 Nacos 做注册中心
越来越多的国内公司使用 SpringCloudAlibaba 技术,其产品 Nacos 功能强大,同时具有注册中心和配置中心的功能。前面的博客已经介绍了如何安装部署 Nacos ,本篇博客就使用之前部署好的 Nacos 集群(当然你也可以部署并使用单节点的 Nacos),介绍 Java 程序代码如何使用 Nacos 作为注册中心。
回顾上篇博客,Nacos 集群需要至少 3 个节点,搭建完成后,其实访问任何一个节点都是可以的,为了实现负载均衡,采用 80 端口转发了 http 的请求,采用 1080 端口转发了 grpc 的请求。nginx 所在的服务器防火墙需要开通 80 端口和 1080 端口。需要注意的是防火墙需要开通 grpc 的端口,否则 java 程序连接 nacos 时会报错。
在了解了之前已经部署好的 Nacos 集群之后,下面我们就开始写代码,在博客最后会提供源代码下载。
一、搭建工程
新建一个 SpringCloud 工程,名称为 nacos_discovery ,结构如下图所示:
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 中查看已经注册的微服务:
从上图中可以发现:微服务 consumer 和 provider 都已经注册到了 nacos 中,其中 provider 注册了 2 个示例,点击 provider 后面的详情菜单可以看到具体的两个实例,如下图所示:
三、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