springcloud高可用配置中心

目录

相关配置

前言

快速搭建eureka

pom

application.yml

启动类

正题

一、搭建配置中心(config-server)

pom包

启动类

bootstrap.yml

二、客户端(config-client)

pom

bootstrap.yml

动态刷新配置

前提

第一步:添加包

第二步:修改配置中心(config-server)的yml文件

第三步:修改客户端(config-client)

第四步:为客户端添加相关注解

实例1

第五步:使用更新请求来刷新配置

重要扩展

局部刷新

跟踪总线事件


相关配置

工具:idea2019

springboot版本:2.1.6

springcloud版本:Greenwich.SR2

注:我只列出主要用到的包,如果自己项目用到其它的自行补上。还有yml文件不要盲目复制,要注意一下端口之类的。

前言

高可用的配置中心需要与注册中心(eureka)结合。

如果搭建了可直接进入正题

快速搭建eureka

pom

 <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

application.yml

server:
  port: 8761

spring:
  application:
    name: eureka
eureka:
  instance:
    lease-renewal-interval-in-seconds: 30 #每30S给其他服务发次请求,监测心跳
    lease-expiration-duration-in-seconds: 90 #如果其他服务没心跳,90S后剔除该服务
    hostname: localhost
  client:
    # 是否注册自己的信息到EurekaServer,默认是true
    register-with-eureka: false
    # 是否拉取其它服务的信息,默认是true
    fetch-registry: false
    service-url:
      #即其它服务向注册中心注册的地址
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

启动类


@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {

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

}

 

正题

关于git仓库(我用的是码云gitee)的截图

 

一、搭建配置中心(config-server)

pom包

由于高可用的配置中心要用到注册中心,所以我同时引入了客户端发现的包

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

启动类

EnableConfigServer成为配置中心


@SpringBootApplication
@EnableConfigServer
public class ConfigServerApplication {

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

}

bootstrap.yml

个人推荐使用bootstrap.yml而不是application.yml

bootstrap的启动优先级比application高

spring:
  application:
    #微服务实例名
    name: config
  cloud:
    config:
      server:
        git:
          #git地址  克隆>>HTTPS  可以去掉.git结尾
          uri: https://gitee.com/XXXXXXXX
          #分支
          default-label: master
          username: XXXXX@qq.com
          password: XXXXx
          #如果配置文件在git的根目录下就不用这个,假如在aa目录下  那就写上 aa
#          search-paths:
#         basedir: 指定本地仓库的地址,不指定则由系统决定 

server:
  port: 9001

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

 到此,我们可以先验证得不得。在浏览器中输入地址,端口是配置中心的。

补:我们可以利用此方式来检测yml的格式是否正确,不正确浏览器会报一些错误提示。

补:事实上我们可以把.yml改成.json

 

http请求地址和资源文件映射如下:

    /{application}/{profile}[/{label}]

    /{application}-{profile}.yml

    /{label}/{application}-{profile}.yml

    /{application}-{profile}.properties

    /{label}/{application}-{profile}.properties

label为分支的意思,默认master。profile就对应着dev。

二、客户端(config-client)

以order-server服务为例

pom

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

bootstrap.yml

这里必须使用bootstrap.yml这个配置文件名,不然容易出问题。

这里要特别注意的是yml文件中的spring.application.name服务名是对应着git上的配置文件名,不要结尾的dev。

当然,假如git上的配置文件名是order-server-dev.yml的话,你配置的时候就写order-server,我这里是order。

spring:
  application:
    #对应git上的配置文件名 : order-dev.yml 不写dev
    name: order
  cloud:
    config:
      #节点
      label: master
      #       dev开发环境配置文件
      #       test测试环境
      #       pro正式环境
      profile: dev
      discovery:
        enabled: true
        #指向配置中心服务名
        service-id: config

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka 

到此就配置完了。当然,再实际中你得多启动几个配置中心,防止挂掉。

温馨提示:先启动注册中心(eureka)再启动配置中心,再启动其它服务


动态刷新配置

实际开发中改个配置就要重启是很不好的,所以,我们要改为动态刷新配置才行。

为实现目标,需要用到spring cloud bus组件,关于详尽内容自己去查。它可以使用rabbitmq、kafka来传递信息,我这里只举例rabbitmq,事实上kafka在实际中也经常用到,建议也学一下。

下面进行升级:

前提

安装好rabbitmq,自己百度

第一步:添加包

配置中心与客户端都要引用下面的包:

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

