当前位置:   article > 正文

5.2 学习总结 config配置中心,Rabbitmq六种工作模式_ribbitmq集群 yml配置

ribbitmq集群 yml配置

1 Spring cloud config 配置中心

集中地管理和维护配置文件
微服务启动时,从服务器获取配置文件

1.1 准备 git 仓库

现在本地准备一个文件夹存放2,3,4的配置文件,再把文件夹放到 git 仓库

  1. 在 gitee 创建仓库

    • springcloud1
    • 开源
  2. 在 springcloud1 工程目录下,新建一个文件夹:config

  3. 把 2,3,4 的 application.yml 复制到 config 目录,并改名

    • item-service-dev.yml
    • user-service-dev.yml
    • order-service-dev.yml
      在这里插入图片描述
  4. 创建本地仓库

    • double shift – 搜索 create git repository(有中文插件用汉字搜索)

    • 选择 springcloud1 工程目录,设置成本地仓库

    • 在这里插入图片描述

    • double shift – 搜索 commit

    • 勾选所有文件、填写提交信息,然后点提交按钮

  5. 把本地仓库推送到远程仓库

    • double shift – 搜索 push
      在这里插入图片描述

    • 点 define remote 链接

    • 粘贴远程仓库的地址,完成推送

1.2 搭建配置中心

  1. 新建 spring 模块:sp09-config

  2. 添加依赖

    • eureka client
    • config server
  3. yml

    spring:
    application:
    name: config-server
    cloud:
    config:
    server:
    git:
    uri: https://gitee.com/shixumin/springclould1 #创建的git仓库地址
    search-paths: config
    server:
    port: 6001
    eureka:
    client:
    service-url:
    defaultZone: http://eureka1:2001/eureka, http://eureka2:2002/eureka

  4. 启动类注解:@EnableConfigServer

  5. 验证

    • 注册表中有 config-server
    • http://localhost:6001/item-service/dev
    • http://localhost:6001/user-service/dev
    • http://localhost:6001/order-service/dev

在这里插入图片描述

1.3 配置中心的客户端

  1. 把 2,3,4 的 application.yml 都注释掉

  2. 添加依赖: config client

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
    
    • 1
    • 2
    • 3
    • 4
  3. 添加新的配置文件: bootstrap.yml

    • eureka地址
    • 设置配置中心的服务id
    • 下载的配置文件

    引导配置,应用启动之前会先执行引导配置

    #应用启动时才会执行 application.yml

    #从配置中心下载配置,再使用下载的配置启动应用

    1.连接eureka

    2.从注册表获得config-server的地址

    3.从config-server下载配置文件

    eureka:
    client:
    service-url:
    defaultZone: http://eureka1:2001/eureka,http://eureka2:2002/eureka
    spring:
    cloud:
    config:
    discovery:
    enabled: true #
    #2.从注册表获得config-server的地址
    service-id: CONFIG-SERVER
    #3.从config-server下载配置文件 user-service-dev.yml
    name: user-service
    profile: dev

1.4 检查确认

  1. 按顺序启动项目
    1. 05-eureka,等待05完全启动
    2. 09-config,等待09完全启动
    3. 03-user
  2. 检查配置中心
    1. 注册表中有 config-server
    2. http://localhost:6001/item-service/dev
    3. http://localhost:6001/user-service/dev
    4. http://localhost:6001/order-service/dev
  3. 03-user 的控制台日志,有没有连接 6001 服务器

更换仓库再测试

在这里插入图片描述

注意:先启动02的话 ,会连接默认配置中心 localhost:8888
在这里插入图片描述

VMware

1.1 ip设置失败

# centos 7 禁用 NetworkManager 系统服务
systemctl stop NetworkManager
systemctl disable NetworkManager

# centos 8 开启 VMware 托管
nmcli n on
systemctl restart NetworkManager
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1.2 安装 Docker 环境

  1. 关闭虚拟机
  2. 右键点虚拟机–管理–克隆
  3. 点三下下一步,起名字: docker-base
  4. 启动虚拟机
  5. 执行 ifconfig 查看 ip
  6. 用 MobaXterm 工具连接服务器,上传文件到 /root/
    • DevOps课前资料dockerdocker-install 文件夹
  7. 按 csdn 离线安装 docker 笔记
    上传离线安装包
    rabbitmq-install 目录上传到 /root
    切换到rabbitmq-install目录
    cd rabbitmq-install
    安装
    rpm -ivh *.rpm
    在这里插入图片描述

Rabbitmq

消息服务、消息队列、消息中间件 Broker

常见的消息服务器:

  • Rabbitmq
  • Activemq
  • Rocketmq
  • Kafka
  • Tubemq

搭建 Rabbitmq 服务器

1. 关闭 docker-base,从docker-base克隆: rabbitmq

2. 设置固定ip

./ip-static
ip: 192.168.64.140

ifconfig
  • 1
  • 2
  • 3
  • 4

3. 上传文件到 /root/

  • DevOps课前资料docker abbit-image.gz

4. 导入镜像

systemctl restart docker

docker load -i rabbit-image.gz

docker images
  • 1
  • 2
  • 3
  • 4
  • 5

