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方式安装,具体安装流程可以参照如下:

1
2
3
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依赖

    1
    2
    3
    4
    5
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2.2.0.RELEASE</version>
    </dependency>

  2. 配置Nacos Server地址与其他信息

    1
    2
    3
    spring.application.name=service-provider
    server.port=8081
    spring.cloud.nacos.discovery.server-addr=192.168.252.128:8848

  3. 使用 @EnableDiscoveryClient 注解开启服务注册与发现功能

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableDiscoveryClient
public class SpringCloudAlibabaNacosExampleApplication {

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

}

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

服务发现功能案例

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

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <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. 填写相关配置

    1
    2
    3
    spring.application.name=service-consumer
    server.port=8282
    spring.cloud.nacos.discovery.server-addr=192.168.252.128:8848

  3. 添加相关注解

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableFeignClients
    public class SpringCloudAlibabaNaocsConsumerApplication {

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

    }

  4. 编写通过Feign调用服务代码

1
2
3
4
5
6
7
@FeignClient(name = "service-provider")
public interface EchoService {

@GetMapping(value = "/echo/{str}")
String echo(@PathVariable("str") String str);

}
1
2
3
4
5
6
7
8
9
10
11
@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代码。

1
2
3
4
5
6
7
8
9
10
11
@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注解

    1
    2
    3
    4
    5
    6
    7
    8
    <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,填写如下配置:

    1
    2
    3
    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代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @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

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!