SpringCloud - Config、bus、Sleuth+Zipkin入门(三)

1.Config 分布式配置中心

配置中心顾名思义,就是管理配置的模块,使用场景是什么呢?在开发过程中我们会遇到很多配置文件,无论是我们框架上的开发环境、测试环境、生产环境,这些个配置,还是我们代码里用到的参数配置,当越来越多的时候会变的难以管理(有聪明的兄弟就要问了怎么会越来越多呢?比如说微服务我有上百个,每个微服务我都做集群,那么我什么时候要改一个配置,让你慢慢改你受得了吗?),那么配置中心就解决了这些痛点。

有了配置中心那么这些服务只要知道配置中心的地址就行,过来问配置中心要配置就行,而且这边的好处就是配置中心更改了,相应的微服务可以不用重启,非常方便。

1.1 配置中心 - 外部文件

配置中心肯定要有一个统一的地方存放配置文件,有两种方式存放,一是你自己搞个服务器,把配置啥的,都放在服务器上。二是放在云端比如github、gitee。下面我就用gitee来简单教学一下。

实现准备一个gitee仓库并且上传一个文件。

1.2 配置中心服务端的搭建

pom文件,这个非常重要,不引入的话,找不到参数会报错的。

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

启动类

@SpringBootApplication
@EnableConfigServer//开启config 这个功能
@EnableEurekaClient
public class ConfigServerApp {
    public static void main(String[] args) {
        SpringApplication.run(ConfigServerApp.class,args);
    }
}

配置文件

server:
  port: 5687
spring:
  application:
    name: config-server
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/xxxxx/xxxx.git
#这边是你刚才创建的gitee仓库
#如果不是公开的话就要配置账号密码
#          username: xxxx
#          password: xxxx
#分支名称
      label: master
#注册到eureka上
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka

 1.3 客户端连接配置中心

第一步引入依赖!别忘了,忘了就会报错!

第二步创建bootstrap.yml 文件,这个文件加载顺序优先级更高

spring:
  cloud:
    config:
#这边可以直接配置相应的配置中心地址,当然也可以从eureka上拿
#      uri : http://localhost:5687
      name : my
      profile : dev
      lable : master
#注册在eureka 上配置中心的地址
      discovery:
        enabled: true
        service-id: CONFIG-SERVER

第三步使用

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

    public CompanyInfo findCompanyInfo(int id){
        System.out.println(server);
        return companyDao.findCompany(id);
    }

1.4 配置自动刷新

这边的刷新是指客户端的刷新,配置中心是实时请求云端配置文件的,所以这边涉及到的刷新就是针对消费方的功能。

第一步引入依赖

​
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

​

第二步加上配置文件

management:
  endpoints:
    web:
      exposure:
        include: refresh

第三步加上@RefreshScope注解

这边我使用的时候遇到了一个问题就是,这个注解加在controller 层的时候,发现注解都不可用的情况。

这个注解就是你在哪里使用云端配置文件的地方就在加在哪里。

@Service
@RefreshScope//开启自动刷新功能
public class CompanyService {
    @Autowired
    CompanyDao companyDao;

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

    public CompanyInfo findCompanyInfo(int id){
        System.out.println(server);
        return companyDao.findCompany(id);
    }
}

第四步用命令刷新一下,这个端口是用消费方的的端口,有的人要问了,更新一下都要手动刷新一下吗,那么不如不要这个功能哦,不要急着给功能需要配合bus 才能发挥功效!

curl -X POST http://localhost:8000/actuator/refresh

2. bus消息总站

大概的说一下这是个什么东西,可以理解为一个容器,里面的核心功能呢由RabbitMq、或者kafuka消息中间件实现,然后bus可以对消息处理的一个应用服务,这个服务可以与其他微服务建立连接,可以大致理解为一个广播站!这边演示一下rabbitmq 消息组件实现消息群发功能。

我们这边主要实现上面手动刷新的功能

2.1 rabbitmq 安装

安装教程点击这边https://www.cnblogs.com/JiHC/p/15879240.html