5. 按照 rabbitmq 笔记 – docker 启动rabbitmq,启动rabbitmq 容

  1. 关闭防火墙

    systemctl stop firewalld
    systemctl disable firewalld #取消开机自启
     
    # 重启 docker 系统服务
    systemctl restart docker
    
    • 1
    • 2
    • 3
    • 4
    • 5
  2. 配置管理员用户名和密码

    mkdir /etc/rabbitmq
    vim /etc/rabbitmq/rabbitmq.conf
    
    # 添加两行配置:
    default_user = admin
    default_pass = admin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
  3. 启动Rabbitmq

    docker run -d --name rabbit 
    -p 5672:5672 
    -p 15672:15672 
    -v /etc/rabbitmq/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf 
    -e RABBITMQ_CONFIG_FILE=/etc/rabbitmq/rabbitmq.conf 
    --restart=always 
    rabbitmq:management
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
  4. 访问管理控制台 http://192.168.64.140:15672
    用户名密码是 admin

3 rabbitmq六种工作模式

3.1 简单模式

在这里插入图片描述

  • 发送消息的程序是生产者
  • 队列就代表一个邮箱。虽然消息会流经RbbitMQ和你的应用程序,但消息只能被存储在队列里。队列存储空间只受服务器内存和磁盘限制,它本质上是一个大的消息缓冲区。多个生产者可以向同一个队列发送消息,多个消费者也可以从同一个队列接收消息.
  • 消费者等待从队列接收消息

pom依赖

    <dependencies>
        <dependency>
            <groupId>com.rabbitmq</groupId>
            <artifactId>amqp-client</artifactId>
            <version>5.4.3</version>
        </dependency>
    </dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

生产者发送消息

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Producer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1.连接服务器
        ConnectionFactory f = new ConnectionFactory();
        f.setHost("192.168.64.140");
        f.setPort(5672);//5672 收发消息端口 , 15672 管理控制台界面的端口
        f.setUsername("admin");
        f.setPassword("admin");
        Connection con = f.newConnection();
        //建立信道
        Channel c = con.createChannel(); //通信新增
        // 2.在服务器上创建一个队列 : helloworld
        //如果队列在服务器上已存在,不会重复创建
        /*
         *参数:
         * 第二个参数durable: 是否是持久队列
         * 3 exclusive:是否是排他队列,独占队列
         * 4 autoDelete:是否自动删除
         * 5 arguments: 队列的其他属性
         */
        c.queueDeclare("helloworld",false,false,false,null);
        // 3.向helloworld队列发送消息
        /*
           1.  "" 空串 默认的交换机
           2. -routingKey: 对于默认交换机,路由键就是目标队列名称
		 * 3. -props: 其他参数,例如头信息
		 * 4. -body: 消息内容byte[]数组
         */
        c.basicPublish("", "helloworld", null, "helloworld!".getBytes());

        System.out.println("消息已发送");
        c.close();
        con.close();
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42

消费者接收消息

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class Consumer {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 连接
        // 1.连接服务器
        ConnectionFactory f = new ConnectionFactory();
        f.setHost("192.168.64.140");
        f.setPort(5672);//5672 收发消息端口 , 15672 管理控制台界面的端口
        f.setUsername("admin");
        f.setPassword("admin");
        Connection con = f.newConnection();
        //建立信道
        Channel c = con.createChannel(); //通信新增
        // 2.在服务器上创建一个队列 : helloworld
        //如果队列在服务器上已存在,不会重复创建
        c.queueDeclare("helloworld",false,false,false,null);

        // 3.创建回调对象
        //DeliverCallback 处理消息
        //方式1 new 匿名内部类
        DeliverCallback deliverCallback = new DeliverCallback() {
            @Override
            public void handle(String s, Delivery message) throws IOException {
                byte[] a = message.getBody();
                 s = new String(a);
                System.out.println("收到:"+s);
            }
        };
        //方式2 Lambda表达式
//        DeliverCallback deliverCallback = (consumerTag, message) -> {
//            byte[] a = message.getBody();
//            String s = new String(a);
//            System.out.println("收到:"+s);
//        };
        CancelCallback cancelCallback=consumerTag -> {};
        
        // 4. 开始接受消息,把消息传递给一个回调对象进行处理
        //第2个参数 autoAck: 是否自动确认
        c.basicConsume("helloworld", true, deliverCallback, cancelCallback);
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

3.2 工作模式

一个生产者,多个消费者,每个消费者获取到的消息唯一

  1. 自动模式
    消费者从消息队列获取消息后,服务端就认为该消息已经成功消费。
  2. 手动模式
    消费者从消息队列获取消息后,服务端并没有标记为成功消费
    消费者成功消费后需要将状态返回到服务端

4

查看有没有暴露bus-refresh

http://localhost:6001/actuator
在这里插入图片描述

查看2,3,4 控制台有没有重连配置中心,重新下载相应配置(商品,用户,订单配置)

POST http://localhost:6001/actuator/bus-refresh
在这里插入图片描述

在这里插入图片描述

bus 消息总线 (动态配置刷新)

sleuth + Zipkin 链路跟踪

zipkin 可以收集链路跟踪数据,提供可视化的链路分析

java -jar zipkin-server-2.12.9-exec.jar --zipkin.collector.rabbitmq.uri=amqp://admin:admin@192.168.64.140:5672
java -jar zipkin-server-2.23.16-exec.jar --zipkin.collector.rabbitmq.uri=amqp://admin:admin@192.168.64.140:5672

微服务添加 zipkin 起步依赖

修改以下微服务

sp02-item-service
sp03-user-service
sp04-order-service
sp11-zuul


<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-zipkin</artifactId>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/846079
推荐阅读
相关标签
  

闽ICP备14008679号