分类目录Java

springboot 常用错误处理

无法启动

缺少容器依赖

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

取消Mysql的runtime
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <!--<scope>runtime</scope>-->
</dependency>

 

 

Zuul 服务网关

常用网关方案

Nginx+Lua
Kong(商业)
Tyk(go开发)
Spring Cloud Zuul

Zuul 4种过滤器

前置Pre 限流(google的令牌桶,spring-cloud-zuul-ratelimit),鉴权,参数校验
路由 Route
后置Post 统计,日志
错误Error

将多个Zuul节点注册到Eureka Server实现高可用

Nginx和Zuul混搭

配制

#自定义路由
#自定义路由
zuul:
  routes:
    myProduct:
#      路由到 /myProduct/** ->> /product
      path: /myProduct/**
      serviceId: product
#      敏感头过滤,设置传递参数带cookie
      sensitiveHeaders:
#      简单写法
#  product: /myProduct/**
  #  禁止路由外部访问
  ignored-patterns:
    - /product/product/listForOrder
    - /myProduct/product/listForOrder
#    - /**/product/listForOrder

#所有路由规则地址
management:
  #打开/actuator监控端口 /actuator/routes路由列表 /actuator/routes/details路由详情
  endpoints:
    web:
      exposure:
        include: '*'
  #打开health
  endpoint:
    health:
      show-details: ALWAYS
  #关闭权限认证 默认访问需权限
  security:
    enabled: false

跨域解决
1. 在Nginx中解决
1. 在被调用的类或方法上增加注解@CrossOrigin
1. 在ZULL中使用CorsConfig配制文件增加CorsFilter过滤器

@Configuration
public class CorsConfig {

    @Bean
    public CorsFilter corsFilter() {
        final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
        final CorsConfiguration config = new CorsConfiguration();
        //是否支持Cookie跨域
        config.setAllowCredentials(true);
        //允许的原始域,你自己的域名 http:www.a.com
        config.setAllowedOrigins(Arrays.asList("*"));
        //允许的头
        config.setAllowedHeaders(Arrays.asList("*"));
        //允许的方法GET POST ....
        config.setAllowedMethods(Arrays.asList("*"));
        //缓存时间,在这时间内的同一请求不再进行跨域检查
        config.setMaxAge(300L);
        //将配制文件注册
        source.registerCorsConfiguration("/**", config);
        return new CorsFilter(source);
    }
}

ERROR:com.netflix.zuul.exception.ZuulException: Hystrix Readed time out

这个错误是应为zuul的默认超时时间比较小,我们配置下zuul的超时时间,因zuul启用了ribbon的负载均衡,还需要设置ribbon的超时时间,注意ribbon的超时时间要小于zuul超时时间 。

zuul:
  host:
    connect-timeout-millis: 15000 #HTTP连接超时要比Hystrix的大
    socket-timeout-millis: 60000   #socket超时

Redis

https://redis.io/

hub.docker.com

https://hub.docker.com/_/redis/

docker run -itd --name redis -p 6379:6379 -v /home/redis/data:/data --restart always redis:5.0.7
<dependency>
            <groupId> org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

spring:
 redis:
  host: localhost
  port: 6379

类型 简介 特性 场景
String(字符串) 二进制安全 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M
Hash(字典) 键值对集合,即编程语言中的Map类型 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去) 存储、读取、修改用户属性
List(列表) 链表(双向链表) 增删快,提供了操作某一段元素的API 1,最新消息排行等功能(比如朋友圈的时间线) 2,消息队列
Set(集合) 哈希表实现,元素不重复 1、添加、删除,查找的复杂度都是O(1) 2、为集合提供了求交集、并集、差集等操作 1、共同好友 2、利用唯一性,统计访问网站的所有独立ip 3、好友推荐时,根据tag求交集,大于某个阈值就可以推荐
Sorted Set(有序集合) 将Set中的元素增加一个权重参数score,元素按score有序排列 数据插入集合时,已经进行天然排序 1、排行榜 2、带权重的消息队列

