官方地址
下载地址
docker安装
docker run --name nacos --net mynet -e MODE=standalone -p 8848:8848 -d nacos/nacos-server:1.1.4
启动
windows
启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
访问
用户名+密码=nacos

父项目
创建父项目
cloud2021
依赖
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<cloud.version>Hoxton.SR11</cloud.version>
<cloud-alibaba.version>2.2.1.RELEASE</cloud-alibaba.version>
</properties>
<parent>
<artifactId>spring-boot-dependencies</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.3.10.RELEASE</version>
<relativePath/>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${cloud-alibaba.version}</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
子项目
创建子项目
cloud-alibaba-provider-payment9001
cloud-alibaba-provider-payment9002
依赖
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<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>
配置文件
server:
port: 9002
spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
controller
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "nacos serverPort="+ serverPort+ " id= " +id;
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class NaCosMain9002 {
public static void main(String[] args) {
SpringApplication.run(NaCosMain9002.class,args);
}
}
效果


负载均衡

nacos集成了ribbon,可以直接使用负载均衡
创建consumer
创建:cloud-alibaba-consumer-nacos-order83
依赖
<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>
在最新的2.1.0版本中,已经放弃ribbon,需要导入loadbalancer
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
配置文件
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
#配置消费者要去访问的微服务名称
server-url:
nacos-user-service: http://nacos-payment-provider
配置类
@Configuration
public class MyConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
controller
@RestController
public class OrderNaCosController {
@Resource
private RestTemplate restTemplate;
//获取在配置文件中配置的url
@Value("${server-url.nacos-user-service}")
private String url;
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Integer id){
return restTemplate.getForObject(url+"/payment/nacos/"+id,String.class);
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class OrderMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderMain83.class,args);
}
}
结果

访问同一个接口,分别调用了9001和9002


负载均衡策略
| 策略类 | 命名 | 描述 |
|---|---|---|
| RandomRule | 随机策略 | 随机选择server |
| RoundRobinRule | 轮询策略 | 轮询选择, 轮询index,选择index对应位置的Serve |
| RetryRule | 重试策略 | 对选定的负载均衡策略机上重试机制,在一个配置时间段内当选择Server不成功,则一直尝试使用subRule的方式选择一个可用的server |
| BestAvailableRule | 最低并发策略 | 逐个考察server,如果server断路器打开,则忽略,再选择其中并发链接最低的server |
| AvailabilityFilteringRule | 可用过滤策略 | 过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值)或者使用一个AvailabilityPredicate来包含过滤server的逻辑,其实就就是检查status里记录的各个Server的运行状态 |
| ResponseTimeWeightedRule | 响应时间加权重策略 | 根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。响应时间越短,权重越高,被选中的概率越高,这个策略很贴切,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间 |
| ZoneAvoidanceRule | 区域权重策略 | 综合判断server所在区域的性能,和server的可用性,轮询选择server并且判断一个AWS Zone的运行性能是否可用,剔除不可用的Zone中的所有server |
我们可以通过修改配置来调整Ribbon的负载策略
nacos-payment-provider: #要负载调用的服务名称
ribbon:
NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
服务配置中心
创建module: cloud-alibaba-config-nacos-client3377
依赖
<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>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
</dependencies>
在最新的SpringCloud 2021.0.2版本中,如果需要加载bootstrap.yml,需要导入spring-cloud-starter-bootstrap
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
配置文件
创建:
application.yml
bootstrap.yml
application.yml
spring:
profiles:
active: dev #环境
bootstrap.yml:
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
config:
server-addr: localhost:8848 #nacos作为配置中心地址
file-extension: yaml #nacos配置文件的类型
discovery:
server-addr: localhost:8848 #nacos注册中心地址
controller
@RestController
@RefreshScope //Spring Cloud 原生注解,实现配置自动更新
@RequestMapping("/config")
public class ConfigController {
@Value("${config.info:c}")
private String info;
@RequestMapping("/get")
public String getInfo(){
return info;
}
}
启动类
@SpringBootApplication
@EnableDiscoveryClient
public class NaCosMain3377 {
public static void main(String[] args) {
SpringApplication.run(NaCosMain3377.class,args);
}
}
nacosconfig配置
浏览器输入 localhost:8848/nacos 进入控制台


点击配置列表右边➕新建配置
配置类容如图所示
文件名官方说明

结果

集群和持久化
这里使用linux.
将nacos上传至linux解压缩
将application.properties和cluster.conf.example进行备份
其中将 cluster.conf.example 备份为 cluster.conf

持久化
官方文档:
官方
在0.7版本之前,在单机模式时nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况。0.7版本增加了支持mysql数据源能力,具体的操作步骤:
- 安装数据库,版本要求:5.6.5+
- 创建数据库nacos_config
- 初始化mysql数据库,数据库初始化文件:nacos-mysql.sql(在conf目录下)
- 修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://xxx.xxx.xxx.xxx:3306/nacos_devtest?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=nacos_devtest
db.password=youdontknow
直接创建数据库nacos_config
然后执行nacos/config/nacos-mysql.sql sql脚本,创建表
在配置文件application.properties中加入:

👌👌👌👌👌👌👌👌👌👌👌👌👌👌
集群
一台linux上不同端口的集群---------------
🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬
在上面cp的配置文件cluster.conf中加入naocs地址(ip+端口)
192.168.0.231:3333
192.168.0.231:4444
192.168.0.231:5555
如图,将自带的注释掉,加入我们集群的地址

然后进入nacos/bin目录

将startup.sh进行备份

更改startup.sh:


nginx配置

nacos启动
./startup.sh -g 3333
./startup.sh -g 4444
./startup.sh -g 5555
依次启动

三台服务器集群---------------
🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬🤬
上传文件解压 什么的都一样
备份文件,修改配置文件application.properties

修改cluster.conf

nacos自己的配置一启动就是几个g的内存占用,对于我们只有2-4个g内存的服务器来说直接跑不起来-------------
😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨😨
所以我们需要调一下配置。
直接修改启动文件--------------->start.sh(记得备份😂😂😂😂)
测试着玩,随便调吧,想给多少给多少

然后挨个启动

nginx负载均衡
nainx.conf配置

访问一个地址,可以实现在集群中三台nacos中丝滑切换
ojbk
😴😴😴😴😴😴😴😴😴😴😴😴😴😴😴😴😴
坑

这是因为,nacos在启动的时候直接去hosts里面获取了本地的ip,如果部署在服务器上,就是服务器的内网ip,导致访问不到,在服务注册的时候拿着服务器的ip去本地找,能找到就有鬼了。。当然,在同一局域网就不说了

解决办法:
在application.properties配置文件中配置启动ip就好。

记得删除cluster.conf配置文件中的内网ip