SpringCloud学习笔记尚硅谷周阳2020版 上半场(二)

SpringCloud学习笔记

gitee仓库地址

https://gitee.com/lu-yi1104/spring-cloud_-study.git/

上半场 (一)地址

https://blog.csdn.net/weixin_43691773/article/details/109167048

十一 Spring Cloud Config 分布式配置中心

1 分布式系统面临的一些问题

在这里插入图片描述

2 是什么

在这里插入图片描述

3 怎么用

在这里插入图片描述
在这里插入图片描述

4 Config 服务端配置与测试

首先要有一个git仓库

<1>新建Module模块

pon文件

<?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">
    <parent>
        <artifactId>com.luyi.cloud</artifactId>
        <groupId>com.luyi.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-config-center3344</artifactId>
    <dependencies>
        <dependency><!--引入自己定义的api通用包,可以使用payment支付Entity-->
            <groupId>com.luyi.cloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!--Eureka Client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--config-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
        <!--web-->
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-web</artifactId>
           </dependency>
           <dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-actuator</artifactId>
           </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!-- 一般基础配置类-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.luyi.cloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>

</project>

yml文件

server:
  port: 3344

spring:
  application:
    name: cloud-config-center #注册进Eureka服务器的微服务

  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/lu-yi1104/spring-cloud_-study.git/ #gitee上面的仓库地址
          #### 搜索目录
          search-paths:
            - spring-cloud_study

        ### 读取分支
      label: master


eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka







主启动类

package cloud.luyi.springcloud;

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

/**
 * @author 卢意
 * @create 2020-10-26 15:19
 */
@SpringBootApplication
@EnableConfigServer //激活配置中心
public class ConfigMain3344 {
	public static void main(String[] args) {
		SpringApplication.run(ConfigMain3344.class,args);
	}
}

gitee上的位置
在这里插入图片描述

修hosts文件
127.0.0.1 config-3344.com
启动 测试
在这里插入图片描述

<2>读取规则

Spring Cloud Config 有它的一套访问规则,我们通过这套规则在浏览器上直接访问就可以。

/{application}/{profile}[/{label}]
/{application}-{profile}.yml
/{label}/{application}-{profile}.yml
/{application}-{profile}.properties
/{label}/{application}-{profile}.properties

{application} 就是应用名称,对应到配置文件上来,就是配置文件的名称部分,例如我上面创建的配置文件。

{profile} 就是配置文件的版本,我们的项目有开发版本、测试环境版本、生产环境版本,对应到配置文件上来就是以 application-{profile}.yml 加以区分,例如application-dev.yml、application-sit.yml、application-prod.yml。

{label} 表示 git 分支,默认是 master 分支,如果项目是以分支做区分也是可以的,那就可以通过不同的 label 来控制访问不同的配置文件了。
在这里插入图片描述

5 Config 客户端配置与测试

<1>新建Module模块 3355

新建pom文件
注意这里与config服务端的不同
在这里插入图片描述

<?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">
    <parent>
        <artifactId>com.luyi.cloud</artifactId>
        <groupId>com.luyi.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-config-client3355</artifactId>
    <dependencies>
        <dependency><!--引入自己定义的api通用包,可以使用payment支付Entity-->
            <groupId>com.luyi.cloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!--Eureka Client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--config-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!-- 一般基础配置类-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.luyi.cloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>

</project>

</project>

新建 bootstrap.ym文件

在这里插入图片描述

server:
  port: 3355

spring:
  application:
    name: cloud-client
  cloud:
    config:
      label: master #分支名称
      name: config #配置文件名称
      profile: dev #读取后缀名称  上述3个综合: master分支上 config-dev.yml 的配置文件被读取
      uri: http://config-3344.com:3344/



eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

主启动类

package cloud.luyi.springcloud;

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

/**
 * @author 卢意
 * @create 2020-10-26 16:34
 */
@SpringBootApplication
@EnableEurekaClient
public class ConfigMain3355 {
	public static void main(String[] args) {
		SpringApplication.run(ConfigMain3355.class, args);
	}
}

启动3355
在这里插入图片描述
成功实现了3355访问Springcloud config3344通过gitee获取配置信息
在这里插入图片描述

<2> 分布式配置的动态刷新问题

在这里插入图片描述

<2> config客户端动态刷新

确认3355加入actuator监控
在这里插入图片描述

修改 3355 bootstrap.yml文件 暴露监控端口

server:
  port: 3355