Spring Cloud Stream

支持RabbitMQ,Kaflka,简化消息中间件的使用

添加依赖

支持RabbitMQ
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-rabbit</artifactId>
</dependency>
支持Kaflka
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-stream-kaflka</artifactId>
</dependency>

定义接口

/**
 * 功能描述: 定义Spring Cloud Stream接口
 */
public interface StreamClient {

    String INPUT = "myMessage";

    String INPUT2 = "myMessage2";

    @Input(StreamClient.INPUT)
    SubscribableChannel input();

    @Output(StreamClient.INPUT)
    MessageChannel output();

    @Input(StreamClient.INPUT2)
    SubscribableChannel input2();

    @Output(StreamClient.INPUT2)
    MessageChannel output2();
}

发送stream消息

@Api(tags = "发送Spring Cloud Stream信息到MQ")
@RestController
public class SendMessageController {

    @Autowired
    private StreamClient streamClient;

//    @GetMapping("/sendMessage")
//    public void process() {
//        String message = "now " + new Date();
//        streamClient.output().send(MessageBuilder.withPayload(message).build());
//    }

    /**
     * 发送 orderDTO对象
     */
    @ApiOperation("发送 orderDTO对象")
    @GetMapping("/sendMessage")
    public void process() {
        OrderDTO orderDTO = new OrderDTO();
        orderDTO.setOrderId("123456");
        streamClient.output().send(MessageBuilder.withPayload(orderDTO).build());
    }
}

接收stream消息

 * 功能描述:接收Spring Cloud Stream消息
 */
@Component
@EnableBinding(StreamClient.class)
@Slf4j
public class StreamReceiver {

//    @StreamListener(value = StreamClient.INPUT)
//    public void process(Object message) {
//        log.info("StreamReceiver: {}", message);
//    }

    /**
     * myMessage 接收orderDTO对象 消息,myMessage2发送一条返回消息
     * @param message
     */
    @StreamListener(value = StreamClient.INPUT)
    @SendTo(StreamClient.INPUT2)
    public String process(OrderDTO message) {
        log.info("StreamReceiver: {}", message);
        return "received.";
    }

    /**
     * myMessage2接收返回消息
     * @param message
     */
    @StreamListener(value = StreamClient.INPUT2)
    public void process2(String message) {
        log.info("StreamReceiver2: {}", message);
    }
}

统一配制中心 Config

/{name}-{profiles}.yml

/{lable}/{name}-{profiles}.yml

label 分支(bracndh)

name 服务名

profiles 环境

order-dev(XXX).yml启动时会与order.yml合并下发,可以将通用的配制信息写入order.yml,差异的写在不同的环境文件中,

将eureka的注册地址写在代码配制文件中

SERVER

““ org.springframework.cloud spring-cloud-config-server ““ SpringCloud Bus 自动刷新配制 ““ org.springframework.cloud spring-cloud-starter-bus-amqp org.springframework.cloud spring-cloud-config-client ““ 客户端配制文件 ““ bootstrap.yml spring: application: name: product cloud: config: profile: master discovery: enabled: true service-id: CONFIG ““ RabbitMQ消息队列 ““ WebHooks :post www.xxx.com:8080/actuator/bus-refresh github www.xxx.com/monitor(不是actuator/bus-refresh) josn ““ ***微服务先访问eureka,再读取配制中心,注意eureka端口不是8761时,配制内容的顺序*** Webhook 报错在接收json数据时置空,详情见代码仓库 ““ JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token at [Source: (PushbackInputStream); line: 1, column: 452] (through reference chain: java.util.LinkedHashMap[“project”])] ““

/{name}-{profiles}.yml

/{lable}/{name}-{profiles}.yml

label 分支(bracndh)

name 服务名

profiles 环境

order-dev(XXX).yml启动时会与order.yml合并下发,可以将通用的配制信息写入order.yml,差异的写在不同的环境文件中,

将eureka的注册地址写在代码配制文件中

SERVER

