nacos可提供动态服务发现、服务配置、服务元数据及流量管理。
下载nacos:https://github.com/alibaba/nacos/releases/download/1.2.0/nacos-server-1.2.0.zip
解压
修改startup.cmd中的MODE为cluster,只要不为standalone就行。
复制bin/startup.cmd,分别为bin/startup-8858.cmd,bin/startup-8868,这样会得到3份启动脚本,然后在复制出来的脚本中,分别加入所需要绑定的端口,如下:
// bin/startup-8858.cmd
set "JAVA_OPT=%JAVA_OPT% -Dserver.port=8858"
// bin/startup-8868.cmd
set "JAVA_OPT=%JAVA_OPT% -Dserver.port=8868"
注意位置,放在读取默认配置代码的后面,会导致端口修改不生效。最保险的是放在这个变量最开始地方的前面。可参考下面的修改:
192.168.137.1:8848
192.168.137.1:8858
192.168.137.1:8868
docker run --name mysql -e MYSQL_ROOT_PASSWORD=root -p 3306:3306 -d mysql:5.7
后面还可以考虑做一个nginx,对三个nacos做一下负载均衡,docker运行指令如下:
docker run --name nginx -v /d/projects/nginx:/etc/nginx -p 80:80 -d nginx
nginx的配置信息如下:
user www-data; ## 配置 worker 进程的用户和组
worker_processes auto; ## 配置 worker 进程启动的数量,建议配置为 CPU 核心数
error_log logs/error.log; ## 全局错误日志
pid /run/nginx.pid; ## 设置记录主进程 ID 的文件
worker_rlimit_nofile 8192; ## 配置一个工作进程能够接受并发连接的最大数
events {
}
http{
upstream nacos {
server 192.168.137.1:8848;
server 192.168.137.1:8858;
server 192.168.137.1:8868;
}
server {
listen 80;
server_name localhost;
location /nacos/ {
proxy_pass http://nacos/nacos/;
}
}
}
还试了一下,删掉leader,过段时间会重新选举出来新的leader。
还是继续分成两种类型,一种是配置相关,另一种是服务注册与发现。
可通过web端访问localhost/nacos来进行管理,也可以通过命令行进行简单的查询、管理:
// 发布配置
curl -X POST "http://localhost/nacos/v1/cs/configs?dataId=module-01.yml&group=DEFAULT_GROUP&content=hellonacos"
// 获取配置
curl -X GET "http://localhost/nacos/v1/cs/configs?dataId=module-01.yml&group=DEFAULT_GROUP"
在代码中使用nacos的配置使用时,以Spring Cloud为例(也可参考官方文档demo):
①pom文件需要特别注意版本问题,用官方的实例都有问题,主要体现在配置发布了之后不能刷新。
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
<version>2.2.0.RELEASEversion>
dependency>
dependencies>
出问题的原因主要是版本不一致。主要是看Spring Boot的版本,这里的Spring Boot版本是v2.2.5.RELEASE,根据官网版本说明wiki可以看出:
所以这里选2.2.0.RELEASE版本的spring-cloud-starter-alibaba-nacos-config
。按照官网example的例子,选0.2.1.RELEASE配置更新后,并不会刷新。
②resources
下面新建bootstrap.yaml
,并在nacos上面创建好module-01.yaml
。
spring:
application:
name: module-01
cloud:
nacos:
config:
refresh:
enabled: true
server-addr: localhost
file-extension: yaml
module-01.yaml
的内容如下:
③创建启动类。与普通Spring Boot应用无区别。
package com.example.springloud.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
④创建获取配置信息的接口。需要加上@RefreshScope
,以使自动刷新生效。
package com.example.springloud.demo.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("config")
@RefreshScope
public class GetDynamicValueController {
@Value(value = "${hello}")
private String dynamicValueStr;
@RequestMapping("get")
public String getStr() {
return dynamicValueStr;
}
}
⑤修改配置,看能否自动刷新。如果加了@RefreshScope
注解,但还是不能自动刷新,可考虑检查Spring Boot与spring-cloud-starter-alibaba-nacos-config
版本是否一致。
在开始之前,还是要注意一下版本问题。
①pom文件导入spring-cloud-starter-alibaba-nacos-discovery
。版本选的2.2.0.RELEASE,原因同上所述。如果不能运行了,那么再参看官网wiki上面的版本对应表进行修改。
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
<version>2.2.0.RELEASEversion>
dependency>
②bootstrap.yaml文件中加入服务发现相关的配置:
spring:
application:
name: module-01
cloud:
nacos:
discovery:
server-addr: localhost
config:
server-addr: localhost
file-extension: yaml
③创建RestTemplate实例,然后加上@LoadBalanced注解,开启 @LoadBalanced
与 Ribbon 的集成。
package com.example.springloud.demo.beans;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class LoadBalancedTemplate {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
④在Controller中注入restTemplate,然后新建一个新的接口config/remote-get
,通过nacos,调用注册在其上的config/get
接口,作为返回。
package com.example.springloud.demo.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("config")
@RefreshScope
public class GetDynamicValueController {
@Value(value = "${hello}")
private String dynamicValueStr;
@Autowired
private RestTemplate restTemplate;
@RequestMapping("get")
public String getStr() {
return dynamicValueStr;
}
@RequestMapping("remote-get")
public String getStrViaNacos() {
return restTemplate.postForObject("http://module-01/config/get", null, String.class);
}
}
此时的demo整体架构为:
⑤运行代码,可以观察到nacos上面的服务列表中出现了module-01:
调用config/remote-get
接口,正常返回config/get
接口的数据: