Nacos作为服务注册中心

配置项 Key 默认值 说明
服务端地址 spring.cloud.nacos.discovery.server-addr Nacos Server 启动监听的ip地址和端口
服务名 spring.cloud.nacos.discovery.service ${spring.application.name} 给当前的服务命名
服务分组 spring.cloud.nacos.discovery.group DEFAULT_GROUP 设置服务所处的分组
权重 spring.cloud.nacos.discovery.weight 1 取值范围 1 到 100,数值越大,权重越大
网卡名 spring.cloud.nacos.discovery.network-interface 当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址
注册的IP地址 spring.cloud.nacos.discovery.ip 优先级最高
注册的端口 spring.cloud.nacos.discovery.port -1 默认情况下不用配置,会自动探测
命名空间 spring.cloud.nacos.discovery.namespace 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
AccessKey spring.cloud.nacos.discovery.access-key 当要上阿里云时,阿里云上面的一个云账号名
SecretKey spring.cloud.nacos.discovery.secret-key 当要上阿里云时,阿里云上面的一个云账号密码
Metadata spring.cloud.nacos.discovery.metadata 使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息
日志文件名 spring.cloud.nacos.discovery.log-name
集群 spring.cloud.nacos.discovery.cluster-name DEFAULT 配置成Nacos集群名称
接入点 spring.cloud.nacos.discovery.enpoint UTF-8 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否集成Ribbon ribbon.nacos.enabled true 一般都设置成true即可
是否开启Nacos Watch spring.cloud.nacos.discovery.watch.enabled true 可以设置成false来关闭 watch

服务提供者

新建Modulecloudalibaba-provider-payment9001

image-20200710205212074

pom

父模块的pom中添加依赖

1
2
3
4
5
6
7
8
<!--spring cloud alibaba 2.1.0.RELEASE-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>

本模块中导入spring-cloud-starter-alibaba-nacos-discovery

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency><dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.62</version>
</dependency>
</dependencies>

yml

image-20200710210312321

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server:
port: 9001

spring:
application:
name: nacos-payment-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #配置Nacos地址

management:
endpoints:
web:
exposure:
include: '*'

主启动类

创建PaymentMain9001,使用@EnableDiscoveryClient开启服务注册与发现

image-20200710210618472

1
2
3
4
5
6
7
8
//开启服务注册与发现
@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class,args);
}
}

controller

创建PaymentController

image-20200710210754207

1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
public class PaymentController
{
@Value("${server.port}")
private String serverPort;

@GetMapping(value = "/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id)
{
return "nacos registry, serverPort: "+ serverPort+"\t id"+id;
}
}

测试

启动Nacos Server 9001,访问http://localhost:8848/nacos/查看服务列表

image-20200710211009166

注册成功!

访问http://localhost:9001/payment/nacos/1运行成功

image-20200710211357956

为了展示nacos的负载均衡,参照9001新建9002,只有配置文件端口号不同,主启动类名不同

image-20200710212002160

启动运行,查看是否注册

image-20200710212142016

点击详情查看

image-20200710212208357

注册成功!

访问http://localhost:9002/payment/nacos/1程序运行成功

image-20200710212243996

服务消费者

新建模块cloudalibaba-consumer-nacos-order83

image-20200710212328007

pom

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<dependencies>
<!--SpringCloud ailibaba nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.kylin</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

为什么nacos支持负载均衡?因为nocos-discovery集成了ribbon

image-20200710212638236

yml

service-url.nacos-user-service值为消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者,可以不配置)

image-20200710212910711

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
server:
port: 83


spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848

#消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-payment-provider

主启动类

创建OrderNacosMain83

image-20200710213153253

1
2
3
4
5
6
7
8
@EnableDiscoveryClient
@SpringBootApplication
public class OrderNacosMain83 {
public static void main(String[] args)
{
SpringApplication.run(OrderNacosMain83.class,args);
}
}

RestTemplate

编写RestTemplate配置类ApplicationContextBean,开启负载均衡

image-20200710214958745

1
2
3
4
5
6
7
8
9
10
@Configuration
public class ApplicationContextBean {

@Bean
//开启负载均衡
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
}

controller

编写OrderNacosController

image-20200710215059977

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
@RestController
@Slf4j
public class OrderNacosController {
@Resource
private RestTemplate restTemplate;

@Value("${service-url.nacos-user-service}")
private String serverURL;

@GetMapping(value = "/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id)
{
return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);
}

}

测试

启动9001 9002 83 Nacos Server

image-20200710214002694

访问http://localhost:8848/nacos/查看服务列表

image-20200710214033560

服务注册成功!

访问http://localhost:83/consumer/payment/nacos/13

GIF2151

轮询负载成功!

Nacos作为服务配置中心演示

基础配置

新建cloudalibaba-config-nacos-client3377

pom

image-20200711083132976

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<dependencies>
<!--nacos-config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--nacos-discovery-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>com.kylin</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>1.0-SNAPSHOT</version>
</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>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

yml

Nacos同springcloud-config一样,在项目初始化时,要保证先从配置中心进行配置拉取,来取配置之后,才能保证项目的正常启动。

springboot中的配置文件的加载是存在优先级顺序的,bootstrap优先级高于application

说明:之所以需要配置 spring.application.name ,是因为它是构成 Nacos 配置管理 dataId字段的一部分。

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

