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
点击查找