首页 > 技术文章 > 记一次springboot(2.1.6)+springcloud(Greenwich.SR2) 配置中心搭建,支持在线刷新

crow9527 2019-10-16 16:03 原文

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 

 

推荐阅读