分布式配置中心Config&消息总线Bus

1.配置中心Config

1.1概述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0JZJiI5t-1640249749340)(assets\QQ图片20200427211954.png)]

Spring Cloud Config就是我们通常意义上的配置中心。Spring Cloud Config-把应用原本放在本地文件的配置抽取出来放在中心服务器,本质是配置信息从本地迁移到云端。从而能够提供更好的管理、发布能力。

Spring Cloud Config分服务端和客户端:

  • 服务器端也称为分布式配置中心,他是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密/解密信息等访问接口。

  • 客户端则是在启动的时候从config服务端获取和加载配置信息。

SpringCloud Config作用:

  • 集中管理配置文件
  • 不需要重启即可感知到配置的变化并应用新的配置

1.2.上传配置文件到github

1.2.1.新建仓库

1、注册GitHub账号,并在GitHub上新建Repository

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vw7JTCVx-1640249749344)(assets\1587994127397.png)]

2、设置仓库名称为springcloud-config,点击Create repository
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CpBAstxd-1640249749345)(assets\1587994203476.png)]

1.2.2.创建配置文件

application-test.properties

#向注册中心注册的名字
spring.application.name=config-provider
server.port=7888

#设置注册中心的地址
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8761/eureka/

application-dev.properties

#向注册中心注册的名字
spring.application.name=config-provider
server.port=8777

#设置注册中心的地址
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8761/eureka/

1.2.3.推送到github上

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YkLj796W-1640249749346)(assets/image-20200512090820720.png)]

1.3.创建config服务端

1.3.1.创建工程

springcloud_config_server

1.3.2.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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <groupId>com.qf</groupId>
    <artifactId>springcloud_config_server</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- springBoot的启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- config-server的启动器 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
    </dependencies>
</project>

1.3.3.application.properties

获得仓库地址:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-320GJAMB-1640249749348)(assets\1587995375350.png)]

#端口
server.port=3344

#git仓库的地址
spring.cloud.config.server.git.uri=https://github.com/guangweima/springcloud-config.git	

1.3.4.App

package com.qf;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@EnableConfigServer
@SpringBootApplication
public class ConfigServerApp {
    public static void main(String[] args) {
        SpringApplication.run(ConfigApp.class, args);
    }
}

1.3.5.测试

http://127.0.0.1:3344/application-dev.properties

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Kk4wbXwr-1640249749350)(assets\1587996138318.png)]

http://127.0.0.1:3344/application-test.properties

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zg7eosLN-1640249749351)(assets\1587996172551.png)]

1.4.创建config客户端

1.4.1.创建工程

springcloud_config_client

1.4.2.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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <groupId>com.qf</groupId>
    <artifactId>springcloud_config_client</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- springBoot的启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--eureka-server客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>com.qf</groupId>
            <artifactId>springcloud_common_pojo</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--Spring Cloud Config Client 启动器-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
    </dependencies>
</project>

1.4.3.bootstrap.properties

注意:客户端配置文件的名称必须为bootstrap.properties

#本微服务启动后先去找3344服务获取GitHub的服务地址
spring.cloud.config.uri=http://127.0.0.1:3344
#需要从github上读取的资源名称,注意没有后缀名
spring.cloud.config.name=application
#指定环境
spring.cloud.config.profile=test
#github分支
spring.cloud.config.label=master

1.4.4.service

package com.qf.service;

import com.qf.pojo.User;
import org.springframework.stereotype.Service;

import java.util.Date;

@Service
public class UserServiceImpl implements UserService {

	@Override
	public User getUser(Integer id) {
		return new User(id,"王粪堆",18);
	}

}

1.4.5.controller

package com.qf.controller;

import com.qf.pojo.User;
import com.qf.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ProviderController {
	
	@Autowired
	private UserService userService;

	@RequestMapping("/provider/user/{id}")
	public User getUser(@PathVariable("id") Integer id){
		return userService.getUser(id);
	}
	
}

1.4.6.App

package com.qf;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

@EnableEurekaClient//允许向服务端注册服务
@SpringBootApplication
public class ConfigClientApp {
	public static void main(String[] args) {
		SpringApplication.run(ConfigClientApp.class, args);
	}
}

1.4.7.测试

访问config-client:http://127.0.0.1:8777/user/1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9xhj066O-1640249749353)(assets\1588079440457.png)]

1.5.配置中心原理

1.5.1.原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wIft5UZp-1640249749354)(assets\1588080638159.png)]

Config Client从Config Server中获取配置信息的流程:
	1. Config Client启动时向Config Server请求获取配置数据;
	2. Config Server从Git仓库中查找符合的配置文件拉取到本地,并建立本地缓存;

1.5.1.测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zMLxtFfd-1640249749355)(assets\1588084228579.png)]

2.消息总线 Bus

