前言:
本章做了Nacos环境隔离和配置拉取,通过命名空间的划分能够让不同项目间互不干扰,以及nacos提供的配置管理配合maven的环境选择能够在不变更代码的情况下实现不同配置以及配置热更新。
本章代码基于第3章项目,前置源码可在第3章博客下载,博客链接如下:
从零搭建微服务项目(第3章——Nacos服务注册和发现)-优快云博客https://blog.youkuaiyun.com/wlf2030/article/details/145514414https://blog.youkuaiyun.com/wlf2030/article/details/145514414简要介绍前置项目流程:order-service以及user-service两服务分别连接order-db以及user-db两数据库,order-db中仅有user-id,user-info存在user-db中,为提供完整order-info,order-service通过nacos发现user-service服务地址并使用RestTemplate调用其端口拿取user-info结合从order-db中拿取的信息返回给前端。
本项目源码链接如下:
wlf728050719/SpringCloudBase4https://github.com/wlf728050719/SpringCloudBase4https://github.com/wlf728050719/SpringCloudBase4以及本专栏会持续更新微服务项目,每一章的项目都会基于前一章项目进行功能的完善,欢迎小伙伴们关注!同时如果只是对单章感兴趣也不用从头看,只需下载前一章项目即可,每一章都会有前置项目准备部分,跟着操作就能实现上一章的最终效果,当然如果是一直跟着做可以直接跳过这一部分。专栏目录链接如下,其中Base篇为基础微服务搭建,Pro篇为复杂模块实现。
从零搭建微服务项目(全)-优快云博客https://blog.youkuaiyun.com/wlf2030/article/details/145799620
一、前置项目准备
1.从github下载前一章的项目解压,重命名文件夹为Base4打开。
2.重命名模块为Base4
将父pom中的base3换成base4
3.检查maven,选择配置文件为dev
4.更换两服务的resources下yml文件的数据库配置,数据库sql见第一章数据库准备部分。
5.测试数据库连接 属性->点击数据源->测试连接->输入用户名密码
6.启动nacos(安装和启动见第三章)
7.启动服务
8.测试,访问orderservice接口能够拿取完整订单信息。
二、环境隔离
1.nacos创建命名空间bitgo
2.父工程pom文件为每种环境都添加namespace,值为nacos自动生成的id
3.每个服务均添加namaspace配置,记得先重新加载maven
4.启动服务后查看nacos,此时两服务运行在bitgo命名空间下,不同命名空间的服务无法访问。
三、nacos配置拉取
1.nacos中点击创建三种环境dev、test、prod的不同配置
创建内容如下,Data ID由服务名和开发环境组成
2.在父文件pom中为每种环境创建profile.active配置,用于在不同环境下使用不同的配置环境
最终父pom内容如下:
<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>cn.bit</groupId>
<artifactId>Base4</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<name>Base4</name>
<url>http://maven.apache.org</url>
<modules>
<module>user-service</module>
<module>order-service</module>
</modules>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<!--Spring依赖-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.9.RELEASE</version>
<relativePath/>
</parent>
<dependencyManagement>
<dependencies>
<!--nacos的管理依赖-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
<version>1.18.36</version>
<optional>true</optional>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
</dependency>
<!--测试依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!--多环境配置-->
<profiles>
<profile>
<id>dev</id>
<properties>
<profile.active>dev</profile.active>
<namespace>5dadfe94-237d-4367-998e-b13d172ddcfc</namespace>
<user.service.port>1234</user.service.port>
<order.service.port>1235</order.service.port>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<profile.active>test</profile.active>
<namespace>5dadfe94-237d-4367-998e-b13d172ddcfc</namespace>
<user.service.port>2234</user.service.port>
<order.service.port>2235</order.service.port>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profile.active>prod</profile.active>
<namespace>5dadfe94-237d-4367-998e-b13d172ddcfc</namespace>
<user.service.port>3234</user.service.port>
<order.service.port>3235</order.service.port>
</properties>
</profile>
</profiles>
<build>
<resources>
<!--允许src/main/resources下配置文件读取pom中配置-->
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.9.RELEASE</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
2.在user-service的pom文件中添加nacos配置管理依赖
3.user-service的resources目录下创建bootstrap.yml文件,内容如下:
(bootstrap.yml优先于application.yml加载,服务先通过bootstrap找到nacos的配置文件然后再与application中的配置拼接后产生spring容器。如果配置文件写在bitgo命名空间下,此处一定要保留config.namespace部分否则会无法找到对应配置文件,不写则是在public中找)
spring:
application:
name: user-service
profiles:
active: @profile.active@
cloud:
nacos:
server-addr: localhost:8848
discovery:
cluster-name: HZ
namespace: @namespace@
config:
file-extension: yaml
namespace: @namespace@
同时删去application中重复部分,删除后内容如下:
server:
port: @user.service.port@
spring:
datasource:
url: jdbc:mysql://localhost:3306/db_user?useSSL=false
username: root
password: 15947035212
driver-class-name: com.mysql.jdbc.Driver
mybatis:
type-aliases-package: cn.bit.userservice.bean.po
configuration:
map-underscore-to-camel-case: true
4.在user-service模块下创建config包以及PatternProperties类用于读取配置
PatternProperties类的内容如下,读取前缀为pattern的配置,并自动装填。
package cn.bit.userservice.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "pattern")
public class PatternProperties {
private String dateformat;
}
同时修改user-service controller的方法,即测试时能够输出当前时间,从而可视化其读取的配置文件
UserController类内容如下
package cn.bit.userservice.controller;
import cn.bit.userservice.bean.dto.UserBaseInfoDTO;
import cn.bit.userservice.bean.vo.R;
import cn.bit.userservice.bean.vo.UserFavorVO;
import cn.bit.userservice.config.PatternProperties;
import cn.bit.userservice.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private PatternProperties patternProperties;
@GetMapping("/test/{id}")
public String test(@PathVariable Integer id) {
System.out.println(id);
return id.toString()+ " "+LocalDateTime.now().format(DateTimeFormatter.ofPattern(patternProperties.getDateformat()));
}
@GetMapping("/favor/{id}")
public R getUserFavorById(@PathVariable Integer id) {
UserFavorVO vo = userService.getUserFavorById(id);
if(vo != null) {
return R.ok(vo);
}
else
return R.failed("用户不存在");
}
@GetMapping("/baseInfo/{id}")
public R getUserBaseInfoById(@PathVariable Integer id) {
System.out.println("get request");
UserBaseInfoDTO dto = userService.getUserBaseInfoById(id);
if(dto != null) {
return R.ok(dto);
}
else
return R.failed("用户不存在");
}
}
5.在不同环境下启动服务测试,不同端口对应不同环境,对应不同配置文件。
(通过在maven点击选取当前环境)
6.在服务启动时热更新配置
修改配置文件内容如下,即添加时分秒。
刷新页面能够看到对应效果
6.如果nacos中配置文件命名只有服务名称没有环境名称比如user-service.yaml则无论什么环境均会读取该文件配置,此处不再演示。
多个配置文件有同一配置项时优先级为:nacos特定环境yaml>nacos通用yaml>本地配置环境
最后:
用第3章和第4章大概了解了nacos的基本使用,包括nacos服务的注册和发现,集群管理,环境隔离以及配置管理。之前看实习公司代码找不到application.yml的疑惑也解决了,他把所有的配置都放nacos了,虽然黑马说应该把常变更配置放远端,但感觉写两份配置文件确实有些繁琐以及不方便看,个人也更倾向代码中只写bootstrap配置用于nacos的配置管理,