““ org.springframework.cloud spring-cloud-config-server ““ SpringCloud Bus 自动刷新配制 ““ org.springframework.cloud spring-cloud-starter-bus-amqp org.springframework.cloud spring-cloud-config-client ““ 客户端配制文件 ““ bootstrap.yml spring: application: name: product cloud: config: profile: master discovery: enabled: true service-id: CONFIG ““ RabbitMQ消息队列 ““ WebHooks :post www.xxx.com:8080/actuator/bus-refresh github www.xxx.com/monitor(不是actuator/bus-refresh) josn ““ ***微服务先访问eureka,再读取配制中心,注意eureka端口不是8761时,配制内容的顺序*** Webhook 报错在接收json数据时置空,详情见代码仓库 ““ JSON parse error: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token at [Source: (PushbackInputStream); line: 1, column: 452] (through reference chain: java.util.LinkedHashMap[“project”])] ““

RabbitMQ

https://www.rabbitmq.com/download.html

docker run -itd --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management

sudo docker run -d --hostname rabbitmq --name rabbitmq  -p 5672:5672 -p 15672:15672 -e RABBITMQ_DEFAULT_USER=user -e RABBITMQ_DEFAULT_PASS=password --restart always harbor.com/public/rabbitmq:3-management

1883 是mqtt tcp协议默认端口
4369 EPMD默认端口号
5672 是服务的端口
15672 是管理界面的端口
15674 是web_stomp ws协议默认端口
15675 是web_mqtt ws协议默认端口
25672 用于节点间和CLI工具通信(Erlang分发服务器端口)

docker run -p 1883:1883 -p 4369:4369 -p 5671:5671 -p 5672:5672 -p 8883:8883 -p 15672:15672 -p 25672:25672 -p 15675:15675  -d cyrilix/rabbitmq-mqtt

sudo docker run -d --hostname rabbitmq --name rabbitmq  -p 5672:5672 -p 15672:15672  -p 1883:1883  -p 15674:15674  -p 15675:15675 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --restart always  rabbitmq:3-management

docker exec rabbitmq rabbitmq-plugins list
docker exec rabbitmq rabbitmq-plugins enable rabbitmq_mqtt
docker exec rabbitmq rabbitmq-plugins enable rabbitmq_web_mqtt
docker exec rabbitmq rabbitmq-plugins enable rabbitmq_web_stomp 
docker exec rabbitmq rabbitmq-plugins enable rabbitmq_web_stomp_examples

启用 HTTP 后台认证需要使用 rabbitmq_auth_backend_http 插件,同时该插件还推荐配合 rabbitmq_auth_backend_cache 通过缓存减轻授权认证服务器压力。
---
docker-compose.yml
version: '3'
      services:
        rabbitmq:
       image: rabbitmq:management
       container_name: rabbitmq
       restart: always
       ports:
       - 5672:5672
       - 15672:15672
       - 1883:1883
       - 15675:15675
       environment:
       RABBITMQ_DEFAULT_USER: admin
       RABBITMQ_DEFAULT_PASS: admin
       volumes:
       - ~/rabbitmq/lib:/var/lib/rabbitmq
       - ~/rabbitmq/log:/var/log

docker exec -it rabbitmq bin/bash
      rabbitmq-plugins enable rabbitmq_mqtt
      rabbitmq-plugins enable rabbitmq_web_mqtt
 docker-compose restart
      docker-compose -f /home/zhu/rabbitmq/docker-compose.yml up -d

通过后台管理插件我们可以动态监控mq的流量,创建用户,队列等。

创建目录
mkdir /etc/rabbitmq

启用插件
/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management
其会在/etc/rabbitmq目录下创建一个enabled_plugins文件,这是后台管理的配置文件。

开启远程访问
rabbitmq的网页管理的端口是15672,如果你是远程操作服务器,输入http://ip:15672,发现连接不上,因为服务器防火墙不允许这个端口远程访问;
###将mq的tcp监听端口和网页管理端口都设置成允许远程访问
firewall-cmd –permanent –add-port=15672/tcp
firewall-cmd –permanent –add-port=5672/tcp
systemctl restart firewalld.service

