1. 概述与环境搭建
1.1 Nacos是什么
- 一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台
- 替代Eureka做服务注册中心
- 替代Config做服务配置中心
- 集成了负载均衡Ribbon
1.2 官网
如果访问不到网址,可以用4G网络试试
GitHub:https://github.com/alibaba/Nacos
官网:https://nacos.io/zh-cn/index.html
API文档:https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_spring_cloud_alibaba_nacos_discovery
下载地址:https://github.com/alibaba/nacos/releases
1.3 Windows安装Nacos
- 下载windows版本
- 解压安装包
- 进入bin目录打开cmd界面
- 在cmd界面输入
startup.cmd -m standalone
- 访问网址 http://localhost:8848/nacos ,帐号密码都是nacos
1.4 docker安装Nacos
- 下载nacos镜像
docker pull nacos/nacos-server
- 运行nacos镜像
# MODE=standalone表示单机模式,非集群
docker run --env MODE=standalone --name nacos -d -p 8848:8848 nacos/nacos-server
- 访问Nacos管理页面 http://ip地址:8848/nacos
1.5 父工程pom引入SpringCloud Alibaba的依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2. Nacos注册中心
2.1 基于Nacos的服务提供者
- 新建模块cloudalibaba-provider-payment9011
- 根据9011模块复制一个9012模块
2.1.1 pom文件
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web组件 -->
<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>
<!--日常通用jar包配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.1.2 yml文件
server:
port: 9011
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置中心Nacos的地址
# 暴露端点便于监控(非必须,监控时要用到)
management:
endpoints:
web:
exposure:
include: '*'
2.1.3 启动类
启动类添加@EnableDiscoveryClient注解
package com.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient // 开启注册中心功能
public class NacosPaymentMain9011 {
public static void main(String[] args) {
SpringApplication.run(NacosPaymentMain9011.class,args);
}
}
2.1.4 控制器
package com.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/get/{id}")
public String get(@PathVariable("id") Integer id){
return "端口:"+serverPort+",id:"+id;
}
}
2.1.5测试
-
启动9011
-
启动9012
-
访问 http://localhost:9011/payment/get/2
-
访问注册中心管理界面 http://localhost:8848/nacos
2.2 基于Nacos的服务消费者
- 新建模块cloudalibaba-consumer-order6011
- OpenFeign版本略
2.2.1 pom文件
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringBoot整合Web组件 -->
<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>
<!--日常通用jar包配置-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2.2.2 pom文件
server:
port: 6011
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
2.2.3 启动类
package com.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient // 开启注册中心功能
public class NacosOrderMain6011 {
public static void main(String[] args) {
SpringApplication.run(NacosOrderMain6011.class,args);
}
// RestTemplate实例
@Bean
@LoadBalanced // 负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
2.2.4 控制器
package com.springcloud.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serverURL;
@GetMapping("/consumer/payment/get/{id}")
public String get(@PathVariable("id") Integer id){
return restTemplate.getForObject(serverURL+"/payment/get/"+id,String.class);
}
}
2.2.5 测试
- 依次启动9011、9012、6011
- 多次访问 http://localhost:6011/consumer/payment/get/2
3. Nacos配置中心
- 配置中心不用手动代码搭建,直接在Nacos管理界面可查看
- 配置中心自带动态刷新配置功能,Nacos管理界面修改配置文件立即生效,不用额外的cmd命令
3.1 基础配置
新建cloudalibaba-config-nacos-client3377模块
3.1.1 pom文件
<dependencies>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--web + actuator-->
<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>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
3.1.2 yml文件
- bootstrap.yml
# nacos配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式的配置
- application.yml
spring:
profiles:
active: dev # 表示开发环境
3.1.3 启动类
package com.springcloud;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class,args);
}
}
3.1.4 控制器
package com.springcloud.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope //在控制器类加入@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能。
public class ConfigClientController {
// 获取配置中心的配置文件中的属性
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo(){
return configInfo;
}
}
3.1.4 Data ID匹配规则
最终公式:${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
3.1.5 在Nacos配置中心界面新建配置
3.1.6 测试
- 启动3377
- 访问http://localhost:3377/config/info
- 修改配置中心的配置文件内容
- 再次访问http://localhost:3377/config/info
3.2 分类配置
3.2.1 概述
-
Namespace默认public,Group默认DEFAULT_GROUP, Cluster默认DEFAULT
-
Namespace用于生产环境隔离,比方说我们现在有三个环境:开发、测试、生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。
-
Group对不同的微服务进行分组
-
Service就是微服务;一个Service可以包含多个Cluster(集群),Nacos默认Cluster是DEFAULT,Cluster是对指定微服务的一个虚拟划分。比方说为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时就可以给杭州机房的Service微服务起一个集群名称(HZ),给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。
-
Instance,就是微服务的实例。
3.2.2 配置文件匹配规则
配置文件匹配规则:Namespace+Group+Data ID
Data ID匹配规则:服务名-生产环境.配置文件后缀名
${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
3.2.3 新建命名空间
3.2.4 在命名空间下新建配置并指定分组
3.2.5 根据命名空间和分组查找配置文件
namespace:命名空间ID
group:分组名称
# nacos配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos服务注册中心地址
config:
server-addr: localhost:8848 # Nacos作为配置中心地址
file-extension: yaml # 指定yaml格式的配置
namespace: test # 命名空间ID,主要是ID,不是名称
group: 3377_GROUP # 分组名称
profiles:
active: test # 表示测试环境
# active: dev # 表示开发环境
3.2.6 测试
4. Nacos集群
4.1 架构图
4.2 MySQL
4.2.1 MySQL安装
4.2.2 执行Nacos建表语句
- 新建一个名字nacos-config的数据库
- 执行Nacos建表语句
-
方式1:下载的安装包的conf目录下的nacos-mysql.sql
-
方式2:GitHub上的SQL
- 执行完效果
4.3 Docker构建Nacos集群
分别运行以下3个镜像
docker run -d \
-p 8845:8848 \ #把docker容器内的8848端口映射到Linux的8845端口
--name c_nacos1 \ # 容器名称
-e MODE=cluster \ # 集群模式
-e NACOS_SERVERS="192.168.23.131:8845 192.168.23.131:8846 192.168.23.131:8847" \ # Nacos集群的主机,因为是单机3个docker容器,所以用端口区分
-e SPRING_DATASOURCE_PLATFORM=mysql \ # 使用mysql持久化保存Nacos数据
-e MYSQL_SERVICE_HOST=192.168.23.131 \ # mysql所在的主机IP
-e MYSQL_SERVICE_PORT=3306 \ # mysql端口号
-e MYSQL_SERVICE_DB_NAME=nacos_config \ # nacos数据库的数据库名
-e MYSQL_SERVICE_USER=root \ # mysql帐号
-e MYSQL_SERVICE_PASSWORD=root \ # mysql密码
nacos/nacos-server:2.0.2
docker run -d \
-p 8846:8848 \
--name c_nacos2 \
-e MODE=cluster \
-e NACOS_SERVERS="192.168.23.131:8845 192.168.23.131:8846 192.168.23.131:8847" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.23.131 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
nacos/nacos-server:2.0.2
docker run -d \
-p 8847:8848 \
--name c_nacos3 \
-e MODE=cluster \
-e NACOS_SERVERS="192.168.23.131:8845 192.168.23.131:8846 192.168.23.131:8847" \
-e SPRING_DATASOURCE_PLATFORM=mysql \
-e MYSQL_SERVICE_HOST=192.168.23.131 \
-e MYSQL_SERVICE_PORT=3306 \
-e MYSQL_SERVICE_DB_NAME=nacos_config \
-e MYSQL_SERVICE_USER=root \
-e MYSQL_SERVICE_PASSWORD=root \
nacos/nacos-server:2.0.2
4.4 Nginx
# 安装Nginx
docker pull nginx
# 运行镜像
docker run -d -p 1111:80 --name c_nginx nginx
# 进入容器
docker exec -it c_nginx /bin/bash
# 安装vim工具
apt-get update
apt-get -y install vim
# 进入nginx目录
cd /etc/nginx
#备份nignx配置文件
cp nginx.conf nginx.conf.bk
# 修改配置文件
vim /etc/nginx/nginx.conf
在gzip on下面添加以下代码
# 负载均衡配置
upstream nacos{
# 3个docker的nacos
server 192.168.23.131:8845;
server 192.168.23.131:8846;
server 192.168.23.131:8847;
}
server{
listen 80; # 这里监听的是80端口,而不是1111,因为docker进行了映射
server_name 192.168.23.131; # 监听访问的地址主机
location / {
proxy_pass http://nacos; # 引用上面的负载均衡配置
}
}
# 退出nginx容器
exit
# 重启nginx容器
docker restart c_nginx
访问http://192.168.23.131:1111/nacos/#/login