接上篇spring cloud alibaba 笔记 (一)nacos 部署
nacos 服务注册
接下来创建微应用项目
项目结构如下
父项目pom文件
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<modules>
<module>server-test-a</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.11.RELEASE</version>
</parent>
<groupId>group.tmlxq</groupId>
<artifactId>cloud-alibab-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<!-- Environment Settings -->
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- spring cloud 依赖版本-->
<spring-cloud.version>Hoxton.SR4</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
子项目server-test-a pom文件
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud-alibab-demo</artifactId>
<groupId>group.tmlxq</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>server-test-a</artifactId>
<name>test-a</name>
<description>测试项目A</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- spring cloud 配置 -->
<!-- nacos 服务注册-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos 统一配置-->
<!-- <dependency>-->
<!-- <groupId>com.alibaba.cloud</groupId>-->
<!-- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>-->
<!-- </dependency>-->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
按照spring cloud alibaba 的官方说明
需要配置如下
spring:
application:
name: test-a
cloud:
nacos:
discovery:
server-addr: 你的主机地址:8848/
server:
port: 8081 ##当前服务端口
management:
endpoints:
web:
exposure:
include: '*'
然后在子项目的启动类上加上@EnableDiscoveryClient注解,表明这是一个nacos客户端,启动项目
@SpringBootApplication
@EnableDiscoveryClient
public class TestAApplication {
public static void main(String[] args) {
SpringApplication.run(TestAApplication.class, args);
}
}
值得一提的是,开始我在子项目的application.yml 进行如下配置,注册到阿里云上的远程nacos 服务。本地却启动报错,显示链接localhost:8848 的nacos 报错。说明配置的远程nacos 地址没有生效,仍然链接默认的本地naocs,查阅官网说明,说是要在bootstrap.yml中配置,因为bootstrap 比application 启动早,nacos 具有统一配置的功能,需要在项目启动前就读取统一配置信息。(但是官方仓库里面的示例代码却全都在application.yml中配置的。小朋友你是否有很多的??.jpg)
但当我使用bootstrap.yml进行启动时,仍然报错,最后改用bootstrap.properties 启动才成功注册到远程的nacos 上,感觉应该是springboot 的版本bug ,当时用的是2.2.6的版本,改为2.2.11 版本,果然报错消除了。
启动成功后在nacos 管理页面的服务列表就可以看到test-a已经注册成功了。
远程配置
naocs可以作为远程配置中心,根据官网的示例,先引入依赖,就是之前test-a子项目中被我注释的依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
在子项目bootstrap.yml中增加
config:
server-addr: 39.99.201.218:8848
添加后的配置文件为
spring:
application:
name: test-a ## 服务名
cloud:
nacos:
discovery:
server-addr: 你的nocos服务Ip:8848
config: ##远程配置中心配置
server-addr: 你的nocos服务Ip:8848
server:
port: 8081
management:
endpoints:
web:
exposure:
include: '*'
在看一眼项目结构图,子项目test-a中目前只有一个配置文件。
现在打开nacos管理界面,新建三个配置进行测试,data id 分别test-a.yaml,test-a.yml,test-a.properties,
三个配置文件内容分别是:
- test-a.yaml
model: 后缀yaml
- test-a.yml
model: 后缀yml
- test-a.properties
model= 后缀properties
data id命名规则,摘自官网
这里prefix就是spring.cloud.nacos.config.prefix的值,如果没有配置就是spring.application.name的值,,我的子项目test-a没有配置spring.cloud.nacos.config.prefix,所以prefix的值就是test-a,而我也没有spring.profiles.active,所以我的文件命名就是${prefix}.${file-extension}。
所以这三个配置文件就相当于本地的application.yml。
再写一个接口进行测试
@RestController()
@RequestMapping("/test")
@RefreshScope
public class TestApi {
@Value("${model}")
private String model;
@RequestMapping
public String testA()
{
return "当前后缀:"+model;
}
}
这里@RefreshScope是代表配置文件热更新。
然后启动项目。
这里发生了一些小插曲,开始无论我参照官方仓库示例怎样修改配置,都无法获取远程的配置信息,我开始怀疑是版本问题,但是官网又写的
版本 2.1.x.RELEASE 对应的是 Spring Boot 2.1.x 版本。版本 2.0.x.RELEASE 对应的是 Spring Boot 2.0.x 版本,版本 1.5.x.RELEASE 对应的是 Spring Boot 1.5.x 版本。
我当时用的是2.2.1的spring cloud alibaba,和2.2.11的springboot版本,完全符合官方的说明,所以我又去找了一圈问题,但是仍没解决,就在我一筹莫展,被nacos 搞的七窍生烟的时候,又想到当时使用2.2.6的springboot出现的无法连接nacos的小bug,换到最新版解决的情况。所以我把spring cloud alibaba换到了当时最新版2.2.3。然后问题就解决了,此时又想到了之前好多次用阿里的开源组件解决发现官网实例出现过很多次bug的情况,心中顿时一万个草泥马飘过。
好了进入正题
访问192.168.100.169:8081/test接口
可以看到接口获取到了test-a.properties文件中的参数值,再试试热修改
将test-a.properties内容修改为如下,再请求接口,同样会返回修改后的值
model= 后缀properties,我被修改了
通过这个测试也可以看到,当我没有设置file-extension时,默认去找后缀为properties的配置文件,这一点和本地配置文件很像,但是有一点不同,当我没有test-a.properties文件时并不会去找yml后缀的配置文件,导致会读不到对应的配置。
现在增加file-extension配置,如下:
spring:
application:
name: test-a
cloud:
nacos:
discovery:
server-addr: 你的nocos服务Ip:8848
config:
server-addr: 你的nocos服务Ip:8848
file-extension: yaml
##file-extension: yml
server:
port: 8081
management:
endpoints:
web:
exposure:
include: '*'
切换file-extension 文件扩展名试试,同样找到了对应的文件,其中有一点需要注意的,yaml 和yml 不能混用,这里写yaml ,就要在配置中心建立yaml 文件,如果没有,并不会读取yml 文件。
再试下active,修改配置文件:
spring:
application:
name: test-a
cloud:
nacos:
discovery:
server-addr: 你的nocos服务Ip:8848
config:
server-addr: 你的nocos服务Ip:8848
file-extension: yaml
profiles:
active: dev
server:
port: 8081
management:
endpoints:
web:
exposure:
include: '*'
当前环境为dev,在nacos 管理页面建立test-a-dev.yaml文件,内容为
model: yaml 开发环境
删除了之前的三个文件
重启服务,访问接口。得到了正确的结果
通过测试发现,通过active 引入远程配置文件仍然需要指定file-extension,如果不指定会去找properties文件,没有就会报错,这和本地的配置文件启动顺序不一样。
这里说的报错并不是找不到配置文件报错,而是因为从配置文件获取不到值导致的报错。
好了,这里我们有了一个简单的服务提供者,并且也有了一个配置中心。