分类目录组件项目

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

eureka-client无法启动com.netflix.discovery.DiscoveryClient : Shutting down DiscoveryClient

解决思路:

“Unregistering application unknown with eureka with status DOWN”,eureka无法注册未知应用程序,导致停止。感觉应该是缺少容器,spring-boot-starter-web中含有tomcat。

解决方法:
在pom.xml中加入或者父pom.xml中加入
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

微服务框架

两大配方

网关 [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

express

apt install node-express-generator
npm install -g express-generator
npm -g install express
express -V

错误:在项目目录执行 npm install express 或 npm link express

npm -g install serve-index
npm -g install socket.io
npm install -g forever

运维
npm i pm2 -g
pm2 init
pm2 start ecosystem.config.js

pm2 list
pm2 restart xxxx
pm2 log

mediasoup安装

下载

git clone https://github.com/versatica/mediasoup-demo.git

cd mediasoup-demo

git checkout v3

 app客户端
broadcasters广播推流
server服务器端,媒体服务(管道通信)与信令服务

配置服务器

cd server

npm install

cp config.example.js config.js

// Listening hostname (just for gulp live task).
domain : process.env.DOMAIN || ‘localhost‘,
// Signaling settings (protoo WebSocket server and HTTP API server).
https :
{
listenIp : ‘0.0.0.0’,
// NOTE: Don’t change listenPort (client app assumes 4443).
listenPort : process.env.PROTOO_LISTEN_PORT || 4443,
// NOTE: Set your own valid certificate files.
tls :
{
cert : process.env.HTTPS_CERT_FULLCHAIN || ${__dirname}/certs/<strong><span style="color: #ff0000;">fullchain.pem</span></strong>,//证书
key : process.env.HTTPS_CERT_PRIVKEY || ${__dirname}/certs/<span style="color: #ff0000;"><strong>privkey.key</strong></span> //证书
}
},

// See https://mediasoup.org/documentation/v3/mediasoup/api/#WebRtcTransportOptions
webRtcTransportOptions :
{
listenIps :
[
{
ip : process.env.MEDIASOUP_LISTEN_IP || ‘1.2.3.4′,  //服务器IP或0.0.0.0,浏览器的传输
announcedIp : process.env.MEDIASOUP_ANNOUNCED_IP
}
],
initialAvailableOutgoingBitrate : 1000000,
minimumAvailableOutgoingBitrate : 600000,
maxSctpMessageSize : 262144,
// Additional options that are not part of WebRtcTransportOptions.
maxIncomingBitrate : 1500000
},

// See https://mediasoup.org/documentation/v3/mediasoup/api/#PlainRtpTransportOptions
plainRtpTransportOptions :
{
listenIp :
{
ip : process.env.MEDIASOUP_LISTEN_IP || ‘1.2.3.4‘, //普通的传输
announcedIp : process.env.MEDIASOUP_ANNOUNCED_IP
},
maxSctpMessageSize : 262144
}

/启动server
npm start

//客户端安装 app目录
npm install
npm install -g gulp-cli
gulp live //客户端
gulp dist //生成发布目录/server/public

启动nodejs服务
node app.js
nohup node app.js &
forever start app.js 推荐此方式

调试
node –inspect-brk server.js
chrome://inspect
再根据需要设置断点