杭州网站建设培训班/网络推广主要是做什么工作
目录
介绍
架构
配置仓库:
配置中心:
客户端:
测试
刷新
介绍
在单机部署中,可能会出现一个或者多个的配置文件,比如开发环境以及生产环境,在这种情况下配置文件放在一起即可,如果是springboot程序,由它来指定profiles是不错的选择。
在集群或者分布式中,可能多个程序有着相同的配置文件,也可能每个程序有单独的配置文件,如何管理这些配置文件就是一个问题了,挨个去找去修改明显是不合适的。面对解决这种问题,springcloud为我们提供了配置中心。
本教程版本Greenwich.RELEASE
架构
大概像上面这图一样,需要有个配置仓库,放置一大堆配置文件,这个仓库可以是公网库,也可以是本地库(本地库如何能让所有的客户端都能访问是一个问题),一般都会使用公网git库。
流程一般是:客户端会先访问配置中心,配置中心告诉该客户端“你的配置文件在某个公网库里,网址是多少,叫什么什么名字,你去公网库拿去吧(这种说法不严谨,只表面粗浅流程)。
配置仓库:
我新建了一个仓库https://gitee.com/dmw000/spring-cloud
里面新建了一个config文件,文件夹下有三个配置文件。
config-client-dev.properties
config-client-prod.properties
config-client2-dev.properties
过多的不再解释。
配置中心:
pom文件如下:
<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><groupId>com.heping</groupId><artifactId>cloud</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.4.RELEASE</version><relativePath /></parent><name>cloud</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencyManagement><dependencies><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-dependencies --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>Greenwich.SR1</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-config --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-config-server --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-config-server</artifactId></dependency></dependencies>
</project>
该pom文件继承了springboot.parent。同时引入了Greenwich版本的springcloud。又添加了config的依赖,由于我们这是配置中心服务器,所以又添加了confi-server的依赖。
启动类如下:
@SpringBootApplication
@EnableConfigServer
public class App {public static void main(String[] args) {SpringApplication.run(App.class, args);}
}
该启动类与普通的spirngboot项目相比多了一个@EnableConfigServer注解,这个是必须的。
还有application.yml如下:
server: port: 8888
spring:application:name: config-servercloud:config:server:git:uri: https://gitee.com/dmw000/spring-cloudsearchPaths: /config
该yml做了下面的事情:
1.配置了端口为8888,等待客户端来访问。
2.配置了仓库服务器地址是https://gitee.com/dmw000/spring-cloud
3.配置文件在/config文件夹里。
客户端:
客户端的依赖,你需要把服务端依赖的spring-cloud-config-server去掉即可。这里为了好观察,需要启动springmvc,所有又加入了springbootstartweb这个依赖
客户端的配置文件就不能叫application.yml,而是bootstrap.yml,如下:
spring:application:name: config-clientcloud:config:label: masterprofile: devuri: http://localhost:8888/
server:port: 8881
做了下面这些事情:
1.给自己起名字叫 config-client
2.自己的配置指定了dev
3.配置中心是:http://localhost:8888/
4.自身端口是8881
启动类如下:
@RestController
@SpringBootApplication
public class App {@Value("${hello}")String hello;@RequestMapping("")public String hello(){return hello;}public static void main(String[] args) {SpringApplication.run(App.class, args);}
}
测试
我们先启动配置中心服务器,然后再启动客户端,访问localhost:8881就会发现返回的是git里config/config-client-dev.properties这个文件里配置好的值。
这样我们的客户端就可以访问到配置仓库里的配置文件了。
那么这究竟是怎么回事呢?
客户端会先去访问config.uri,找到配置中心服务器,从配置中心里了解到了配置文件都在https://gitee.com/dmw000/spring-cloud的config这个文件夹下
其次,每个客户端都有自己的名字,本例中客户端的名字叫做:config-client,而它指定的profile又叫dev。所以它读取解析https://gitee.com/dmw000/spring-cloud/config/config-client-dev.properties配置文件。(至于label,默认就是master分支)
这是springcloud的约定,它就是这样搞的,
/{application}/{profile}[/{label}] /{application}-{profile}.yml /{label}/{application}-{profile}.yml /{application}-{profile}.properties /{label}/{application}-{profile}.properties
我们此时可以让客户端指定profile=prod,再次均重启客户端访问,会发现访问了config-client-prod.properties了。
我们可以再开启一个客户端,指定application-name=config-client1,会发现其访问了config-client1-dev.properties
刷新
但这里有个问题,如果git更新了配置文件,我们必须重启服务器和客户端才能得到新的配置,有没有什么办法不重启就能使用新配置呢?
有的。
你需要做下面3件事情
1.客户端需要开启springboot端点监控,依赖里加入:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
2.bootstrap.yml添加开放refresh端点:
spring:application:name: config-clientcloud:config:label: masterprofile: devuri: http://localhost:8888/
server:port: 8881
management:endpoints:web:exposure:include: refresh
3.在需要刷新的类上加入@RefreshScope注解,本例客户端的启动类里又是controller,所以直接在启动类上加入@RefreshScope即可。
然后当你修改了git的配置文件后,访问客户端的http://localhost:8881/actuator/refresh
这个url是会让本应用里所有加入@RefreshScope的类里的可刷新的部件都进行刷新。
执行刷新之后,再访问客户端,发现果然改变了。
这个需要主动请求。
有没有更为省事的呢?springboot里目前没有这个功能,不过你可以去做些事情,比如轮询执行/actuator/refresh?比如事件执行/actuator/refresh?。。
springboot里虽然没有智能刷新的功能,但是它可以接收webhook.
什么是webhook,webhook实际上就是git网站当发生改动时的一个钩子,可以往自己的服务器上进行推送,你可以在各大get网站设置webhoot。当有变动后通知自己的服务器,然后自己的服务器再执行刷新。