管理界面介绍
###输入用户名密码登录后进入主界面
Overview:用来显示流量,端口,节点等信息,以及修改配置文件;
Connections:显示所有的TCP连接;
channels:显示所有的信道连接;
exchanges:显示所有的交换机以及创建删除等;
queues:显示所有的队列以及创建删除等;
admins:显示所有的用户以及用户管理;

用户设置
rabbitmq有一个默认的用户名和密码,guest和guest,但为了安全考虑,该用户名和密码只允许本地访问,如果是远程操作的话,需要创建新的用户名和密码;

###root权限
rabbitmqctl add_user username passwd //添加用户,后面两个参数分别是用户名和密码
rabbitmqctl set_permissions -p / username “.” “.” “.*” //添加权限
rabbitmqctl set_user_tags username administrator //修改用户角色,将用户设为管理员

注意:创建的新用户默认角色为空。
用户的角色说明

management:用户可以访问管理插件
policymaker:用户可以访问管理插件,并管理他们有权访问的vhost的策略和参数。
monitoring:用户可以访问管理插件,查看所有连接和通道以及与节点相关的信息。
administrator:用户可以做任何监视可以做的事情,管理用户,vhost和权限,关闭其他用户的连接,并管理所有vhost的政策和参数。

使用添加的账户远程访问后台管理站点,将原来的账号guest删除;
用户管理命令汇总

新建用户:rabbitmqctl add_user username passwd
删除用户:rabbitmqctl delete_user username
改密码: rabbimqctl change_password {username} {newpassword}
设置用户角色:rabbitmqctl set_user_tags {username} {tag …}

rabbitmqctl set_permissions -p / username “.” “.” “.*” //添加权限

权限说明:

rabbitmqctl set_permissions [-pvhostpath] {user} {conf} {write} {read}
Vhostpath:虚拟主机,表示该用户可以访问那台虚拟主机;
user:用户名。
Conf:一个正则表达式match哪些配置资源能够被该用户访问。
Write:一个正则表达式match哪些配置资源能够被该用户设置。
Read:一个正则表达式match哪些配置资源能够被该用户访问。

虚拟主机
默认的用户和队列都是在/虚拟机下。
创建一个虚拟主机
rabbitmqctl add_vhost vhost_name
删除一个虚拟主机
rabbitmqctl delete_vhost vhost_name

常用文件路径

/usr/local/rabbitmq_server/var/log/rabbitmq/rabbit@tms.log:记录rabbitmq运行日常的日志
/usr/local/rabbitmq_server/var/log/rabbitmq/rabbit@tms-sasl.log:rabbitmq的崩溃报告
/usr/local/rabbitmq_server/etc/rabbitmq/rabbitmq.config:rabbitmq的配置文件
/usr/local/rabbitmq_server/var/lib/rabbitmq/mnesia/rabbit@tms:rabbit消息持久化文件

注意:
如果相应路径的文件不存在就自己创建,如果是使用apt安装或yum安装那么这些文件夹都被自动创建好了。


RabbitMQ常用的交换器类型有direct、topic、fanout、headers四种。
1. Direct Exchange
该类型的交换器将所有发送到该交换器的消息被转发到RoutingKey指定的队列中,也就是说路由到BindingKey和RoutingKey完全匹配的队列中。
1. Topic Exchange
该类型的交换器将所有发送到Topic Exchange的消息被转发到所有RoutingKey中指定的Topic的队列上面。
Exchange将RoutingKey和某Topic进行模糊匹配,其中“”用来匹配一个词,“#”用于匹配一个或者多个词。
1. Fanout Exchange
该类型不处理路由键,会把所有发送到交换器的消息路由到所有绑定的队列中。优点是转发消息最快,性能最好。
1. Headers Exchange
该类型的交换器不依赖路由规则来路由消息,而是根据消息内容中的headers属性进行匹配。headers类型交换器性能差,在实际中并不常用。

