springcloud-config初步配置

SpringCloud Config

配置中心:

对于传统的单体应用而言,常使用配置文件来管理所有配置,比如SpringBoot的application.yml文件,但是在微服务架构中全部手动修改的话很麻烦而且不易维护。微服务的配置管理一般有以下需求:

  • 集中配置管理,一个微服务架构中可能有成百上千个微服务,所以集中配置管理是很重要的。
  • 不同环境不同配置,比如数据源配置在不同环境(开发,生产,测试)中是不同的。
  • 运行期间可动态调整。例如,可根据各个微服务的负载情况,动态调整数据源连接池大小等
  • 配置修改后可自动更新。如配置内容发生变化,微服务可以自动更新配置
    综上所述对于微服务架构而言,一套统一的,通用的管理配置机制是不可缺少的总要组成部分。常见的做法就是通过配置服务器进行管理

Spring Cloud Config为分布式系统中的外部配置提供服务器和客户端支持。

Spring Cloud Config项目是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,

  • server提供配置文件的存储、以接口的形式将配置文件的内容提供出去。
  • client通过接口获取数据、并依据此数据初始化自己的应用。

一、 config服务端

  1. 创建公开码云仓库config-repository

仓库公开,不能私有

https://gitee.com/

上传文件:product-dev.yml 和product-pro.yml

# product-pro.yml
server:
  port: 9002 #端口
spring:
  application:
    name: service-product #服务名称
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8
    username: root
    password: root
  jpa:
    database: MySQL
    show-sql: true
    open-in-view: true
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest    
#配置Eureka
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9000/eureka/
  instance:
    prefer-ip-address: true #使用ip地址注册
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
name: itcast-product-2
# product-dev.yml
server:
  port: 9001 #端口
spring:
  application:
    name: service-product #服务名称
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/shop?useUnicode=true&characterEncoding=utf8
    username: root
    password: root
  jpa:
    database: MySQL
    show-sql: true
    open-in-view: true
#配置Eureka
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9000/eureka/
  instance:
    prefer-ip-address: true #使用ip地址注册
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
name: itcast-dev

https://gitee.com/it-lemon/config-repostory/tree/master

  1. 创建config_server服务模块,导入依赖
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
  1. 启动类
SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {
	public static void main(String[] args) {			SpringApplication.run(ConfigServerApplication.class,args);
	}
}

  1. application.yml
server:
  port: 10000 #服务端口
spring:
  application:
    name: config-server #指定服务名
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/hxmkd/config-repository.git  #git地址

现在访问http://localhost:10000/product-dev.yml 获取到git的文件就成功了。

二、 config客户端

  1. 修改模块product_service,导入依赖

      <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-config</artifactId>
            </dependency>
    
  2. 创建resource/bootstrap.yml文件,删除application.yml

    spring:
      cloud:
        config:
          name: product #应用名称,需要对应git中配置文件名称的前半部分
          profile: dev #开发环境
          label: master #git中的分支
          uri: http://localhost:10000 #config-server的请求地址
    

    意思是:bootstrap.yml从config-server服务去读取,config-server服务读取git


    访问http://localhost:9002/product/1,可以看出bootstrap.yml没有配置数据库等,但项目可以运行。


手动刷新

现在基本配置完成,但当改动git里的文件,项目微服务里配置并不会随之改变,还需进行配置。

  1. 给product_service服务导入依赖

       <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-actuator</artifactId>
            </dependency>
    
  2. 添加@RefreshScope注解

    @RefreshScope 开启动态刷新

    product_service服务什么地方使用git读取的文件内容,就给其类上添加注解

    @RestController
    @RequestMapping("/product")
    @RefreshScope //开启动态刷新
    public class ProductController {
    
    	@Autowired
    	private ProductService productService;
    //这里是name属性需要,所以添加@RefreshScope
    	@Value("${name}")
    	private String name;
    
    
    	@RequestMapping(value = "/{id}",method = RequestMethod.GET)
    	public Product findById(@PathVariable Long id) {
    		return productService.findById(id);
    	}
    
    	@RequestMapping(value = "/test")
    	public String test() {
    		return name;
    	}
    }
    

    git的yml文件里配置了name和值(最后一行),ProductController里有name属性需要随之变动,所以添加@RefreshScope

  3. 开启动态刷新的请求路径端点

    在product_service的bootstrap.yml追加

    management:
      endpoints:
        web:
          exposure:
            include: refresh
    
  4. 启动所有微服务项目后,修改git中product-dev.yml z中配置。刷新配置文件需要发送post请求 http://localhost:9002/actuator/refresh9002是product服务端口号,refresh是config-server服务的bootstrap.yml中配置的路径(management.endpoints.web.exposure.include)

    ),因为是post请求,所以需要使用postman进行发送。

  5. 发送之后,服务会重新读取配置文件。

  6. 发送之后,服务会重新读取配置文件。


