一、 什么是nacos
Nacos 支持基于 DNS 、RPC 的服务发现、动态配置服务、动态 DNS 服务。
官方介绍:
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您实现动态服务发现、服务配置管理、服务及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构(例如微服务范式、云原生范式)的服务基础设施。
官方网址:http://nacos.io
二、 Nacos基本架构及概念
服务 (Service)
服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service.
服务注册中心 (Service Registry)
服务注册中心,它是服务,其实例及元数据的数据库。服务实例在启动时注册到服务注册表,并在关闭时注销。服务和路由器的客户端查询服务注册表以查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。
服务元数据 (Service Metadata)
服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据
服务提供方 (Service Provider)
是指提供可复用和可调用服务的应用方
服务消费方 (Service Consumer)
是指会发起对某个服务调用的应用方
配置 (Configuration)
在系统开发过程中通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成这个步骤。配置变更是调整系统运行时的行为的有效手段之一。
配置管理 (Configuration Management)
在数据中心中,系统中所有配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动统称为配置管理。
名字服务 (Naming Service)
提供分布式系统中所有对象(Object)、实体(Entity)的“名字”到关联的元数据之间的映射管理服务,例如 ServiceName -> Endpoints Info, Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List, 服务发现和 DNS 就是名字服务的2大场景。
配置服务 (Configuration Service)
在服务或者应用运行过程中,提供动态配置或者元数据以及配置管理的服务提供者。
三、 逻辑架构及其组件介绍
服务管理:实现服务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:命令行对产品进行轻量化管理,像git一样好用
数据模型
Nacos 数据模型 Key 由三元组唯一确定, Namespace默认是空串,公共命名空间(public),分组默认是 DEFAULT_GROUP。
服务领域模型
配置领域模型
围绕配置,主要有两个关联的实体,一个是配置变更历史,一个是服务标签(用于打标分类,方便索引),由 ID 关联。
类视图
Nacos-SDK 类视图
服务部分待续
构建物、部署及启动模式
两种交付工件
Nacos 支持标准 Docker 镜像(TODO: 0.2版本开始支持)及 zip(tar.gz)压缩包的构建物。
两种启动模式
Nacos 支持将注册中心(Service Registry)与配置中心(Config Center) 在一个进程合并部署或者将2者分离部署的两种模式。
免费的公有云服务模式
除了您自己部署和启动 Nacos 服务之外,在云计算时代,Nacos 也支持公有云模式,在阿里云公有云的商业产品(如ACM, EDAS) 中会提供 Nacos 的免费的公有云服务。我们也欢迎和支持其他的公有云提供商提供 Nacos 的公有云服务。
四、 Nacos支持三种部署模式
单机模式 - 用于测试和单机试用。
集群模式 - 用于生产环境,确保高可用。
多集群模式 - 用于多数据中心场景。
下载与安装
下载地址为https://github.com/alibaba/nacos/releases,完成下载后,解压压缩包,Windows部署点击bin目录下的startup.cmd,即可运行,也可以通过命令进行单部署。
单机模式下运行Nacos
Linux/Unix/Mac
Standalone means it is non-cluster Mode. * sh startup.sh -m standalone
Windows
cmd startup.cmd 或者双击 startup.cmd 文件
单机模式支持mysql
在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:
1.安装数据库,版本要求:5.6.5+
2.初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
3.修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow
集群模式下运行Nacos
用户把所有服务列表放到一个vip下面,然后挂到一个域名下面
http://ip1:port/openAPI 直连ip模式,机器挂则需要修改ip才可以使用。
http://VIP:port/openAPI 挂载VIP模式,直连vip即可,下面挂server真实ip,可读性不好。
http://nacos.com:port/openAPI 域名 + VIP模式,可读性好,而且换ip方便,推荐模式
环境准备
请确保是在环境中安装使用:
64 bit OS Linux/Unix/Mac,推荐使用Linux系统。
64 bit JDK 1.8+;
Maven 3.2.x+;
3个或3个以上Nacos节点才能构成集群。
配置集群配置文件
在nacos的解压目录nacos/的conf目录下,有配置文件cluster.conf,请每行配置成ip:port。(请配置3个或3个以上节点)
200.8.9.16:8848
200.8.9.17:8848
200.8.9.18:8848
配置 MySQL 数据库
生产使用建议至少主备模式,或者采用高可用数据库。
初始化 MySQL 数据库
/*****************************************/
/ 数据库全名 = nacos_config /
/ 表名称 = config_info /
/*****************************************/
CREATE TABLE config_info
(
id
bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘id’,
data_id
varchar(255) NOT NULL COMMENT ‘data_id’,
group_id
varchar(255) DEFAULT NULL,
content
longtext NOT NULL COMMENT ‘content’,
md5
varchar(32) DEFAULT NULL COMMENT ‘md5’,
gmt_create
datetime NOT NULL DEFAULT ‘2010-05-05 00:00:00’ COMMENT ‘创建时间’,
gmt_modified
datetime NOT NULL DEFAULT ‘2010-05-05 00:00:00’ COMMENT ‘修改时间’,
src_user
text COMMENT ‘source user’,
src_ip
varchar(20) DEFAULT NULL COMMENT ‘source ip’,
app_name
varchar(128) DEFAULT NULL,
tenant_id
varchar(128) DEFAULT ‘’ COMMENT ‘租户字段’,
c_desc
varchar(256) DEFAULT NULL,
c_use
varchar(64) DEFAULT NULL,
effect
varchar(64) DEFAULT NULL,
type
varchar(64) DEFAULT NULL,
c_schema
text,
PRIMARY KEY (id
),
UNIQUE KEY uk_configinfo_datagrouptenant
(data_id
,group_id
,tenant_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=‘config_info’;
/*****************************************/
/ 数据库全名 = nacos_config /
/ 表名称 = config_info_aggr /
/*****************************************/
CREATE TABLE config_info_aggr
(
id
bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘id’,
data_id
varchar(255) NOT NULL COMMENT ‘data_id’,
group_id
varchar(255) NOT NULL COMMENT ‘group_id’,
datum_id
varchar(255) NOT NULL COMMENT ‘datum_id’,
content
longtext NOT NULL COMMENT ‘内容’,
gmt_modified
datetime NOT NULL COMMENT ‘修改时间’,
app_name
varchar(128) DEFAULT NULL,
tenant_id
varchar(128) DEFAULT ‘’ COMMENT ‘租户字段’,
PRIMARY KEY (id
),
UNIQUE KEY uk_configinfoaggr_datagrouptenantdatum
(data_id
,group_id
,tenant_id
,datum_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=‘增加租户字段’;
/*****************************************/
/ 数据库全名 = nacos_config /
/ 表名称 = config_info_beta /
/*****************************************/
CREATE TABLE config_info_beta
(
id
bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘id’,
data_id
varchar(255) NOT NULL COMMENT ‘data_id’,
group_id
varchar(128) NOT NULL COMMENT ‘group_id’,
app_name
varchar(128) DEFAULT NULL COMMENT ‘app_name’,
content
longtext NOT NULL COMMENT ‘content’,
beta_ips
varchar(1024) DEFAULT NULL COMMENT ‘betaIps’,
md5
varchar(32) DEFAULT NULL COMMENT ‘md5’,
gmt_create
datetime NOT NULL DEFAULT ‘2010-05-05 00:00:00’ COMMENT ‘创建时间’,
gmt_modified
datetime NOT NULL DEFAULT ‘2010-05-05 00:00:00’ COMMENT ‘修改时间’,
src_user
text COMMENT ‘source user’,
src_ip
varchar(20) DEFAULT NULL COMMENT ‘source ip’,
tenant_id
varchar(128) DEFAULT ‘’ COMMENT ‘租户字段’,
PRIMARY KEY (id
),
UNIQUE KEY uk_configinfobeta_datagrouptenant
(data_id
,group_id
,tenant_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=‘config_info_beta’;
/*****************************************/
/ 数据库全名 = nacos_config /
/ 表名称 = config_info_tag /
/*****************************************/
CREATE TABLE config_info_tag
(
id
bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘id’,
data_id
varchar(255) NOT NULL COMMENT ‘data_id’,
group_id
varchar(128) NOT NULL COMMENT ‘group_id’,
tenant_id
varchar(128) DEFAULT ‘’ COMMENT ‘tenant_id’,
tag_id
varchar(128) NOT NULL COMMENT ‘tag_id’,
app_name
varchar(128) DEFAULT NULL COMMENT ‘app_name’,
content
longtext NOT NULL COMMENT ‘content’,
md5
varchar(32) DEFAULT NULL COMMENT ‘md5’,
gmt_create
datetime NOT NULL DEFAULT ‘2010-05-05 00:00:00’ COMMENT ‘创建时间’,
gmt_modified
datetime NOT NULL DEFAULT ‘2010-05-05 00:00:00’ COMMENT ‘修改时间’,
src_user
text COMMENT ‘source user’,
src_ip
varchar(20) DEFAULT NULL COMMENT ‘source ip’,
PRIMARY KEY (id
),
UNIQUE KEY uk_configinfotag_datagrouptenanttag
(data_id
,group_id
,tenant_id
,tag_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=‘config_info_tag’;
/*****************************************/
/ 数据库全名 = nacos_config /
/ 表名称 = config_tags_relation /
/*****************************************/
CREATE TABLE config_tags_relation
(
id
bigint(20) NOT NULL COMMENT ‘id’,
tag_name
varchar(128) NOT NULL COMMENT ‘tag_name’,
tag_type
varchar(64) DEFAULT NULL COMMENT ‘tag_type’,
data_id
varchar(255) NOT NULL COMMENT ‘data_id’,
group_id
varchar(128) NOT NULL COMMENT ‘group_id’,
tenant_id
varchar(128) DEFAULT ‘’ COMMENT ‘tenant_id’,
nid
bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (nid
),
UNIQUE KEY uk_configtagrelation_configidtag
(id
,tag_name
,tag_type
),
KEY idx_tenant_id
(tenant_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=‘config_tag_relation’;
/*****************************************/
/ 数据库全名 = nacos_config /
/ 表名称 = group_capacity /
/*****************************************/
CREATE TABLE group_capacity
(
id
bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘主键ID’,
group_id
varchar(128) NOT NULL DEFAULT ‘’ COMMENT ‘Group ID,空字符表示整个集群’,
quota
int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘配额,0表示使用默认值’,
usage
int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘使用量’,
max_size
int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘单个配置大小上限,单位为字节,0表示使用默认值’,
max_aggr_count
int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘聚合子配置最大个数,,0表示使用默认值’,
max_aggr_size
int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值’,
max_history_count
int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘最大变更历史数量’,
gmt_create
datetime NOT NULL DEFAULT ‘2010-05-05 00:00:00’ COMMENT ‘创建时间’,
gmt_modified
datetime NOT NULL DEFAULT ‘2010-05-05 00:00:00’ COMMENT ‘修改时间’,
PRIMARY KEY (id
),
UNIQUE KEY uk_group_id
(group_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=‘集群、各Group容量信息表’;
/*****************************************/
/ 数据库全名 = nacos_config /
/ 表名称 = his_config_info /
/*****************************************/
CREATE TABLE his_config_info
(
id
bigint(64) unsigned NOT NULL,
nid
bigint(20) unsigned NOT NULL AUTO_INCREMENT,
data_id
varchar(255) NOT NULL,
group_id
varchar(128) NOT NULL,
app_name
varchar(128) DEFAULT NULL COMMENT ‘app_name’,
content
longtext NOT NULL,
md5
varchar(32) DEFAULT NULL,
gmt_create
datetime NOT NULL DEFAULT ‘2010-05-05 00:00:00’,
gmt_modified
datetime NOT NULL DEFAULT ‘2010-05-05 00:00:00’,
src_user
text,
src_ip
varchar(20) DEFAULT NULL,
op_type
char(10) DEFAULT NULL,
tenant_id
varchar(128) DEFAULT ‘’ COMMENT ‘租户字段’,
PRIMARY KEY (nid
),
KEY idx_gmt_create
(gmt_create
),
KEY idx_gmt_modified
(gmt_modified
),
KEY idx_did
(data_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=‘多租户改造’;
/*****************************************/
/ 数据库全名 = nacos_config /
/ 表名称 = tenant_capacity /
/*****************************************/
CREATE TABLE tenant_capacity
(
id
bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT ‘主键ID’,
tenant_id
varchar(128) NOT NULL DEFAULT ‘’ COMMENT ‘Tenant ID’,
quota
int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘配额,0表示使用默认值’,
usage
int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘使用量’,
max_size
int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘单个配置大小上限,单位为字节,0表示使用默认值’,
max_aggr_count
int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘聚合子配置最大个数’,
max_aggr_size
int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘单个聚合数据的子配置大小上限,单位为字节,0表示使用默认值’,
max_history_count
int(10) unsigned NOT NULL DEFAULT ‘0’ COMMENT ‘最大变更历史数量’,
gmt_create
datetime NOT NULL DEFAULT ‘2010-05-05 00:00:00’ COMMENT ‘创建时间’,
gmt_modified
datetime NOT NULL DEFAULT ‘2010-05-05 00:00:00’ COMMENT ‘修改时间’,
PRIMARY KEY (id
),
UNIQUE KEY uk_tenant_id
(tenant_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=‘租户容量信息表’;
CREATE TABLE tenant_info
(
id
bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘id’,
kp
varchar(128) NOT NULL COMMENT ‘kp’,
tenant_id
varchar(128) default ‘’ COMMENT ‘tenant_id’,
tenant_name
varchar(128) default ‘’ COMMENT ‘tenant_name’,
tenant_desc
varchar(256) DEFAULT NULL COMMENT ‘tenant_desc’,
create_source
varchar(32) DEFAULT NULL COMMENT ‘create_source’,
gmt_create
bigint(20) NOT NULL COMMENT ‘创建时间’,
gmt_modified
bigint(20) NOT NULL COMMENT ‘修改时间’,
PRIMARY KEY (id
),
UNIQUE KEY uk_tenant_info_kptenantid
(kp
,tenant_id
),
KEY idx_tenant_id
(tenant_id
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT=‘tenant_info’;
CREATE TABLE users (
username varchar(50) NOT NULL PRIMARY KEY,
password varchar(500) NOT NULL,
enabled boolean NOT NULL
);
CREATE TABLE roles (
username varchar(50) NOT NULL,
role varchar(50) NOT NULL
);
INSERT INTO users (username, password, enabled) VALUES (‘nacos’, ‘$2a 10 10 10EuWPZHzz32dJN7jexM34MOeYirDdFAZm2kuWj7VEOJhhZkDrxfvUu’, TRUE);
INSERT INTO roles (username, role) VALUES (‘nacos’, ‘ROLE_ADMIN’);
application.properties 配置
server.contextPath=/nacos
server.servlet.contextPath=/nacos
server.port=8848
#management.endpoints.web.exposure.include=*
management.metrics.export.elastic.enabled=false
#management.metrics.export.elastic.host=http://localhost:9200
management.metrics.export.influx.enabled=false
#management.metrics.export.influx.db=springboot
#management.metrics.export.influx.uri=http://localhost:8086
#management.metrics.export.influx.auto-create-db=true
#management.metrics.export.influx.consistency=one
#management.metrics.export.influx.compressed=true
server.tomcat.accesslog.enabled=true
server.tomcat.accesslog.pattern=%h %l %u %t “%r” %s %b %D %{User-Agent}i
server.tomcat.basedir=
#spring.security.enabled=false
#management.security=false
#security.basic.enabled=false
#nacos.security.ignore.urls=/**
nacos.security.ignore.urls=/,//*.css,//.js,/**/.html,//*.map,//.svg,/**/.png,//*.ico,/console-fe/public/,/v1/auth/login,/v1/console/health/,/v1/cs/,/v1/ns/,/v1/cmdb/,/actuator/,/v1/console/server/
启动服务器
Linux/Unix/Mac
启动命令(在没有参数模式,是集群模式):
sh startup.sh
服务注册
curl -X PUT ‘http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080’
服务发现
curl -X GET ‘http://127.0.0.1:8848/nacos/v1/ns/instances?serviceName=nacos.naming.serviceName’
发布配置
curl -X POST “http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=helloWorld”
获取配置
curl -X GET “http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test”
关闭服务器
sh shutdown.sh
五、 Nacos 结合Spring Cloud开发
主要面向 Spring Cloud 的使用者,通过两个示例来介绍如何使用 Nacos 来实现分布式环境下的配置管理和服务注册发现。
Nacos Config
Nacos 提供用于存储配置和其他元数据的 key/value 存储,为分布式系统中的外部化配置提供服务器端和客户端支持。使用 Spring Cloud Alibaba Nacos Config,您可以在 Nacos Server 集中管理你 Spring Cloud 应用的外部属性配置。
Spring Cloud Alibaba Nacos Config 是 Config Server 和 Client 的替代方案,客户端和服务器上的概念与 Spring Environment 和 PropertySource 有着一致的抽象,在特殊的 bootstrap 阶段,配置被加载到 Spring 环境中。当应用程序通过部署管道从开发到测试再到生产时,您可以管理这些环境之间的配置,并确保应用程序具有迁移时需要运行的所有内容。
Nacos 服务端初始化
1、启动Nacos Server。启动方式可见 Nacos 官网
2、启动好Nacos之后,在Nacos添加如下的配置:
Data ID: nacos-config.properties
Group : DEFAULT_GROUP
配置格式: Properties
配置内容: user.name=nacos-config-properties
user.age=90
Note 注意dataid是以 properties(默认的文件扩展名方式)为扩展名。
客户端使用方式
如果要在您的项目中使用 Nacos 来实现应用的外部化配置,使用 group ID 为 com.alibaba.cloud 和 artifact ID 为 spring-cloud-starter-alibaba-nacos-config 的 starter。
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
现在就可以创建一个标准的 Spring Boot 应用。
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :"+userName+"; age: "+userAge);
}
}
在运行此 Example 之前, 必须使用 bootstrap.properties 配置文件来配置Nacos Server 地址,例如:
bootstrap.properties
spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
Note 注意当你使用域名的方式来访问 Nacos 时,spring.cloud.nacos.config.server-addr 配置的方式为 域名:port。 例如 Nacos 的域名为abc.com.nacos,监听的端口为 80,则 spring.cloud.nacos.config.server-addr=abc.com.nacos:80。 注意 80 端口不能省略。
启动这个 Example,可以看到如下输出结果:
2018-11-02 14:24:51.638 INFO 32700 — [main] c.a.demo.provider.ProviderApplication : Started ProviderApplication in 14.645 seconds (JVM running for 15.139)
user name :nacos-config-properties; age: 90
2018-11-02 14:24:51.688 INFO 32700 — [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@a8c5e74: startup date [Fri Nov 02 14:24:51 CST 2018]; root of context hierarchy
2018-11
基于 dataid 为 yaml 的文件扩展名配置方式
spring-cloud-starter-alibaba-nacos-config 对于 yaml 格式也是完美支持的。这个时候只需要完成以下两步:
1、在应用的 bootstrap.properties 配置文件中显示的声明 dataid 文件扩展名。如下所示
bootstrap.properties
spring.cloud.nacos.config.file-extension=yaml
2、在 Nacos 的控制台新增一个dataid为yaml为扩展名的配置,如下所示:
Data ID: nacos-config.yaml
Group : DEFAULT_GROUP
配置格式: YAML
配置内容: user.name: nacos-config-yaml
user.age: 68
这两步完成后,重启测试程序,可以看到如下输出结果。
2018-11-02 14:59:00.484 INFO 32928 — [main] c.a.demo.provider.ProviderApplication:Started ProviderApplication in 14.183 seconds (JVM running for 14.671)
user name :nacos-config-yaml; age: 68
2018-11-02 14:59:00.529 INFO 32928 — [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@265a478e: startup date [Fri Nov 02 14:59:00 CST 2018]; root of context hierarchy
支持配置的动态更新
spring-cloud-starter-alibaba-nacos-config 也支持配置的动态更新,启动 Spring Boot 应用测试的代码如下:
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
while(true) {
//当动态配置刷新时,会更新到 Enviroment中,因此这里每隔一秒中从Enviroment中获取配置
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :" + userName + "; age: " + userAge);
TimeUnit.SECONDS.sleep(1);
}
}
}
如下所示,当变更user.name时,应用程序中能够获取到最新的值:
user name :nacos-config-yaml; age: 68
user name :nacos-config-yaml; age: 68
user name :nacos-config-yaml; age: 68
2018-11-02 15:04:25.069 INFO 32957 — [-127.0.0.1:8848] o.s.boot.SpringApplication : Started application in 0.144 seconds (JVM running for 71.752)
2018-11-02 15:04:25.070 INFO 32957 — [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@10c89124: startup date [Fri Nov 02 15:04:25 CST 2018]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@6520af7
2018-11-02 15:04:25.071 INFO 32957 — [-127.0.0.1:8848] s.c.a.AnnotationConfigApplicationContext : Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6520af7: startup date [Fri Nov 02 15:04:24 CST 2018]; root of context hierarchy
//从 Enviroment 中 读取到更改后的值
user name :nacos-config-yaml-update; age: 68
user name :nacos-config-yaml-update; age: 68
Note 你可以通过配置 spring.cloud.nacos.config.refresh.enabled=false 来关闭动态刷新
可支持profile粒度的配置
spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,不仅仅加载了以 dataid 为 s p r i n g . a p p l i c a t i o n . n a m e . {spring.application.name}. spring.application.name.{file-extension:properties} 为前缀的基础配置,还加载了dataid为 s p r i n g . a p p l i c a t i o n . n a m e − {spring.application.name}- spring.application.name−{profile}.${file-extension:properties} 的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的 ${spring.profiles.active} 这个配置项来配置。
spring.profiles.active=develop
Note ${spring.profiles.active} 当通过配置文件来指定时必须放在 bootstrap.properties 文件中。
Nacos 上新增一个dataid为:nacos-config-develop.yaml的基础配置,如下所示:
Data ID: nacos-config-develop.yaml
Group : DEFAULT_GROUP
配置格式: YAML
配置内容: current.env: develop-env
启动 Spring Boot 应用测试的代码如下:
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
while(true) {
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
//获取当前部署的环境
String currentEnv = applicationContext.getEnvironment().getProperty("current.env");
System.err.println("in "+currentEnv+" enviroment; "+"user name :" + userName + "; age: " + userAge);
TimeUnit.SECONDS.sleep(1);
}
}
}
启动后,可见控制台的输出结果:
in develop-env enviroment; user name :nacos-config-yaml-update; age: 68
2018-11-02 15:34:25.013 INFO 33014 — [ Thread-11] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6f1c29b7: startup date [Fri Nov 02 15:33:57 CST 2018]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@63355449
如果需要切换到生产环境,只需要更改 ${spring.profiles.active} 参数配置即可。如下所示:
spring.profiles.active=product
同时生产环境上 Nacos 需要添加对应 dataid 的基础配置。例如,在生成环境下的 Naocs 添加了dataid为:nacos-config-product.yaml的配置:
Data ID: nacos-config-product.yaml
Group : DEFAULT_GROUP
配置格式: YAML
配置内容: current.env: product-env
启动测试程序,输出结果如下:
in product-env enviroment; user name :nacos-config-yaml-update; age: 68
2018-11-02 15:42:14.628 INFO 33024 — [Thread-11] ConfigServletWebServerApplicationContext : Closing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@6aa8e115: startup date [Fri Nov 02 15:42:03 CST 2018]; parent: org.springframework.context.annotation.AnnotationConfigApplicationContext@19bb07ed
Note 此案例中我们通过 spring.profiles.active= 的方式写死在配置文件中,而在真正的项目实施过程中这个变量的值是需要不同环境而有不同的值。这个时候通常的做法是通过 -Dspring.profiles.active= 参数指定其配置来达到环境间灵活的切换。
支持自定义 namespace 的配置
首先看一下 Nacos 的 Namespace 的概念, Nacos 概念
用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
在没有明确指定 ${spring.cloud.nacos.config.namespace} 配置的情况下, 默认使用的是 Nacos 上 Public 这个namespae。如果需要使用自定义的命名空间,可以通过以下配置来实现:
spring.cloud.nacos.config.namespace=b3404bc0-d7dc-4855-b519-570ed34b62d7
Note 该配置必须放在 bootstrap.properties 文件中。此外 spring.cloud.nacos.config.namespace 的值是 namespace 对应的 id,id 值可以在 Nacos 的控制台获取。并且在添加配置时注意不要选择其他的 namespae,否则将会导致读取不到正确的配置。
支持自定义 Group 的配置
在没有明确指定 ${spring.cloud.nacos.config.group} 配置的情况下, 默认使用的是 DEFAULT_GROUP 。如果需要自定义自己的 Group,可以通过以下配置来实现:
spring.cloud.nacos.config.group=DEVELOP_GROUP
Note 该配置必须放在 bootstrap.properties 文件中。并且在添加配置时 Group 的值一定要和 spring.cloud.nacos.config.group 的配置值一致。
支持自定义扩展的 Data Id 配置
Spring Cloud Alibaba Nacos Config 从 0.2.1 版本后,可支持自定义 Data Id 的配置。关于这部分详细的设计可参考 这里。 一个完整的配置案例如下所示:
spring.application.name=opensource-service-provider
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.ext-config[0].data-id=ext-config-common01.properties
spring.cloud.nacos.config.ext-config[1].data-id=ext-config-common02.properties
spring.cloud.nacos.config.ext-config[1].group=GLOBALE_GROUP
spring.cloud.nacos.config.ext-config[2].data-id=ext-config-common03.properties
spring.cloud.nacos.config.ext-config[2].group=REFRESH_GROUP
spring.cloud.nacos.config.ext-config[2].refresh=true
可以看到:
• 通过 spring.cloud.nacos.config.ext-config[n].data-id 的配置方式来支持多个 Data Id 的配置。
• 通过 spring.cloud.nacos.config.ext-config[n].group 的配置方式自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
• 通过 spring.cloud.nacos.config.ext-config[n].refresh 的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
Note 多个 Data Id 同时配置时,他的优先级关系是 spring.cloud.nacos.config.ext-config[n].data-id 其中 n 的值越大,优先级越高。
Note spring.cloud.nacos.config.ext-config[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。
通过自定义扩展的 Data Id 配置,既可以解决多个应用间配置共享的问题,又可以支持一个应用有多个配置文件。
为了更加清晰的在多个应用间配置共享的 Data Id ,你可以通过以下的方式来配置:
spring.cloud.nacos.config.shared-dataids=bootstrap-common.properties,all-common.properties
spring.cloud.nacos.config.refreshable-dataids=bootstrap-common.properties
可以看到:
• 通过 spring.cloud.nacos.config.shared-dataids 来支持多个共享 Data Id 的配置,多个之间用逗号隔开。
• 通过 spring.cloud.nacos.config.refreshable-dataids 来支持哪些共享配置的 Data Id 在配置变化时,应用中是否可动态刷新, 感知到最新的配置值,多个 Data Id 之间用逗号隔开。如果没有明确配置,默认情况下所有共享配置的 Data Id 都不支持动态刷新。
Note 通过 spring.cloud.nacos.config.shared-dataids 来支持多个共享配置的 Data Id 时, 多个共享配置间的一个优先级的关系我们约定:按照配置出现的先后顺序,即后面的优先级要高于前面。
Note 通过 spring.cloud.nacos.config.shared-dataids 来配置时,Data Id 必须带文件扩展名,文件扩展名既可支持 properties,也可以支持 yaml/yml。 此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。
Note spring.cloud.nacos.config.refreshable-dataids 给出哪些需要支持动态刷新时,Data Id 的值也必须明确给出文件扩展名。
配置的优先级
Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。
• A: 通过 spring.cloud.nacos.config.shared-dataids 支持多个共享 Data Id 的配置
• B: 通过 spring.cloud.nacos.config.ext-config[n].data-id 的方式支持多个扩展 Data Id 的配置
• C: 通过内部相关规则(应用名、应用名+ Profile )自动生成相关的 Data Id 配置
当三种方式共同使用时,他们的一个优先级关系是:A < B < C
完全关闭配置
通过设置 spring.cloud.nacos.config.enabled = false 来完全关闭 Spring Cloud Nacos Config
Nacos Discovery
该项目通过自动配置以及其他 Spring 编程模型的习惯用法为 Spring Boot 应用程序在服务注册与发现方面提供和 Nacos 的无缝集成。 通过一些简单的注解,您可以快速来注册一个服务,并使用经过双十一考验的 Nacos 组件来作为大规模分布式系统的服务注册中心。
服务注册发现: Nacos Discovery Starter
服务发现是微服务架构体系中最关键的组件之一。如果尝试着用手动的方式来给每一个客户端来配置所有服务提供者的服务列表是一件非常困难的事,而且也不利于 服务的动态扩缩容。Nacos Discovery Starter 可以帮助您将服务自动注册到 Nacos 服务端并且能够动态感知和刷新某个服务实例的服务列表。除此之外,Nacos Discovery Starter 也将服务实例自身的一些元数据信息-例如 host,port,健康检查URL,主页等-注册到 Nacos 。Nacos 的获取和启动方式可以参考 Nacos 官网。
如何引入 Nacos Discovery Starter
如果要在您的项目中使用 Nacos 来实现服务发现,使用 group ID 为 com.alibaba.cloud 和 artifact ID 为 spring-cloud-starter-alibaba-nacos-discovery 的 starter。
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
启动一个 Provider 应用
以下步骤向您展示了如何将一个服务注册到 Nacos。
4.0.0
open.source.test
nacos-discovery-test
1.0-SNAPSHOT
nacos-discovery-test
org.springframework.boot
spring-boot-starter-parent
${spring.boot.version}
UTF-8
UTF-8
1.8
org.springframework.cloud
spring-cloud-dependencies
${spring.cloud.version}
pom
import
com.alibaba.cloud
spring-cloud-alibaba-dependencies
${spring.cloud.alibaba.version}
pom
import
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-actuator
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.springframework.boot
spring-boot-maven-plugin
1. application.properties 配置。一些关于 Nacos 基本的配置也必须在 application.properties(也可以是application.yaml)配置,如下所示: application.properties server.port=8081 spring.application.name=nacos-producer spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 management.endpoints.web.exposure.include=* Note 如果不想使用 Nacos 作为您的服务注册与发现,可以将 spring.cloud.nacos.discovery 设置为 false。 1. 启动 Provider 示例。如下所示: @SpringBootApplication @EnableDiscoveryClient public class NacosProviderDemoApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProducerDemoApplication.class, args);
}
@RestController
public class EchoController {
@GetMapping(value = "/echo/{string}")
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
}
这个时候你就可以在 Nacos的控制台上看到注册上来的服务信息了。
Note 再启动 Provider 应用之前 请先将 Nacos 服务启动。具体启动方式可参考 Nacos 官网。
服务的 EndPoint
spring-cloud-starter-alibaba-nacos-discovery 在实现的时候提供了一个EndPoint,EndPoint的访问地址为 http://ip:port/actuator/nacos-discovery。 EndPoint 的信息主要提供了两类:
1、subscribe: 显示了当前有哪些服务订阅者
2、NacosDiscoveryProperties: 显示了当前服务实例关于 Nacos 的基础配置
一个服务实例访问 EndPoint 的信息如下所示:
{
“subscribe”: [
{
“jsonFromServer”: “”,
“name”: “nacos-provider”,
“clusters”: “”,
“cacheMillis”: 10000,
“hosts”: [
{
“instanceId”: “30.5.124.156#8081#DEFAULT#nacos-provider”,
“ip”: “30.5.124.156”,
“port”: 8081,
“weight”: 1.0,
“healthy”: true,
“enabled”: true,
“cluster”: {
“serviceName”: null,
“name”: null,
“healthChecker”: {
“type”: “TCP”
},
“defaultPort”: 80,
“defaultCheckPort”: 80,
“useIPPort4Check”: true,
“metadata”: {
}
},
"service": null,
"metadata": {
}
}
],
"lastRefTime": 1541755293119,
"checksum": "e5a699c9201f5328241c178e804657e11541755293119",
"allIPs": false,
"key": "nacos-producer",
"valid": true
}
],
“NacosDiscoveryProperties”: {
“serverAddr”: “127.0.0.1:8848”,
“endpoint”: “”,
“namespace”: “”,
“logName”: “”,
“service”: “nacos-provider”,
“weight”: 1.0,
“clusterName”: “DEFAULT”,
“metadata”: {
},
"registerEnabled": true,
"ip": "30.5.124.201",
"networkInterface": "",
"port": 8082,
"secure": false,
"accessKey": "",
"secretKey": ""
}
}
启动一个 Consumer 应用
Consumer 的应用可能还没像启动一个 Provider 应用那么简单。因为在 Consumer 端需要去调用 Provider 端提供的REST 服务。例子中我们使用最原始的一种方式, 即显示的使用 LoadBalanceClient 和 RestTemolate 结合的方式来访问。 pom.xml 和 application.properties 的配置可以参考 1.2 小结。启动一个 Consumer应用的示例代码如下所示:
Note 通过带有负载均衡的RestTemplate 和 FeignClient 也是可以访问的。
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApp {
@RestController
public class NacosController{
@Autowired
private LoadBalancerClient loadBalancerClient;
@Autowired
private RestTemplate restTemplate;
@Value("${spring.application.name}")
private String appName;
@GetMapping("/echo/app-name")
public String echoAppName(){
//使用 LoadBalanceClient 和 RestTemolate 结合的方式来访问
ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
String url = String.format("http://%s:%s/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName);
System.out.println("request url:"+url);
return restTemplate.getForObject(url,String.class);
}
}
//实例化 RestTemplate 实例
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApp.class,args);
}
}
这个例子中我们注入了一个 LoadBalancerClient 的实例,并且手动的实例化一个 RestTemplate,同时将 spring.application.name 的配置值 注入到应用中来, 目的是调用 Provider 提供的服务时,希望将当前配置的应用名给显示出来。
Note 在启动 Consumer 应用之前请先将 Nacos 服务启动好。具体启动方式可参考 Nacos 官网。
启动后,访问 Consumer 提供出来的 http://ip:port/echo/app-name 接口。我这里测试启动的 port是 8082。访问结果如下所示:
访问地址:http://127.0.0.1:8082/echo/app-name
访问结果:Hello Nacos Discovery nacos-consumer
关于 Nacos Starter 更多的配置项信息
更多关于 spring-cloud-starter-alibaba-nacos-discovery 的 starter 配置项如下所示:
配置项 Key 默认值 说明
服务端地址 spring.cloud.nacos.discovery.server-addr 无 Nacos Server 启动监听的ip地址和端口
服务名 spring.cloud.nacos.discovery.service ${spring.application.name} 给当前的服务命名
服务分组 spring.cloud.nacos.discovery.group DEFAULT_GROUP 设置服务所处的分组
权重 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.cluster-name DEFAULT 配置成Nacos集群名称
接入点 spring.cloud.nacos.discovery.enpoint UTF-8 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否集成Ribbon ribbon.nacos.enabled true 一般都设置成true即可
是否开启Nacos Watch spring.cloud.nacos.discovery.watch.enabled true 可以设置成false来关闭 watch
六、 快速搭建
启动了 Nacos server 后,您就可以参考以下示例代码,为您的 Spring Cloud 应用启动 Nacos 配置管理服务了。完整示例代码请参考:nacos-spring-cloud-config-example
spring.application.name=example
说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。
在 Nacos Spring Cloud 中,dataId 的完整格式如下:
p r e f i x − {prefix}- prefix−{spring.profile.active}.${file-extension}
• prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
• spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 p r e f i x . {prefix}. prefix.{file-extension}
• file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
4. 通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新:
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
@RequestMapping("/get")
public boolean get() {
return useLocalCache;
}
}
5. 首先通过调用 Nacos Open API 向 Nacos Server 发布配置:dataId 为example.properties,内容为useLocalCache=true
curl -X POST “http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example.properties&group=DEFAULT_GROUP&content=useLocalCache=true”
6. 运行 NacosConfigApplication,调用 curl http://localhost:8080/config/get,返回内容是 true。
7. 再次调用 Nacos Open API 向 Nacos server 发布配置:dataId 为example.properties,内容为useLocalCache=false
curl -X POST “http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=example.properties&group=DEFAULT_GROUP&content=useLocalCache=false”
8. 再次访问 http://localhost:8080/config/get,此时返回内容为false,说明程序中的useLocalCache值已经被动态更新了。
启动服务发现
本节通过实现一个简单的 echo service 演示如何在您的 Spring Cloud 项目中启用 Nacos 的服务发现功能,如下图示:
完整示例代码请参考:nacos-spring-cloud-discovery-example
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
ii. 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能:
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
@RestController
class EchoController {
@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
public String echo(@PathVariable String string) {
return "Hello Nacos Discovery " + string;
}
}
}
3. 配置服务消费者,从而服务消费者可以通过 Nacos 的服务注册发现功能从 Nacos server 上获取到它要调用的服务。
i. 在 application.properties 中配置 Nacos server 的地址:
server.port=8080
spring.application.name=service-consumer
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
ii. 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能。给 RestTemplate 实例添加 @LoadBalanced 注解,开启 @LoadBalanced 与 Ribbon 的集成:
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}
@RestController
public class TestController {
private final RestTemplate restTemplate;
@Autowired
public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}
@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
public String echo(@PathVariable String str) {
return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
}
}
}
4. 启动 ProviderApplication 和 ConsumerApplication ,调用 http://localhost:8080/echo/2018,返回内容为 Hello Nacos Discovery 2018。