2.1.概述

  1. 什么是Spring Cloud Bus?
    Spring Cloud Bus集成了RabbitMQ、kafka两种消息中间件,连接微服务系统中的所有节点,当有数据变更时,可以通过消息代理广播通知微服务及时变更配置信息。

  2. bus解决了什么问题?
    解决了微服务配置文件变更及时同步的问题

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zcrwSC25-1640249749356)(assets\QQ图片20200429160124.png)]

2.2.创建bus服务端

2.2.1.创建工程

springcloud_bus_server

2.2.2.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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <groupId>com.qf</groupId>
    <artifactId>springcloud_bus_server</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- springBoot的启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- config-server的启动器 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <!-- springcloud bus的启动器 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
    </dependencies>
</project>

2.2.3.application.properties

server.port=3344

#git仓库的地址
spring.cloud.config.server.git.uri=https://github.com/guangweima/springcloud-config.git

#消息队列的链接配置
spring.rabbitmq.host=192.168.204.131
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=1111
spring.rabbitmq.virtual-host=/

##springboot默认开启了权限拦截 会导致/actuator/bus-refresh出现 405,拒绝访问
management.endpoints.web.exposure.include=bus-refresh

2.2.4.App

package com.qf;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@EnableConfigServer
@SpringBootApplication
public class ConfigServerApp {
    public static void main(String[] args) {
        SpringApplication.run(ConfigApp.class, args);
    }
}

2.3.创建bus客户端

2.3.1.创建工程

springcloud_bus_client

2.3.2.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>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <groupId>com.qf</groupId>
    <artifactId>springcloud_bus_client</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR2</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <!-- springBoot的启动器 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--eureka-server客户端 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--Spring Cloud Config Client 启动器-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <!-- springcloud bus的启动器 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>
    </dependencies>
</project>

2.3.3.bootstrap.properties

#本微服务启动后先去找3344服务获取GitHub的服务地址
spring.cloud.config.uri=http://127.0.0.1:3344
#需要从github上读取的资源名称,注意没有后缀名
spring.cloud.config.name=bus-client
#指定环境
spring.cloud.config.profile=test
#github分支
spring.cloud.config.label=master

2.2.4.bus-client-test.properties

上传bus-client-test.properties

#向注册中心注册的名字
spring.application.name=bus-client
server.port=7888
#设置注册中心的地址
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8761/eureka/

#消息队列的链接配置
spring.rabbitmq.host=192.168.204.131
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=1111
spring.rabbitmq.virtual-host=/

2.2.5.controller

package com.qf.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.RestController;

@RestController
//自动刷新配置,重新从BeanFactory获取一个新的实例(该实例使用新的配置)
@RefreshScope 
public class ConfigController {

	@Value("${spring.application.name}")
	private String applicationName;

	@Value("${eureka.client.serviceUrl.defaultZone}")
	private String eurekaServers;

	@Value("${server.port}")
	private String port;


    @RequestMapping("/config")
	public String getConfig(){
		return "applicationName: " + applicationName + "<br> eurekaServers:" +
                                                eurekaServers + "<br> port: " + port;
	}

}

2.2.5.App

package com.qf;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;

@SpringBootApplication
public class ConfigClientApp {
    public static void main(String[] args) {
        SpringApplication.run(ConfigClientApp.class, args);
    }
}	

2.4.测试

2.4.1.启动工程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Mymuxr1n-1640249749357)(assets\1588166218937.png)]

2.4.2.测试bus客户端

http://127.0.0.1:7888/config

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LQeO9TGB-1640249749358)(assets\1588156339958.png)]

2.4.3.修改bus-client.properties

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oXskkM9c-1640249749359)(assets\1588166572069.png)]

2.4.4.刷新bus服务端

1、Postman访问:http://127.0.0.1:3344/actuator/bus-refresh

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XJGOvZq6-1640249749361)(assets\1588156479275.png)]

2、bus服务端从新加载配置文件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UkA51ZT6-1640249749361)(assets\1588166810057.png)]

2.4.5.测试bus客户端

http://127.0.0.1:7888/config

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xsQV2sfn-1640249749363)(assets\1588166960443.png)]

2.5.局部刷新服务

​ 如果只修改了A服务的配置文件,这时候如果刷新服务,则所有的客户端(上百个甚至更多)都会从服务端更新配置文件。

2.5.1.刷新指定服务

http://Config-Server/actuator/bus-refresh?destination=需要刷新的服务名称:端口

例如:http://127.0.0.1:3344/actuator/bus-refresh?destination=bus_client:7888

2.5.2.刷新指定集群

http://Config-Server/actuator/bus-refresh?destination=需要刷新的服务名称:*

例如:http://127.0.0.1:3344/actuator/bus-refresh?destination=bus_client:*

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值