SpringCloud Alibaba微服务之Nacos
1.简介
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
从上图不难看出,一个Nacos干掉了Spring Cloud的三大组件,分别是注册中心Eureka
、服务配置Config
,服务总线Bus
。
2.Nacos服务端搭建
用过Nacos的开发者都说很爽,不用自己搭建服务,阿里给你准备好了服务,只需要启动即可;界面中英文都有,很适合初学者。
2.1 下载nacos
下载并解压后可以看到以下目录结构:
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部署可以参考:
方法二
方法一比较简单,但是需要复制多份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 | 默认值 | 说明 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Springcloud Alibaba各个组件的版本关系
3.2 Nacos配置中心
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来选择不同的配置文件