赞
踩
记录:386
场景:在nacos中集中管理微服务配置,微服务在启动时,连接nacos读取配置到本地使用。在nacos中集中管理微服务注册,微服务在启动时,连接nacos并注册到其服务管理中。在微服务配置文件中只需写nacos配置和注册等少量配置。
源码:https://github.com/alibaba/Nacos
1.初始化准备
1.1准备nacos
Nacos版本:Nacos 2.1.1。
1.1.1启动和登录nacos
启动命令:sh startup.sh -m standalone
地址:http://127.0.0.1:8848/nacos
用户名/口令:nacos/nacos
1.1.2创建命名空间
命名空间ID:aa3eebb6-daa2-4db8-9a29-03dd8a17db15
命名空间名:hub
1.1.3创建配置
选中hub命名空间,创建配置。
(1)hub-example01-config.yml配置
Data ID:hub-example01-config.yml
Group:DEFAULT_GROUP
配置格式:YAML
配置内容:
- pring:
- main:
- allow-bean-definition-overriding: true
- server:
- max-http-header-size: 51200
(2)hub-example02-config.yml配置
Data ID:hub-example02-config.yml
Group:DEFAULT_GROUP
配置格式:YAML
配置内容:
- hub:
- example:
- cityName: '杭州'
1.2创建Maven工程
使用IntelliJ IDEA创建Maven工程。
(1)微服务名称
名称:hub-example-301-nacos
(2)微服务groupId和artifactId
groupId: com.hub
artifactId: hub-example-301-nacos
(3)微服务核心模块版本
- spring-boot 2.6.3
- spring-cloud 2021.0.1
- spring-cloud-alibaba 2021.0.1.0
- spring-framework 5.3.15
2.修改pom.xml
修改pom.xml,引入项目依赖Jar和管理Jar包。
2.1修改pom.xml文件
引入核心依赖包:
内容:
- <!--nacos注册中心-->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- <version>2021.0.1.0</version>
- <exclusions>
- <exclusion>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <!--nacos配置中心-->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
- <version>2021.0.1.0</version>
- <exclusions>
- <exclusion>
- <groupId>com.alibaba.nacos</groupId>
- <artifactId>nacos-client</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
2.2全量pom.xml文件
全量pom.xml文件请参考附录:1.8.1全量pom.xml文件
3.创建bootstrap.yml文件
在bootstrap.yml文件中配置nacos的配置和注册信息以及微服务端口等基础信息,其它配置均从nacos中读取。
3.1配置bootstrap.yml
文件名:../src/main/resources/bootstrap.yml
文件内容:
server: port: 18301 servlet: context-path: /hub-301-nacos spring: application: name: hub-example-301-nacos cloud: nacos: discovery: server-addr: 127.0.0.1:18848 username: nacos password: nacos namespace: aa3eebb6-daa2-4db8-9a29-03dd8a17db15 group: DEFAULT_GROUP config: server-addr: 127.0.0.1:18848 username: nacos password: nacos namespace: aa3eebb6-daa2-4db8-9a29-03dd8a17db15 group: DEFAULT_GROUP file-extension: yaml shared-configs: - dataId: hub-example01-config.yml group: DEFAULT_GROUP refresh: true - dataId: hub-example02-config.yml group: DEFAULT_GROUP refresh: true
3.2解析bootstrap.yml
(1)配置端口号和context-path,此项可选,不指定就会默认。
(2)配置微应用名称:hub-example-301-nacos,此项必须配置,因为注册微服务需用到微服务名称。
(3)nacos的注册在spring.cloud.nacos.discovery下的属性。
spring.cloud.nacos.discovery.server-addr,指定nacos地址。
spring.cloud.nacos.discovery.username,指定nacos名称。
spring.cloud.nacos.discovery.password,指定nacos密码。
spring.cloud.nacos.discovery.namespace,指定命名空间。
spring.cloud.nacos.discovery.group,指定group名称。
(4)nacos的配置在spring.cloud.nacos.discovery下的属性。
spring.cloud.nacos.config.server-addr,指定nacos地址。
spring.cloud.nacos.config.username,指定nacos名称。
spring.cloud.nacos.config.password,指定nacos密码。
spring.cloud.nacos.config.namespace,指定命名空间。
spring.cloud.nacos.config.group,指定group名称。
spring.cloud.nacos.config.file-extension,指定从nacos读取配置文件后缀。
spring.cloud.nacos.config.shared-configs,指定从nacos读取配置文件。
注意:spring.cloud.nacos.config.shared-configs属性是一个List属性,换句话说,就是可以读取多个配置文件。
在Java代码中类型:List<NacosConfigProperties.Config> sharedConfigs。
在bootstrap.yml配置文件中,以短横线-,开头代表是List类型。
(5)解析spring.cloud.nacos.config.shared-configs
nacos的spring.cloud.nacos.config.shared-configs是List属性。
例如:
- - dataId: hub-example01-config.yml
- group: DEFAULT_GROUP
- refresh: true
解析:-,代表是List类型。dataId,指定nacos中的文件名。group,指定文件所在组。refresh,指定是否刷新,true,刷新,false,不刷新,换句话说,就是微服务能实时刷新nacos中的配置,达到同步效果。
4.创建启动类
4.1创建包
com.hub.example.domain:微服务使用到的DTO等实体类。
com.hub.example.controller:Controller类,发布Restful接口。
4.2启动类
包名:com.hub.example。
启动类:HubExampleNacosApplication。
(1)内容
- @SpringBootApplication
- @ComponentScan(basePackages = "com.hub.example.*")
- public class HubExampleNacosApplication {
- public static void main(String[] args) {
- SpringApplication.run(HubExampleNacosApplication.class, args);
- }
- }
(2)解析
@SpringBootApplication,SpringBoot标记启动类的注解。
@ComponentScan,扫描指定的包,将组件加载到IOC容器中。
5.编写Controller代码
5.1Controller代码
- @RestController
- @RequestMapping("/hub/example/city")
- @RefreshScope
- public class CityController {
- @Value("${hub.example.cityName}")
- private String cityName;
- @PostMapping("/queryCityByCityId")
- public ResultObj<CityDTO> queryCityByCityId(String cityId) {
- CityDTO cityDTO = new CityDTO();
- cityDTO.setCityId(cityId != null ? Long.parseLong(cityId) : 1L);
- cityDTO.setCityName(cityName);
- cityDTO.setUpdateTime(new Date());
- return ResultObj.data(200, cityDTO, "执行成功");
- }
- }
5.2解析Controller代码
@Value("${hub.example.cityName}"):从nacos的hub-example02-config.yml配置中读取配置信息。
@RefreshScope:此注解会激活@Value实时从配置文件中取值,只要对应配置有变化,达到同步效果。
6.支撑对象
6.1CityDTO
- @Data
- public class CityDTO implements Serializable {
- private Long cityId;
- private String cityName;
- private Double landArea;
- private Long population;
- private Double gross;
- private String cityDescribe;
- private String dataYear;
- @JsonFormat(
- pattern = "yyyy-MM-dd HH:mm:ss"
- )
- private Date updateTime;
- }
6.2ResultObj
- @Data
- public class ResultObj<T> implements Serializable {
- private int code;
- private boolean success;
- private String msg;
- private T data;
- private ResultObj(int code, T data, String msg) {
- this.code = code;
- this.data = data;
- this.msg = msg;
- this.success = code == 200;
- }
- public static <T> ResultObj<T> data(int code, T data, String msg) {
- return new ResultObj<>(code, data, msg);
- }
- }
7.使用Postman工具测试
使用Postman工具测试。
测试地址:http://127.0.0.1:18301/hub-301-nacos/hub/example/city/queryCityByCityId
测试入参:cityId=20230322
返回结果:
- {
- "code": 200,
- "success": true,
- "msg": "执行成功",
- "data": {
- "cityId": 20230322,
- "cityName": "杭州",
- "landArea": null,
- "population": null,
- "gross": null,
- "cityDescribe": null,
- "dataYear": null,
- "updateTime": "2023-03-22 21:21:55"
- }
- }
8.附录
8.1全量pom.xml文件
- <?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>
- <groupId>com.hub</groupId>
- <artifactId>hub-example-301-nacos</artifactId>
- <version>1.0-SNAPSHOT</version>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.6.3</version>
- </parent>
- <description>集成nacos框架应用</description>
- <packaging>jar</packaging>
- <properties>
- <maven.compiler.source>1.8</maven.compiler.source>
- <maven.compiler.target>1.8</maven.compiler.target>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <spring.boot.maven.plugin.version>2.6.3</spring.boot.maven.plugin.version>
- <spring.boot.version>2.6.3</spring.boot.version>
- <spring.cloud.version>2021.0.1</spring.cloud.version>
- <spring.cloud.alibaba.version>2021.0.1.0</spring.cloud.alibaba.version>
- <nacos.client.version>2.1.1</nacos.client.version>
- <lombok.version>1.18.24</lombok.version>
- <guava.version>30.1-jre</guava.version>
- </properties>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</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>
- <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.springframework.boot</groupId>
- <artifactId>spring-boot-starter</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-bootstrap</artifactId>
- </dependency>
- <!--nacos注册中心-->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- <exclusions>
- <exclusion>
- <groupId>org.springframework.cloud</groupId>
- <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <!--nacos配置中心-->
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
- <exclusions>
- <exclusion>
- <groupId>com.alibaba.nacos</groupId>
- <artifactId>nacos-client</artifactId>
- </exclusion>
- </exclusions>
- </dependency>
- <dependency>
- <groupId>com.alibaba.nacos</groupId>
- <artifactId>nacos-client</artifactId>
- <version>${nacos.client.version}</version>
- </dependency>
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <version>${lombok.version}</version>
- </dependency>
- <dependency>
- <groupId>com.google.guava</groupId>
- <artifactId>guava</artifactId>
- <version>${guava.version}</version>
- </dependency>
- </dependencies>
- <build>
- <finalName>${project.artifactId}</finalName>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- <version>${spring.boot.maven.plugin.version}</version>
- <configuration>
- <fork>true</fork>
- <addResources>true</addResources>
- </configuration>
- <executions>
- <execution>
- <goals>
- <goal>repackage</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
- </project>
以上,感谢。
2023年3月22日
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。