Eureka 使用及常用配置

  1. ### Eureka server 注册中心
增加依赖
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>
在主启动类使用注解
@EnableEurekaServer
配制--服务端同时也是客户端
# 应用名
spring:
  application:
    name: eurekaserver
#  freemarker:
#    prefer-file-system-access: false
# 服务端口
server:
  port: 8761
eureka:
  #  instance:
  #    以IP:端口方式定位
  #    prefer-ip-address: true
  #    eureka.instance.instance-id: 主机名:应用名:端口号
  #    eureka主机名
  #    hostname: 127.0.0.1
  # 关闭注册中心的自我保护模式,开发环境可以关闭
  server:
    enable-self-preservation: false
  client:
    #    是否从eureka获取注册信息
    fetch-registry: false
    #   是否注册到eureka(eureka本身是不需要再注册到自己的)(单机环境)
    register-with-eureka: false
    service-url:
      #      设置注册服务器地址,开发测试时注册一个,上线服务器多台服务器,两台相互注册,三台两两相互注册 /eureka/
      defaultZone: http://localhost:8761/eureka
  1. ### Eureka client 服务注册
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
主启动类开启eureka客户端
@EnableDiscoveryClient
配制
eureka:
  client:
    #    是否从eureka获取注册信息
    fetch-registry: true
    # 是否注册到eureka(eureka本身是不需要再注册到自己的)(单机环境)
    register-with-eureka: true
    service-url:
      # 设置注册服务器地址,开发测试时注册一个,上线服务器多台服务器
      defaultZone: http://client:8761/eureka/
 #  instance:
  #    以IP:端口方式定位
  #    prefer-ip-address: true
  #    eureka.instance.instance-id: 主机名:应用名:端口号
  #    eureka主机名
  #    hostname: 127.0.0.1

常用配置说明:

配置参数 默认值 说明
服务注册中心配置 Bean类:org.springframework.cloud.netflix.eureka.server.EurekaServerConfigBean
eureka.server.enable-self-preservation false 关闭注册中心的保护机制,Eureka 会统计15分钟之内心跳失败的比例低于85%将会触发保护机制,不剔除服务提供者,如果关闭服务注册中心将不可用的实例正确剔除
服务实例类配置 Bean类:org.springframework.cloud.netflix.eureka.EurekaInstanceConfigBean
eureka.instance.prefer-ip-address false 不使用主机名来定义注册中心的地址,而使用IP地址的形式,如果设置了

eureka.instance.ip-address 属性,则使用该属性配置的IP,否则自动获取除环路IP外的第一个IP地址

eureka.instance.ip-address IP地址
eureka.instance.hostname 设置当前实例的主机名称
eureka.instance.appname 服务名,默认取 spring.application.name 配置值,如果没有则为 unknown
eureka.instance.lease-renewal-interval-in-seconds 30 定义服务续约任务(心跳)的调用间隔,单位:秒
eureka.instance.lease-expiration-duration-in-seconds 90 定义服务失效的时间,单位:秒
eureka.instance.status-page-url-path /info 状态页面的URL,相对路径,默认使用 HTTP 访问,如果需要使用 HTTPS则需要使用绝对路径配置
eureka.instance.status-page-url 状态页面的URL,绝对路径
eureka.instance.health-check-url-path /health 健康检查页面的URL,相对路径,默认使用 HTTP 访问,如果需要使用 HTTPS则需要使用绝对路径配置
eureka.instance.health-check-url 健康检查页面的URL,绝对路径
服务注册类配置 Bean类:org.springframework.cloud.netflix.eureka.EurekaClientConfigBean
eureka.client.service-url. 指定服务注册中心地址,类型为 HashMap,并设置有一组默认值,默认的Key为 defaultZone;默认的Value为 http://localhost:8761/eureka ,如果服务注册中心为高可用集群时,多个注册中心地址以逗号分隔。

如果服务注册中心加入了安全验证,这里配置的地址格式为: http://:@localhost:8761/eureka 其中 为安全校验的用户名; 为该用户的密码

