spring_cloud_alibaba之nacos使用

下载安装

官网:https://nacos.io/zh-cn/

进入官网后,找到文档,找到生态融合,找到spring cloud。就看文档开整就可以了。

从github的release中下载压缩包。

安装JDK8

安装maven

1
unzip nacos-server-2.2.3.zip

配置简单权限认证(鉴权,nacos自带的鉴权)

如果需要其他的鉴权,可以查看文档。

修改conf/application.properties

1
2
3
4
nacos.core.auth.enabled=true
nacos.core.auth.plugin.nacos.token.secret.key=自己设置的加密BASE64串最好32位
nacos.core.auth.server.identity.key=example
nacos.core.auth.server.identity.value=example

启动服务

1
2
3
cd nacos/bin
sh startup.sh -m standalone
cat ../logs/start.out

访问:http://192.168.80.3:8848/nacos

默认用户名密码:nacos nacos

关闭服务

1
sh shutdown.sh

版本对应

因为使用的是spring boot spring cloud spring cloud alibaba 还有nacos,版本之间会有差异,所以要版本对应。

一般spring cloud 与 spring boot 对应关系在spring cloud的页面。https://spring.io/projects/spring-cloud

然后是spring cloud alibaba与 spring cloud 与spring boot 与 nacos,这个在

https://github.com/alibaba/spring-cloud-alibaba

中,更详情的在WIKI的版本说明链接中

https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E

配置中心使用

版本选择

nacos上面使用的是2.2.3版本,根据上面版本对应所以spring cloud alibaba选用2022.0.0.0,spring cloud 使用2022.0.0, spring boot 使用3.0.2。

spring boot 使用jdk17。

helloworld

使用idea创建maven项目或者spring init项目。项目名为nacos-config。

pom.xml

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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>nacos-config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-config</name>
<description>nacos-config</description>

<properties>
<spring-boot.version>3.0.2</spring-boot.version>
<spring-cloud.version>2022.0.0</spring-cloud.version>

<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>

<dependencies>
<!--Spring Cloud 新版本默认将 Bootstrap 禁用 ,开启bootstrap-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2022.0.0.0</version>
</dependency>

</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

</project>

bootstrap.properties

1
2
3
4
spring.cloud.nacos.config.server-addr=192.168.80.3:8848
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos
spring.application.name=example

必须使用bootstrap配置文件,因为spring-cloud-starter-alibaba-nacos-config使用的spring boot starter方式整合进来的,根据以前文章的源码分析,可以找到相关源码。这里用猜想分析下,bootstrap配置是启动时的配置文件,application配置文件是应用的配置文件,要先加载nacos配置之后,获取到nacos服务器的地址及相关获取时要的信息后,才能去nacos服务器获取其他配置的配置。

启动类:

1
2
3
4
5
6
7
8
9
10
11
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class NacosConfigApplication {

public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}

}

测试类:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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 ConfigController {

@Value("${useLocalCache:false}")
private boolean useLocalCache;

/**
* http://localhost:8080/config/get
*/
@RequestMapping("/get")
public boolean get() {
return useLocalCache;
}
}

在nacos控制台中”配置管理”->配置列表->创建配置->

dataId写spring.application.name 如 example

group 使用默认的

配置格式选哪个都行,我选的properties

在配置内容中写 useLocalCache=true

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

1
${prefix}-${spring.profiles.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。

  • spring.profiles.active 即为当前环境对应的 profile,详情可以参考 Spring Boot文档

  • 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}

  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 propertiesyaml 类型。

测试:

访问:http://localhost:8080/config/get 返回ture

在nacos控制台修改useLocalCache=false再访问返回false。

更多文档

官网的例子很少,还是看spring cloud alibaba nacos config的文档吧。

https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config

注册中心使用

pom.xml添加依赖

1
2
3
4
5
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2022.0.0.0</version>
</dependency>

服务提供者

bootstrap配置文件 或者application配置文件

1
2
3
4
5
spring.application.name=example

spring.cloud.nacos.config.server-addr=192.168.80.3:8848
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos

spring.application.name作为服务提供者的服务名。

在NacosConfigApplication启动类中添加@EnableDiscoveryClient注解

1
2
3
4
5
6
7
8
9
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigApplication {

public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}

}

服务消费者

pom.xml添加依赖

1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

配置文件

1
2
3
4
5
6
7
8
9
10
server.port=8888
spring.application.name=service-consumer

spring.cloud.nacos.config.server-addr=192.168.80.3:8848
spring.cloud.nacos.config.username=nacos
spring.cloud.nacos.config.password=nacos

spring.cloud.nacos.discovery.server-addr=192.168.80.3:8848
spring.cloud.nacos.discovery.username=nacos
spring.cloud.nacos.discovery.password=nacos

启动类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigApplication {

@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}

public static void main(String[] args) {
SpringApplication.run(NacosConfigApplication.class, args);
}

}

测试类

1
2
3
4
5
6
7
8
9
10
11
@RestController
public class TestController {

@Autowired
private RestTemplate restTemplate;

@RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
public String echo(@PathVariable String str) {
return restTemplate.getForObject("http://example/config/get", String.class);
}
}

访问nacos控制台,服务管理->服务列表

出现example和service-consumer两个服务。

访问http://localhost:8888/echo/aaaa 连接,可以返回true或者false。

使用openfeign调用

pom.xml

1
2
3
4
5
6
7
8
9
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

openfeign同样需要loadbalancer包。

在启动类添加@EnableFeignClients注解

添加feign接口

1
2
3
4
5
6
7
8
9
10
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient(name = "example")
public interface ExampleConfigFeign {

@RequestMapping("/config/get")
boolean get();

}

测试类:

1
2
3
4
5
6
7
8
9
10
11
@RestController
public class TestController {

@Autowired
private ExampleConfigFeign exampleConfigFeign;

@RequestMapping(value = "/echo2/{str}", method = RequestMethod.GET)
public String echo2(@PathVariable String str) {
return exampleConfigFeign.get() + "";
}
}

同样测试。


spring_cloud_alibaba之nacos使用
http://hanqichuan.com/2023/10/10/spring_cloud/spring_cloud_alibaba之nacos使用/
作者
韩启川
发布于
2023年10月10日
许可协议