config 分布式配置中心^springCloud(四)

config 分布式配置中心^springCloud(四)

在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是Config-Server,二是Config-Client。

上一篇文章描述了怎么创建一个 eureka server 项目,服务注册中心有了。
目前还没有任何服务被注册到eureka server 中去,这一篇我们创建一个名为 cloud-config 项目,计划将来作为工程中所有微服务的配置中心使用,但它同时又是一个 eurake client 项目,运行后会被注册到 eureka server 中

1. 新建 cloud-config 项目

按之前的方法新建一个module ,使用 spring initializr 快速搭建,如下

选择必要的依赖。包括 eureka client 的依赖 和 config server的依赖

2. 加入相关依赖

分布式配置中心的工作原理是接收仓库中配置文件更改的消息,然后将改动的配置文件内容发送到消息总线/消息队列(springcloud bus),对应的模块读取消息队列中已改变的配置内容,最后实现动态配置的效果。

所以我们还要加上以下依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-monitor</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

这里可以用amqp也可以用kafaka,我这里因为之前安装好了rabbitMq,所以选用了amqp。
monitor主要用来接收git远程仓库发来的webhook请求

项目创建完成后,修改pom.xml。完整pom文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>cn.ludg</groupId>
        <artifactId>cloud-cli-root</artifactId>
        <version>0.0.1-dev</version>
        <relativePath>../cloud-cli-root/pom.xml</relativePath>
    </parent>

    <artifactId>cloud-config</artifactId>
    <packaging>jar</packaging>
    <name>cloud-config</name>
    <description>Ludg's spring project</description>

    <dependencies>

        <!--服务发现-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <!--配置中心-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-monitor</artifactId>
        </dependency>
        <!--消息总线-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

        <!--测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

3. 修改 boostrap.yml文件

配置eureka服务地址、远程git仓库、消息队列相关信息

server:
  port: 8200
eureka:
  instance:
    prefer-ip-address: true # 注册服务的时候使用服务的ip地址
  client:
    service-url:
      defaultZone: http://localhost:8001/eureka/ #把本服务注册到注册中心去
spring:
  application:
    name: cloud-config
  # 配置中心
  cloud:
    config:
      server:
        git:
          uri: git_address  # 远程git仓库的地址
          username: git_username  # 以及相应的账户名
          password: git_password  # 和密码
          # basedir: E:\Java_IDEA\component\basedir  # 可以使用这个配置项来指定本地git仓库的路径
          search-paths: dir_name # 一个git配置仓库可以给多个cloud项目使用,通过不同目录来区分
  # 配置rabbitmq的地址以及用户密码
  rabbitmq:
    host: localhost # 服务器部署后应改为服务器上的mq地址
    port: 5672
    username: ludg1
    password: 123456       

4. 在启动类上添加注解

//表明配置中心服务者的身份
@EnableConfigServer
//表明是一个eureka客户端
@EnableEurekaClient

5. 创建存放项目配置文件的git仓库

在本地创建git仓库并推送到远程仓库上(码云或者github、gitlab之类),我使用的是码云的私有仓库。
具体操作可以参考这篇文章 简易git教程

此时启动 cloud-config 项目,就可以在注册中心看到了。配置中心 既是一个config server又是一个eureka的client。

此时项目已可以访问到远程git仓库的配置文件,但是还不能实时拿取文件改动信息。要想达到这个目的需要一个触发事件。

什么时候触发呢?当然是 git提交 事件发生时。git已经提供了钩子函数githooks ,当事件发生时,githook生效执行一系列指令。码云这类在线git仓库也提供了这类功能,他们叫webhooks,这东西可以在你推送代码到仓库时调用你设置好的回调地址。

6. 远程仓库设置webhook

因为我目前是自己电脑上(局域网内部)开发的项目,码云的webhook访问不到我的ip地址,这时我们需要一个 内网穿透工具 来将本地ip映射成外网可以访问的域名。我使用的是 NATAPP 这个工具,按照官网文档注册设置,选择免费版即可。
正常启动natapp后,显示如下界面

接下来配置码云中的webhooks
把生成的域名地址 http://tmhev3.natappfree.cc 和对应接口拼接起来设置到webhooks中

http://tmhev3.natappfree.cc/monitor?path=*


确定之后,查看本地natapp中多出一条信息。 200就表示调用成功。

OK,目前为止分布式配置中心已经搭建起来了,并且可以实时接收到远程仓库中的配置文件的更改通知。下一篇文章讲怎么搭建一个微服务,作为配置中心的client项目,实现动态修改配置文件。