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

  1. OTP 21.2 Windows 64-bit Binary File

http://www.erlang.org/downloads

  1. 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 消费者调用关键代码

  1. 配置远端注册中心服务器地址

  2. 发送远程调用指令

@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  的基本概念

https://liuyueyi.github.io/hexblog/2018/05/27/RabbitMQ%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B%E4%B9%8B%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/

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);
posted @ 2019-02-18 11:33  lvye1221  阅读(46)  评论(0编辑  收藏  举报