第二步:修改配置中心(config-server)的yml文件

相较于上面的配置,多了rabbitmq与management。

要注意格式是否写对,多一个tab键之类的就不好。

rabbitmq好理解,management稍后再说。

spring:
  application:
    name: config
  cloud:
    bus:
      #跟踪总线事件
      trace:
        enabled: true
    config:
      server:
        git:
          uri: https://gitee.com/XXXXXX
          default-label: master
          username: XXX@qq.com
          password: XXX
          #basedir: 指定本地仓库的地址,不指定则由系统决定
  rabbitmq:
    username: guest
    port: 5672
    password: XXXXX
    host: XXXXXXX



server:
  port: 9001

eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

management:
  endpoints:
    web:
      exposure:
        #对外开放刷新配置的接口,可以指定多个,或者开放所有
        include: bus-refresh

第三步:修改客户端(config-client)

也就多了rabbitmq的配置,其它的不变

spring:
  rabbitmq:
    host: XXXXX
    port: 5672
    username: guest
    password: XXXX
  application:
    #对应git上的文件名 : order-dev.yml 不写dev
    name: order
  cloud:
    config:
      #节点
      label: master
      #       dev开发环境配置文件
      #       test测试环境
      #       pro正式环境
      profile: dev
      discovery:
        enabled: true
        service-id: config
      fail-fast: true

eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:8761/eureka


第四步:为客户端添加相关注解

关键字:@RefreshScope

         关于此关键字,我的理解是:用于动态刷新此注解下与远程配置有关的属性。(不对之处留言补充指正)

这是git上order-dev.yml文件中的一段内容:

实例1

 

到这里,基本就完成了。当然,还是不能动态刷新,哈哈,请往下看。

第五步:使用更新请求来刷新配置

我们再修改了git仓库的代码之后,不会生效,要发送一条请求来刷新配置。

打开cmd,输入以下命令来更新配置,9001为配置中心的端口,后面的actuator/bus-refresh是固定的。

curl -X POST http://localhost:9001/actuator/bus-refresh

linux下的命令也差不多。

也就是说,我们更新了仓库配置,要发送一个请求来刷新微服务的配置。

至此,已经实现了动态刷新


当然,这样还是不怎么ok,总不能老是手动发送吧。

解决方案:

再git上配置webhooks,简单理解为只要修改了仓库的文件就会发送自己指定的请求。

补:本地怎么实验?使用内网穿透工具,比如免费的natapp。

 

重要扩展

原文来源:https://yq.aliyun.com/articles/622384

局部刷新

某些场景下(例如灰度发布),我们可能只想刷新部分微服务的配置,此时可通过/bus/refresh端点的destination参数来定位要刷新的应用程序。

例如:/bus/refresh?destination=customers:9000 ,这样消息总线上的微服务实例就会根据destination参数的值来判断是否需要要刷新。其中,customers:9000(服务名:端口) 指的是各个微服务的ApplicationContext ID。

destination参数也可以用来定位特定的微服务。例如:/bus/refresh?destination=customers:** ,这样就可以触发customers微服务所有实例的配置刷新。

扩展阅读:关于ApplicationContext ID

默认情况下,ApplicationContext ID是spring.application.name:server.port,详见org.springframework.boot.context.ContextIdApplicationContextInitializer.getApplicationId(ConfigurableEnvironment) 方法。

来源: https://yq.aliyun.com/articles/622384

 

跟踪总线事件

一些场景下,我们可能希望知道Spring Cloud Bus事件传播的细节。此时,我们可以跟踪总线事件(RemoteApplicationEvent的子类都是总线事件)。

跟踪总线事件非常简单,只需设置spring.cloud.bus.trace.enabled=true ,这样在/bus/refresh端点被请求后,访问/trace端点就可获得类似如下的结果:

{
  "timestamp": 1481098786017,
  "info": {
    "signal": "spring.cloud.bus.ack",
    "event": "RefreshRemoteApplicationEvent",
    "id": "66d172e0-e770-4349-baf7-0210af62ea8d",
    "origin": "microservice-foo:8081",
    "destination": "**"
  }
},{
  "timestamp": 1481098779073,
  "info": {
    "signal": "spring.cloud.bus.sent",
    "type": "RefreshRemoteApplicationEvent",
    "id": "66d172e0-e770-4349-baf7-0210af62ea8d",
    "origin": "microservice-config-server:8080",
    "destination": "**:**"
  }
}

这样,我们就可清晰地知道事件的传播细节。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值