Spring Cloud Alibaba Nacos

什么是Nacos

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。

Nacos的关键特性包括:

  • 服务发现和服务健康监测
  • 动态配置服务
  • 动态 DNS 服务
  • 服务及其元数据管理

Nacos架构

Nacos架构

其中Nacos整体分为两大块,分别是Nacos ServerNacos ConsoleNacos Server为核心,其中包括Naming ServiceConfig ServiceNaming Service主要提供服务发现和DNS功能,Config Service相当于Netflix时期的Spring Cloud Config提供的分布式配置中心的功能,使得配置信息在线读取。

Nacos安装

这里笔者使用Docker方式安装,具体安装流程可以参照如下:

git clone https://github.com/nacos-group/nacos-docker.git
cd nacos-docker/example
docker-compose -f standalone-mysql-5.7.yaml up -d

Nacos 控制台:http://192.168.252.128:8848/nacos

服务注册功能案例

  1. 引入Nacos Discovery Starter依赖

    <dependency>
       <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
       <version>2.2.0.RELEASE</version>
    </dependency>
  2. 配置Nacos Server地址与其他信息

    spring.application.name=service-provider
    server.port=8081
    spring.cloud.nacos.discovery.server-addr=192.168.252.128:8848
  3. 使用 @EnableDiscoveryClient 注解开启服务注册与发现功能

@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudAlibabaNacosExampleApplication {

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

}

启动应用后,通过Nacos控制台可以看到服务已注册。
Nacos控制台服务注册情况

服务发现功能案例

  1. 创建Consumer案例,引入Nacos Discovery Starter依赖与Feign依赖

    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        <version>2.2.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-openfeign</artifactId>
        <version>2.2.2.RELEASE</version>
    </dependency>
  2. 填写相关配置

    spring.application.name=service-consumer
    server.port=8282
    spring.cloud.nacos.discovery.server-addr=192.168.252.128:8848
  3. 添加相关注解

    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableFeignClients
    public class SpringCloudAlibabaNaocsConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(SpringCloudAlibabaNaocsConsumerApplication.class, args);
        }
    
    }
  4. 编写通过Feign调用服务代码

@FeignClient(name = "service-provider")
public interface EchoService {
    
    @GetMapping(value = "/echo/{str}")
    String echo(@PathVariable("str") String str);
    
}
@RestController
public class TestController {

    @Autowired
    private EchoService echoService;

    @GetMapping(value = "/feign/{str}")
    public String feign(@PathVariable String str) {
        return echoService.echo(str);
    }
}

通过访问:http://localhost:8282/feign/xxx

可以看出,成功通过Feign调用service-provider服务

调用结果

负载均衡案例

首先修改controller代码。

@RestController
public class EchoController {

    @Value("${server.port}")
    private String port;

    @GetMapping("echo/{str}")
    public String echo(@PathVariable String str) {
        return "Nacos Discovery " + str + " from port: " + port;
    }
}

开启允许多个实例运行的配置:
运行多个实例配置

将配置文件中运行端口改为8083,Nacos控制台如图所示:
Nacos控制台情况

可以看出,provider运行了两个实例。下面通过消费者服务进行服务调用。
运行结果1

运行结果2

配置中心案例

  1. 创建项目,导入Nacos Config Server依赖。添加@EnableDiscoveryClient注解

    <dependency>
       <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
    <dependency>
       <groupId>com.alibaba.cloud</groupId>
       <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
  2. 创建配置文件bootstrap.properties,填写如下配置:

    spring.application.name=nacos-config-example
    server.port=18084
    spring.cloud.nacos.config.server-addr=192.168.252.128:8848
  3. 在Nacos控制台新添加如下配置:
    Nacos添加配置

  4. 编写Controller代码

    @RestController
    public class TestController {
    
        @Value("${user.id}")
        private String id;
    
        @Value("${user.name}")
        private String name;
    
        @GetMapping("test")
        public String test() {
            return id + ", Hello "+ name;
        }
    }
  5. 访问:http://localhost:18084/test
    访问结果
    可以看到,通过Nacos配置中心,成功读取到配置文件的内容。

下面列出Nacos的其它配置项:

配置项 key 默认值 说明
服务端地址 spring.cloud.nacos.discovery.server-addr
服务名 spring.cloud.nacos.discovery.service spring.application.name
权重 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.endpoint UTF-8 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否集成Ribbon ribbon.nacos.enabled true

Spring Cloud Alibaba Nacos
https://l1n.wang/2020/Spring Cloud/spring-cloud-alibaba-nacos/
作者
Lin Wang
发布于
2020年4月6日
许可协议