WindowsServer2012微服务注册中心及调用尝试
安装软件
redis
环境搭建-在Windows Server 2012 R2上搭建Redis
https://www.jianshu.com/p/fdf41b1d85a1
redis Windows 版本
https://github.com/MicrosoftArchive/redis/releases
默认安装位置:
C:\Program Files\Redis
命令行执行:
redis-server.exe redis.windows.conf
redis-cli.exe
info
rabbitmq
- OTP 21.2 Windows 64-bit Binary File
http://www.erlang.org/downloads
- rabbitmq 下载地址,Windows: Installer
http://www.rabbitmq.com/download.html
两个软件都安装好后,通过如下文章开通管理UI
Windows 安装Rabbitmq
https://www.cnblogs.com/hobinly/p/6265668.html
访问地址:
http://192.168.1.121:15672/#/users
打开远程访问参考
https://blog.csdn.net/juan0728juan/article/details/77653776
新建用户,并设置对应权限
consul
下载windows 安装版本
https://www.consul.io/downloads.html
csdn用的资源是 1.4.0,我是从官网下的版本:1.4.2
https://download.csdn.net/download/zjl91dragon/10840388
新建 start-consul.bat 文件,调试模式下,启动服务器命令如下:
consul agent -dev -client 0.0.0.0
启动参数的具体意义,参见: https://blog.csdn.net/liuzhuchen/article/details/81913562 文章
中心访问地址
http://192.168.1.121:8500/ui/dc1/services
服务提供者与消费者
idea,创建项目
SpringInit / Cloud Core / Cloud Bootstrap
Consul 服务提供者
http://www.ityouknow.com/springcloud/2018/07/20/spring-cloud-consul.html
注册服务的配置文件:
spring.application.name=spring-cloud-consul-producer
server.port=8502
spring.cloud.consul.host=192.168.1.121
spring.cloud.consul.port=8500
#注册到consul的服务名称
spring.cloud.consul.discovery.serviceName=service-producer
Consul 消费者
consul 消费者调用关键代码
-
配置远端注册中心服务器地址
-
发送远程调用指令
@RestController
public class CallHelloController {
@Autowired
private LoadBalancerClient loadBalancer;
@RequestMapping("/call")
public String call() {
ServiceInstance serviceInstance = loadBalancer.choose("service-producer");
System.out.println("服务地址:" + serviceInstance.getUri());
System.out.println("服务名称:" + serviceInstance.getServiceId());
String callServiceResult = new RestTemplate().getForObject(serviceInstance.getUri().toString() + "/hello", String.class);
System.out.println(callServiceResult);
return callServiceResult;
}
}
延伸:带参数的远程调用方法等
项目配置文件代码及pom.xml 依赖库相关代码,参见博主的开源示例代码。
参考资料
参考博客
http://www.ityouknow.com/springcloud/2018/07/20/spring-cloud-consul.html
Spring Cloud Eureka Consul使用和对比
https://blog.csdn.net/ZYC88888/article/details/81453647
consul 与 eureka
https://blog.csdn.net/baidu_36327010/article/details/80363703
安装及启动
下载地址,及安装部署方法,参考: http://csit.anancar.cn/p/index.php?title=Springcloud
安装 erl10.3 : otp_win64_21.3.exe
安装 rabbitmq-server-3.7.10
搭建RabbitMQ环境
3.1.下载
下载地址:http://www.rabbitmq.com/download.html
3.2.windows下安装
3.2.1.安装Erlang
下载:http://www.erlang.org/download/otp_win64_17.3.exe
开启 UI 访问界面:
cd C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.10\sbin rabbitmq-plugins enable rabbitmq_management
测试地址 http://localhost:15672/
默认的用户名:guest
默认的密码为:guest
RabbitMQ的测试
测试的仓库代码: https://gitee.com/lvye1221/rabbitmq-test
学习文章: https://blog.csdn.net/hellozpc/article/details/81436980#53Work_331
新建 maven的java工程
https://www.cnblogs.com/yb38156/p/9761716.html
rabbitmq 中 虚拟主机, Virtual Host
类似于虚拟空间,当前虚拟空间不会影响到其他位置的
basicQos 方法设置了当前信道最大预获取(prefetch)消息数量为1。消息从队列异步推送给消费者,消费者的 ack 也是异步发送给队列,从队列的视角去看,总是会有一批消息已推送但尚未获得 ack 确认,Qos 的 prefetchCount 参数就是用来限制这批未确认消息数量的。设为1时,队列只有在收到消费者发回的上一条消息 ack 确认后,才会向该消费者发送下一条消息。prefetchCount 的默认值为0,即没有限制,队列会将所有消息尽快发给消费者。
// 同一时刻服务器只会发一条消息给消费者 channel.basicQos(1); //开启这行 表示使用手动确认模式 channel.basicAck(delivery.getEnvelope().getDeliveryTag(), false); // 监听队列,false表示手动返回完成状态,true表示自动 channel.basicConsume(QUEUE_NAME, false, consumer);
SpringBoot 集成 RabbitMQ
10分钟轻松搞定SpringBoot集成RabbitMQ教程
https://blog.csdn.net/pingweicheng/article/details/80336386
演示项目
开源项目代码
https://gitee.com/rabbitmqDemo/rabbitmq
发送数据到队列中
@Autowired private AmqpTemplate amqpTemplate; public void send1(Object obj){ // String context = "hello"+new Date(); Gson gson = new Gson(); System.out.println("Sender1 : "+gson.toJson(obj)); this.amqpTemplate.convertAndSend("hello",gson.toJson(obj)); }
// 主动接收队列中的数据
@Component public class PollReceiver { @Autowired private AmqpTemplate amqpTemplate; public void recieve (){ Object o = this.amqpTemplate.receiveAndConvert("hello"); System.out.println("Poll Receiver1" + o); } }
查看队列中是否存在数据,如果存在, Ready 将有计数器表明数据的存在
http://192.168.1.121:15672/#/queues
资料
RabbitMQ 入门:介绍及安装方法
https://blog.csdn.net/qq_31634461/article/details/79377256
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比
https://www.sojson.com/blog/48.html
消息队列系列:Rabbitmq Trace 日志的使用
https://www.cnblogs.com/li150dan/p/9529049.html
RabbitMQ 的基本概念
Queue: 消息队列
Exchange 类型 负责将数据转发到对应的Queue:
策略: 直接策略, 广播策略, Topic 转发(模式匹配进行转发数据)
ACK, 确认消息
RabbitMQ基础教程之基本使用篇
https://www.cnblogs.com/yihuihui/p/9127300.html
RabbitMQ教程 专栏
https://blog.csdn.net/hellozpc/article/details/81436980
重复消息
消费任务类型最好要支持幂等性 或者 用 map 记录任务执行情况
https://blog.csdn.net/varyall/article/details/79111745
如果一个消费者挂掉(channel被关闭、connection被关闭或者TCP 连接被关闭)而没有发送ACK,那么rabbitmq会让这个消息重新入队。
如果在同一时间内有其他的消费者连接了,他快被快速的投递到其他的消费者那。即使工作者偶尔挂掉,这种方式下也可以确定没有消息会丢失。
没有任何的消息超时,当消费者挂掉,rabbitmq将重新投递这些消息。对于处理一个消息需要非常非常长的时间也没关系因为不会超时。
https://my.oschina.net/lzhaoqiang/blog/712095
多个消费者可以订阅同一个Queue,这时Queue中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理。
https://www.cnblogs.com/zhangxiaoliu/p/7524846.html
重回队列模式,是当投递消息失败时,让该消息重新回到队列的模式,该模式需要手动签收,并需要在消费者中进行判断,调用重回队列的确认模式
https://www.cnblogs.com/xiaoyao-001/p/9608665.html
分发到消费端后,消费端没有回发ack的消息会在unacked状态栏中。
https://blog.csdn.net/kdc18333608478/article/details/77552546
那么在消费过程中有异常了怎么办,这条消费肯定就不能返回ack应答了,这时就需要channel.basicNack方法了,这个方法解决了消费异常情况下该条消息怎么处理,有两种办法:第一,这条消息重新放回队列重新消费,第二,抛弃此条消息。
//重新放入队列 //channel.basicNack(envelope.getDeliveryTag(), false, true); //抛弃此条消息 //channel.basicNack(envelope.getDeliveryTag(), false, false);