0. 前言
最近搭建了一套SpringCloud架构的微服务的系统,所用的组件包括:Nacos、Spring Cloud Gateway、Sentinel、ELK、Promethues。
这里算是最简单的框架了:Nacos既作为服务中心,又当配置中心,算是整个体系的中控基础;Spring Cloud Gateway做应用内流量的导向,通过Sentinel对流量进行限流控制,又通过Auth中心进行认证,算是整个体系的前线核心;ELK收集日志,Promethues监控资源,算是整个体系保障。
下边分几篇文章将整个的搭建过程进行一个整理,本篇是第一章Nacos的搭建记录。
1. 简介
Nacos有两个主要功能:服务中心与配置中心。
服务示例在启动时,将数据注册到服务中心的注册表中,并在关闭的时候注销他们。服务的客户端查询服务注册表,以查找可用的示例。服务注册中心还有通过心跳信号来检测服务的健康情况。
配置管理是将原本在application.yml配置文件中的配置统一到配置中心来管理,这样能方便运维管理。 架构图如下:
2. Nacos安装
nacos可以搭建standalone,也可以搭建成cluster,这方面官网说的比较详细了,本地搭建成standalone模式。
最简单的安装方式:
docker pull nacos/nacos-server
docker run --name nacos -d -p 8848:8848 -e MODE=standalone nacos/nacos-server
但这样数据都是在nacos-server容器中的,一旦容器删除,则造成了严重的损失,所以采用standalone的mysql方式。
先从官网git库中下载文档
git clone https://github.com/nacos-group/nacos-docker.git
然后根据自己的需要进行修改:
version: '3.4'
services:
diego-nacos:
image: nacos/nacos-server:v2.0.4
hostname: diego-nacos
env_file:
- ./env/nacos-standlone-mysql.env
ports:
- "8848:8848"
- "9848:9848"
- "9555:9555"
depends_on:
- diego-nacos-mysql
restart: on-failure
networks:
- diego-network
deploy:
replicas: 1
diego-nacos-mysql:
image: nacos/nacos-mysql:5.7
hostname: diego-nacos-mysql
env_file:
- ./env/mysql.env
volumes:
- /home/sun/database/nacos_mysql_data:/var/lib/mysql
ports:
- "3307:3306"
networks:
- diego-network
deploy:
replicas: 1
networks:
diego-network:
external: true
在docker-compose.yml同层下创建env文件夹,存放mysql.env与nacos-standlone-mysql.env,这两个从官网移植过来,将nacos-standlone-mysql.env中MYSQL_SERVICE_HOST进行修改即可。
然后就可以通过http://127.0.0.1:8848/nacos进行访问,初始的账号、密码都是nacos。
ps:这里有篇裸机搭建nacos集群的文章
3. 业务服务
3.1 依赖
包括服务发现与配置:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
这要注意SpringCloud、SpringCloudAlibaba的版本对应。
我用的版本是:
- Spring Cloud Alibaba :2.2.6.RELEASE
- Spring Cloud: Spring Cloud Hoxton.SR9
- Spring Boot Version: 2.3.2.RELEASE
3.2 配置
-
登录http://127.0.0.1:8848/nacos/
创建命名空间cloud
-
bootstrap.yml:
spring:
application:
name: order-server
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: 553aff19-8cd6-4d4e-99a8-6671f51394b6
config:
enabled: true
file-extension: yaml
namespace: 553aff19-8cd6-4d4e-99a8-6671f51394b6
制定namespace的id
3.3 使用
-
EnableDiscoveryClient
@Slf4j
@SpringBootApplication
@EnableDiscoveryClient
@MapperScan({"com.sun.order.mapper"})
public class OrderApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(OrderApplication.class, args);
log.info("Order Server Started!");
log.info(applicationContext.getEnvironment().getProperty("app.discount"));
}
}
-
服务发现的使用
完成上述配置后,启动服务,可以在Nacos页面的服务管理 -> 服务列表 中看到相应的服务了;
这样已经注册到了Nacos,其他服务注册也注册之后,就可以通过服务名直接访问该服务了;
如在Feign中使用:
@FeignClient(name = "auth-server", contextId = "user", path="/user")
public interface UserService {
@GetMapping("/{id}")
User getUser(@PathVariable Long id);
}
-
配置中心的直接使用
在配置中心cloud下,创建服务名同名的配置(格式选择yml)
然后就可以直接像使用普通property一样使用了,如:
@ConfigurationProperties("app")
@RefreshScope
@Data
@Component
public class OrderConfig {
private Integer discount = 100;
}
-
配置中心的监听使用
还用一种动态配置方式:
- 通过nacos创建配置项,格式可以是json
- 业务服务中,监听该配置
- 当Nacos中配置发生改变时,会进行回调,通过回调函数对配置进行解析与处理
gateway中的动态路由以及熔断策略都是用的这种方式,具体的示例见下一节gateway
4. 结语
配置中心是整个体系的基础,它维护整个系统的服务名、ip等基本信息,为服务间的通信提供了基础。细想这个过程与DNS是挺接近的。它的具体实现需要单独拿来进行研究。
服务中心除了Nacos,还可以选择Consul,Consul的DNS功能很出色,还有就是Consul对Promethues的支持更好,这个我们在Promethues再去聊。