微服务:Spring Cloud Config 配置中心

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

一、Spring Cloud Config简介

Spring Cloud Confifig为分布式系统中的外部配置提供服务器和客户端支持。使用Confifig Server,您可以为所有环境中的应用程序管理其外部属性。它非常适合spring应用,也可以使用在其他语言的应用上。随着应用程序通过从开发到测试和生产的部署流程,您可以管理这些环境之间的配置,并确定应用程序具有迁移时需要运行的一切。服务器存储后端的默认实现使用git,因此它轻松支持标签版本的配置环境,以及可以访问用于管理内容的各种工具。
 
Spring Cloud Confifig服务端特性:
  • HTTP,为外部配置提供基于资源的API(键值对,或者等价的YAML内容)
  • 属性值的加密和解密(对称加密和非对称加密)
  • 通过使用@EnableConfifigServerSpring boot应用中非常简单的嵌入。
  • 绑定Confifig服务端,并使用远程的属性源初始化Spring环境
  • 属性值的加密和解密(对称加密和非对称加密)

简单的来说:SpringCloudConfig就是我们配置中心,在单体应用中,配置文件不多,可以很方便处理。但是对于微服务架构来说,每个微服务就有:测试环境、生产环境、线上环境等。而微服务项目又有多个,所以呢,我们可以采用配置中心来进行统一管理。

看一张小图:

我们的配置文件实际上放在码云或者github上,我们搭建一个配置服务拿到远端的配置,然后发给微服务。

二、搭建一个小项目

在码云上搭建一个仓库,然后放两个配置文件!!

搭建一个项目:

   <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
server:
  port: 9999 #服务端口
spring:
  application:
    name: config-server #指定服务名
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/Zesystem/config-resposity.git
          username: 码云账号
          password: 码云密码
          skip-ssl-validation: true
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

	public static void main(String[] args) {
		SpringApplication.run(ConfigServerApplication.class,args);
	}
}

直接启动就可可以了!!获取到对应的配置信息

微服务配置

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.32</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <!--引入EurekaClient-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
    </dependencies>

bootstrap.xml

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

启动程序(还有注册中心哦):

这样是可以访问的。说明配置成功!!!

但是这样依然无法解决这样一个问题:我们在码云上面更改配置文件信息,项目不会立即更新,需要重新启动项目,这样非常不友好!!我们看怎么来解决。

三、配置手动刷新

造成不能立即更新的原因是微服务有缓存,当你更改之后不会再次请求git拿取最新值。

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

修改配置服务(开放请求刷新端点)

management:
  endpoints:
    web:
      exposure:
        include: refresh

在git上修改完配置文件之后,需要先访问localhost:9001/actuator/refresh。这样配置就刷新了,可以访问最新的数据。

四、高可用

在之前的代码中,客户端都是直接调用配置中心的server端来获取配置文件信息。这样就存在了一个问题,客户端和服务端的耦合性太高,如果server端要做集群,客户端只能通过原始的方式来路由,server端改变IP地址的时候,客户端也需要修改配置,不符合springcloud服务治理的理念。springcloud提供了这样的解决方案,我们只需要将server端当做一个服务注册到eureka中,client端去eureka中去获取配置中心server端的服务既可。

我们可以构建多个config-server,将信息放到注册中心,然后微服务从注册中心中获取,而不是从config-server中直接获取

config-service

   <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <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>

修改配置注册到注册中心

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地址

 修改配置微服务信息

测试是没问题的,大家可以看一下项目源代码就好!

五、连接消息总线

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

根据此图我们可以看出利用Spring Cloud Bus做配置更新的步骤:
  • 提交代码触发post请求给bus/refresh
  • server端接收到请求并发送给Spring Cloud Bus
  • Spring Cloud bus接到消息并通知给其它客户端
  • 其它客户端接收到通知,请求Server端获取最新配置
  • 全部客户端均获取到最新的配置
消息总线整合:
配置中心配置
 <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>
        </dependency>

 

server:
  port: 9999 #服务端口
spring:
  application:
    name: config-server #指定服务名
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/Zesystem/config-resposity.git
          username:
          password:
          skip-ssl-validation: true
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: user
    password: password
management:
  endpoints:
    web:
      exposure:
        include: 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地址

boostrap.xml配置: 

spring:
  cloud:
    config:
      name: application #应用名称,需要对应git中配置文件名称的前半部分
      profile: pro #开发环境
      label: master #git中的分支
#      uri: http://localhost:9999 #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}

码云上面的配置修改:

 

源码:[email protected]:Zesystem/SpringCloudConfig.git

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章