SpringCloud Alibaba微服务之Nacos
1.简介
官方网址:
https://nacos.io/zh-cn/docs/what-is-nacos.html
https://nacos.io/zh-cn/docs/quick-start-spring-cloud.html
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
从上图不难看出,一个Nacos干掉了Spring Cloud的三大组件,分别是注册中心Eureka
、服务配置Config
,服务总线Bus
。
2.Nacos服务端搭建
用过Nacos的开发者都说很爽,不用自己搭建服务,阿里给你准备好了服务,只需要启动即可;界面中英文都有,很适合初学者。
2.1 下载nacos
下载地址: https://github.com/alibaba/nacos/releases/tag/2.1.0
下载并解压后可以看到以下目录结构:
tar --zxvf nacos-server-1.1.4.tar.gz
2. 启动nacos
单机版
- 启动命令:sh startup.sh -m standalone
- 关闭命令:sh shutdown.sh
看到这个就表示nacos服务已经启动起来
集群版
- 启动命令:sh startup.sh
- 关闭命令:sh shutdown.sh
3.访问验证
输入ip地址+端口号8848/nacos就可以访问
默认用户名:nacos 密码:nacos
到此nacos服务器端的搭建就完成了。
4.nacos配置文件
nacos的配置文件在文conf文件夹里面,包括对nacos的端口号、集群配置、配置数据库连接等信息。
5.nacos的数据持久化
Nacos使用的是内嵌数据库 Derby
(Apache Derby),目前Nacos仅支持Mysql
数据库,且版本要求:5.6.5+
,也可通过修改配置文件把数据持久化到mysql数据库。
5.1 修改配置文件
在配置文件application.properties文件中添加mysql数据库连接配置信息
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000 &autoReconnect=true
db.user.0=root
db.password.0=root
5.2 重启nacos服务
5.3 重新打开nacos,新添加一个命名空间
5.4 数据库查询
新建的的命名空间存储在表tenant_info表中的,通过查询该表说明数据已经持久化到我们指定的mysql数据库中
6. 集群化部署Nacos
官方文档: 集群部署
方法一
集群部署步骤:
1、解压nacos安装包,执行命令将nacos的名字改成nacos-8848、nacos-8858、nacos-8868,作为三个服务方便区分。命令:mv nacos nacos8848。
2、创建数据库,集群的nacos需要连接数据库保存配制信息,在nacos的解压包中有初始脚本,位置/usr/local/nacos8849/conf/nacos-mysql.sql ,在创建的数据库中直接执行。
3、配制数据源,位置/usr/local/nacos8849/conf/application.properties,配制内容如下。
server.contextPath=/nacos
server.servlet.contextPath=/nacos
server.port=8849
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user.0=root
db.password.0=XXXX
4、配制集群cluster,将原cluster.conf.example改为cluster.conf,位置/usr/local/nacos8849/conf。
#it is ip
#example
XX.XX.59.125:8848
XX.XX.59.125:8849
这里有一个坑,就是这个IP不能在阿里云配制为127.0.0.1,得采用它本地的IP。
docker部署可以参考: https://blog.csdn.net/m0_53151031/article/details/123118920
方法二
方法一比较简单,但是需要复制多份nacos文件,而且需要修改每份nacos下面的配置文件,也比较麻烦。下面通过修改startup.sh脚本文件,通过使用参数-p xxxx
来指定端口号来启动
-
修改startup.sh脚本文件
- 添加参数-p
while getopts ":m:f:s:p:" opt do case $opt in m) MODE=$OPTARG;; f) FUNCTION_MODE=$OPTARG;; s) SERVER=$OPTARG;; p) PORT=$OPTARG;; ?) echo "Unknown parameter" exit 1;; esac done
修改后:
-
添加启动参数
$Dserver.port=${PORT}
# start echo "$JAVA ${JAVA_OPT}" > ${BASE_DIR}/logs/start.out 2>&1 & nohup $JAVA $Dserver.port=${PORT} ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 & echo "nacos is starting,you can check the ${BASE_DIR}/logs/start.out"
修改后
-
启动验证
使用命令
sh ./startup.sh -p xxxx
指定不同的端口号启动集群部署nacos
3.Nacos客户端搭建
3.1 Nacos服务注册中心
微服务的服务注册和发现相信都用过Eureka,要自己本地构建一个Eureka微服务,但是整合了Alibaba的Nacos则不用那么复杂,直接启动Alibaba提供的Nacos服务即可,这样让程序员把全部精力放在业务上,下面是一个简单的架构图:
服务注册(服务提供者)
-
引入依赖
<dependencies> <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>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies>
-
修改配置文件
server: port: 8081 spring: application: name: nacos-producer cloud: nacos: discovery: server-addr: 192.168.123.103:8848 enabled: true #如果不想使用 Nacos 作为您的服务注册与发现,设置为false management: endpoints: web: exposure: include: '*'
-
启动服务
@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的服务列表就可以找到刚才创建的服务提供者nacos-producer
服务消费
-
引入依赖
<dependencies> <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>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies>
-
修改配置文件application.yml
spring: application: name: nacos-consumer cloud: nacos: discovery: server-addr: 192.168.123.103:8848 enabled: true server: port: 8201 management: endpoints: web: exposure: include: '*'
-
RestTemplate配置
在 Consumer 端需要去调用 Provider 端提供的REST 服务。我们使用最原始的一种方式, 即显示的使用 RestTemolate 的方式来访问
@Configuration public class ApplicationContextConfig { @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } }
-
调用服务提供者的接口
@RestController public class ConsumerController { @Autowired private RestTemplate restTemplate; @GetMapping("/echo/app-name") public String echoAppName(){ String s = restTemplate.getForObject("http://nacos-provider-payment/echo/hello",String.class); return s; } }
-
验证调用提供者接口
到此,服务的注册与发现功能就完毕,服务提供者和消费者都已经注册到服务注册中心nacos中,Nacos的服务注册发现很简单,比Eureka简单多了,无需自己构建个注册中心。
额外补充
nacos与Eureka的对比
Nacos的配置项信息
配置项 | 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 |
Springcloud Alibaba各个组件的版本关系
官方文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明
3.2 Nacos配置中心
官方文档: Nacos config
1. 基础配置
- 添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 添加配置文件 application.yml和bootstrap.yml
Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,拉取之后,才能保证项目的正常启动。springboot中配置文件的加载是存在优先级顺序的,bootstrap优先级高于application
- bootstrap.yml配置文件
server:
port: 3377
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos作为服务注册中心地址
config:
server-addr: localhost:8848 #nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
group: DEV_GROUP
namespace: 3e1a6d2a-63dc-4e1a-9318-3bd41c7d16c8
application:
name: nacos-config-client
- application.yml配置文件
spring:
profiles:
active: info
-
在nacos中添加配置文件
DataId的命名规则:
spring-cloud-starter-alibaba-nacos-config 在加载配置的时候,加载dataid为
${spring.application.name}-${profile}.${file-extension:properties}
的基础配置。在日常开发中如果遇到多套环境下的不同配置,可以通过Spring 提供的${spring.profiles.active}
这个配置项来配置。 -
创建controller访问接口,从配置中心获取配置信息
@RestController @RefreshScope //支持Nacos动态刷新 public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/config/info") public String getConfigInfo() { return configInfo; } }
-
访问接口,验证获取配置信息
Nacos配置中心配置如下
2. 分类配置
类似java里面的package名和类名,最外层的namespace是可以用于区分部署环境的,Group和dataId逻辑上区分2个目标对象
比如我们现在有:开发、测试、生产环境,我们就可以创建3个nameSpace,不同的nameSpace之间是隔离的。Group默认是default_group,Group可以把不同的微服务划分到同一个分组里面去
在bootstrap.yml配置中通过配置不同的namespace以及group来选择不同的配置文件