Nacos单机&集群&持久化&Nginx代理配置
Nacos是什么
官方:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
本质:Nacos = Eureka+Config+Bus
可以替代原本SpringCloud中Eureka、Config、Bus组件
注册中心对比
环境搭建
环境准备
Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:
- 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。
- 64 bit JDK 1.8+;[下载&配置]
Nacos下载
下载地址(2023/02/20最新稳定版为2.2.0)
运行单机测试
sh startup.sh -m standalone
访问
http://10.20.30.227:8848/nacos
登录页面
帐号密码默认为nacos
特性一:注册中心
消费者项目
POM
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>3.0.2</version>
</dependency>
</dependencies>
YML
server:
port: 8888
spring:
application:
name: service-consumer #注册到nacos的消费者名称
cloud:
nacos:
discovery:
server-addr: 10.20.30.227:8848
配置类
@Configuration
public class ApplicationContextBean
{
@Bean
@LoadBalanced
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
控制类
@RestController
public class CustomerController {
public static final String URL = "http://service-provider";//生产者注册的服务名称
@Autowired
private RestTemplate restTemplate;
@GetMapping("/customer/getMethod")
public String getMethod(String val){
String result = restTemplate.getForObject(URL+"/producer/getMethod?val="+val, String.class);//生产者暴漏的路径
return result;
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class NacosCustomerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosCustomerApplication.class,args);
}
}
两个生产者项目
POM
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba.cloud/spring-cloud-starter-alibaba-nacos-discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
<version>3.0.2</version>
</dependency>
</dependencies>
YML
server:
port: 6601 #一个生产者端口6601一个为6602
spring:
application:
name: service-provider #注册到nacos的生产者名称
cloud:
nacos:
discovery:
server-addr: 10.20.30.227:8848
控制类
@RestController
public class NacosProducerController {
@GetMapping("/producer/getMethod")
public String getMethod(String val){
return "生产者6601"+val;
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProducer6601Application {
public static void main(String[] args) {
SpringApplication.run(NacosProducer6601Application.class,args);
}
}
验证
启动三个项目,登录Nacos页面会查到相应的服务
并且消费者发出请求,默认负载均衡为轮询转发
特性二:配置中心
修改上面customer项目
YML
新增配置bootstrap.yml
spring:
cloud:
nacos:
config:
server-addr: 10.20.30.227:8848 #nacos配置中心
file-extension: yaml #指定配置文件格式是yaml
POM
<!--新增坐标-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.0.RELEASE</version>
</dependency>
新增配置类
@RestController
@RequestMapping("/config")
@RefreshScope //@RefreshScope注解使当前类下的配置支持Nacos的动态刷新功能
public class ConfigController {
@Value("${ip.name}")//要读取的配置
private String ipName;
@RequestMapping("/get")
public String get() {
return ipName;
}
}
Nacos页面新增配置
-
访问http://10.20.30.227:8848/
-
配置管理->配置列表->创建配置
-
内容如下
-
DataID结构解析
service-consumer-dev.yaml
“service-consumer” 为上面配置的spring.application.name
"dev"为上面配置的spring.profiles.active
附官方图:
-
每次提交配置,通过url查看,可发现配置自动更新了
配置分组
- nacos页面添加配置时设置Group
-
修改上面项目的bootstrap.yml
spring: cloud: nacos: config: server-addr: 10.20.30.227:8848 #nacos配置中心 file-extension: yaml #指定配置文件格式是yaml group: MY_GROUP1 #设置的分组名
配置命名空间
-
nacos页面添加配置时设置NameSpace
-
nacos页面在新的命名空间下添加配置
-
修改上面项目的bootstrap.yml
spring: cloud: nacos: config: server-addr: 10.20.30.227:8848 #nacos配置中心 file-extension: yaml #指定配置文件格式是yaml group: MY_GROUP1 #设置的分组名 namespace: 7ec90e54-85e3-4c04-b345-bf91fc26394f #设置的命名空间ID,此IP命名空间添加后自动生成或者指定
Nacos数据持久化
环境要求
MySQL5.6.5+
为什么要修改持久化
Nacos自带数据库为derby,如果单机使用没问题,如果集群部署,那么就涉及到数据一致性问题,所以需要将内置derby修改为外部数据库MySQL
创建数据库
数据库sql脚本在下载的Nacos包中,具体路径见下图
修改Nacos配置
修改解压后目录/usr/local/nacos/nacos/conf/application.properties文件中如下配置
### If use MySQL as datasource:
spring.datasource.platform=mysql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:mysql://10.20.30.13:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=www
db.password.0=123456
### Connection pool configuration: hikariCP
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
验证
-
启动Nacos
-
创建一个配置文件
-
去MySQL中查询,配置已经存储到外部数据库
Nacos服务高可用(集群部署)
集群架构图
环境要求
请确保是在环境中安装使用:
- 64 bit OS Linux/Unix/Mac,推荐使用Linux系统。
- 64 bit JDK 1.8+;[下载&配置]
- Maven 3.2.x+;下载.配置。
- 3个或3个以上Nacos节点才能构成集群。
集群搭建前准备
-
预计搭建后架构样子
1个Nginx+3个Nacos注册中心
-
定义端口号
正常是多台物理机,用虚拟机就一台虚拟三个Nacos服务
8848、8748、8648
复制解压出的nacos文件夹到下面三个目录中
重命名为Nacos8848\Nacos8748\Nacos8748,表示我要启动三个Nacos做集群
(就是上面单机版解压缩后的文件夹)
修改每个文件夹中Nacos配置文件
-
将/usr/local/nacos/conf/cluster.conf.example复制一份,起名为cluster.conf
-
修改cluster.conf,配置内容如下(三个都)
注意:我是本机搭建三台Nacos模拟集群,所以此处端口号不可设置为8848\8847\8846等连号,因为Nacos集群使用grpc来通信,启动会默认占用三个端口,例如:8848启动后会默认启动8848、9848、9849
10.20.30.227:8848 10.20.30.227:8748 10.20.30.227:8648
注意:配置ip必须是通过hostname -i可查到的
-
修改application.properties
注意:server.port要更改,并且要和第二步cluster.conf配置中的一致
### Default web server port: server.port=8848 ### If use MySQL as datasource: spring.datasource.platform=mysql ### Count of DB: db.num=1 ### Connect URL of DB: db.url.0=jdbc:mysql://10.20.30.13:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=www db.password.0=123456
Nacos以集群模式启动
sh startup.sh
下图为官方文档说明
验证集群验证结果
-
打开Nacos页面
-
查看集群管理->节点列表
Nginx代理Nacos集群
Nginx配置文件
#此处配置上面集群Nacos地址
upstream nacos_cluster{
server 10.20.30.227:8848;
server 10.20.30.227:8748;
server 10.20.30.227:8648;
}
server {
listen 9999;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
proxy_set_header Host $http_host;
#root html;
#index index.html index.htm;
proxy_pass http://nacos_cluster;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
访问Nginx验证代理结果
http://10.20.30.227:9999/nacos
将服务通过Nginx代理注册进Nacos
修改项目Yml文件,如下:
server:
port: 8888
spring:
profiles:
active: dev #读取dev的配置
application:
name: service-consumer #注册到nacos的消费者名称
cloud:
nacos:
discovery:
server-addr: 10.20.30.227:9999 #修改为Nginx代理地址