🥳🥳Welcome Huihui's Code World ! !🥳🥳
接下来看看由辉辉所写的关于SpringCloud的相关操作吧
目录
🥳🥳Welcome Huihui's Code World ! !🥳🥳
????????微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务。
????????由于每个服务都需要必要的配置信息才能运行,所以一套集中式的,动态的配置管理设施是必不可少的。
????????Spring Cloud 提供了 ConfigServer来解决这个问题. Spring Cloud Config 为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。 SpringCloud Config 分为服务端和客户端两部分。
????????服务端也称为分布式配置中心,他是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。
????????客户端则是通过制定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心 获取和加载配置信息,配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并 且可以通过git客户端工具来方便的管理和访问配置内容
一个使用微服务架构的应用系统可能会包括成百上千个微服务,配置各部相同,需求各不相同:
- 不同环境不同配置:例如数据源在不同的环境(开发,测试,生产)是不同的,可以通过配置中心
- 运行期间可以动态调整:例如根据各个微服务的负载状况,动态调整数据源连接池大小或者熔断阀 值,并且调整时不停止微服务(配置修改后可以自动更新)
????????配置中心组件是一种用于管理应用程序配置信息的工具或服务。它通常可以集中存储应用程序的各种配置数据,如数据库连接字符串、API密钥、环境变量等,以便方便地进行配置管理和维护。使用配置中心组件可以大大简化应用程序的部署和维护工作,同时也有助于提高应用程序的可靠性和安全性。常见的配置中心组件包括Spring Cloud Config、Consul、Zookeeper等
这里我还是列举一些场景,来便于理解吧
????????我们在生产环境部署的时候,为了服务的可用性以及负载,通常一个服务会启动多个实例,要么在不同的机器 要么在相同机器不同端口…【例如 商品服务启动4个,订单服务启动4个,用户服务启动N个,文件上传服务启动X个等等…】
????????当服务启动的时候便会去加载自己的配置文件application.properties或者application.yml
一气呵成…这本身,是没有问题的。但是我们总会面临因业务更改导致配置文件需要新增/修改/删除属性…那么在这样的场景中,我们该如何面对呢??
是选择更改配置文件后,从新打包部署?
还是将配置文件存放部署的服务机器某路径上,更改保存再重启服务?
两种方式对比的话,第二种方式可能效率更高一点。但是我们微服务通常又是使用容器化部署,如果保存在宿主机某一处的话,也是涉及到目录挂载问题的,且在服务器上,也不方便多个服务统一管理…
这时候,咱们统一的配置中心就横空出世啦!!!
1.引入依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
2.进入nacos编写配置
关于nacos的下载,在之前的博文中已经提及了nacos的使用
点击发布即是编写好了这个配置文件,那么再配置列表中便可以看到刚刚所写好的这个配置文件
3.读取配置? ? ? ?
?然后咱自己写的项目就要去读取这个配置文件,那么这个配置文件在项目中肯定要比我们自身项目中的配置文件先读取。所以这里需要再写一个配置文件用于读取nacos中所编写的文件
bootstrap.yml:
bootstrap.yml是SpringBoot默认支持properties和YAML两种格式的配置文件。bootstrap.yml(bootstrap.properties)用来程序引导时执行,应用于更加早期配置信息读取,可以用来配置application.yml中使用到参数等。application.yml(application.properties) 应用程序特有配置信息,可以用来配置后续各个模块中需使用 的公共参数等。
要使bootstrap.yml 先于application.yml 加载,就必须先导入一个依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>
然后需要再项目中读取配置文件
单个读取文件中的属性
package com.provider.main; import com.provider.main.config.EmailProperties; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/myconfig") @Slf4j public class ConfigController { @Value("${email.user}") private String user; @Value("${email.code}") private String code; @RequestMapping("/test1") public String test1() { log.info("user{},code{}",user,code); return "SB"; } @RequestMapping("/test2") }
效果演示
读取整个文件中的配置属性
package com.provider.main.config; import lombok.Data; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; /** * @author是辉辉啦 * @create 2024-01-07-18:41 */ @ConfigurationProperties(prefix = "email") @Component @Data public class EmailProperties { private String user; private String code; }
测试
package com.provider.main; import com.provider.main.config.EmailProperties; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/myconfig") @Slf4j public class ConfigController { @Autowired private EmailProperties emailProperties; @RequestMapping("/test2") public Object test2() { return emailProperties; } }
效果演示
以上两种方式都可以读取到配置文件的属性值,不过整个的读取效率会更加高
4.不同环境下的配置
我们可以在整个命名空间中去增加多个环境的空间,其中去存放不同环境中所需的配置文件
我们只需要在配置文件中加上这一个配置,就能够指定对应的空间了
namespace: 1e189198-5765-4b5d-acdd-71e8baa387c0
其中填的是对应空间的id
我们在项目完成了,打包的时候是不需要将这个配置给写上的,因为这样子的话,我们就不好更改空间了,我们直接不写,这样运行这个打好的jar包时,可以使用命令的方式指定对应的空间
在最后,我也附上整个yml文件的配置
server: port: 8082 spring: application: name: provider cloud: nacos: server-addr: localhost:8848 config: server-addr: ${spring.cloud.nacos.server-addr} prefix: ${spring.application.name} file-extension: yaml group: DEFAULT_GROUP # 共享配置集数组 shared-configs: - data-id: redis.yaml # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP group: DEFAULT_GROUP # 是否自动刷新配置,默认为 false refresh: true #dev环境 --开发 namespace: 1e189198-5765-4b5d-acdd-71e8baa387c0
好啦,今天的分享就到这了,希望能够帮到你呢!😊😊??