一、什么是Nacos
前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service;一个更易于构建云原生应用的动态服务发现,配置管理和服务管理中心
Nacos = Eureka+Config+Bus:Nacos就是注册中心+配置中心的组合
服务是Nacos的头等公民。Nacos支持发现,配置和管理几乎所有类型的服务:
Kubernetes服务、gRPC和Dubbo RPC服务、Spring Cloud RESTful服务
Nacos的主要功能
-
替代Eureka做服务注册中心
-
替代Config做服务配置中心
-
服务发现和服务运行状况检查
Nacos提供实时运行状况检查,以防止服务将请求发送到不正常的主机或服务实例。Nacos支持传输层(PING或TCP)健康检查和应用程序层(例如HTTP,Redis,MySQL和用户定义的协议)健康检查。对于复杂云和网络拓扑(例如VPC,边缘服务等)的运行状况检查,Nacos提供代理模式和服务器模式运行状况检查。Nacos还提供统一的服务运行状况仪表板,以帮助您管理服务的可用性和流量。 -
动态配置管理
动态配置服务使您可以在所有环境中以集中,外部化和动态的方式管理所有应用程序和服务的配置。
动态配置消除了在更新配置时重新部署应用程序和服务的需要。
配置的集中管理使您更方便地实现无状态服务和按需弹性扩展服务实例。
Nacos提供了易于使用的UI TODO,可帮助您管理所有应用程序或服务的配置。它提供了一些现成的功能,包括配置版本跟踪,canary / beta版本,配置回滚和客户端配置更新状态跟踪,以确保安全并控制配置更改的风险。 -
动态DNS服务
支持加权路由的动态DNS服务使您可以更轻松地在数据中心内的生产环境中实施中间层负载平衡,灵活的路由策略,流量控制和简单的DNS解析服务。动态DNS服务使您更容易实现基于DNS的服务发现。
Nacos提供了一些简单的DNS API TODO,供您管理DNS域名和IP -
服务治理和元数据管理
Nacos允许您从微服务平台构建器的角度管理所有服务和元数据。这包括管理服务描述,生命周期,服务静态依赖关系分析,服务运行状况,服务流量管理,路由和安全规则,服务SLA和一线指标
如上图所示,Nacos无缝支持开源生态,包括Dubbo和Dubbo Mesh,Spring Cloud以及Kubernetes和CNCF。
使用Nacos可以简化服务发现,配置管理以及服务治理和管理中的解决方案。使用Nacos,开源系统中的微服务管理变得容易。
二、Nacos之服务注册实现
相较于其他服务注册与发现框架:
| 服务注册与发现框架 | CAP模型 | 控制台管理 | 社区活跃度 |
|---|---|---|---|
| Eureka | AP | 支持 | 低 |
| Zookeeper | CP | 不支持 | 中 |
| Consul | CP | 支持 | 高 |
| Nacos | AP | 支持 | 高 |
注:C:一致性(Consistency)、A可用性(Availability)、P分区容错性(Partition tolerance)
在之前我们了解的服务注册与发现组件主要有:Eureka,Zookepper,Consul本次我们选下下阿里巴巴出品的Nacos。
首先官网下载Nacos客户端,本文采用Nacos 1.2.1版本:https://github.com/alibaba/nacos/releases/tag/1.2.1
下载下来之后解压:

双击启动成功后,访问http://localhost:8848/nacos/进入服务监控登录页面,账号密码都是nacos,
出现上述页面则代表安装成功。
与Eureka相比不需要自己建一个服务注册中心项目,页面风格也更加符合我们的审美。
由于已经不需要手动创建服务注册服务了,我们只需要创建服务端 Payment9001 以及消费端 ConsumerOrder8001即可:
首先:Payment9001 :pom.xml
<?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>cloud2020</artifactId>
<groupId>com.cpown.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-alibaba-payment9001</artifactId>
<dependencies>
<!-- SpringCloud ailibaba nacos-->
<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-web</artifactId>
</dependency>
<!--监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
application.yml:
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
# 配置 nacos地址
server-addr: localhost:8848
management:
endpoints:
web:
exposure:
exclude: '*'
主启动:
package com.cpown.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class AlibabaPayment9001 {
public static void main(String[] args) {
SpringApplication.run(AlibabaPayment9001.class,args);
}
}
接口controller
package com.cpown.springcloud.controller;
import com.cpown.springcloud.dto.CommonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import java.util.UUID;
@RestController
@Slf4j
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/getInfo/{id}")
public CommonResult get(@PathVariable("id") Long id){
log.info("9001查询数据:"+id);
return new CommonResult("请求成功,serverPort:"+serverPort,0000, UUID.randomUUID());
}
}
我们启动项目看一下:服务可用

我们在看一下服务是否已经注册进nacos:http://localhost:8848/nacos/

服务已经注册,实例数为1.
客户端cloud-alibaba-order8001
pom.xml:
<?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>cloud2020</artifactId>
<groupId>com.cpown.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloud-alibaba-order8001</artifactId>
<dependencies>
<!-- SpringCloud ailibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 引用自己定义的api通用包,可以使用Payment支付Entity -->
<dependency>
<groupId>com.cpown.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- openfeign -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
application.yml:
server:
port: 8001
spring:
application:
name: nacos-payment-consumer
cloud:
nacos:
discovery:
# 配置 nacos地址
server-addr: localhost:8848
management:
endpoints:
web:
exposure:
exclude: '*'
主启动:
package com.cpown.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableFeignClients
public class OrderMainFeign8001 {
public static void main(String[] args) {
SpringApplication.run(OrderMainFeign8001.class,args);
}
}
service :此处使用OpenFeign作为接口调用:可参考前面:https://blog.csdn.net/flycp/article/details/108567595
package com.cpown.springcloud.service;
import com.cpown.springcloud.dto.CommonResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
@FeignClient(value = "nacos-payment-provider")
@Component
public interface PaymentService {
@GetMapping("/getInfo/{id}")
CommonResult get(@PathVariable("id") Long id);
}
controller:
package com.cpown.springcloud.controller;
import com.cpown.springcloud.dto.CommonResult;
import com.cpown.springcloud.service.PaymentService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class FeignController {
@Resource
private PaymentService paymentService;
@GetMapping("/consumer/get/{id}")
public CommonResult getInfo(@PathVariable("id") Long id){
return paymentService.get(id);
}
}
我们启动项目看一下:首先在nacos服务监控可以看到客户端也已注册进Nacos
http://localhost:8848/nacos/#/serviceManagement?dataId=&group=&appName=&namespace=

服务调用成功:

我们在增加一台机器,9002项目和9001完全一样,仅端口不同,测试一下集群版:

启动并测试:首先可以看到Nacos监控页面 nacos-payment-provider 的实例已经变为两个:

OpenFeign默认轮询负载均衡成功:


本文介绍Nacos作为服务注册中心及配置管理中心的应用实践,包括安装部署、服务注册、配置管理等功能,并通过示例展示了如何使用Nacos进行服务治理。

1029

被折叠的 条评论
为什么被折叠?



