淘先锋技术网

首页 1 2 3 4 5 6 7

有关Springcloud Config、Bus、Stream、Sleuth的简单操作

1.SpringCloud config分布式配置中心

为什么会出现分布式配置中心?
我们的微服务是将一个整体的业务拆分成多个子服务,而每个子服务都会有相应的配置信息,为了方便管理统一配置,我们的而分布式配置中心是必不可少的。

SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同的微服务应用的所有环境提供了一个中心化的外部配置

SpringCloud Config分为客户端和服务端俩部分,其中服务端称之为分布式配置中心,是一个独立的微服务,用来专门连接配置服务器并把配置信息分发给客户端
在这里插入图片描述
功能:

  • 可以集中管理配置信息,方便微服务整合
  • 方便管理不同的开发版本
  • 能够动态的更新配置信息

1.1Config服务端配置与测试

1.1.1 新建Module

在这里插入图片描述

1.1.2 导入POM

与前面的相比较多导入了config-server包

 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

导入成功后可开启分布式配置服务

1.1.3 写yml文件

server:
  port: 3344   #端口号可任意取

spring:
  application:
    name:  cloud-config-center #注册进Eureka服务器的微服务名
  cloud:
    config:
      server:
        git:
          uri: https://github.com/123/MyCloud.git #GitHub上面的git仓库得地址

        ####搜索目录
          search-paths:
            - MyCloud

      ####读取分支
      label: master
  
#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

1.1.4 编写启动类

@SpringBootApplication
@EnableConfigServer   #表示该服务为配置中心
public class ConfigCenterMain3344
{
    public static void main(String[] args) {
            SpringApplication.run(ConfigCenterMain3344.class, args);
    }
}

1.1.5 读取配置文件规则

/{label}/{application}-{profile}.yml
label:表示所在分支
application:服务名
profile:环境

1.1.6 启动并测试

需要启动Eureka服务注册中心以及config配置中心

在这里插入图片描述
能动态获取github上对应配置文件得信息
测试完毕

1.2 Config客户端配置与测试

操作与服务端基本一致
POM包导入部分为:

<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

编写yml文件部分公共配置文件应写在bootstrap.yml上方便更改

server:
  port: 3355

spring:
  application:
    name: config-client
  cloud:
    #Config客户端配置
    config:
      label: master #分支名称
      name: config #配置文件名称
      profile: test #读取后缀名称   上述3个综合:master分支上config-dev.yml的配置文件被读取http://config-3344.com:3344/master/config-dev.yml
      uri: http://localhost:3344 #配置中心地址
      
#服务注册到eureka地址
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka

1.2.1 编写Controller类

@RestController
@RefreshScope  #开启动态刷新
public class ConfigClientController
{
    @Value("${config.info}")
    private String configInfo;

    @GetMapping("/configInfo")
    public String getConfigInfo()
    {
        return configInfo;
    }
}

启动客户端
更改配置文件
在这里插入图片描述
发现客户端获取到得配置信息还是原来的旧信息,而服务端却获取到了新配置
此时需要我们手动告知客户端,已经做了修改,这样可以避免重启客户端节省时间
在CMD窗口敲下如下命令

启动完毕后客户端即可更新到最新配置
在这里插入图片描述

鉴于以上情况,我们发现如果微服务客户端有成千上万台,我们还是要一个一个手动通知是不是会太麻烦了太浪费时间了,所以我们引入了另一个概念——总线,总线可以实现一次通知处处生效,也可以实现定点通知。

2. SpringCloud Bus

需要通知,我们先要安装一个消息中间件RabbitMQ

2.1 RabbitMQ环境配置

2.1.1 安装Elang

下载地址:https://www.erlang.org/downloads
在这里插入图片描述
若上述安装太慢,我这里提供了22.0的安装链接
链接:https://pan.baidu.com/s/1TgS-Mn2NUrPHJywISwrjIg
提取码:1dq7

2.1.2 安装RabbitMQ

下载地址:https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.3/rabbitmq-server-3.8.3.exe

下载完成后进入到RabbitMQ安装目录下的sbin目录运行CMD命令:
rabbitmq-plugins enable rabbitmq_management

2.1.3 测试是否安装成功

在浏览器网址栏输入:http://localhost:15672
默认账户密码是:guest
看是否出现界面
在这里插入图片描述

2.2 SpringCloud Bus设计思想

2.2.1以某一客户端为中心

利用消息总线出发一个客户端/bus/refresh,再延申至所有的客户端配置,

2.2.2 以服务端为中心

以用消息总线出发服务端ConfigServer的/bus/refresh断电,来刷新所有客户端配置

从微服务的角度来看,显然以服务端为中心更适合,可以保证各微服务的职责单一,没有其他负担

2.3 导入对应POM

 <!--添加消息总线RabbitMQ支持-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

2.4 修改yml文件

#rabbitmq相关配置
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest
management:
  endpoints: #暴露bus刷新配置的端点
    web:
      exposure:
        include: 'bus-refresh'

2.5 启动并测试

此时启动客户端集群,我们再GitHub上对某一配置文件进行修改,服务端还是一样能够立马获得修改内容,而个客户端需要先执行以下命令,从服务端上获取。
curl -X POST "http://localhost:分布式配置中心端口号/actuator/bus-refresh"
此时做到了一处通知处处生效
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.6 定点通知

通过以下命令,使得通知只对某指定客户端生效
http://localhost:3344/actutor/bus-refresh/{destination}
/bus/refresh请求不再发送到具体的服务实例上,而是发给config server通过destination参数指定需要更新配置的服务或实例