SpringCloud版本Hoxton SR5 --- 第七讲:SpringCloud Config 分布式配置中心+整合bus、rabbitmq、actuator

 

传送门:SpringCloud版本Hoxton SR5 --- 第一讲:认识 先看SpringCloud Config 可以完成的功能,或者说他在项目中的定位和作用。

SpringCloud config也可以使用Eureka配置集群高可用.

 

建议将eureka注册中心 与 springcloud config服务端分开部署。

在上面建议的前提下,运行的时候,启动是有顺序的:

单机版:

1. 当eureka使用了springcloud config客户端,必须先启动springcloud config服务端,再启动eureka服务端,再启动其他微服务。

2. 当eureka没有使用springcloud config客户端,springcloud config服务端与eureka服务端没有先后顺序,但是其他微服务必须最后启动。

集群版:

如果是集群的话,eureka服务端一定使用不到springcloud config组件。

这时候,eureka集群 与 springcloud config集群服务端,没有启动顺序。但是其他微服务需要在上面两个集群启动后在启动。

 

先来单机版:

===================================== SpringCloud config 单机版 =======================================

 

服务端: 单机模式没必要注册到Eureka,所以我将Eureka的配置删掉了,不过也可以与之整合,看需求。

依赖:
        <!-- springcloud config 服务端依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
配置:
#################################################### 基础公共配置 #######################################################
server:
  port: 7500  # 配置项目访问端口


#################################################### config 配置 #######################################################
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/w_wangqinmin/config.git # http格式的仓库地址,不管是GitHub,码云都是这样的。亲自测试,官网也是这么写的。
          search-paths: eureka,item,login,order,zuul  # 匹配搜索(有些配置文件放在git仓库的自定义目录之下,直接访问不到,这里就是自动匹配,比较懒的人可以直接配: '*'  不过不建议)。git仓库,我们可能建不同的目录,比如:myone、mytwo、mythree 这些文件夹。当mythree里面有一个要使用的配置文件时,前面就配置myt*就可以自动找到配置文件了。
          clone-on-start: true  # 是否启动的时候就clone远程仓库到本地服务端(相当于懒加载)。意思就是当该微服务启动的时候,就将git仓库里的代码clone下来。如果设位置false,就表示用的时候再去git仓库clone。
          skipSslValidation: true #禁用配置服务器对Git服务器的SSL证书的验证 (默认false)
          timeout: 5 # 配置服务器将等待获取HTTP连接的时间(默认 5秒,以秒为单位)
          force-pull: true # 当本地仓库clone的副本出问题的时候,从远程存储库强制拉取(默认false)
          deleteUntrackedBranches: false # 为使本地仓库与远程仓库一致,强制将Spring Cloud Config本地服务端未跟踪的分支删除。(默认false)
          default-label: master # 访问分支
        force-pull: true # 与服务器本地副本冲突的情况下,从远程存储库强制拉出
启动类:
package com.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;


/**
 * @author: wangqinmin
 * @date : 2020/6/16
 * @description: 仰天大笑出门去,我辈岂是蓬蒿人
 */
@SpringBootApplication
@EnableConfigServer
public class ConfigApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConfigApplication.class);
    }
}

这里有几点说明:

1. 上面配置的git远程仓库:就是存储配置文件的地方。

2. 当这个项目启动后,可以直接使用 http://localhost:7500/配置文件名 打开。

3. git仓库里的配置文件名,这个取名字,也是有规则的,不能随便乱取。

这是在官网copy的规则:

