一、初始Nacos
- Nacos是阿里开源的易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
- Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理
- 官网:https://nacos.io/zh-cn/docs/deployment.html
- github下载:https://github.com/alibaba/nacos/releases
1、 Nacos支持三种部署模式
- 下载 jar包
默认集群启动,使用命令单机模式启动 Nacos
sh startup.sh -m standalone
http://127.0.0.1:8848/nacos 进入后台,默认密码 nacos
二、Nacos作为服务注册中心
1、将微服务注册到Nacos
创建模块 cloudalibaba-producer-payment9001
写pom
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
写yml ```yaml server: port: 9001
spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: localhost:8848
暴露服务
management: endpoints: web: exposure: include=*:
4. 主启动类
```java
@SpringBootApplication
@EnableDiscoveryClient
public class AlibabaProducer9001 {
public static void main(String[] args) {
SpringApplication.run(AlibabaProducer9001.class, args);
}
业务类
@RestController public class PaymentController { @Value("${server.port}") private String serverPort; @GetMapping(value = "/payment/nacos/{id}") public String getPayment(@PathVariable("id") Integer id) { return "nacos----serverPort: " + serverPort + "\t id" + id; } }测试进入Nacos服务器后台查看:http://localhost:8848/nacos/
2、消费端使用Nacos
注入依赖
<!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--nacos-discovery--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> <version>2021.1</version> </dependency> <!--openfeign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <!--负载均衡--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> </dependency>```yaml server: port: 80
spring: application: name: service-user-consumer cloud: nacos: discovery: server-addr: 127.0.0.1:8848
输入debug日志
logging: level: com.tao.project.service.*: debug
2. 启动类
```java
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class Application80 {
public static void main(String[] args) {
SpringApplication.run(Application80.class, args);
}
}
编写消费端的服务类、控制器;加入负载均衡策略
@Component @FeignClient(value = "service-user-provider") public interface UserFeignService { /** * 根据ID查用户信息 * * @param userId * @return */ @GetMapping("/provider/user/{id}") String findById(@PathVariable("id") Integer userId); /** * 超时方法 * @param userId * @return */ @GetMapping("/provider/user/{id}/timeout") String getUserByTimeOUt(@PathVariable("id") Integer userId); }@RestController @RequestMapping("consumer") public class UserController { @Autowired private UserFeignService userFeignService; /** * 获取用户信息 * * @param id * @return 需要和 FeignService 对应 */ @GetMapping("/user/{id}") public String getUser(@PathVariable("id") Integer id) { return userFeignService.findById(id); } @GetMapping("/user/{id}/timeout") public String getUserByTimeOUt(@PathVariable("id") Integer id) { return userFeignService.getUserByTimeOUt(id); } }@Configuration public class ApplicationConfig { @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }2、支持AP和CP模式切换(Nacos)
1. Nacos全景图
2. Nacos和其他注册中心特性对比
3. 何时选择使用何种模式?
C是所有节点在同一时间的数据是一致性的;而A是所有的请求都可用,因此:
- 如果不需要存储服务级别的信息且服务实例是通过nacos-client注册,并能够保持心跳上报,那么就可以选择AP模式。
- 如果需要存储/编辑服务级别、配置信息,那么CP是必须的,K8S和NDS服务就适用于CP模式。
三、Nacos作为配置中心
1、配置中心
Nacos 不需要建立服务器,只需要手动在nacos上创建配置文件 nacos-config-client-dev.yaml,命名规则为 spring application name-profile-yaml.config: info: “config info for dev, version = 1”2、客户端读取
- 创建模块
写pom
<!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--nacos-discovery--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <!--nacos-config--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <!--加载bootstrap配置文件--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>注意要用 bootstrap.yml ```yaml server: port: 3377
spring: application: name: nacos-user profiles: active: dev cloud: nacos:
# 注册中心
discovery:
server-addr: 127.0.0.1:8848
# 配置中心
config:
server-addr: 127.0.0.1:8848
# 指定配置文件后缀
file-extension: yaml
# 命名空间
namespace: 253c8c05-5a95-4676-b1f6-f8525ffe72dc
4. 主启动类
```java
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfig3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfig3377.class, args);
}
}
业务类
@RestController @RefreshScope //自动刷新 public class ConfigClientController { @Value("${config.info}") private String configInfo; @GetMapping("/config/info") public String getConfigInfo() { return configInfo; } }测试:访问 http://localhost:3377/config/info ,在修改过发现能够自动更新配置文件,实现了bus的功能。
3、配置文件读取规则
${prefix}-${spring.profiles.active}.${file-extension}
- prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
- spring.profiles.active 即为当前环境对应的 profile。当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
- file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。
- 通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新
4、多环境多项目配置

配置中心的配置查找顺序:NameSapce->Group->DataID1. DataId

2. Group
3. NameSapce

四、Nacos持久化配置
- 切换Nacos嵌入式数据库derby为mysql:修改配置文件 ```bash spring.datasource.platform=mysql
db.num=1 db.url.0=jdbc:mysql://localhost:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=root db.password=root
<a name="dUQqP"></a>
# 五、Nacos集群配置
<a name="orb1c"></a>
## 1、架构
<br />1 Nginx + 3 Nacos + 1 MySQL
<a name="umv03"></a>
## 2、配置 Nacos集群
1. `vim cluster.conf` 将所有集群写入到该文件
```bash
192.168.69.150:3333
192.168.69.150:4444
192.168.69.150:5555
- 开启端口映射模拟多个主机:
vim ./bin/start.sh添加以下配置,开启端口映射启动

nohup $JAVA -Dserver.port=${EMBEDDED_STORAGE} ${JAVA_OPT} nacos.nacos >> ${BASE_DIR}/logs/start.out 2>&1 &

upstream cluster{
server 127.0.0.1:3333;
server 127.0.0.1:4444;
server 127.0.0.1:5555;
}
server {
listen 1111;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
#root html;
#index index.html index.htm;
proxy_pass http://cluster;
}
....
}
启动Nginx
/usr/local/nginx/nginx -c /usr/local/nginx/nginx.conf测试:http://192.168.59.150:1111/nacos/ ,现在即可正常访问Nacos集群。
