课程3-1-springcloud加入redis和rockctMq中间件的使用

springcloud加入redis和rocketMq中间件的使用

redis和rocketMq的安装

点击进入:linux下载安装redis教程
点击进入:linux下载安装rocketMq教程

进行后面的操作需要提前准备好中间件的安装环境。
我们在前面课程study-provider的基础上进行中间件的加入操作。若同学们没有合适的项目,博主已经为大家准备好了项目, 下载后可一起学习使用。
注:项目已上传;
链接:https://pan.baidu.com/s/1NaxN3mpxoOMGI5fxM3ev6w
提取码:fd8y

redis在项目中的使用

  1. 在项目的web层的pom.xml文件中引入redis的依赖在这里插入图片描述

    <dependency>
       <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
  2. 配置文件新增连接信息在这里插入图片描述

    spring.redis.host=120.92.151.118
    spring.redis.port=6379
    spring.redis.password=
    
  3. 新增验证redis的使用
    操作一:新增请求接口
    在这里插入图片描述

    @GetMapping("getRedis")
    public User getRedis(Integer id) {
        User user= userService.getUserByIdRedis(id);
        return user;
    }
    

    操作二:新增service层方法;
    在这里插入图片描述

    User getUserByIdRedis(Integer id);
    

    在这里插入图片描述

    @Autowired
    private RedisTemplate<Object, Object> redisTemplate;
    
    @Override
    public User getUserByIdRedis(Integer id) {
        String key = "user-" + id;
        // 数据库取出user信息
        User userById = userMapper.getUserById(id);
        // 数据库取出的信息放到redis里面60秒
        redisTemplate.opsForValue().set(key, userById, Duration.ofSeconds(60));
        // 从redis里取出来看一下
        User user = (User) redisTemplate.opsForValue().get(key);
        return user;
    }
    

注:RedisTemplate<Object, Object> redisTemplate可以直接注入使用。

操作三:将User实体类实现 Serializable 接口,因为 Spring 会将对象先序列化再存入 Redis,否则会异常;
在这里插入图片描述

package com.xcc.studyprovider.model;

import lombok.Data;

import java.io.Serializable;

@Data
public class User implements Serializable {

    private Integer id;
    private String name;
    private Integer age;
}

  1. 请求结果在这里插入图片描述
    访问成功即可。
    注:由于RedisTemplate<Object, Object> redisTemplate都是obj类,存储到redis的key会被更改,如下;
    在这里插入图片描述
  2. 新增redis的配置文件,设置插入redis的值的格式RedisTemplate<String, Object>在这里插入图片描述
package com.xcc.studyprovider.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);
        GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();
        template.setKeySerializer(StringRedisSerializer.UTF_8);
        template.setHashKeySerializer(StringRedisSerializer.UTF_8);
        template.setValueSerializer(serializer);
        template.setHashValueSerializer(serializer);
        template.afterPropertiesSet();
        return template;
    }

}

修改service文件的注入;在这里插入图片描述
6. 重启项目测试数据;在这里插入图片描述
注:redis的基本用法就是这些,如若想深入了解,可点击继续学习了解更多redis在java中的使用。

java中使用rocketMq

  1. 在项目的web层的pom.xml文件中引入mq的依赖
    在这里插入图片描述

    <!-- rocketmq依赖 -->
    <dependency>
         <groupId>org.apache.rocketmq</groupId>
         <artifactId>rocketmq-client</artifactId>
         <version>4.4.0</version>
     </dependency>
    
  2. 配置mq生产者,将发送者注册成bean,供其他方法调用;在这里插入图片描述

    @Value("${rocket-mq.nameserver.addr}")
    private String nameserverAddr;
    @Value("${rocket-mq.topic}")
    private String topic;
    

    注:两处的配置参数配置在nacos中,如下; 在这里插入图片描述

  3. service层调用生产者进行消息的发送;在这里插入图片描述

    // ------------------------mq--------------------------
    // mqProducer.send();方法中,第一个参数是topic,我发给自己,则是topic_study_provider
    try {
        String data = JSON.toJSONString(user);
        mqProducer.send(new Message("topic_study_provider", "log", data.getBytes(StandardCharsets.UTF_8)));
    } catch (MQClientException e) {
        e.printStackTrace();
    } catch (RemotingException e) {
        e.printStackTrace();
    } catch (MQBrokerException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    

    注:这样的话,调用send()方法,填充对应的参数,就可以发送消息了。

  4. 定义消费者(接收者)
    在这里插入图片描述

    	// 该注解加上以后,注册成bean完成的时候会自动执行一遍
        @PostConstruct
        public void init() throws MQClientException {
            // 定义接收者DefaultMQPushConsumer,消费者组为(topic + "_consumer1")
            DefaultMQPushConsumer consumer1 = new DefaultMQPushConsumer(topic + "_consumer1");
            // 设置mq的连接信息,参数写在nacos中
            consumer1.setNamesrvAddr(nameserverAddr);
            // 消费的消息的topic,此处消费自己,则为(topic_study_provider),“*”代表所有的tag
            consumer1.subscribe("topic_study_provider", "*");
            // 设置线程数,最多为1
            consumer1.setConsumeThreadMax(1);
            consumer1.setConsumeThreadMin(1);
            // 接收到的消息接受处理
            consumer1.setMessageListener(messageListener);
            consumer1.start();
            log.info("启动MQ消费者1号");
        }
    
  5. 新增消息监听在这里插入图片描述

    package com.xcc.studyprovider.mq;
    
    import com.alibaba.fastjson.JSON;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
    import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
    import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
    import org.apache.rocketmq.common.message.MessageExt;
    import org.springframework.stereotype.Component;
    
    import java.nio.charset.StandardCharsets;
    import java.util.List;
    import java.util.Map;
    
    // 实现MessageListenerConcurrently接口,自带消费消息的consumeMessage方法
    @Component
    @Slf4j
    public class MessageListener implements MessageListenerConcurrently {
        @Override
        public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
            msgs.forEach(messageExt -> {
                log.info("收到消息:{}", new String(messageExt.getBody(), StandardCharsets.UTF_8));
                String s = new String(messageExt.getBody(), StandardCharsets.UTF_8);
                Map<String, Object> map = JSON.parseObject(s, Map.class);
                log.info("map=" + map);
                log.info("id=" + map.get("id"));
                log.info("name=" + map.get("name"));
                log.info("age=" + map.get("age"));
            });
            // ConsumeConcurrentlyStatus.RECONSUME_LATER 指消费失败,过一会再次消费;
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        }
    }
    
    
  6. 启动项目,测试发送和消费消息;在这里插入图片描述
    请求接口,打印成功。

代码已上传;
链接:https://pan.baidu.com/s/19HA-5MVIEueNAMTo45cotg
提取码:l19c

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值