1、nacos 简介
Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
-
服务管理:实现服务 CRUD,域名 CRUD,服务健康状态检查,服务权重管理等功能
-
配置管理:实现配置管 CRUD,版本管理,灰度管理,监听管理,推送轨迹,聚合数据等功能
-
元数据管理:提供元数据 CURD 和打标能力
-
插件机制:实现三个模块可分可合能力,实现扩展点 SPI 机制
-
事件机制:实现异步化事件通知,sdk 数据变化异步通知等逻辑
-
日志模块:管理日志分类,日志级别,日志可移植性(尤其避免冲突),日志格式,异常码 + 帮助文档
-
回调机制:sdk 通知数据,通过统一的模式回调用户处理。接口和数据结构需要具备可扩展性
-
寻址模式:解决 ip,域名,nameserver、广播等多种寻址模式,需要可扩展
-
推送通道:解决 server 与存储、server 间、server 与 sdk 间推送性能问题
-
容量管理:管理每个租户,分组下的容量,防止存储被写爆,影响服务可用性
-
流量管理:按照租户,分组等多个维度对请求频率,长链接个数,报文大小,请求流控进行控制
-
缓存机制:容灾目录,本地缓存,server 缓存机制。容灾目录使用需要工具
-
启动模式:按照单机模式,配置模式,服务模式,dns 模式,或者 all 模式,启动不同的程序 +UI
-
一致性协议:解决不同数据,不同一致性要求情况下,不同一致性机制
-
存储模块:解决数据持久化、非持久化存储,解决数据分片问题
-
Nameserver:解决 namespace 到 clusterid 的路由问题,解决用户环境与 nacos 物理环境映射问题
-
CMDB:解决元数据存储,与三方 cmdb 系统对接问题,解决应用,人,资源关系
-
Metrics:暴露标准 metrics 数据,方便与三方监控系统打通
-
Trace:暴露标准 trace,方便与 SLA 系统打通,日志白平化,推送轨迹等能力,并且可以和计量计费系统打通
-
接入管理:相当于阿里云开通服务,分配身份、容量、权限过程
-
用户管理:解决用户管理,登录,sso 等问题
-
权限管理:解决身份识别,访问控制,角色管理等问题
-
审计系统:扩展接口方便与不同公司审计系统打通
-
通知系统:核心数据变更,或者操作,方便通过 SMS 系统打通,通知到对应人数据变更
-
OpenAPI:暴露标准 Rest 风格 HTTP 接口,简单易用,方便多语言集成
-
Console:易用控制台,做服务管理、配置管理等操作
-
SDK:多语言 sdk
-
Agent:dns-f 类似模式,或者与 mesh 等方案集成
-
CLI:命令行对产品进行轻量化管理
2、nacos 下载启动
下载安装包
https://github.com/alibaba/nacos/releases
下载完成后,需要配置 mysql 连接信息,在 nacos 的/conf/application.properties 文件中配置
然后在数据库中执行 nacos 的数据库脚本/conf/nacos-mysql.sql
然后就可以启动了,启动的时候使用单机模式启动
startup.cmd -m standalone
3、建立一个提供服务的工程
3.1、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">
<modelVersion>4.0.0</modelVersion>
<artifactId>provider</artifactId>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>
3.2、配置文件
配置文件中指定项目名称和 nacos 的地址
server.port=8081
spring.application.name=nacos-provider
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
3.3、接口
建立一个接口,输入是谁调用了这个接口
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderDemoApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderDemoApplication.class, args);
}
@RestController
public class EchoController {
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
}
4、消费服务的功能
4.1、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">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.com.wenyl.alibaba</groupId>
<artifactId>consumer</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<optional>true</optional>
</dependency>
</dependencies>
</project>
4.2、配置文件
server.port=8080
spring.application.name=nacos-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
management.endpoints.web.exposure.include=*
4.3、接口
建立一个接口,在这个接口中调用了服务提供者的接口
/**
* @author Mr.Wen
* @version 1.0
* @date 2021-08-24 16:54
*/
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerDemoApplication {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerDemoApplication.class, args);
}
@RestController
public class NacosController{
@Resource
private LoadBalancerClient loadBalancerClient;
@Resource
private RestTemplate restTemplate;
@Value("${spring.application.name}")
private String appName;
@GetMapping("/echo/app-name")
public String echoAppName(){
//Access through the combination of LoadBalanceClient and RestTemplate
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
String path = String.format("http://%s:%s/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName);
System.out.println("request path:" +path);
return restTemplate.getForObject(path,String.class);
}
}
//Instantiate RestTemplate Instance
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
5、调动
调用服务消费者的消费接口,然后负载均衡客户端选择一个服务进行调用(loadBanceClient 是负载均衡客户端,根据服务名调用服务),返回结果如下
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于