1 Spring cloud config 配置中心
   
    集中地管理和维护配置文件
    
    微服务启动时,从服务器获取配置文件
   
    
    
    1.1 准备 git 仓库
   
现在本地准备一个文件夹存放2,3,4的配置文件,再把文件夹放到 git 仓库
- 
在 gitee 创建仓库 - springcloud1
- 开源
 
- 
在 springcloud1 工程目录下,新建一个文件夹:config 
- 
把 2,3,4 的 application.yml 复制到 config 目录,并改名 - item-service-dev.yml
- user-service-dev.yml
- 
       order-service-dev.yml
 
   
 
- 
创建本地仓库 - 
double shift – 搜索 create git repository(有中文插件用汉字搜索) 
- 
选择 springcloud1 工程目录,设置成本地仓库 
- 
  
- 
double shift – 搜索 commit 
- 
勾选所有文件、填写提交信息,然后点提交按钮 
 
- 
- 
把本地仓库推送到远程仓库 - 
double shift – 搜索 push 
 
   
- 
点 define remote 链接 
- 
粘贴远程仓库的地址,完成推送 
 
- 
    
    
    1.2 搭建配置中心
   
- 
新建 spring 模块:sp09-config 
- 
添加依赖 - eureka client
- config server
 
- 
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
- 
启动类注解: 
 
 @EnableConfigServer
 
- 
验证 - 注册表中有 config-server
- 
       
 http://localhost:6001/item-service/dev
 
- 
       
 http://localhost:6001/user-service/dev
 
- 
       
 http://localhost:6001/order-service/dev
 
 
     
   
    
    
    1.3 配置中心的客户端
   
- 把 2,3,4 的 application.yml 都注释掉
- 添加依赖: config client
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
- 
     添加新的配置文件: 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 检查确认
   
- 
     按顺序启动项目
- 05-eureka,等待05完全启动
- 09-config,等待09完全启动
- 03-user
 
- 
     检查配置中心
- 注册表中有 config-server
- 
       
 http://localhost:6001/item-service/dev
 
- 
       
 http://localhost:6001/user-service/dev
 
- 
       
 http://localhost:6001/order-service/dev
 
 
- 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 安装 Docker 环境
   
- 关闭虚拟机
- 右键点虚拟机–管理–克隆
- 点三下下一步,起名字: docker-base
- 启动虚拟机
- 执行 ifconfig 查看 ip
- 
     用 MobaXterm 工具连接服务器,上传文件到 /root/
- DevOps课前资料\docker\docker-install 文件夹
 
- 
     按 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
    
    
    3. 上传文件到 /root/
   
- DevOps课前资料\docker\rabbit-image.gz
    
    
    4. 导入镜像
   
systemctl restart docker
docker load -i rabbit-image.gz
docker images
    
    
    5. 按照 rabbitmq 笔记 – docker 启动rabbitmq,启动rabbitmq 容
   
- 
关闭防火墙 systemctl stop firewalld systemctl disable firewalld #取消开机自启 # 重启 docker 系统服务 systemctl restart docker
- 
配置管理员用户名和密码 mkdir /etc/rabbitmq vim /etc/rabbitmq/rabbitmq.conf # 添加两行配置: default_user = admin default_pass = admin
- 
启动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
- 
访问管理控制台 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>
    
    
    生产者发送消息
   
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();
    }
}
    
    
    消费者接收消息
   
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);
    }
}
    
    
    3.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>
 
