此文章主要讲解springcloud中的服务注册和配置中心Nacos的相关知识。
Spring Cloud Alibaba
Github官网:https://github.com/alibaba/spring-cloud-alibaba
概述
之所以有Spring CloudAlibaba,是因为Spring Cloud Netflix项目进入维护模式
。
不是不更新了,是不会开发新组件了,所以,某些组件都有代替版了,比如 Ribbon 由 Loadbalancer 代替等等。
支持的功能
服务限流降级:默认支持Servlet、Feign、RestTemplate、Dubbo和RocketMQ限流降级功能的接入,可以在运行时通过控制台实时修改限流降级规则,还支持查看限流降级Metrics 监控。
服务注册与发现:适配Spring Cloud服务注册与发现标准,默认集成了Ribbon的支持。
分布式配置管理:支持分布式系统中的外部化配置,配置更改时自动刷新。
消息驱动能力:基于Spring Cloud Stream为微服务应用构建消息驱动能力。
阿里云对象存储:阿里云提供的海量、安全、低成本、高可靠的云存储服务。支持在任何应用、任何时间、任何地点存储和访问任意类型的数据。
分布式任务调度:提供秒级、精准、高可靠、高可用的定时(基于Cron表达式)任务调度服务。同时提供分布式的任务执行模型,如网格任务。网格任务支持海量子任务均匀分配到所有Worker (schedulerx-client)上执行。
这几乎可以将之前的 Spring Cloud NetFlix 代替。
怎么玩
<!--spring cloud Alibaba-->
<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>
具体组件:
Nacos简介
为什么叫Nacos?
- 前四个字母为Naming和Configuration的前两个字母,最后的s为Service。
Nacos是什么?
-
是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
-
Nacos:Dynamic Naming and Configuration Service。
-
Nacos就是注册中心和配置中心的结合,换言之Nacos=Eureka+Config+Bus。
Nacos能干嘛?
-
替代Eureka做服务注册中心。
-
替代Config做服务配置中心。
去哪里下?
各种注册中心比较
C(Consistency):一致性
A(Availability):可用性
P(Partition tolerance):分许容错性
服务注册和发现 | CAP模型 | 控制台管理 | 社区活跃度 |
---|---|---|---|
Eureka | AP | 支持 | 低(2.x版本闭源) |
Zookeeper | CP | 不支持 | 中 |
Consul | CP | 支持 | 高 |
Nacos | AP | 支持 | 高 |
据说Nacos在阿里内部有超过10万的实例运行,已经过了类似双十一等各种大型流量的考验。
安装和运行
安装
准备工作
- 本地安装有
JDK8
和Maven3.x
环境。
下载
运行
-
解压缩安装包。
-
直接在bin目录下,使用
startup.cmd -m standalone
命令启动Nacos。以单机模式启动。 -
命令运行成功后直接访问 http://localhost:8848/nacos (默认用户名和密码为
nacos/nacos
)。
- 登录成功,结果页面:
Nacos作为服务注册中心
记得在父工程中引入 Spring Cloud Alibaba 依赖
<!--spring cloud Alibaba-->
<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>
基于Nacos的服务提供者
新建Module
cloudalibaba-provider-payment9001
POM文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring_cloud_atguigu_2020</artifactId>
<groupId>com.itjing.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-provider-payment9001</artifactId>
<dependencies>
<!-- springcloud alibaba 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包,导入了mybatis记得配置数据库url-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</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>
<!-- 引入自己定义的api通用包-->
<dependency>
<groupId>com.itjing.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
YML文件
server:
port: 9001
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 配置Nacos的地址
# 暴露监控端点
management:
endpoints:
web:
exposure:
include: '*'
主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class, args);
}
}
业务逻辑
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping(value = "/payment/nacos/{id}")
public String payment(@PathVariable(value = "id") Integer id) {
return "Nacos的注册中心的端口是:" + serverPort + ",id是:" + id;
}
}
测试
启动 9001
访问: http://localhost:8848/nacos/ ,查看注册情况
再次新建提供者
Nacos 自带负载均衡机制
为了演示 nacos 的负载均衡,参照 9001 新建 9002
或者可以拷贝虚拟端口映射:
基于Nacos的服务消费者
新建Module
cloudalibaba-consumer-order80
POM文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring_cloud_atguigu_2020</artifactId>
<groupId>com.itjing.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-consumer-order80</artifactId>
<dependencies>
<!-- springcloud alibaba 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>
<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>
<!-- 引入自己定义的api通用包-->
<dependency>
<groupId>com.itjing.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
</project>
YML文件
server:
port: 80
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 配置Nacos的地址
# 暴露监控端点
management:
endpoints:
web:
exposure:
include: '*'
# 消费者将要去访问的微服务名称(成功注册进nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class OrderMain80 {
public static void main(String[] args) {
SpringApplication.run(OrderMain80.class, args);
}
}
业务逻辑
配置类
nacos底层也是ribbon,需要注入ReatTemplate
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced // 负载均衡
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
Controller
@RestController
@Slf4j
public class OrderController {
@Value("${service-url.nacos-user-service}")
private String serverURL;
@Resource
private RestTemplate restTemplate;
@GetMapping("/consumer/nacos/{id}")
public String orderId(@PathVariable("id") Long id) {
return restTemplate.getForObject(serverURL + "/payment/nacos/" + id, String.class);
}
}
测试
- 启动两个提供者 9001/9002
- 启动消费者 80
测试访问: http://localhost/consumer/nacos/1 ,成功,并且实现了负载均衡
。
各种服务注册中心对比
Nacos生态图
Nacos服务发现实例模型
Nacos和其他注册中心特性对比
Nacos支持AP和CP模式的切换
概述
-
如果不需要存储服务级别的信息且服务实例是通过Nacos Client注册,并能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如Spring Cloud和Dubbo服务,都适用于AP模式,AP模式为了服务的可用性而减弱了一致性,因此AP模式下只支持临时实例。
-
如果需要在服务级别编辑或者存储配置信息,那么CP是必须,K8s服务和DNS服务则使用于CP模式。CP模式下支持注册服务化实例,此时则是以Raft协议为集群运行模式,该模式下注册实例之前必须先注册服务,如果服务不存在,则会返回错误。
模式切换
- Nacos集群默认支持的CAP原则中的AP原则,但是也可以支持CP原则,切换命令如下:
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
- 同时微服务的bootstrap.properties需要配置如下选择指明注册为临时/永久实例(AP模式不支持数据一致性,所以只支持服务注册的临时实例,CP模式支持服务注册的永久实例)。
#false为永久实例,true表示临时实例开启,注册为临时实例
spring.cloud.nacos.discovery.ephemeral=false
Nacos配置中心
Nacos作为服务配置中心的基础配置
新建Module
cloudalibaba-nacos-config3377
POM文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>spring_cloud_atguigu_2020</artifactId>
<groupId>com.itjing.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-nacos-config3377</artifactId>
<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>
</dependencies>
</project>
YML文件
-
Nacos 和 Spring Cloud Config一样,在项目初始化的时候,要保证先从配置中心进行配置拉取,拉取配置之后,才能保证项目的正常启动。
-
SpringBoot中配置文件的加载时存在优先级顺序的,bootstrap优先级高于application。
bootstrap.yml
,系统级别的
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格式的配置
management:
endpoints:
web:
exposure:
include: '*'
application.yml
,用户自定义的
spring:
profiles:
active: dev # 表示开发环境
以上两个文件放在一起,表明从 nacos 上拉取 dev 环境的配置文件。
主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}
Controller
@RestController
@RefreshScope //支持Nacos的动态刷新
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo(){
return configInfo;
}
}
向Nacos中添加配置信息
-
Nacos中的dataId的组成格式和Spring Cloud中的配置文件的匹配规则。
${prefix}-${spring.profiles.active}.${file-extension}
-
官方地址。
从上面可以看到重要的一点,配置文件的名称第二项,spring.profiles.active 是依据当前环境的profile属性值的,也就是这个值如果是 dev,即开发环境,它就会读取 dev 的配置信息,如果是test,测试环境,它就会读取test的配置信息,就是从 spring.profile.active 值获取当前应该读取哪个环境下的配置信息。
则根据之前的配置文件, Nacos 的 Data Id 应为:nacos-config-client-dev.yaml
新建配置:
测试
启动 cloudalibaba-nacos-config3377 的主启动类
调用接口查看: http://localhost:3377/config/info
自带动态刷新
修改 Nacos 中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新。
这样以后就不用在项目中建立配置中心了,客户端直接刷新了。
Nacos作为服务配置中心的分类配置
问题:多项目多环境问题
问题1
- 在实际开发中,通常一个系统会准备:
dev开发环境,test测试环境,prod生产环境
。如何保证指定环境启动时服务能正确读取到Nacos上相应环境的配置文件?
问题2
- 一个大型分布式微服务会有很多微服务子项目,每个微服务服务又都会有相应的开发环境、测试环境、预发布环境、正式环境等等,如果对这些微服务配置进行管理?
Nacos图形化界面管理
配置列表
命名空间
Namespace+Group+DataId什么关系,为什么这么设计?
Namespace+Group+DataId是什么?
-
Namespace+Group+DataId
类似于Java里面的package(包名)和类名
。 -
最外层的namespace是可以用于
区分部署环境
的,Group和DataId逻辑上区分两个目标对象。
Namespace+Group+DataId的关系以及设计的意图
-
默认情况下,
Namespace=public
、Group=DEFAULT_GROUP
,默认Cluster是DEFAULT
。 -
Nacos的默认的命名空间是public,
Namespace主要用来实现隔离
。比如说,现在有三个环境:开发、测试和生产环境,我们就可以创建三个Namespace,不同的Namespace之间是隔离的。 -
Group默认是DEFAULT_GROUP,Group可以把不同的微服务划分到同一个分组里面。
-
Service就是微服务。
一个Service可以包含多个Cluster(集群)
,Nacos默认Cluster就是DEFAULT
,Cluster是对指定微服务的一个虚拟划分。比如说,为了容灾,将Service微服务分别部署在了杭州机房和广州机房,这时候就可以给杭州机房的Service微服务起一个集群名称(HZ),给广州机房的Service微服务起一个集群名称(GZ),还可以尽量让同一个机房的微服务互相调用,以提升性能。 -
Instance,就是微服务的实例。
三种方案加载配置
DataID方案
- 指定
spring.profile.active
和配置文件的DataID
来使不同环境下读取不同的配置(常用) - 默认空间+默认分组+新建 dev 和 test 两个 DataID:
- 新建dev配置DataID
- 新建test配置DataID
- 通过 spring.profile.active 属性就能进行多环境下配置文件的读取
Group方案
通过Group实现环境区分,新建配置指定不同Group
在 bootstrap.yml中的 config 下增加一条 group的配置即可
Namespace方案
新建 dev/test 的 Namespace,会自动给创建的命名空间分配命名空间ID
。
可以看到多出了两个命名空间。
dataid、group、namespace 三者关系如下:
(不同的dataid,是相互独立的,不同的group是相互隔离的,不同的namespace也是相互独立的)
Nacos集群和持久化配置(重要)
官网说明
官网地址
- 官网地址。
官网集群架构图
Nacos集群架构图理解
说明
单机版的Nacos持久化配置
-
Nacos默认自带的是
嵌入式数据库derby
,不方便观察数据存储的基本情况,需要将数据源由derby切换到MySQL。 -
derby切换到MySQL的步骤:
- 安装MySQL数据库,版本要求5.6.5+。
- 初始化MySQL数据库,数据库的sql脚本在
nacos/conf/nacos-mysql.sql
文件中
-
修改
conf/application.properites
文件,增加支持MySQL数据源配置(目前只支持MySQL
),添加MySQL的数据源的URL、用户和密码等。spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=root
-
启动Nacos
Linux版Nacos+MySQL生产环境配置
准备工作
-
Nginx:1个。
-
Nacos Server:3个。
-
MySQL:1个(IP地址为192.168.32.100,端口是3306)。
-
Centos7:3个(IP地址分别为192.168.32.100、192.168.32.101和192.168.32.102)。
逻辑架构图
在每个Centos7系统中下载Linux版本的Nacos
cd /opt
wget https://github.91chifun.workers.dev//https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-server-1.3.2.tar.gz
tar -zxvf nacos-server-1.3.2.tar.gz
数据库环境
将nacos-mysql.sql文件导入到每个CentOS7系统的MySQL数据库中
持久化配置
在每个CentOS7系统上的Nacos的conf/application.properties
文件中加入如下的配置:
# 在最后一行添加
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://192.168.32.100:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=123456
集群配置
- 在每个CentOS7系统上的Nacos的
conf
目录,复制cluster.conf.example
文件,并改名为cluster.conf
:
cp cluster.conf.example cluster.conf
- 修改每个CentOS7系统上的Nacos的
conf/cluster.conf
文件,并添加如下的配置,指定哪几个节点是Nacos集群: - 前面的ip地址不能写127.0.0.1,必须是用Linux命令
hostname -i
能够识别的ip
192.168.32.100:8848
192.168.32.101:8848
192.168.32.102:8848
- 分别启动各个Nacos服务。
/opt/nacos/bin
./startup.sh
修改Nginx的配置文件并启动Nginx
- nginx.conf
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main '$remote_addr - $remote_user [$time_local] "$request" '
# '$status $body_bytes_sent "$http_referer" '
# '"$http_user_agent" "$http_x_forwarded_for"';
#access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
# -----------修改-----------------
upstream nacos {
server 192.168.32.100:8848;
server 192.168.32.101:8848;
server 192.168.32.103:8848;
}
# -----------修改-----------------
server {
# -----------修改-----------------
listen 8089;
# -----------修改-----------------
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
# -----------修改-----------------
location ^~ /nacos{
proxy_pass http://nacos;
# nginx非80端口处理
proxy_set_header Host $host:$server_port;
# 获取真实IP
proxy_set_header X-Real-IP $remote_addr;
# 获取代理者的真实ip
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 解决getScheme,isSecure,sendRedirect
proxy_set_header X-Forwarded-Scheme $scheme;
client_max_body_size 1000m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffer_size 4k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 64k;
}
# -----------修改-----------------
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
在一台Linux上搭建伪集群
1、由于学习配置的问题,这里只能在一台机器上搭建伪集群。
2、下载安装Nacos的Linux版安装包,解压
3、进入mysql,执行nacos自带的sql文件
4、修改配置文件,切换为我们的mysql,即 conf/application.properties
,和上面一样
5、修改 conf/cluster.conf
,指定哪几个节点是Nacos集群,这里使用3333/4444/5555作为三个Nacos节点监听的端口
192.168.111.144:3333
192.168.111.144:4444
192.168.111.144:5555
6、模拟三台nacos服务,编辑nacos的startup启动脚本,使他能够支持不同的端口启动多次
修改 startup.sh
,内容如下:
![1597815675706](https://i-blog.csdnimg.cn/blog_migrate/732f98526c1fadaaf5f23164c379cfea.png)
7、nginx配置,修改nginx.conf
8、启动Nacos
./startup.sh -p 3333
./startup.sh -p 4444
./startup.sh -p 5555
9、启动nginx
10、测试,访问192.168.111.144:1111,如果可以进入nacos的web界面,就证明安装成功了
11、新建配置测试,在Linux服务器查看mysql是否插入一条记录
12、将微服务注册到Nacos集群
13、启动微服务,进入Nacos界面,可以看到,已经注册成功
14、总结
Docker搭建集群
官方教程地址:点我跳转
单服务器部署集群
1、从git上下载nacos-docker项目,本地目录为/opt/nacos-docker
# 如果linux上没有 git ,需要安装
yum -y install git
# 克隆项目,官方的github下载太慢
git clone https://github.com/nacos-group/nacos-docker.git /opt/nacos-docker
# 可以使用国内gitee的下载
git clone https://gitee.com/BetterMe1125/nacos-docker.git /opt/nacos-docker
2、安装docker-compose( docker 提供的一个命令行工具,用来定义和运行由多个容器组成的应用)
# 官方
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 这个可能快点
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
3、给docker-compose授权
[root@iz2ze4lfnjztrjppyfbqo1z bin]# chmod +x /usr/local/bin/docker-compose
4、运行nacos-docker脚本
首先对 cluster-hostname.yaml
进行修改
version: "3"
services:
nacos1:
hostname: nacos1
container_name: nacos1
image: nacos/nacos-server:1.1.4
environment:
- MODE=cluster # 集群模式
- NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
- PREFER_HOST_MODE=hostname
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_MASTER_SERVICE_HOST=47.94.217.177 # mysql数据库对应的ip
- MYSQL_MASTER_SERVICE_PORT=3306 # mysql数据库对应的端口
- MYSQL_MASTER_SERVICE_DB_NAME=nacos_config
- MYSQL_MASTER_SERVICE_USER=root
- MYSQL_MASTER_SERVICE_PASSWORD=123456
- MYSQL_DATABASE_NUM=1 # 数据源为1个
- JVM_XMS=128m
- JVM_XMX=128m
- JVM_XMN=128m
volumes:
- ./cluster-logs/nacos1:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8848:8848"
- "9555:9555"
restart: on-failure
nacos2:
hostname: nacos2
image: nacos/nacos-server:1.1.4
container_name: nacos2
environment:
- MODE=cluster # 集群模式
- NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
- PREFER_HOST_MODE=hostname
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_MASTER_SERVICE_HOST=47.94.217.177 # mysql数据库对应的ip
- MYSQL_MASTER_SERVICE_PORT=3306 # mysql数据库对应的端口
- MYSQL_MASTER_SERVICE_DB_NAME=nacos_config
- MYSQL_MASTER_SERVICE_USER=root
- MYSQL_MASTER_SERVICE_PASSWORD=123456
- MYSQL_DATABASE_NUM=1 # 数据源为1个
- JVM_XMS=128m
- JVM_XMX=128m
- JVM_XMN=128m
volumes:
- ./cluster-logs/nacos2:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8849:8848"
restart: on-failure
nacos3:
hostname: nacos3
image: nacos/nacos-server:1.1.4
container_name: nacos3
environment:
- MODE=cluster # 集群模式
- NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
- PREFER_HOST_MODE=hostname
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_MASTER_SERVICE_HOST=47.94.217.177 # mysql数据库对应的ip
- MYSQL_MASTER_SERVICE_PORT=3306 # mysql数据库对应的端口
- MYSQL_MASTER_SERVICE_DB_NAME=nacos_config
- MYSQL_MASTER_SERVICE_USER=root
- MYSQL_MASTER_SERVICE_PASSWORD=123456
- MYSQL_DATABASE_NUM=1 # 数据源为1个
- JVM_XMS=128m
- JVM_XMX=128m
- JVM_XMN=128m
volumes:
- ./cluster-logs/nacos3:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8850:8848"
restart: on-failure
如果您的服务器内存资源足够(大于4G),则可以直接运行。
否则会出现三台nacos机器疯狂重启的情况,这是我们可以选择增加内存资源或者修改nacos运行配置,修改内存大小。
JVM参数根据自己服务器调整。nacos默认就2G,不设置的话容器就会不断重启,还非常卡。
找了蛮久才发现是这个原因。
部署命令:
cd /opt/nacos-docker
# 使用 example/cluster-hostname.yaml 构建集群
docker-compose -f example/cluster-hostname.yaml up
5、停止、启动
# 停止
docker-compose -f ./example/cluster-hostname.yaml stop
# 启动
docker-compose -f ./example/cluster-hostname.yaml start
启动成功后 我们可以访问 nacos 控制台 http://xxxx:8848/nacos/ ,默认用户名和密码都是nacos。
多台服务器通过ip部署集群
修改每个服务器中 nacos 的 cluster-ip.yaml
,每换一个服务器就把 NACOS_SERVER_IP
改一下就好了
version: "3"
services:
nacos:
container_name: nacos1
image: nacos/nacos-server:1.1.4
networks:
- nacos_net
environment:
- MODE=cluster # 集群模式
- NACOS_SERVERS=IP1:8848 IP2:8848 IP3:8848 # IP1,IP2是对应的服务器外网,PORT1,PORT2是对应的nacos服务端口
- NACOS_SERVER_IP=当前服务器IP # 服务器外网
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_MASTER_SERVICE_HOST=xxx.xxx.xx.xx# mysql数据库对应的ip
- MYSQL_MASTER_SERVICE_PORT=3306 # mysql数据库对应的端口
- MYSQL_MASTER_SERVICE_DB_NAME=nacos_config
- MYSQL_MASTER_SERVICE_USER=root
- MYSQL_MASTER_SERVICE_PASSWORD=123456
- MYSQL_DATABASE_NUM=1 # 数据源为1个
- JVM_XMS=256m
- JVM_XMX=256m
- JVM_XMN=256m
volumes:
- ./cluster-logs/nacos:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8848:8848"
- "9555:9555"
restart: on-failure
networks:
nacos_net:
driver: bridge
部署命令:
docker-compose -f cluster-ip.yaml up -d
nginx配置
nginx-compose.yaml
nginx:
restart: always
image: nginx:1.17
container_name: nginx
ports:
- nginx端口号:映射端口号
volumes:
- /home/nginx/nginx.conf:/etc/nginx/nginx.conf
ulimits:
nproc: 65535
nofile:
soft: 65535
hard: 65535
nginx.conf配置文件,主要是改http中的配置
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
keepalive_timeout 65;
upstream cluster{
# 此处三个修改成对应的ip
server nacos1的IP:port weight=1 max_fails=2 fail_timeout=30s;
server nacos2的IP:port weight=1 max_fails=2 fail_timeout=30s;
server nacos3的IP:port weight=1 max_fails=2 fail_timeout=30s;
}
server{
listen nginx端口号; # 此处修改
server_name nginx的IP; # 此处修改
large_client_header_buffers 4 16k; # 读取大型客户端请求头的缓冲区的最大数量和大小
client_max_body_size 300m; #设置nginx能处理的最大请求主体大小。
client_body_buffer_size 128k; #请求主体的缓冲区大小。
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 8 32k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 64k;
location / {
proxy_pass http://cluster;
}
}
include /etc/nginx/conf.d/*.conf;
}
这样就可以通过 nginx的IP:port/nacos
来访问nacos集群啦。
将微服务注册到Nacos集群
spring:
application:
name: SYSTEM-SERVICE
cloud:
nacos:
discovery:
server-addr: # 这里写nginx的IP:port即可,由nginx转发到其中某个节点
参考文章:
https://www.freesion.com/article/9674637134/
https://blog.csdn.net/weixin_43993065/article/details/105607999