传送门: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的配置删掉了,不过也可以与之整合,看需求。
依赖:
org.springframework.cloud
spring-cloud-config-server
配置:
#################################################### 基础公共配置 #######################################################
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文件)
依赖:
org.springframework.cloud
spring-cloud-starter-config
## 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的依赖:
org.springframework.cloud
spring-cloud-config-server
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
对于集群版来说下面的配置:
端口需要改改、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只需要这两个依赖。
org.springframework.cloud
spring-cloud-starter-netflix-eureka-client
org.springframework.cloud
spring-cloud-starter-config
在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动态配置功能的微服务,还需要以下步骤:
添加依赖:
org.springframework.boot
spring-boot-starter-actuator
org.springframework.cloud
spring-cloud-starter-bus-amqp
添加配置:
# 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和端口,都是可以的。
到这里就真正的结束了,具体怎么测试,就不写了,功能已经完成,测试就自己慢慢测吧。