SpringBoot项目如何整合Nacos注册中心框架

Nacos作为阿里开源的注册中心和配置中心框架,以其活跃的社区和超高的性能吸引了很多开发者和公司的青睐,笔者目前了解到的注册中心框架有Eureka、Consul、Nacos和ZK,这几种框架都各具特色,可根据公司业务和成本来具体选型。

Nacos手册Nacos性能测试报告

版本依赖关系

首先来看一下,Spring Cloud、Spring Cloud Alibaba和Spring Boot版本的依赖关系,好选择合适的版本

Spring Cloud Version

Spring Cloud Alibaba Version

Spring Boot Version

Spring Cloud Greenwich

2.1.0.RELEASE

2.1.X.RELEASE

Spring Cloud Finchley

2.0.0.RELEASE

2.0.X.RELEASE

Spring Cloud Edgware

1.5.0.RELEASE

1.5.X.RELEASE

项目搭建

创建一个聚合工程,父pom文件如下:

<modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/>
    </parent>
    <groupId>com.ambition</groupId>
    <artifactId>spring-cloud-alibaba</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>

    <dependencyManagement>
        <dependencies>
            <!-- 整合Spring Boot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.3.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!-- 整合Spring Cloud -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.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.1.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

然后新建order和stock两个子模块,pom文件为:

<parent>
        <artifactId>demo</artifactId>
        <groupId>com.ambition</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <artifactId>stock</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>stock</name>
    <description>Demo project for Spring Boot</description>

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

        <!-- Nacos Discovery -->
        <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-actuator</artifactId>
        </dependency>
    </dependencies>

接着在启动类上加上@EnableDiscoveryClient注解

@EnableDiscoveryClient
@SpringBootApplication
public class StockApplication {

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

}

最后修改application.yml配置文件:

server:
  port: 8082

spring:
  application:
    name: stock
  main:
    allow-bean-definition-overriding: true

  cloud:
    nacos:
      discovery:
        # 注册地址,不需要写协议
        server-addr: 127.0.0.1:8848

        # 命名空间,不同命名空间之间不能调用,用于环境隔离
        # 开发环境
        # namespace: acd952e0-7c60-4c6b-9854-6daa22d12d4c
        # 生产环境
        # namespace: 534c904d-7f24-4086-acbd-daf628cb1446

        # 分组,不同分组之间不能调用,用于微服务之间的隔离
        group: DEFAULT_GROUP

        # 集群名称【有 BJ 和 NJ】,不同集群之间可以调用,但是在设计负载均衡策略的时候要避免跨机房集群调用
        # cluster-name: BJ

        # 元数据,让配置更加灵活
        metadata:
          # 比如灰度发布时,可以跨集群调用,但是不能跨版本调用
          version: v1

management:
  # 加载 actuator 所有的端点(默认只加载 info / health)
  endpoints:
    web:
      exposure:
        include: "*"
  endpoint:
    # 允许关闭端点
    shutdown:
      enabled: true
    # 总是显示检查详细信息
    health:
      show-details: always

整个项目结构如下:

springboot 整合springcloud alibaba springboot 整合nacos ribbon_java


本地启动了一个Nacos服务,然后访问Nacos的控制台页面,可以看到服务都注册上了:

springboot 整合springcloud alibaba springboot 整合nacos ribbon_ci_02


在order项目验证stock已经注册到注册中心,并获取stock的服务信息:

@RestController
public class ServiceController {

    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping(value = "/getServiceList")
    public List<ServiceInstance> getServiceList() {
        List<ServiceInstance> serviceInstanceList = discoveryClient.getInstances("stock"); 
        return serviceInstanceList;
    }
}

去浏览器上访问一下:

springboot 整合springcloud alibaba springboot 整合nacos ribbon_ci_03


可以看到在order项目中能拉取到注册中心上stock服务的信息,同样在stock项目中也能拉取到order服务的信息。

接下来打算写Nacos的源码专题,先搭建一个源码的解析环境,Nacos的源码可以去同性社区上克隆或者或者下载(https://github.com/alibaba/nacos),导入IDEA后,console项目就是它的控制台中心,如果想运行的话需要在VM options中加入如下参数:

-Dnacos.standalone=true -Dnacos.home=/XXX/nacos/distribution

控制台需要解析distribution项目里面的文件参数,需要在启动参数中指定这个项目的路径