一、SpringCloud Config
微服务意味着要将单体应用中的业务拆分成一个个子服务 , 每个服务的粒度相对较小 , 因此系统中会出现大量的服务。由于每个服务都需要必要的配置信息才能运行 , 所以一套集中式的 , 动态的配置管理设施是必不可少的。Spring Cloud 提供了 ConfigServer 来解决这个问题 .Spring Cloud Config 为微服务架构中的微服务提供集中化的外部配置支持 , 配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。SpringCloud Config 分为服务端和客户端两部分。服务端也称为分布式配置中心 , 他是一个独立的微服务应用 , 用来连接配置服务器并为客户端提供获取配置信息, 加密 / 解密 信息等访问接口。客户端则是通过制定的配置中心来管理应用资源 , 以及与业务相关的配置内容 , 并在启动的时候从配置中心获取和加载配置信息配置服务器默认采用 git 来存储配置信息 , 这样就有助于对环境配置进行版本管理 , 并且可以通过git 客户端工具来方便的管理和访问配置内容。一个使用微服务架构的应用系统可能会包括成百上千个微服务 , 配置各部相同 , 需求各不相同:·不同环境不同配置:例如数据源在不同的环境(开发 , 测试 , 生产)是不同的 , 可以通过配置中心·运行期间可以动态调整。例如根据各个微服务的负载状况 , 动态调整数据源连接池大小或者熔断阀值, 并且调整时不停止微服务(配置修改后可以自动更新)
1、将项目打成jar包
①、首先将Commons打成jar包
pom.xml中的对应maven仓库中的位置
②、打包父项目
因为子项目都继承父项目,使用父项目的依赖,所以打包父项目
(1)将父项目的承认子项目注掉,不然打包父项目时,同时也会将子项目打包,
(2)打包前先清一下
打包(package和install都可以进行打包)
因为他是父项目只为子项目提供依赖,所以他是没有jar包的
③、打包生产者(provider)
(1)先清空,在打包,它的jai包可以去本地仓库找也可以在源码编译target哪里找
(2) 将jar复制到桌面
现在服务就已经打包完成了,现在运行它
(3)打开cmd窗口
运行:java -jar jar包名
运行前记得将nacos打开运行起来
运行起来:
然后就能访问生产者了
后面会做集群,就需要将jar包给到每一个人,假如就三个人,他们每个人的电脑上都会有自己的配置,三台电脑都使用了redis(缓存服务,里面有缓存配置),如果缓存服务器过期了,换了新的缓存服务器,里面的缓存地址就会改变,这时候自己的电脑就需要修改,连带那三台电脑也需要修改,但是给到这三台电脑的是jar包,修改不了。就需要自己打开代码修改代码的缓存重新打包,在给到三台电脑,再从新运行,如果又出现别的修改,就会很麻烦,所以今天以下解决这个问题
2、SpringCloud Config
一套集中式的,动态的配置管理设施是必不可少的
Spring Cloud 提供了 ConfigServer 来解决这个问题 .Spring Cloud Config 为微服务架构中的微服务提供集中化的外部配置支持 , 配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
我们使用的是Spring Cloud Alibaba
①、Spring Cloud Alibaba 是使用Nacos来解决这一问题的
nacos config:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
(1)父项目导入pom.xml依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
生产者(provider)和消费者(consumer)都属于客户端;
但是,为了区分,我们新建一个客户端,
②、新建客户端
(1)新建config-client
(2)pom.xml继承父项目,删除不需要的东西
父项目()承认子项目
<modules> <module>provider</module> <module>consumer</module> <module>commons</module> <module>config-client</module> </modules>
客户端就建好了,需要读取服务器信息,
没有配置服务
提供服务器配置,
新建服务器配置:点击“+”号,新建邮箱服务配置
点击发布即可
③、config-client项目中读取配置中心配置的配置
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency>
假如application.yml中什么都没写,bootstrap.yml写了访问端口号,application.yml就能使用bootstrap.yml的端口号访问,bootstrap.yml相当于application.yml的父类;但是application.yml写了端口号,访问端口就会是application.yml的端口号,因为覆盖了,
(1).application.yml
(2).新建bootstrap.yml
读取远程配置中心的服务
server:
port: 8083
spring:
application:
# 会自动根据服务名拉取data-id对应的配置文件.如果data-id跟服务名不一致 就需要手动指定data-id
# 跟服务名相同的data-id的配置文件,称之为默认的配置文件
# 除了默认的配置文件,其他配置文件必须写上后缀
name: config-client
cloud:
nacos:
discovery: #注册中心
server-addr: 127.0.0.1:8848
# username: nacos
# password: nacos
config: #配置中心
prefix: ${spring.application.name}
#指定nacos配置中心地址
server-addr: 127.0.0.1:8848
file-extension: yml # 使用的 nacos 配置集的 dataId 的文件拓展名,同时也是 Nacos 配置集的配置格式,默认为 properties
# namespace: 3a74eaaa-031c-4cae-9441-3c159febeb79 # 使用的 nacos 的命名空间,默认为 null
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
# 共享配置集数组
# shared-configs:
# - data-id: redis-config.yml
# group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
# refresh: true # 是否自动刷新配置,默认为 false
(3)启动类添加注解
注册到注册中心去
@EnableDiscoveryClient
(4)测试查看能不能读取配置
新增controller软件包,新建TestController类
第一种yml注入方式:
package com.mwy.configclient.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@SuppressWarnings("all")
public class TestController {
// yml注入
@Value("${email.host}")
private String host;
@Value("${email.username}")
private String username;
@Value("${email.password}")
private String password;
@RequestMapping("/test01")
public String test01(){
StringBuffer buffer=new StringBuffer();
buffer.append("<b>host</b>:"+host);
buffer.append("<b>username</b>:"+username);
buffer.append("<b>password</b>:"+password);
return buffer.toString() ;
}
}
启动查看结果:
读取成功:
增加刷新配置的注解
@RefreshScope
第二种yml注入方式:
新建EmailProperties
package com.mwy.configclient;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Service;
@Data
@Configuration
@ConfigurationProperties(prefix = "email")
public class EmailProperties {
private String host;
private String username;
private String password;
}
注入再打印
得到结果:
假如有一个项目要加进以下配置是不行的,都用一个就变成了集群了,
所有说生产者就会有生产者的配置文件,消费者就会有消费者的配置文件,不同的相互读取不同的yml文件,所以说,他是给某一个配置去用的,理解为私有配置
但是,还是有一种情况,生产者和消费者存在相同的配置(比如:redis),
④、远程读取配置
(1)写几个公有配置
随机新建redis配置
除了读取自己文件配置同时再读取公共文件配置
bootstrap.yml中写共享配置集数组
测试是否能读取到:
读取成功:
(2)分环境读取配置
新建命名空间
克隆给到开发、测试
修改开发的port
测试的:
1)读取开发环境的配置
填写开发命名空间的ID,
直接测试得到port为开发空间
⑤、共享配置+环境
项目打包了,环境就写死了,不好调
需要到对应的环境中修改 对应的文件,如果修改了,环境就失效了
所以解决这一问题:
(1)首先注掉命名空间
(2)要在服务上运行将config-client项目进行打包
1)将jar复制出到桌面
让他运行起来
运行成功后查看是否能访问
访问成功,现在是公有配置
2)切换环境
java - jar xx.jarjava - jar xx.jar -- spring.cloud.nacos.config.namespace=xxx
bootstrap.yml中环境注掉了,手动指定环境
填写测试的命名空间:
命名空间修改成功:
配置内容中,注释不允许有中文,像以下这样就会运行报错