/ {application} / {profile} [/ {label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

解释一下:

当springcloud config服务端启动好了,并且git仓库准备好了,且有配置文件后。直接访问 http://localhost:7500/配置文件名

如果胡乱给配置文件取名字,而且不知道访问规则, 可能你得到的就是404。 下面给访问例子:

每一个访问地址对应上面官网copy的一个规则。Login-Server.yml就是git仓库中配置文件的文件名。

http://localhost:7500/Login-Server/dev/master    master可以不加,通常情况配置文件都在git的master目录(默认访问master)

http://localhost:7500/Login-Server-dev.yml         有没有发现,我的配置文件名是 Login-Server.yml。 但是访问加了 -dev

http://localhost:7500/master/Login-Server-dev.yml   默认访问master所以可以访问:http://localhost:7500/Login-Server-dev.yml 

http://localhost:7500/Login-Server-dev.properties

http://localhost:7500/master/Login-Server-dev.properties    这里也是一样的,默认master。

看了上面的规则一定有一个疑问,就是-dev是哪里来的,dev需要在配置文件里面配置,就是对环境的选择。

给一个git仓库Login-Server1.yml的文件做参考学习: 码云git仓库 Login-Server1.yml文件配置, 下面是解释git仓库配置文件中某些配置作用:

---    # 不同环境配置用 三个减号 分割。

# (注释用 #)

spring:
  profiles: dev  # 本地环境(Initialization)  ### 这里就是定义的dev,上面访问地址加的dev,就表示访问这个配置文件中的这个配置。如果这里是自定义的 test,那么访问地址后面就将 -dev 换成  -test


上面3行,每一行都是对当前行配置的解释。

 

客户端:就是我们的微服务端,使用起来非常简单。只需2步:

1.引入依赖

2. 增加配置文件bootstrap.yml  ( 放在resource目录下,不是把application.yml删除,而是新增一个bootstrap.yml文件)

依赖:
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
##  bootstrap.yml 文件里面的配置。
spring:
  cloud:
    config:
      name: Login-Server #这是我们要读取的配置文件名 对应获取规则的{application}
      profile: local   #这个是要获取的环境 对应的便是{profile}
      label: master #这个就是获取的节点 对应的是{label}
      uri: http://localhost:7777/ #单机版, 指定Spring cloud config服务端的地址,就是让这个服务去git仓库中获取所需的配置数据。

对于客户端增加的bootstrap.yml的配置文件,我要说明几点:

1.  文件名必须是 bootstrap.yml 。他和application.yml在同一个目录下,并且它的级别比application.yml级别高。就是说,bootstrap.yml中配置的属性优先使用。 比如:application.yml中配置了 server.port = 6060 ,bootstrap.yml读取git仓库中的 server.port = 5050, 那么程序运行起来后,一定是5050端口。如果远程读取或者本地读取不成功,就是使用本地application.yml的配置文件。

2. boostrap.yml文件, 默认情况下它们不能被本地配置。解释:就是说当你打开idea 或者 eclipse ,你需要创建bootstrap.yml这个文件。但是文件里面需要配置的是:去git 或者 本地配置仓库 获取配置数据的地址,而不是直接在里面进行端口、eureka等等的配置,注意这里面配置的只是获取配置文件的地址。

3. boostrap.yml  中的:

       name,就是对应git仓库中配置文件的名称。

       profile就是对应git仓库Login-Server.yml配置文件内部的环境。

       label 就是对应配置文件在git仓库的哪个目录。

 

单机版的SpringCloud config就到这里了。引入依赖、添加bootstrap.yml文件。直接就完成了对SpringCloud Config客户端的整合,没有其他的配置了。也不需要在启动类上加注解。

 

 

===================================== SpringCloud config 集群版 =====================================

通常情况下,小项目是不需要集群的,如果使用集群一定是很大的项目,主要做高可用。

如果是这样的话,Eureka也一定是集群。所以我下面的配置,也是用了  Eureak集群。

 

服务端:

相比较springcloud的单机模式,添加了对Eureak的依赖:
        <!-- springcloud config 服务端依赖 -->
        <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>

 对于集群版来说下面的配置:

端口需要改改、instance-id(注册到Eureka的服务名)需要改改不能重复、配置的ip地址修改成自己的、search-paths根据自己git仓库的文件名改改,可以直接改成   ’*‘  ,就是匹配所有,配置中也有解释。

其他都是一样的。

#################################################### 基础公共配置 #######################################################
server:
  port: 7501  # 配置项目访问端口

#################################################### eureka客户端配置 #######################################################
eureka: # 注意下面的时间设置,是在网络不稳定的时候生效,但是如果是手动关闭eureka的客户端实例,会直接给eureka服务端发送信息,直接关闭在eureka中注册的服务
  client:
    serviceUrl:
      # defaultZone: http://wangqinmin.com:6001/eureka  #集群配置   我建议使用这种,但是服务端的配置中,需要打开自我注册,默认也是打开的。
      defaultZone: http://wangqinmin.com:6001/eureka,http://127.0.0.1:6002/eureka,http://localhost:6003/eureka  #集群配置
      # 将本项目的客服端注册到所有的服务端中,为了防止服务端不注册自己的情况
      #(一般情况下不会出现这种问题,就是怕有些人不懂eureka,胡乱配置集群服务端,所以这是一个最稳妥的方式,如果就按照我服务端的配置来,就不会出现这样的问题。)
      # 其实会出问题的原因就是:手动的把自我注册的配置关闭了。
      # 这种配置还有一个缺点,没有连上的服务会不停的在日志中报错
  instance:
    instance-id: client-config-1 #此实例注册到eureka服务端的唯一的实例ID(也就是给当前项目指定一个ID,当当前项目运行起来后,就会将这个ID注册到eureka的服务端)
    prefer-ip-address: true #是否显示IP地址
    leaseRenewalIntervalInSeconds: 30 #eureka客户需要多长时间发送心跳给eureka服务器,表明它仍然活着,默认为30 秒 (与下面配置的单位都是秒)
    leaseExpirationDurationInSeconds: 90 #Eureka服务器在接收到实例的最后一次发出的心跳后,需要等待多久才可以将此实例删除,默认为90秒

#################################################### config 配置 #######################################################
spring:
  application:
    name: cluster-config
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/w_wangqinmin/config.git # http格式的仓库地址,不管是GitHub,码云都是这样的。亲自测试,官网也是这么写的。
          search-paths: eureka,item,login,order,zuul  # 匹配搜索(有些配置文件放在git仓库的自定义目录之下,直接访问不到,这里就是自动匹配,比较懒的人可以直接配: '*'  不过不建议)。git仓库,我们可能建不同的目录,比如:myone、mytwo、mythree 这些文件夹。当mythree里面有一个要使用的配置文件时,前面就配置myt*就可以自动找到配置文件了。
          # search-paths: myone,mytwo,myt*  # 匹配搜索(有些配置文件放在git仓库的自定义目录之下,直接访问不到,这里就是自动匹配,比较懒的人可以直接配: '*'  不过不建议)。git仓库,我们可能建不同的目录,比如:myone、mytwo、mythree 这些文件夹。当mythree里面有一个要使用的配置文件时,前面就配置myt*就可以自动找到配置文件了。
          clone-on-start: true  # 是否启动的时候就clone远程仓库到本地服务端(相当于懒加载)。意思就是当该微服务启动的时候,就将git仓库里的代码clone下来。如果设位置false,就表示用的时候再去git仓库clone。
          skipSslValidation: true #禁用配置服务器对Git服务器的SSL证书的验证 (默认false)
          timeout: 5 # 配置服务器将等待获取HTTP连接的时间(默认 5秒,以秒为单位)
          force-pull: true # 当本地仓库clone的副本出问题的时候,从远程存储库强制拉取(默认false)
          deleteUntrackedBranches: false # 为使本地仓库与远程仓库一致,强制将Spring Cloud Config本地服务端未跟踪的分支删除。(默认false)
          default-label: master # 访问分支
        force-pull: true # 与服务器本地副本冲突的情况下,从远程存储库强制拉出

启动类: 添加了对Eureak整合的注解

package com.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;


/**
 * @author: wangqinmin
 * @date : 2020/6/16
 * @description: 仰天大笑出门去,我辈岂是蓬蒿人
 */
@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class Config7501Application {
    public static void main(String[] args) {
        SpringApplication.run(Config7501Application.class);
    }
}

 

服务端: 微服务端其他要用组件自己加,集群版的Springcloud Config只需要这两个依赖。

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

在resource目录下,增加一个 bootstrap.yml 的配置文件

spring:
  cloud:
    config:
      name: Login-Server #这是我们要读取的配置文件名 对应获取规则的{application}
      profile: local   #这个是要获取的环境 对应的便是{profile}
      label: master #这个就是获取的节点 对应的是{label}
      discovery: ###  下面是集群版的配置
        enabled: true # 打开对Eureka服务注册中心的支持
        service-id: cluster-config # 集群版 配置config在Eureka上注册的应用名称


eureka: # 注意下面的时间设置,是在网络不稳定的时候生效,但是如果是手动关闭eureka的客户端实例,会直接给eureka服务端发送信息,直接关闭在eureka中注册的服务
  client:
    serviceUrl:
      defaultZone: http://wangqinmin.com:6001/eureka,http://127.0.0.1:6002/eureka,http://localhost:6003/eureka  #集群配置

上面的配置需要说明一下:

这里剔除了单机版的对 uri 的配置,因为springcloud config集群整合Eureka之后,所有的SpringCloud Config注册到了Eureak的集群上,所以访问的话,直接访问Eureka注册后的应用名称就好了。就不需要单独的去访问某一个SpringCloud config的服务端了。

并且将Eureka的集群访问地址,配置在bootstra.yml的配置文件中。

 

这样集群版的SpringCloud Config就好了。

如果不需要修改代码里的属性,上面的springcloud config直接使用就够了。

如果需要修改代码里注入的属性,可以参考下面的整合 springcloud bus + actuator。

 


上面虽然把springcloud config服务端、客户端的配置都弄好了,但是要实现动态的修改配置,并应用到已经启动好的微服务上,还需要借助: springcloud bus + actuator组件:

 

所以,需要springcloud config动态配置功能的微服务,还需要以下步骤:

添加依赖:
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <!-- RabbitMQ 消息总线依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
添加配置:
# actuator组件监听:
management:
  endpoints:
    web:
      exposure:
        include: '*'  # 暴露所有端口, 单独开项目HystrixDashBoard,查看本微服务调用情况。
  #        include: hystrix.stream  # 暴露所有端口, 单独开项目HystrixDashBoard,查看本微服务调用情况。
  endpoint:
    health:
      show-details: always


# bus整合mq的mq连接配置
spring:
  rabbitmq:
    host: 47.96.100.61
    port: 5673  # 默认是5672,这里是我自己修改的。
    username: admin
    password: admin

rabbitmq的linux安装传送门:docker快速安装rabbitmq  ,当然如果不会安装docker的话:Linux CentOS7.2安装Docker

基本配置算是做好了。

还需要指定哪些地方,使用springcloud config的动态配置功能,因为我虽然修改了配置,但是不是项目每个地方都需要修改吧,所以需要修改的地方,要提前在该类上加上 @RefreshScope注解,类似:

@RestController
@RequestMapping("/login")
@RefreshScope
public class LoginController {

    @Value("${month}")
    private String month; // 这个就是我再git仓库中配置的一个属性,修改的也是git仓库的这个属性,然后测试在微服务运行的前提下,看看这个属性是否动态修改了,测试就自己测了,不贴具体步骤了。
}

然后:必须post请求调用,http://localhost:8080/actuator/bus-refresh 用idea的httpclient/postman/其他 看自己的习惯。
注意这里的 localhost:8080 是任意一个使用springcloud config客户端 + bus + actuator的微服务 的ip和端口,都是可以的。

 

到这里就真正的结束了,具体怎么测试,就不写了,功能已经完成,测试就自己慢慢测吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值