spring:
  application:
    name: cloud-client
  cloud:
    config:
      label: master #分支名称
      name: config #配置文件名称
      profile: dev #读取后缀名称  上述3个综合: master分支上 config-dev.yml 的配置文件被读取
      uri: http://config-3344.com:3344/



eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

#暴露监控的端口点
management:
  endpoints:
    web:
      exposure:
        include: "*"


controller层加入注释 @RefreshScope
在这里插入图片描述
启动测试
把config-dev.yml文件做变更
在这里插入图片描述
3344 改变
在这里插入图片描述
运维人员发送post请求激活3355的更新
http://localhost:3355/actuator/refresh
在这里插入图片描述
刷新发现3355 改变
在这里插入图片描述
以上还是手动版的动摇刷新 避免了客户端的重启
想要自动刷新需要我们的1消息总线bus

十一 Bus 消息总线

1 Bus 消息总线的概述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
传一个实体类进去
在这里插入图片描述
大家都有
在这里插入图片描述

2 为何被称为消息总线

在这里插入图片描述

安装RabbitMq

https://blog.csdn.net/weixin_43691773/article/details/109295391

Bus动态刷新全局广播

在这里插入图片描述
第一种刷新配置方式
在这里插入图片描述
第二种方式
在这里插入图片描述
选择第二种方式比较好
在这里插入图片描述

新建3366模块

pom

 <dependencies>
        <dependency><!--引入自己定义的api通用包,可以使用payment支付Entity-->
            <groupId>com.luyi.cloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>
        <!--Eureka Client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--config-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!-- 一般基础配置类-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.luyi.cloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>

Yml文件

server:
  port: 3366

spring:
  application:
    name: cloud-client
  cloud:
    config:
      label: master #分支名称
      name: config #配置文件名称
      profile: dev #读取后缀名称  上述3个综合: master分支上 config-dev.yml 的配置文件被读取
      uri: http://config-3344.com:3344/



eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

#暴露监控的端口点
management:
  endpoints:
    web:
      exposure:
        include: "*"


主启动类

package com.luyi.springcloud;

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

/**
 * @author 卢意
 * @create 2020-11-05 13:48
 */
@SpringBootApplication
@EnableEurekaClient
public class ConfigMain3366 {
	public static void main(String[] args) {
		SpringApplication.run(ConfigMain3366.class);
	}
}

controller层

package cloud.luyi.springcloud.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * 3366
 * @author 卢意
 * @create 2020-10-26 16:38
 */
@RestController
@Slf4j
@RefreshScope
public class ConfigClientController {

	@Value("${config.info}")
	private String configInfo;

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

}

给3344配置中心添加消息总线功能

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

更改 3344的applicatio.yml

server:
  port: 3344

spring:
  application:
    name: cloud-config-center #注册进Eureka服务器的微服务

  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/lu-yi1104/spring-cloud_-study.git/ #gitee上面的仓库地址
          #### 搜索目录
          search-paths:
            - spring-cloud_study

        ### 读取分支
      label: master
#rabbitmq相关配置
	rabbitmq:
	  host: 192.168.216.130
	  port: 5672
	  username: guest
	  password: guest

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka

# rabbitmq想关位置,暴露bus刷新配置的端点
management:
  endpoints: #暴露bus刷新配置的端点
    web:
      exposure:
        include: 'bus-refresh'




注意 凡是暴露端点 配置监控的 都要引入 下面的依赖
在这里插入图片描述

给3355 3366客户端添加消息总线功能

pom文件都加入

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

yml文件加入

#rabbitmq相关配置
rabbitmq:
  host: 192.168.216.130
  port: 5672
  username: guest
  password: guest

同样的这个依赖记得加
在这里插入图片描述

大致架构就完成了
在这里插入图片描述

采坑了 yml文件的rabbit目前的端口号不是浏览器访问的15672 而是 5672

测试

启动 7001 3344 3355 3366
当前总体架构
在这里插入图片描述

当前yml文件的内容 版本为3 确认 3355 3366 版本号也没错
在这里插入图片描述
更该版本为4
在这里插入图片描述
刷新服务器端
在这里插入图片描述
在这里插入图片描述
3355 3366 都变成了4 实现了 一次刷新处处刷新
在这里插入图片描述
原理再回顾一下
在这里插入图片描述
在这里插入图片描述

Bus动态刷新定点通知

在这里插入图片描述
现在只通知3355 不通知3366
git更新版本
在这里插入图片描述

curl -X POST "http://localhost:3344/actuator/bus-refresh/config-client:3355"

参数说明
在这里插入图片描述
测试成功 不沾图了

通知总结

在这里插入图片描述