eureka.client.fetch-registery true 检索服务
eureka.client.registery-fetch-interval-seconds 30 从Eureka服务器端获取注册信息的间隔时间,单位:秒
eureka.client.register-with-eureka true 启动服务注册
eureka.client.eureka-server-connect-timeout-seconds 5 连接 Eureka Server 的超时时间,单位:秒
eureka.client.eureka-server-read-timeout-seconds 8 读取 Eureka Server 信息的超时时间,单位:秒
eureka.client.filter-only-up-instances true 获取实例时是否过滤,只保留UP状态的实例
eureka.client.eureka-connection-idle-timeout-seconds 30 Eureka 服务端连接空闲关闭时间,单位:秒
eureka.client.eureka-server-total-connections 200 从Eureka 客户端到所有Eureka服务端的连接总数
eureka.client.eureka-server-total-connections-per-host 50 从Eureka客户端到每个Eureka服务主机的连接总数

https://www.cnblogs.com/li3807/p/7282492.html

微服务框架

两大配方

网关 [Zuul] Spring Cloud Gateway

1:阿里系

Dubbo
Nacos Zookeeper
SpringBoot /SpringMVC
采用服务端发现
Sentinel流控
链路监控 Pinpoint

2:Spring Cloud

Spring Cloud Netflix Eureka 服务注册发现
SpringBoot
Ribbon 客户端负载均衡器 RestTemplate/feign / Zuul
Hystrix流控
链路监控 Spring Cloud Sleuth & Zipkin

Eureka线上环境至少两台相互注册,三台两两相互注册以达到高可用,采用客户端发现,REST异构时常用的Nodejs有eureka-js-client客户端.

服务注册与发现对比 AP

如果要求一致性,则选择zookeeper、Consul,如金融行业 CP设计,保证了一致性,集群搭建的时候,某个节点失效,则会进行选举行的leader,或者半数以上节点不可用,则无法提供服务,因此可用性没法满足
如果要求可用性,则Eureka,如电商系统 AP原则,无主从节点,一个节点挂了,自动切换其他节点可以使用,去中心化
Nacos:
Nacos是阿里开源的,Nacos 支持基于 DNS 和基于 RPC 的服务发现。在Spring Cloud中使用Nacos,只需要先下载 Nacos 并启动 Nacos server,Nacos只需要简单的配置就可以完成服务的注册发现。
Nacos除了服务的注册发现之外,还支持动态配置服务。动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。

微服务可见性

Metrics 跟踪所有可以用数字来表示的信息内容,用于度量
Tracing 跟踪单次请求中发生了什么,用于优化,提优
Logging 跟踪零散的文字描述,用于日志

Prometheus 采取拉取数据
ELK解决方案 采集离合零散的信息的处理,索引等
LogStash 离散的日志收集,处理,过滤,格式转换
ElasticSearch 搜索引擎,进行索引,方便检索
Kibana 展示数据

消息中间

RabbitMQ 集成
Kafka
ActiveMQ

综合对比:

  1. ActiveMQ: 历史悠久的开源项目,已经在很多产品中得到应用,实现了JMS1.1规范,可以和spring-jms轻松融合,实现了多种协议,不够轻巧(源代码比RocketMQ多),支持持久化到数据库,对队列数较多的情况支持不好。
  2. RabbitMq:
    它比kafka成熟,支持AMQP事务处理,在可靠性上,RabbitMq超过kafka,在性能方面超过ActiveMQ。
  3. Kafka:
    Kafka设计的初衷就是处理日志的,不支持AMQP事务处理,可以看做是一个日志系统,针对性很强,所以它并没有具备一个成熟MQ应该具备的特性,Kafka的性能(吞吐量、tps)比RabbitMq要强,如果用来做大数据量的快速处理是比RabbitMq有优势的

综合使用

网关:[Zuul]
网关流控:spring-cloud-zuul-ratelimit
服务与配制: Nacos
身份认证:Spring Cloud OAuth2
消息中间:RabbitMQ Kafka
服务流控:Sentinel