通常我们用spring-boot的时候会遇到这样的问题!我们把配置信息写到yml中,可能是一个版本号或链接或其他的,通过spring的注解配置成类的属性,之后程序就会应用这个配置了。而当我们想要修改这个配置信息时,我们就得修改yml,重新启动服务,所以我们频繁的重启着服务,一个服务还好,spring-cloud可能有上百个服务,就崩溃了。有的人可能把配置信息搞到了数据库中,解决了这个问题,但是这个配置信息真的是不经常修改啊,每次都读取数据库也是一种浪费,那么Spring-cloud-config就是为解决这个问题而生的。
ok,开始我们的搭建工作吧!
之前在搭建spring-cloud注册中心
的时候,我是分开建立的工程,现在我建议把他们搞到一起,这样好操作,最终我们需要三个工程模块,截图如下:
pom.xml
<?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>cong</groupId>
<artifactId>allin-config</artifactId>
<version>1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
<relativePath/>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<!--配置中心服务,注意不是:spring-cloud-starter-config-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--注册服务-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>
以上,注意:
在搭建spring-cloud注册中心时我用的spring-cloud版本是Brixton.SR5,spring-boot是1.3.7.RELEASE比较旧,我换成了新的版本:Finchley.RELEASE / 2.0.3.RELEASE。
ConfigApplication.java
package com.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
/**
* <dependency>
* <groupId>org.springframework.cloud</groupId>
* <artifactId>spring-cloud-config-server</artifactId>
* </dependency>
*/
@EnableConfigServer //可以提供配置服务
@SpringBootApplication
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
application.yml 如下:
spring:
profiles:
active: test #加载application-online.yml
application-online.yml 如下:
server:
port: 6001
spring:
application:
name: allin-config
cloud:
config:
server:
git:
uri: http://xxx/git/allin-yml.git
# search-paths: config-repo //指定的是匹配查询的路径名
password: xxx
username: xxx
force-pull: true
# 使用Spring Cloud Config配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息
#注册中心路径
eureka:
client:
service-url:
defaultZone: http://allin:1111/eureka/
#logging:
# config: classpath:config/logback-spring-test.xml
以上是我们的配置中心工程,而在我们的git仓库下,我们需要创建文件【注意:search-paths可以指定路径】:
allinservice-dev.yml 然后添加如下:
login:
key: 123456
ok,接下来,我们配置allin-eureka-server注册中心工程,注意以上yml:配置中心中的路径是指向注册中心的链接,allin-eureka-server 结构如下图:
image.png
application.yml如下:
spring:
profiles:
active: online
application-online.yml 如下:
spring:
application:
name: eureka-server
eureka:
instance:
hostname: allin
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
server:
enable-self-preservation: false
server:
port: 1111
#java -jar target/allin-eureka-server-1.0.jar
# 关于:配置界面的参数
# Renew: 服务续约
# Eureka Client 会每隔 30 秒发送一次心跳来续约。
# 通过续约来告知 Eureka Server 该 Eureka Client 运行正常,没有出现问题。
# 默认情况下,如果 Eureka Server 在 90 秒内没有收到 Eureka Client 的续约,Server 端会将实例从其注册表中删除,此时间可配置,一般情况不建议更改。
#RENEWALS ARE LESSER THAN THE THRESHOLD. THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
#RENEWALS小于阀值。自身保护模式关闭。在有网络或其他问题的时候可能不会保护到期的实例。
#Uptime 运行的时间
EurekaApplication.java 如下:
package com.con;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class EurekaApplication {
public static void main(String args[]){
SpringApplication.run(EurekaApplication.class);
}
}
ok,我们分别启动allin-config和allin-eureka-server,然后访问:http://allin:1111/【注意需要在host文件添加映射:】
allin 127.0.0.1
然后我们会发现界面显示allin-config服务已经注册成功。【截图忽略】
pom.xml 如下:
<?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">
<artifactId>service-a</artifactId>
<groupId>cong</groupId>
<version>1.0</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.3.RELEASE</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<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.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- actuator 监控 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<finalName>allin-service</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>
ServiceaApplication.java 如下:
package com.cong;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
//用于发现allin-config服务
@EnableDiscoveryClient
@SpringBootApplication
public class ServiceaApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceaApplication.class, args);
}
}
bootstrap.yml 如下:
eureka:
client:
service-url:
defaultZone: http://allin:1111/eureka/
server:
port: 8081
#注意:配置文件一定是bootstrap.yml,application.yml会不起作用
spring:
application:
#微服务名
name: servicea
cloud:
config:
discovery:
enabled: true
#访问配置中心服务
service-id: allin-config
profile: dev
# label: master
name: allinservice
# fail-fast: false
# uri: http://allin:6001/
#Spring boot 2.0的改动较大,/bus/refresh全部整合到actuator里面了,变成了/actuator/refresh,所以之前1.x的management.security.enabled全部失效,不适用于2.0
#如果不配置这个,似乎加载不出refresh的Mapped接口,但是加了之后health接口没有打印出来
#更新配置之后调用http://10.88.35.92:8081/actuator/refresh的返回:
#[
# "config.client.version",
# "login.key"
#]
management:
endpoints:
web:
exposure:
#配置刷新接口
include: refresh
#logging:
# config: classpath:config/logback-spring.xml
#java -jar target/allin-service.jar --server.port=8081
LoginController.java
package com.cong;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
//用于refresh刷新配置
@RefreshScope
@RestController
public class LoginController {
Logger logger = LoggerFactory.getLogger(LoginController.class);
@Value("${login.key}")
private String loginKey;
@ResponseBody
@RequestMapping(value = "/login", method = RequestMethod.GET, produces = "application/json;charset=UTF-8")
public String login() {
return "{\"result\":\""+loginKey+"\"}";
}
}
以上,启动service-a工程后,我们发现service-a服务也注册成功了,这时候我们请求:http://10.88.35.92:8081/login 就会返回loginKey了,这说明我们已经加载配置文件成功了,当我们修改配置信息allinservice-dev.yml的时候,我们调用:http://10.88.35.92:8081/actuator/refresh后就会返回更新的配置,然后我们重新发送login请求,loginKey就会变成修改后的了【截图忽略】。
注意:有一个坑需要特别注意,就是service-a的yml配置文件是bootstrap.yml不是application.yml,我之前配置的application.yml始终无法成功加载配置。
网友评论