1
${prefix}-${spring.profile.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。
  • spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

bootstrpa.yml

image-20200711090738405

yaml不能简写为yml,nacos不支持

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
server:
port: 3377

spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务注册中心地址
config:
server-addr: localhost:8848 #配置中心地址
file-extension: yaml #指定yaml格式的配置

#${prefix}-${spring.profile.active}.${file-extension}
# nacos-config-client-dev.yaml

注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension} 如果没有配可能发生一些错误

application.yml

image-20200711085551525

1
2
3
spring:
profiles:
active: dev

Nacos Server中添加nacos-config-client-dev.yaml配置文件

image-20200711091110886

image-20200711091041332

1
2
config:
info: from nacos config center,nacos-config-client-dev.yaml,version=1

点击发布

image-20200711091242412

image-20200711091257197

主启动类

创建NacosConfigClientMain3377

image-20200711084436509

1
2
3
4
5
6
7
8
@EnableDiscoveryClient
@SpringBootApplication
public class NacosConfigClientMain3377
{
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}

controller

通过Spring Cloud原生注解@RefreshScope实现配置自动更新

image-20200711084730810

1
2
3
4
5
6
7
8
9
10
11
12
13
@RestController
//实现配置自动更新
@RefreshScope
public class ConfigClientController
{
@Value("${config.info}")
private String configInfo;

@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}

测试

启动前需要在nacos客户端-配置管理-配置管理栏目下有没有对应的yaml配置文件,运行cloud-config-nacos-client3377的主启动类

image-20200711091350613

访问http://localhost:3377/config/info

image-20200711091436113

修改下Nacos中的yaml配置文件,再次调用查看配置的接口,就会发现配置已经刷新。修改version为2

image-20200711091637188

image-20200711091646106

确认发布

image-20200711091706275

再次访问http://localhost:3377/config/info,更新成功!

image-20200711091729320

分类配置

概念。。。

DataID方案

默认空间+默认分组+新建dev和test两个DataID,dev我们已经创建好了,创建nacos-config-client-test.yaml

1
2
config:
info: from nacos config center,nacos-config-client-test.yaml,version=1

image-20200711093230821

image-20200711093250619

通过spring.profile.active属性就能进行多环境下配置文件的读取

image-20200711093443701

此时读取的就是nacos-config-client-test.yaml文件config.info

测试,重新启动3377,访问http://localhost:3377/config/info

image-20200711093652751

Group方案

通过Group实现环境区分,新建GroupDEV_GROUPnacos-config-client-info.yaml

image-20200711094202456

1
2
config:
info: nacos-config-client-info.yaml,DEV_GROUP

image-20200711094221216

同样再次创建nacos-config-client-info.yamlGroup为TEST_GROUP

image-20200711094458382

1
2
config:
info: nacos-config-client-info.yaml,TEST_GROUP

image-20200711094519620

修改配置文件spring.cloud.nacos.config.group配置group,默认为DEFAULT_GROUP

image-20200711095131222

通过配置读取配置中心中的TEST_GROUP分组下的nacos-config-client-info.yaml文件

bootstrap.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server:
port: 3377

spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #服务注册中心地址
config:
server-addr: localhost:8848 #配置中心地址
file-extension: yaml #指定yaml格式的配置
group: TEST_GROUP #指定group 默认值为DEFAULT_GROUP

#${prefix}-${spring.profile.active}.${file-extension}
# nacos-config-client-dev.yaml

applicaiton.yml

1
2
3
4
5
spring:
profiles:
active: info
# active: dev
# active: test

测试,重新启动3377,访问http://localhost:3377/config/info

image-20200711095440350

修改group为DEV_GROUP

image-20200711095504086

测试,重新启动3377,访问http://localhost:3377/config/info

image-20200711095652945

成功!

Namespace方案

新建dev/test的Namespace

image-20200711095857542

image-20200711095936125

image-20200711095957703

image-20200711100009161

分别带有各自的命名空间ID

回到服务管理-服务列表查看

image-20200711100113933

点击dev

image-20200711100340082

新建nacos-config-client-dev.yaml

image-20200711102740854

1
2
config:
info: 1e849be4-14fe-450d-8da9-8bb25413ac5f dev namespace

image-20200711102705882

修改配置文件spring.cloud.nacos.config.namespace配置命名空间ID

image-20200711103124488

测试,重新启动3377,访问http://localhost:3377/config/info

image-20200711102500996

Nacos持久化配置解释

Nacos默认自带的是嵌入式数据库derby,官方源代码中的pom中可以看出引入了

image-20200711140911532

derby到mysql切换配置步骤

nacos-server-1.1.4\nacos\conf目录下找到sql脚本sql语句源文件

image-20200711135726643

image-20200711135820708

创建nacos_config

image-20200711135910831

复制运行sql语句

image-20200711135940372

image-20200711140030660

接着nacos-server-1.1.4\nacos\conf目录下找到application.properties

image-20200711140158637

添加数据库配置

image-20200711140250109

1
2
3
4
5
6
spring.datasource.platform=mysql

db.num=1
db.url.0=jdbc:mysql://localhost:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true
db.user=root
db.password=数据库密码

重新启动nacos,可以看到是个全新的空记录界面

image-20200711140438365

image-20200711140552139

Linux安装Nacos

https://github.com/alibaba/nacos/releases/tag/1.1.4

下载后发送到服务器的/opt 目录,使用tar -zxvf nacos-server-1.1.4.tar.gz解压

image-20200711143746068

解压成功后得到nacos目录复制到/mynacos使用cp -r nacos /mynacos

image-20200711143923201