此文章是看了方志朋老师的教材自己写的框架demo:
学习spring cloud推荐大家看下方志朋老师的史上最简单的 SpringCloud 教程 | 终章,地址如下:
https://blog.youkuaiyun.com/forezp/article/details/70148833
1.简介和作用
在分布式系统中,由于服务数量巨多,为了方便服务配置文件统一管理,实时更新,所以需要分布式配置中心组件。在Spring Cloud中,有分布式配置中心组件spring cloud config ,它支持配置服务放在配置服务的内存中(即本地),也支持放在远程Git仓库中。在spring cloud config 组件中,分两个角色,一是config server,二是config client。
2.代码实现
因为我们公司用的管理工具是svn,所以主要演示svn的远程配置读取
创建本地svn库,新建一个config-client-dev.properties配置文件放在config文件夹下,配置文件内容为:
good:immo
2.1 创建远程配置服务端
1.新建maven项目 immo-config-service
2.pom.xml添加依赖
<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.immo</groupId> <artifactId>immo-config-service</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- spring boot 依赖包 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath/> </parent>
<!-- 编码和java版本 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.7</java.version> </properties>
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.tmatesoft.svnkit</groupId> <artifactId>svnkit</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR7</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project> |
3.编写启动类和配置文件
编写application.properties
#端口 server.port=9300 #svn-url spring.cloud.config.server.svn.uri=https://pc201588754678:8443/svn/cloudcofig #svn userName spring.cloud.config.server.svn.username=123 #svn passWord spring.cloud.config.server.svn.password=123 #此svn下哪个路径,默认 trunk spring.cloud.config.server.default-label=config #告诉spring要调用的服务是svn spring.profiles.active=subversion #要发布到eureka的服务名 spring.application.name=config-service #eureka 地址 eureka.client.serviceUrl.defaultZone=http://localhost:9000/eureka/ |
编写ConfigServiceApplication.java
@EnableConfigServer注解开启配置服务器的功能
package com.immo;
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;
@EnableConfigServer @SpringBootApplication @EnableEurekaClient public class ConfigServiceApplication { public static void main(String[] args) { SpringApplication.run(ConfigServiceApplication.class, args); } }
|
4.测试,先后启动immo-eureka,immo-config-service访问localhost:9000(服务已经注册):
访问 http://localhost:9300/config-client-dev.properties(说明能获取到svn远程配置文件):
2.2创建远程配置服务客户端
1.创建maven项目 immo-config-client
2.pom.xml添加依赖:
<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.immo</groupId> <artifactId>immo-config-client</artifactId> <version>0.0.1-SNAPSHOT</version> <!-- spring boot 依赖包 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath /> </parent> <!-- 编码和java版本 --> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.7</java.version> </properties>
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <!-- spring mvc --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Camden.SR7</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> </project> |
3.创建配置文件和启动类以及测试接口
搭建srpingcloud-config server端的时候,配置文件可以用application.yml或者application.properties,但是在config client要使用bootstrap.yml或bootstrap.properties,因为bootstrap.properties的加载优先于application.properties
编写bootstrap.properties:
#这里需要注意这里的 {spring.cloud.config.name}-{spring.cloud.config.profile}=svn需要调用的xxxx.properties #例如我们现在需要远程调用的配置文件名字为 config-client-dev.properties spring.cloud.config.name=config-client ## 要读取的配置文件profile属性,默认是dev dev开发环境配置文件 test测试环境 pro正式环境 可填写多个,用逗号(,)隔开 spring.cloud.config.profile=dev #读取svn服务项目的地址 spring.cloud.config.uri=http://localhost:9300/ |
编写application.properties:
#eureka 服务地址 eureka.client.serviceUrl.defaultZone=http://localhost:9000/eureka/ #注册的服务名称 spring.application.name=config-client #项目端口 server.port=9400 #是否开启安全认证 默认开启 management.security.enabled=false |
编写ConfigClientController.java:
@RefreshScope:监听配置文件改动
package com.immo.controller;
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.RequestMethod; import org.springframework.web.bind.annotation.RestController;
@RestController @RefreshScope public class ConfigClientController {
@Value("${good}") private String param; @RequestMapping(value="/getParam",method=RequestMethod.GET) public String getSvnParam(){ return "从svn中获得的参数为:"+param; } }
|
编写ConfigClientApplication.java:
package com.immo;
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication @EnableEurekaClient public class ConfigClientApplication { public static void main(String[] args) { SpringApplication.run(ConfigClientApplication.class, args); } }
|
4.测试,先后启动immo-eureka,immo-config-service,immo-config-client(进入管理界面):
测试是否从数据获得数据,访问 http://localhost:9400/getParam (成功拿到了)
测试修改svn配置文件后数据是否马上更新:
修改后提交,再次访问次,你会发现没有改变:
Spring Cloud Config分服务端和客户端,服务端负责将git(svn)中存储的配置文件发布成REST接口,客户端可以从服务端REST接口获取配置。但客户端并不能主动感知到配置的变化,从而主动去获取新的配置。客户端如何去主动获取新的配置信息呢,springcloud已经给我们提供了解决方案,每个客户端通过POST方法触发各自的/refresh
手动调用/refresh方法-post方式:
然后在重新调用接口,看是否修改(成功):
