分布式系统面临的配置文件的问题
微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,
由于每个服务都需要必要的配置信息才能运行,所以一套集中式的,动态的配置管理设施是必不可少的springcloud提供了
configserver来解决这个问题,我们每一个微服务自己带一个application.yml,那上百个配置文件要修改起来,简直让人抓狂
springcloud config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置。
springcloud config分为服务端和客户端两部分:
服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密,解密信息等访问接口
客户端则是通过指定的配置中心来管理应用资源,以及与业务先关的配置内容,并在启动的时候从配置中心获取和加载配置信息。配置服务器默认采用git
来存储配置信息,这样就有助于对环境配置进行版本管理并且可以通过git客户端工具来方便管理和访问配置内容。
由于springcloud config默认使用git来存储配置文件(也有其他方式,比如支持svn和并本地文件),但是最推荐还是Git而且使用的是http/https访问的形式
项目创建好后老规矩代码,三大步上篮
添加依赖
<dependencies> <!--actuator--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> <version>2.2.6.RELEASE</version> </dependency> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
编写配置
server: port: 3344 spring: application: name: config-server cloud: config: server: git: uri: https://gitee.com/damonYuanlai/springcloud-config-server.git #仓库地址
开启注解
@SpringBootApplication @EnableConfigServer//开启注解 public class ConfigApplication3344 { public static void main(String[] args) { SpringApplication.run(ConfigApplication3344.class,args); } }
测试前需要在服务仓库上配置一个application.yml文件
# 这个3344项目只是为了读取配置,不干别的事,我这里配了 2 套环境为了测试, spring: profiles: dev application: name: springcloud-config-dev --- spring: profiles: test application: name: springcloud-config-test
访问地址:
老规矩,还是三大步上篮
添加依赖
<dependencies> <!--config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>2.2.6.RELEASE</version> </dependency> <!--erueka server--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.4.7.RELEASE</version> </dependency> <!--热部署工具--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies>
修改配置: 系统级别的 可以覆盖application.yml 用户级别的
bootstrap.yml
# 系统级别的 可以覆盖application.yml spring: cloud: config: uri: http://localhost:3344 # 直接3344项目获取配置文件 name: config-eureka # 需要从git上读取资源名称 profile: dev #使用环境 label: master # 使用分支
appliction.yml
#用户级别 spring: application: name: config-eureka-8000
@SpringBootApplication @EnableEurekaServer //EnableEurekaServer 表示注册服务的启动类,可以接收别人注册进来 public class ConfigEurekaServer8000 { public static void main(String[] args) { SpringApplication.run(ConfigEurekaServer8000.class,args); } }
测试访问前需要在git仓库中添加一个config-eureka.yml
spring: profiles: active: dev --- server: port: 8000 spring: profiles: dev application: name: springcloud-config-eureka-dev #Eureka 配置 eureka: instance: hostname: eureka0.com #服务端实例名称,如果名字一样,会当中同一个集群导致集群失败,所有我们需要改回来 client: register-with-eureka: false #表示是否向eureka注册中心注册自己 fetch-registry: false #如果为false 则表示自己为注册中心 service-url: #监控页面地址 #单机模式下配置自己一个就够了 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka # 集群:我们需要在8100 下挂载8000和8200 #defaultZone: http://eureka0.com:8000/eureka,http://eureka2.com:8200/eureka --- server: port: 8000 spring: profiles: test application: name: springcloud-config-eureka-test #Eureka 配置 eureka: instance: hostname: eureka0.com #服务端实例名称,如果名字一样,会当中同一个集群导致集群失败,所有我们需要改回来 client: register-with-eureka: false #表示是否向eureka注册中心注册自己 fetch-registry: false #如果为false 则表示自己为注册中心 service-url: #监控页面地址 #单机模式下配置自己一个就够了 defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka # 集群:我们需要在8100 下挂载8000和8200 #defaultZone: http://eureka0.com:8000/eureka,http://eureka2.com:8200/eureka
访问地址:http://localhost:3344/config-eureka-test.yml
最后就是服务提供者了,新建模块