springcloud加入redis和rocketMq中间件的使用
redis和rocketMq的安装
点击进入:linux下载安装redis教程
点击进入:linux下载安装rocketMq教程
进行后面的操作需要提前准备好中间件的安装环境。
我们在前面课程study-provider的基础上进行中间件的加入操作。若同学们没有合适的项目,博主已经为大家准备好了项目, 下载后可一起学习使用。
注:项目已上传;
链接:https://pan.baidu.com/s/1NaxN3mpxoOMGI5fxM3ev6w
提取码:fd8y
redis在项目中的使用
-
在项目的web层的pom.xml文件中引入redis的依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
配置文件新增连接信息
spring.redis.host=120.92.151.118 spring.redis.port=6379 spring.redis.password=
-
新增验证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;
}
- 请求结果
访问成功即可。
注:由于RedisTemplate<Object, Object> redisTemplate
都是obj类,存储到redis的key会被更改,如下;
- 新增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
-
在项目的web层的pom.xml文件中引入mq的依赖
<!-- rocketmq依赖 --> <dependency> <groupId>org.apache.rocketmq</groupId> <artifactId>rocketmq-client</artifactId> <version>4.4.0</version> </dependency>
-
配置mq生产者,将发送者注册成bean,供其他方法调用;
@Value("${rocket-mq.nameserver.addr}") private String nameserverAddr; @Value("${rocket-mq.topic}") private String topic;
注:两处的配置参数配置在nacos中,如下;
-
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()方法,填充对应的参数,就可以发送消息了。
-
定义消费者(接收者)
// 该注解加上以后,注册成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号"); }
-
新增消息监听
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; } }
-
启动项目,测试发送和消费消息;
请求接口,打印成功。
代码已上传;
链接:https://pan.baidu.com/s/19HA-5MVIEueNAMTo45cotg
提取码:l19c