Spring Cloud Stream 消息驱动

为什么引入 Spring cloud Stream

在这里插入图片描述
在这里插入图片描述

是什么

在这里插入图片描述
Spring Cloud Strea中文手册httphttp://m.wang1314.com/doc/webapp/topic/20971999.html](http://m.wang1314.com/doc/webapp/topic/20971999.html)

设计思想

标准MQ

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

为什么要用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Stream 中的消息通信方式遵循了发布-订阅模式

topic主题进项广播

在RabbitMQ就是Exchange
Kafka里就是Topic
目前只支持RabbitMq和kafka

Stream编码常用注解简介

spring cloud stream 标准流程套路

在这里插入图片描述
在这里插入图片描述
CHANEL在这里插入图片描述

编码API和常用和注解

在这里插入图片描述

案例说明

在这里插入图片描述

消息驱动之生产者

新建模块8801
pom 文件`

<?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">
    <parent>
        <artifactId>com.luyi.cloud</artifactId>
        <groupId>com.luyi.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-stream-rabbitmq-provider8801</artifactId>
    <dependencies>
        <dependency><!--引入自己定义的api通用包,可以使用payment支付Entity-->
            <groupId>com.luyi.cloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>

        <!--Eureka Client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--stream-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!-- 一般基础配置类-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.luyi.cloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>


</project>

yml文件


server:
  port: 8801

spring:
  application:
    name: cloud-stream-provider
  cloud:
    stream:
      binders: # 在此处配置要绑定的rabbitMQ的服务信息
        defaultRabbit: # 表示定义的名称,用于binding的整合
          type: rabbit # 消息中间件类型
          environment: # 设置rabbitMQ的相关环境配置
            spring:
              rabbitmq:
                host: 192.168.216.130
                port: 5672
                username: guest
                password: guest
      bindings: # 服务的整合处理
        output: # 这个名字是一个通道的名称
          destination: studyExchange # 表示要使用的exchange名称定义
          content-type: application/json # 设置消息类型,本次为json,文本则设为text/plain
          binder: defaultRabbit # 设置要绑定的消息服务的具体设置

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka
  instance:
    lease-renewal-interval-in-seconds: 2 # 设置心跳的间隔时间,默认30
    lease-expiration-duration-in-seconds: 5 # 超过5秒间隔,默认90
    instance-id: send-8801.com # 主机名
    prefer-ip-address: true # 显示ip

主启动类

package com.luyi.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

/**
 * @author 卢意
 * @create 2020-11-05 16:39
 */
@SpringBootApplication
public class StreamMQMain8801 {
	public static void main(String[] args) {
		SpringApplication.run(StreamMQMain8801.class,args);
	}
}

发送消息接口

package com.luyi.springcloud.service;

/**
 * 发送消息接口
 * @author 卢意
 * @create 2020-11-05 16:42
 */
public interface IMessageProvider {
	public String send();
}

实现类
注意几个点
再是与controller层的业务打交道了而是与消息中间件打交道 不用加@Services注解
@EnableBinding(Source.class) 里的Source注意路径
这里的Source对应流程里的Source
在这里插入图片描述

package com.luyi.springcloud.service.impl;

import com.luyi.springcloud.service.IMessageProvider;
import org.springframework.amqp.core.Message;
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 java.util.UUID;

/**
 * @author 卢意
 * @create 2020-11-05 16:43
 */
@EnableBinding(Source.class)  // 定义消息推送管道  不再是与controller层的业务打交道了  不用加@Services注解
public class IMessageProviderImpl implements IMessageProvider {

	@Autowired
	private MessageChannel output; //消息发送管道

	@Override
	public String send() {
		String serial= UUID.randomUUID().toString(); // 流水号
		output.send(MessageBuilder.withPayload(serial).build());
		System.out.println("-------------serial: "+serial);
		return null;
	}
}

controller层

package com.luyi.springcloud.controller;

import com.luyi.springcloud.service.IMessageProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

/**
 * @author 卢意
 * @create 2020-11-05 17:05
 */
@RestController
public class SendMessageController {
	@Resource
	private IMessageProvider messageProvider;

	@GetMapping(value = "/sendMessage")
	public String sendMessage(){
		return messageProvider.send();
	}
}

测试 启动 7001 启动让步mq 启动88801

在rabbitmq是否有该交换器 表示成功
在这里插入图片描述
多次访问http://localhost:8801/sendMessage
后台没问题
在这里插入图片描述

消息驱动之消费者

新建model8802
pom文件

<?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">
    <parent>
        <artifactId>com.luyi.cloud</artifactId>
        <groupId>com.luyi.cloud</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>cloud-stream-rabbitMq-consumer8802</artifactId>
    <dependencies>
        <dependency><!--引入自己定义的api通用包,可以使用payment支付Entity-->
            <groupId>com.luyi.cloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>

        <!--Eureka Client-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <!--stream-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!-- 一般基础配置类-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>com.luyi.cloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>

</project>

yml文件


server:
  port: 8802

spring:
  application:
    name: cloud-stream-provider
  cloud:
    stream:
      binders: # 在此处配置要绑定的rabbitMQ的服务信息
        defaultRabbit: # 表示定义的名称,用于binding的整合
          type: rabbit # 消息中间件类型
          environment: # 设置rabbitMQ的相关环境配置
            spring:
              rabbitmq:
                host: 192.168.216.130
                port: 5672
                username: guest
                password: guest
      bindings: # 服务的整合处理
        input: # 这个名字是一个通道的名称
          destination: studyExchange # 表示要使用的exchange名称定义
          content-type: application/json # 设置消息类型,本次为json,文本则设为text/plain
          binder: defaultRabbit # 设置要绑定的消息服务的具体设置

eureka:
  client:
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka
  instance:
    lease-renewal-interval-in-seconds: 2 # 设置心跳的间隔时间,默认30
    lease-expiration-duration-in-seconds: 5 # 超过5秒间隔,默认90
    instance-id: send-8802.com # 主机名
    prefer-ip-address: true # 显示ip

新建controller类
加入注解@EnableBinding(Sink.class)与下图对应
在这里插入图片描述

package com.luyi.springcloud.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.stream.annotation.EnableBinding;
import org.springframework.cloud.stream.annotation.StreamListener;
import org.springframework.cloud.stream.messaging.Sink;
import org.springframework.messaging.Message;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * @author 卢意
 * @create 2020-11-05 18:29
 */
@Component
@EnableBinding(Sink.class)
public class ReceiveMessageListenerController {
	@Value("${server.port}")
	private String serverPort;

	@StreamListener(Sink.INPUT)
	public void input(Message<String> message){
		System.out.println("消费之一号,-------收到的消息:"+message.getPayload()+"\t port: "+serverPort);
	}

}

上面的 message.getPayload()对应8801service实现类的
在这里插入图片描述
测试 启动 7001 8801 8802 和rabbitMq
多次访问http://localhost:8801/sendMessage

在这里插入图片描述
在这里插入图片描述

分组消费和持久化

消息重复消费

根据8802克隆一个8803
在这里插入图片描述
在这里插入图片描述
问题案例
在这里插入图片描述
当前两个消费者在不同的分组
在这里插入图片描述
在这里插入图片描述

如何解决
在这里插入图片描述
修改yml文件
在这里插入图片描述

重启 发现rabbitmq的内容变了

在这里插入图片描述
在这里插入图片描述
发送两条消息就发现两个消费者各拿到一条消息

持久化

停止 8802 8803 并且去掉8802的分组
8801发送4条消息
重启 8802 8803
8802没有加入分组 所以没有收到消息
8803有加入分组 所以还可收到消息

结论是 加入分组不仅能够避免消息重复消费,还支持持久化 避免了消息的丢失

SpringCloud Sleuth 分布式请求链路跟踪

概述

遇到的问题

在这里插入图片描述

是什么

在这里插入图片描述

搭建链路监控步骤

zipkin搭建安装

F版以上就不用调用自己构建Zipjin Server了 只要自己调用jar包
jar报下载地址
https://dl.bintray.com/openzipkin/maven/io/zipkin/java/zipkin-server/
命令java -jar zipkin-server-2.12.9-exec.jar
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
修改8001

    
        <!--包含了 Sleuth+zipkin-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>

修改yml文件
在这里插入图片描述
controller层加入


	@GetMapping(value = "/zipkin")
	public String paymentZipKin(){
		return "hi,I am paymentzipkin ";
	}

修改 80 pom 加入

  <!--包含了 Sleuth+zipkin-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-zipkin</artifactId>
        </dependency>

yml文件如上
controller层加入

@GetMapping("/consumer/payment/zipkin")
	public String paymentZipkin(){
		String result =restTemplate.getForObject("http://localhost:8001"+"payment/zipkin",String.class);
		return  result;
	}

在这里插入图片描述
80消费者调用 8001 多点几次
http://localhost/consumer/payment/zipkin
在这里插入图片描述
在这里插入图片描述
点击查找
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值