配置中心

上文【Java】Spring Cloud学习笔记04我们学到了微服务的消费者、异常处理、熔断器,同时微服务也不断地增多。在实际项目中,我们会创建多个微服务,这些服务可能是同一个数据库以及相同的数据源,一旦我们的数据库地址发生改变,服务的配置文件都需要改。为了解决这个问题,那就是创建一个配置中心,专门用于管理它的所有配置,也就是我们将所有配置文件放到统一的地方进行管理。 SpringCloud 为我们集成了配置中心——Spring Cloud Config 组件。

创建配置中心

在工程下新建一个module,名为eurekaconfig

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

然后在pom.xml中新建以下依赖:

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

<dependencies>
  <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-netflix-hystrix</artifactId>
  </dependency>
</dependencies>

创建启动类 ConfigApplication

import org.springframework.boot.SpringApplication;
import org.springframework.cloud.client.SpringCloudApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringCloudApplication
@EnableConfigServer //开启配置中心
public class ConfigApplication {

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

}

创建 application.yml 并增加如下内容:

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

server:
  port: 8888
spring:
  application:
    name: eurekaconfig
  profiles:
    active: dev
  cloud:
    config:
      server:
        git:
          uri: https://github.com/seven-ocean/springcloud.git #配置git仓库地址
          searchPaths: config #配置仓库路径
          username: xxxxxxxx #访问git仓库的用户名
          password: xxxxxxxx #访问git仓库的用户密码
      label: master #配置仓库的分支
eureka:
  client:
    serviceUrl:
      defaultZone: http://localhost:8761/eureka/

首先分别启动注册中心 eurekaserver 和配置中心 eurekaconfig,浏览器访问:http://localhost:8761,我们可以看到如下界面:

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

接着我们访问http://localhost:8888/config/dev,即可看到eurekaconfig程序从github上读取到的配置信息:

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

配置中心搭好以后,为了统一管理其他服务的配置,我们还需要对其它的微服务改造。以服务提供者 eurekaclient 为例,按照以下步骤进行操作。

pom.xml 加入配置中心依赖:

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

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

删除resources 下的 application.yml新建 bootstrap.yml,它的配置如下:

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

spring:
  cloud:
    config:
      name: eurekaclient
      label: master
      discovery:
        enabled: true
        serviceId: eurekaconfig
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

在配置中心配置的 Git 仓库相应路径下(/config)创建配置文件 eurekaclient.yml

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

server:
  port: 8763
spring:
  application:
    name: eurekaclient

最后我们依次启动注册中心eurekaserver、配置中心eurekaconfig和服务提供者 eurekaclient,可以看到 eurekaclient 的监听端口为 8763,说明 eurekaclient 成功从 Git 上拉取了配置:

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

配置自动刷新

通过上面的步骤,我们发现一个问题:每次修改配置都需要重新提交到git并启动服务,配置才会生效。因此我们需要一个更便捷的方法,每当修改了配置文件时配置自动生效,Spring Cloud 给我们提供了配置自动刷新的方法。

通过接口形式刷新

1.eurekaclient 工程的 pom.xml 添加以下依赖:

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

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

2.修改配置文件 eurekaclient.yml增加以下内容,之后提交到远程 Git 仓库:

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

management:
  endpoints:
    web:
      exposure:
        include: refresh,health,info

3.在 HelloController 类加入 @RefeshScope 依赖:

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RefreshScope //以这种方式注释的bean可以在运行时刷新(可以在程序运行时刷新配置文件)
public class HelloController {

    @Value("${server.port}")
    private int port;

    @RequestMapping("index")
    public String index() {
        return "Hello World!,端口:" + port;
    }
}

4.依次启动注册中心eurekaserver、配置中心eurekaconfig和服务提供者 eurekaclient,我们发现服务提供者端口为8763。接着我们将接口修改为8764并提交到git仓库,最后执行接口http://localhost:8763/actuator/refresh并访问http://localhost:8763/index可以发现配置已经更新:

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

<span class='yzk_title_1668'>【Java】Spring Cloud学习笔记05</span>-Maxchen个人博客

通过消息队列刷新

上文我们访问 /refresh 接口来手动刷新配置,如果每个微服务的配置都需要我们接口手动刷新,随着系统的不断扩张,维护会越来越麻烦。因此,我们需要自动刷新配置的机制:利用 Git 仓库的 WebHook,可以设置当有内容 Push 上去后,则通过 HTTP 的 POST 远程请求指定地址;利用消息队列 RabbitMQ自动通知到每个微服务。

记录你的想法-丰富你的知识
  • <span class='yzk_title_1601'>【Java】Spring Cloud学习笔记04</span>
    【Java】Spring Cloud学习笔记04
  • <span class='yzk_title_1492'>【Java】Spring Cloud学习笔记03</span>
    【Java】Spring Cloud学习笔记03
  • <span class='yzk_title_1425'>【Java】Spring Cloud学习笔记02</span>
    【Java】Spring Cloud学习笔记02
  • <span class='yzk_title_1416'>【Java】Spring Cloud学习笔记01</span>
    【Java】Spring Cloud学习笔记01
  • <span class='yzk_title_1402'>【Java】Spring boot学习笔记05</span>
    【Java】Spring boot学习笔记05
  • <span class='yzk_title_1394'>【Java】Spring boot学习笔记04</span>
    【Java】Spring boot学习笔记04
发表评论

坐等沙发