11.8 微服务与配置文件解耦
-
我们可以将之前的子模块中的配置提取出来,托管到gitee上统一管理,这样运维人员维护配置文件就不变动子模块了,实现了模块与配置的解耦。
-
下面用例子来解释下这种做法的好处
-
在基础工程spring-cloud-microservice下,建立和microservice-cloud-eureka-7003一样的microservice-cloud-eureka-config-7003注册中心,需要在microservice-cloud-eureka-7003工程pom的基础上补充config相关依赖
<!--配置中心客户端依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>3.1.4</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!-- Spring Boot 监控模块,完善监控信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
- 在microservice-cloud-eureka-config-7003的类路径下/resources不要application.yml配置文件,新建一个bootstrap.yml系统级配置文件,是配置连接spring cloud config server服务中心的相关配置尽可能简单
#bootstrap.yml 是系统级别的,加载优先级高于 用户级别application.yml ,负责从外部加载application.yml配置并解析
#对应了java的加载器,根加载器由于用户加载器
spring:
application:
name: MicroserviceCloudEurekaConfig7003 #微服务名称,对外暴漏的微服务名称,十分重要
cloud:
config:
label: master #仓库分支名
name: configEureka #配置文件名称,如:application-dev.yml 中的 application,或application.yml集成配置文件
profile: dev #环境名 如:application-dev.yml 中的 application, 中的 dev,或application.yml继承环境中的dev
#别忘记添加 http:// 否则无法读取
##Spring Cloud Config Server地址
uri: http://localhost:8016
- 而其他的如eureka的配置抽取出来作为configEureka.yml提交到gitee上,注意此处端口和注册中心域名在不同环境中不同作为不同环境测试内容。
spring:
profile:
active: dev
---
server:
port: 7003
spring:
config:
activate:
on-profile: dev
#eureka配置,Spring cloud 自定义服务名称和 ip 地址
eureka:
instance:
hostname: eurekaserver7003.com #eureka7001.comeureka服务端的实例名称,主机名是否可以在配置时确定(否则将从操作系统原语中猜测)
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #指示此客户端是否应从 eureka 服务器获取 eureka 注册表信息
service-url: #监控页面地址
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #发布的服务注册中心地址,单机
defaultZone: http://eurekaserver7001.com:7001/eureka/,http://eurekaserver7002.com:7002/eureka/ #集群版 将当前的 Eureka Server 注册到 7003 和 7003 上,形成一组互相注册的 Eureka Server 集群
---
server:
port: 7004
spring:
config:
activate:
on-profile: test
#eureka配置,Spring cloud 自定义服务名称和 ip 地址
eureka:
instance:
hostname: eurekaserver7004.com #eureka7001.comeureka服务端的实例名称,主机名是否可以在配置时确定(否则将从操作系统原语中猜测)
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #指示此客户端是否应从 eureka 服务器获取 eureka 注册表信息
service-url: #监控页面地址
#defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #发布的服务注册中心地址,单机
defaultZone: http://eurekaserver7001.com:7001/eureka/,http://eurekaserver7002.com:7002/eureka/ #集群版 将当前的 Eureka Server 注册到 7003 和 7003 上,形成一组互相注册的 Eureka Server 集群
-
这样先启动下microservice-cloud-config-server-8016配置服务,访问http://localhost:8016/master/configEureka-dev.yml说明config server连接正常
-
然后启动microservice-cloud-eureka-config-7003注册中心,访问http://localhost:7003/结果如下。注意此时的7003端口是从config server处读取的。
-
由此可知microservice-cloud-eureka-config-7003成功启动并运行
-
然后同样的在基础工程spring-cloud-microservice下建立仿制microservice-cloud-provider-dept-8001服务提供模块建立一个microservice-cloud-provider-dept-config-8001模块,代码基本相同。项目结构如图
-
同样需要在pom中补充config相关依赖
<!-- Spring Boot 监控模块,完善监控信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
- application.yml里面为空文件,只需要在bootstrap.yml系统级配置文件中配置连接spring cloud config server服务中心的相关配置尽可能简单。
#bootstrap.yml 是系统级别的,加载优先级高于 用户级别application.yml ,负责从外部加载application.yml配置并解析
#对应了java的加载器,根加载器由于用户加载器
spring:
cloud:
config:
label: master #仓库分支名
name: configdept #配置文件名称,如:application-dev.yml 中的 application,或application.yml集成配置文件
profile: dev #环境名 如:application-dev.yml 中的 application, 中的 dev,或application.yml继承环境中的dev
#别忘记添加 http:// 否则无法读取
##Spring Cloud Config Server地址
uri: http://localhost:8016
- 而其他的如eureka,数据源相关的配置抽取出来作为configdept.yml提交到gitee上,注意此处数据源在不同环境中连接的数据库不同作为不同环境测试内容
spring:
profile:
active: dev
---
server:
port: 8001
spring:
application:
name: microservicecloudproviderdeptconfigDev #微服务名称,对外暴漏的微服务名称,十分重要
config:
activate:
on-profile: dev
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/springcloud_db2?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimeZone=UTC
type: com.alibaba.druid.pool.DruidDataSource
#SpringBoot默认是不注入这些的,需要自己绑定
#druid数据源专有配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
#配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
#如果允许报错,java.lang.ClassNotFoundException: org.apache.Log4j.Priority
#则导入log4j 依赖就行
filters: stat,wall,log4j2
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
#整合mybatis
mybatis:
type-aliases-package: com.zk.springcloud.entity
mapper-locations: classpath:mybatis/mapper/*.xml
#config-location: classpath:mybatis/mybatis-config.xml
configuration:
map-underscore-to-camel-case: true #默认开启驼峰命名法,可以不用设置该属性
#eureka配置,Spring cloud 自定义服务名称和 ip 地址
eureka:
client:
service-url:
#defaultZone: http://localhost:7001/eureka/ #这个地址是 7001注册中心在 application.yml 中暴露出来额注册地址 (单机版)
defaultZone: http://eurekaserver7001.com:7001/eureka/,http://eurekaserver7002.com:7002/eureka/,http://eurekaserver7003.com:7003/eureka/ #将服务注册到 Eureka Server 集群
fetch-registry: true
instance:
instance-id: microservice-cloud-provider-dept-config-8001-dev #自定义服务名称描述信息
prefer-ip-address: true #显示访问路径的 ip 地址
#zookeeper需要配置那些服务service被扫描,eureka则是将整个服务包注册进去了
# spring cloud 使用 Spring Boot actuator 监控完善信息
# Spring Boot 2.50对 actuator 监控屏蔽了大多数的节点,只暴露了 heath 节点,本段配置(*)就是为了开启所有的节点
management:
endpoints:
web:
exposure:
include: health,info #应包含的端点 ID 或 '' 全部,* 在yaml 文件属于关键字,所以需要加双引号
#include的值也可以改成*,但建议还是最小暴露原则,用啥开启啥
info:
env:
enabled: true #启用配置里的info开头的变量
info: #配置一些服务描述信息,监控信息页面显示,,可以判断服务是否正常
app.name: microservice-cloud-provider-dept-config-8001-dev
company.name: cloud.zk.com
auth: zk
email: 123@qq.com
#build.aetifactId: @project.artifactId@
#build.version: @project.version@
---
server:
port: 8002
spring:
application:
name: microservicecloudproviderdeptconfigTest #微服务名称,对外暴漏的微服务名称,十分重要
config:
activate:
on-profile: test
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/springcloud_db3?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimeZone=UTC
type: com.alibaba.druid.pool.DruidDataSource
#SpringBoot默认是不注入这些的,需要自己绑定
#druid数据源专有配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
#配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
#如果允许报错,java.lang.ClassNotFoundException: org.apache.Log4j.Priority
#则导入log4j 依赖就行
filters: stat,wall,log4j2
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
#整合mybatis
mybatis:
type-aliases-package: com.zk.springcloud.entity
mapper-locations: classpath:mybatis/mapper/*.xml
#config-location: classpath:mybatis/mybatis-config.xml
configuration:
map-underscore-to-camel-case: true #默认开启驼峰命名法,可以不用设置该属性
#eureka配置,Spring cloud 自定义服务名称和 ip 地址
eureka:
client:
service-url:
#defaultZone: http://localhost:7001/eureka/ #这个地址是 7001注册中心在 application.yml 中暴露出来额注册地址 (单机版)
defaultZone: http://eurekaserver7001.com:7001/eureka/,http://eurekaserver7002.com:7002/eureka/,http://eurekaserver7004.com:7004/eureka/ #将服务注册到 Eureka Server 集群
fetch-registry: true
instance:
instance-id: microservice-cloud-provider-dept-config-8001-test #自定义服务名称描述信息
prefer-ip-address: true #显示访问路径的 ip 地址
#zookeeper需要配置那些服务service被扫描,eureka则是将整个服务包注册进去了
# spring cloud 使用 Spring Boot actuator 监控完善信息
# Spring Boot 2.50对 actuator 监控屏蔽了大多数的节点,只暴露了 heath 节点,本段配置(*)就是为了开启所有的节点
management:
endpoints:
web:
exposure:
include: health,info #应包含的端点 ID 或 '' 全部,* 在yaml 文件属于关键字,所以需要加双引号
#include的值也可以改成*,但建议还是最小暴露原则,用啥开启啥
info:
env:
enabled: true #启用配置里的info开头的变量
info: #配置一些服务描述信息,监控信息页面显示,,可以判断服务是否正常
app.name: microservice-cloud-provider-dept-config-8001-test
company.name: cloud.zk.com
auth: zk
email: 123@qq.com
#build.aetifactId: @project.artifactId@
#build.version: @project.version@
注意若是git上有其他的名为application.yml配置文件,有可能会和别的配置文件,如:configdept.yml的配置项糅合,导致配置文件莫名多出一些配置,所以最好将application.yml修改为模块对应的名称
-
然后启动microservice-cloud-provider-dept-config-8001模块,访问http://localhost:8001/dept/list结果如下,
-
由数据源字段显示,说明microservice-cloud-provider-dept-config-8001成功启动并成功读取到配置文件内容,读取了开发环境springcloud_db2数据库中的内容
-
然后修改configEureka.yml为test测试环境并提交,激活test环境,修改microservice-cloud-eureka-config-7003中bootstrap.yml的读取的环境配置为test,
-
然后启动microservice-cloud-eureka-config-7003注册中心,访问http://localhost:7004/结果如下。说明此时测试环境配置生效。
-
然后修改configdept.yml为test测试环境并提交,激活test环境。修改microservice-cloud-provider-dept-config-8001中bootstrap.yml的读取的环境配置为test。
-
然后启动microservice-cloud-provider-dept-config-8001注册中心,访问http://localhost:8001/dept/list结果如下。说明此时测试环境配置生效。
-
这样就实现了微服务下配置中心的统一管理,实现了配置文件于模块的解耦。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123792.html