bug1 解决seems to contain an unquoted IPv6 address. Make sure you quote IPv6 addresses!https://blog.csdn.net/qq_32575047/article/details/104692316

bug2 解决 User can only log in via localhosthttps://blog.csdn.net/u011943534/article/details/88706604

2.2 pom文件

这两个是实现关键,客户端服务端都要配置

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-bus-amqp</artifactId>
        </dependency>

2.3 配置文件

无论是客户端还是服务端都要配置

spring  
  rabbitmq:
    host: localhost
    port: 5672
    username: 你自己的用户名
    password: 你自己的密码
    virtual-host: /

management:
  endpoints:
    web:
      exposure:
        include: 'bus-refresh'
#这边是暴露节点

2.4 最后一步向服务端发送命令

我这边的服务端就是配置中心,我像配置中心发送刷新的节点,配置中心会往mq里面发送一条信息,服务端回去消费这条信息,无论我的服务端有多少个,都会去消费这条消息,

这边需要注意的是你的消费方暴露节点必须是全部暴露,或者和客户端暴露的节点是一样的,也就是这段代码

management:
  endpoints:
    web:
      exposure:
        include: 'bus-refresh'
curl -X POST http://localhost:5687/actuator/bus-refresh

3. Stream 消息驱动

这个讲简单点,这个消息驱动就是和jdbc 一样的设计思路,jdbc 封装了对mysql、oracle等数据库的操作,我们通过一些配置就可以在数据库的种类中切换,那么stream消息驱动异曲同工,它封装了rabbitmq和kafuka两个消息队列,我们也可以动态切换。

3.1 三大组件

消息驱动实现的三个核心的组件分别是,了解一下就行

  1. binder 绑定器实现应用程序和消息中间件消息传输的桥梁
  2. output 向外发消息 source 接口
  3. input 向内接受消息  sink接口

下面我就简单的演示一下

3.1.1 消息的生产者

pom 文件

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
        </dependency>

配置文件,配置文件比较复杂

server:
  port: 8760
spring:
  cloud:
    stream:
      binders:#绑定器
        zxbinder:#自定义绑定器的名称
          type: rabbit #消息中间件的类型,也有kafuka
          environment:#这边就是消息中间件的配置
            spring:
              rabbitmq:
                host: 124.111.91.141#你自己的rabbitmq 的地址
                port: 5672
                username: zzz
                password: zzz
                virtual-host: /
      bindings:
        output:#发送出去,这边会在代码里体现
          binder: zxbinder#上面自定义的绑定器的名字
          destination : zx_exchange #这边就是rabbitmq的交换机

发送类,包不要导错了!

package com.example.producerMsg;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.messaging.Source;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.MessageBuilder;
import org.springframework.stereotype.Component;

@Component
@EnableBinding(Source.class)#发送类固定写法
public class MsgProducer {
    @Autowired
    private MessageChannel output;

    public void send(){
        String msg = "hello stream~~";
        output.send(MessageBuilder.withPayload(msg).build());
        System.out.println("发送成功");
    }
}

3.1.2 消息的消费者

这边大部分都和生产方差不多,我这边列出不一样的地方,为了醒目我直接贴图片

配置文件

 代码

4.Sleuth+Zipkin 链路追踪

Sleuth 其实就是监控消息的生命周期,具体是什么意思呢,我一个请求过来,可能经过100个微服务,突然就报错了,你怎么知道哪个服务不行呢,我看日志,一百个服务你一行一行看吗?sleuth 就是解决这个痛点,我就可以站在上帝视角看一下,数据是怎么在各个微服务之间流转的

Zipkin 就是辅助sleuth 记录数据展示数据。

4.1 zipkin 下载

zipkin开源下载https://www.jianshu.com/p/226e0af70f21

官方网站 https://zipkin.io/pages/quickstart.html

4.2 配置

在你想要监控的服务里面配置如下东西即可监控

pom 配置,可以只引入一个zipkin

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

配置文件

spring:
  zipkin:
    base-url: http://124.111.11.111:9411/ #zipkin 地址
    sleuth:
      sampler:
        probability: 1 #采集颗粒度,是不是每个请求都采集

然后启动就行,页面如下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值