product的application.yml 配置从eureka读取config-server服务

spring:
  cloud:
    config:
      name: product #应用名称,需要对应git中配置文件名称的前半部分
      profile: pro #开发环境
      label: master #git中的分支
      uri: http://localhost:10000 #config-server的请求地址
      #通过注册中心获取config-server配置
      discovery:
        enabled: true #开启服务发现
        service-id: config-server
eureka:
  client:
    service-url:
      defaultZone: http://localhost:9000/eureka/
  instance:
    prefer-ip-address: true #使用ip地址注册
    instance-id: ${spring.cloud.client.ip-address}:${server.port}
management:
  endpoints:
    web:
      exposure:
        include: refresh

消息总线

在微服务架构中,通常会使用轻量级的消息代理来构建一个共用的消息主题来连接各个微服务实例,它广播的消息会被所有在注册中心的微服务实例监听和消费,也称消息总线。
SpringCloud中也有对应的解决方案,SpringCloud Bus 将分布式的节点用轻量的消息代理连接起来,可以很容易搭建消息总线,配合SpringCloud config 实现微服务应用配置信息的动态更新。

Spring Cloud Bus做配置更新的步骤:

  • 提交代码触发post请求给bus/refresh
  • server端接收到请求并发送给Spring Cloud Bus
  • Spring Cloud bus接到消息并通知给其它客户端
  • 其它客户端接收到通知,请求Server端获取最新配置
  • 全部客户端均获取到最新的配置
  1. config-server服务和product_service服务 都导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-bus</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-stream-binder-rabbit</artifactId>
  1. config-server服务 application.yml

    server:
      port: 10000 #服务端口
    spring:
      application:
        name: config-server #指定服务名
      cloud:
        config:
          server:
            git:
              uri: https://gitee.com/hxmkd/config-repository.git  #git地址
      rabbitmq:
        host: 127.0.0.1
        port: 5672
        username: guest
        password: guest
    management:
      endpoints:
        web:
          exposure:
            include: bus-refresh
    eureka:
      client:
        serviceUrl:
          defaultZone: http://127.0.0.1:9000/eureka/
      instance:
        preferIpAddress: true
        instance-id: ${spring.cloud.client.ip-address}:${server.port} #spring.cloud.client.ip-address:获取ip地址
    
  2. git中product-dev.yml添加rabbitmq的配置

spring:
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest
  1. product服务的bootstrap.yml

    spring:
      cloud:
        config:
          name: product #应用名称,需要对应git中配置文件名称的前半部分
          profile: pro #开发环境
          label: master #git中的分支
          uri: http://localhost:10000 #config-server的请求地址
          #通过注册中心获取config-server配置
          discovery:
            enabled: true #开启服务发现
            service-id: config-server
    eureka:
      client:
        service-url:
          defaultZone: http://localhost:9000/eureka/
      instance:
        prefer-ip-address: true #使用ip地址注册
        instance-id: ${spring.cloud.client.ip-address}:${server.port}
    

之前是使用postman往product服务发送刷新的请求,

现在是用postman发送post请求给config-server来刷新所有配置文件的请求

http://localhost:10000/actuator/bus-refresh

10000是config-server服务端口号,bus-refresh是onfig-server服务的application.yml中配置的路径(management.endpoints.web.exposure.include)




项目源码:https://gitee.com/hxmkd/spring-cloud/tree/master/study_springcloudB_config

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值