今天在做一个项目的时候,对于一些系统或者接口的URL地址,感觉在一个项目里面很难管理;或者说各系统之间调用不方便。如果说在分布式项目中单独做一个模块去管理这些个常量或者属性文件的配置,也是可以的,并且之前也是这样做的;但是我认为没有必要去单独的部署一个应用去管理这些配置文件。突然想到了Spring Cloud Config这个组件。就打算实战一把。首先我们需要一个服务注册中心去管理这些个服务。那么我首先得新建一个应用,名字就叫center-register吧。如下的代码是pom依赖:
<?xml version="1.0" encoding="UTF-8"?>
<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.gosaint</groupId>
<artifactId>sso-center-register</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>sso-center-register</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
接下来就是注册中心的配置文件,我用的是yaml配置方式:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false # 不要将本身注册到Eureka中
fetchRegistry: false # 表示是否从eureka服务器获取注册信息
serviceUrl: # Eureka注册中心的地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
再来看主程序,其实只要加一个注解@EnableEurekaServer就可以啦。并且访问localhost:8761/
/**
* @author caozg
*/
@SpringBootApplication
@EnableEurekaServer
public class SsoCenterRegisterApplication {
public static void main(String[] args) {
SpringApplication.run(SsoCenterRegisterApplication.class, args);
}
}
如上图所示证明服务成功启动,只是此时还没有注册实例而已。接下来我要创建一个spring cloud config应用啦。准确的说这只是一个配置服务端。而我的这个应用当然也会注册到Eureka里面。下面是POM文件。
<?xml version="1.0" encoding="UTF-8"?>
<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.gosaint</groupId>
<artifactId>sso-global-config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>sso-global-config</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.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>
<version>1.4.5.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
对于上述的pom我略微做了修改,没有使用系统默认的eureka配置,而是修改为下面的配置啦。这是因为使用默认的Eureka配置,返回属性文件的格式是xml格式:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
如果使用如下的依赖则是JSON格式。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
<version>1.4.5.RELEASE</version>
</dependency>
接着看yaml的配置吧。
server:
port: 8762
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/gosaintmrc/spring-cloud-config # git仓库地址
search-paths: /** # 配置文件所在的目录
username: gosaintmrc@aliyun.com # git用户名和密码
password: ****** # 由于公共仓库可以不用用户名和密码,可以不用设置
label: master # 分支
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
上述的配置的意思基本已经注释啦。在做这个之前,我在我的github上面已经创建了仓库和上传的配置文件。仓库地址是:
https://github.com/gosaintmrc/spring-cloud-config。配置文件如下截图:
点开第一个,很简单的属性配置.
接下来主程序添加两个注解,如下代码所示:
/**
* @author caozg
*/
@SpringBootApplication
@EnableConfigServer //配置服务
@EnableEurekaClient //Eureka客户端
public class SsoGlobalConfigApplication {
public static void main(String[] args) {
SpringApplication.run(SsoGlobalConfigApplication.class, args);
}
}
启动应用,先访问注册中心localhost:8761,看我们的配置应用有没有注册进去。
看到实例存在:config-server.说明注册中心应用注册完毕。关于上述红色警告是说需要负载均衡。但是我没有配置,我是单引用,无妨。接着我们访问http://localhost:8762/global/dev/master。如下图:
方法直接可以读取。关于在config-client怎么读取具体的配置属性,有时间再写吧。还有有人问我为什么喜欢写yaml文件,而不是properties.对于我本人来说,更多的可能是情结吧,缘起于此!其实yaml文件对于语法缩进有着更为严格的要求。在这方面properties文件对于粗心的码农更为合适。但是yaml我认为更为炫酷或者与众不同吧。
现在我们可以通过浏览器直接访问,可以看到属性文件。但是怎么通过客户端去直接获取属性的值呢。我在这里新建一个模块,就是config-client.
<?xml version="1.0" encoding="UTF-8"?>
<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.gosaint</groupId>
<artifactId>sso-client1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>sso-client1</name>
<description>SSO认证客户端1</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.5.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
看看属性配置文件,新建application.yml
spring:
thymeleaf:
cache: false
prefix: classpath:/templates/
suffix: .html
encoding: UTF-8
mode: HTML5
servlet:
content-type: text/html
mvc:
static-path-pattern: /static/**
application:
name: global
cloud:
config:
discovery:
enabled: true
server:
port: 9091
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
新建bootstrap.yml文件。
spring:
application:
name: global
cloud:
config:
uri: http://localhost:8762/ # 配置中心的地址
profile: dev
label: master
@Controller
public class LoginController {
@Value("${name}")
String name;
@Value("${age}")
String age;
@GetMapping("/login")
public String login(){
System.out.println("我的名字是"+name+"我的年龄是"+age);
return "login";
}
}
上面是测试Controller。然后启动类:
/**
* @author gosaint
*/
@SpringBootApplication
@EnableEurekaClient
public class SsoClient1Application {
public static void main(String[] args) {
SpringApplication.run(SsoClient1Application.class, args);
}
}
最后打印结果:我的名字是lucy我的年龄是18.实战成功!