记一次springboot(2.1.6)+springcloud(Greenwich.SR2) 配置中心搭建,支持在线刷新
1.配置eureka注册中心
EureKaSpringApplication:
package com.crow.eureka; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @SpringBootApplication @EnableEurekaServer public class EureKaSpringApplication { public static void main(String[] args) { SpringApplication.run(EureKaSpringApplication.class, args); } /** * 然后会发现其他路径访问不了的,比如向eureka注册服务,注册不进来。 * 那是因为springboot在这个版本默认开启了CSRF攻击防御,2.x其他版本很多也会存在此问题。 * 网上的解决办法是禁用CSRF防御,禁用之后部分版本会出现在登录eureka界面的时候又没有安全登录验证了,要注册服务禁用/eureka即可,而不是直接禁用CSRF * * @author Administrator * */ @Configuration @EnableWebSecurity static class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // // Spring Security 默认开启了所有 CSRF 攻击防御,需要禁用 /eureka 的防御 http.csrf().ignoringAntMatchers("/eureka/**"); // 访问eureka控制台和/actuator时能做安全控制 super.configure(http); // http.csrf().disable();//禁用CSRF // http.authorizeRequests().anyRequest().authenticated().and().httpBasic(); } } }
application.properties配置:
#在默认设置下,Eureka服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为。 #服务注册中心端口号 server.port=7070 #服务注册中心实例的主机名 eureka.instance.hostname=localhost #是否向服务注册中心注册自己 eureka.client.register-with-eureka=false #是否检索服务 eureka.client.fetch-registry=false #服务注册中心的配置内容,指定服务注册中心的位置 eureka.client.serviceUrl.defaultZone=http://localhost:7070/eureka/ # 安全认证的配置 #热部署生效 spring.devtools.restart.enabled=false #用户名 spring.security.user.name=admin # 用户密码 spring.security.user.password=admin123456 spring.application.name= eureka spring.devtools.restart.enabled=false #本机测试下关闭自我保护机制 eureka.server.enableSelfPreservation=false
pom.xml配置:
<!-- eureka 信息面板安全验证 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <!-- actuator监控信息完善 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
2.配置config-service
ConfigSpringBootApplication:
package com.crow.config; 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; @SpringBootApplication @EnableEurekaClient @EnableConfigServer public class ConfigSpringBootApplication { public static void main(String[] args) { SpringApplication.run(ConfigSpringBootApplication.class, args); } }
application.properties:
server.port=7072 # 优先注册IP地址而不是hostname eureka.instance.prefer-ip-address=true eureka.client.serviceUrl.defaultZone=http://admin:admin123456@localhost:7070/eureka/ #配置GitHub 私有仓库 HTTP 克隆地址 spring.cloud.config.server.git.uri={你的仓库地址} #配置你的 github帐号 spring.cloud.config.server.git.username={用户名或邮箱} #配置你的github帐号密码 spring.cloud.config.server.git.password={密码} #克隆配置文件存储地址(注意会项目清空这个目录,设置目录需谨慎!!!!) spring.cloud.config.server.git.basedir=C:/Users/Administrator/Desktop/config #git仓库配置文件分支(默认即为master) spring.cloud.config.label=master #Git仓库路径下搜索路径(多个路径用逗号分隔),即你的仓库目录 spring.cloud.config.server.git.search-paths=safe-service,safe-gateway # 配置中心通过git从远程git库,有时本地的拷贝被污染,这时配置中心无法从远程库更新本地配置,设置force-pull=true,则强制从远程库中更新本地库 spring.cloud.config.server.git.force-pull=true spring.cloud.bus.trace.enabled= true #注意得自己安装rabbitmq spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=crow9527 #支持动态刷新 #打开bus/refresh刷新开关 #actuator配置 management.endpoints.enabled-by-default=true management.endpoint.health.show-details=always #management.endpoints.web.exposure.include=refresh,info,health management.endpoints.web.exposure.include=* management.endpoints.web.base-path=/actuator #本机服务名 spring.application.name=safe-config-service #服务信息 info.app.name= safe-config-service info.app.message=config info.company.name= abzykj info.build.artifactId= @project.artifactId@ info.build.version= @project.version@
pom.xml:
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> <!--配置中心监控 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-monitor</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
我是在码云上新建的属性文件
服务端访问测试:
http://192.168.50.100:7072/safe-test.properties
或 http://192.168.50.100:7072/safe-test.json
或 http://192.168.50.100:7072/safe-test.yml
或 http://192.168.50.100:7072/safe/test (这个是根据你属性文件的命名来的 例如:${application}-${profiles}.properties safe-dev.properties safe-test.properties)
3.配置config-client
ConfigClientSpringBootApplication:
package com.crow.client; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class ConfigClientSpringBootApplication { public static void main(String[] args) { SpringApplication.run(ConfigClientSpringBootApplication.class, args); } }
application.properties:
#springboot 在启动时候. 会先去加载bootstrap.properties 中的配置, 从gtihub上加载配置下来. 再启动 server.port= 7073 #服务名 spring.application.name=safe-config-client #方式一:通过服务名访问服务器 #Config服务端服务名 #spring.cloud.config.discovery.service-id=safe-config-service #支持注册中心访问Config服务端 #spring.cloud.config.discovery.enabled=true #方式二:配置中文件的地址 通过uri访问配置服务 spring.cloud.config.uri=http://localhost:7072/ #git仓库配置文件分支(默认即为master) spring.cloud.config.label=master spring.cloud.config.name=safe-test #git仓库配置文件环境信息 spring.cloud.config.profile=test #得自己安装rabbitmq spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=guest spring.rabbitmq.password=crow9527 spring.cloud.bus.trace.enabled= true
pom.xml:
<!--Spring Cloud Config 客户端依赖 --> <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> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bus-amqp</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
ConfigController: 测试查看属性文件
package com.crow.client.controller; import java.nio.charset.StandardCharsets; import org.springframework.beans.factory.annotation.Value; import org.springframework.cloud.context.config.annotation.RefreshScope; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; /** * <p></p> * @author:Crow * @Date: 2019年10月14日 下午4:13:34 */ @Controller //开启更新功能 @RefreshScope @RequestMapping("/config") public class ConfigController { @Value("${user.name}") private String value; @RequestMapping("/get") @ResponseBody public String getValue() { //因为如果配置文件中,要是有中文的话这里转换一下 //return new String(value.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8); return new String(value); } }
客户端访问测试:
测试在线刷新 :
1.更改码云上属性文件类容(记得要提交)
2.通过actuator手动刷新(POST请求)http://localhost:7073/actuator/bus-refresh(可以在码云上的WebHooks中配置自动刷新)
3.重新访问客户端 http://192.168.50.100:7072/safe-test.properties
OK