这是我参与更文挑战的第 17 天,活动详情查看: 更文挑战
Nacos
一、概述
官网:https://nacos.io/zh-cn/docs/what-is-nacos.html
注册中心和配置中心
二、环境配置
下载安装
- 下载Nacos:
https://github.com/alibaba/nacos/releases - 启动Nacos:在解压后的文件夹bin目录下使用命令启动
cmd startup.cmd -m standalone,standalone(非集群启动) - 访问
http://localhost:8848/nacos,访问主界面,账号密码为nacos
依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
配置
server:
port: 9001
spring:
application:
name: nacos-provider-payment
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # nacos配置中心地址
management: # 暴露监控地址
endpoints:
web:
exposure:
include: '*'
主启动类
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class, args);
}
}
启动服务后,在nacos主页就可以看到当前服务。
三、Nacos负载均衡
根据9001Copy一个9011服务用来提供服务。
创建一个服务的消费者cloudalibaba-consumer-nacos-order83
依赖同上
配置文件
server:
port: 83
spring:
application:
name: nacos-consumer-order
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # nacos配置中心地址
service-url: #可选,用户访问的微服务名称,方便后面使用服务的路径
nacos-user-service: http://nacos-provider-payment
config和Controller
@SpringBootConfiguration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
@RestController()
public class OrderNacosController {
@Resource
private RestTemplate restTemplate;
//从配置文件读取微服务名称
@Value("${service-url.nacos-user-service}")
private String serverUrl;
@GetMapping("/consumer/nacos/getPort/{id}")
public String paymentInfo(@PathVariable("id") String id) {
return restTemplate.getForObject(serverUrl + "/nacos/getPort/" + id, String.class);
}
}
因为Nacos自带Ribbon,所以天生就有负载均衡的能力,现在访问http://localhost:83/consumer/nacos/getPort/1,就会轮询访问9001和9011两个服务。
支持AP和CP切换
A保证可用性,C保证数据一致性。
如果不需要存储服务级别的消息且服务实例是通过nacos-client注册,并且能够保持心跳上报,那么就可以选择AP模式。当前主流的服务如 Spring Cloud 和 Dubbo。
如果需要在服务级别编辑或者存储信息,那么CP是必须的,如K8S服务和DNS服务。
模式切换:
curl -X PUT `$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
四、Nacos之服务配置中心
新建cloudalibaba-config-nacos-client3377,导入依赖
<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>
使用两个配置文件,一个application和一个更高级别的bootstrap
application.yml
spring:
profiles:
active: dev
bootstrap,yml
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848 # nacos配置中心地址
config:
server-addr: 127.0.0.1:8848 # nacos作为配置中心
file-extension: yaml # 指定配置文件格式
在nacos主界面添加配置文件
注意:Data ID 的格式为${prefix}-${spring.profiles.active}.${file-extension},如按照上面的配置就是nacos-config-client-dev.yaml
添加一个Controller就可以访问到对应的配置文件了
@RestController
@RefreshScope //通过Spring Cloud 原生注解实现配置自动刷新
public class ConfigClientController {
@Value("${config.info}")
private String configInfo;
@GetMapping("/getInfo")
public String getConfigInfo() {
return configInfo;
}
}
已经配置RefreshScope注解,所以自带动态刷新。
五、Nacos之命名空间(NamesPace)、DataID、分组
Nacos默认的NamesPase是Public,NamesPase主要用来实现隔离。根据不同的开发环境进行隔离。
Group可以把不同的微服务划分到同一个组。
Service就是微服务,一个Service可以包含多个微服务也就是集群(Cluster)。
Instance就是微服务的实例。
DataID方案
在application.yml中配置的dev环境,DataID 也是 xxxxx-dev.yaml,新建一个nacos-config-client-test.yaml,把application.yml中的active改为test,同样获取到对应DataID的配置内容。
Group方案
默认为DEFAULT_GROUP
也可以根据分组不同获取不同的配置信息。新增一条Group为DEV_GROUP的配置,配置文件的config加一个group的配置。
config:
server-addr: 127.0.0.1:8848 # nacos作为配置中心
file-extension: yaml # 指定配置文件格式
group: DEV_GROUP
NamesPace方案
在nacos住界面新增命名空间,会生成一个命名空间id
在配置文件的config中添加一个namespace配置
config:
server-addr: 127.0.0.1:8848 # nacos作为配置中心
file-extension: yaml # 指定配置文件格式
group: DEV_GROUP
namespace: 9ed7b1a9-6220-4bc5-b271-e39df2651aa8
现在访问的配置文件就是9ed7b1a9-6220-4bc5-b271-e39df2651aa8命名空间下的DEV_GROUP分组中DataID为nacos-config-client-dev.yaml的配置及文件。
六、Nacos集群和持久化配置
官方说明https://nacos.io/zh-cn/docs/cluster-mode-quick-start.html
Nacos数据库切换
Nacos自带的是一个嵌入式数据库derby,需要把数据库切换为MySQL。
- 在conf文件夹下找到
nacos-mysql.sql,运行SQL - 修改
application.properties文件,修改项参考https://nacos.io/zh-cn/docs/deployment.html - 重启nacos,嵌入式数据库已经切换为MySQL数据库。
Linux下配置Nacos集群配合Nginx
修改cluster.conf
172.20.102.156:3333
172.20.102.156:4444
172.20.102.156:5555
注意:172.20.102.156通过hostname -i获得
修改startup.sh
如果内存太小无法启动三台Nacos,修改此处
修改nginx.conf配置
启动Nacos
./startup.sh -p 3333
./startup.sh -p 4444
./startup.sh -p 5555
# 查看启动成功了多少
ps -ef | grep nacos | grep -v grep | wc -l
启动Nginx
./nginx
测试
创建一个cloudalibaba-provider-payment9002服务
配置文件
server:
port: 9002
spring:
application:
name: nacos-provider-payment
cloud:
nacos:
discovery:
server-addr: 47.95.226.96:1111 # nacos配置中心地址
management: # 暴露监控地址
endpoints:
web:
exposure:
include: '*'
访问http://Linux地址:1111/nacos