背景:
次の記事へ、記事では、ビジネスのデカップリングを達成するためのイベント機構のApplicationContextを使用すると、これが唯一のモノマーのアプリケーションで動作することができる方法について話しています。マイクロサービスアーキテクチャで非常に流行した瞬間に、私たちはビジネスのデカップリングを行うには、このプログラムを再利用したいが、そのような今人気のRabbitMQのように、より一般的なソリューションを完了するために、メッセージキューを使用することで、今、私たちも言及し、可能さではありませんRocketMQ、ActiveMQの、カフカ。
もちろん、我々はまた、それは問題ではないが、完了するために、Redisのキューを使用することができます。ただ、私自身のアリの雲は、Redisのための準備ができて、我々はそれを解決するためのRedisを使用しています。Redisのは、生産/消費パターンを提供し、モデルをパブリッシュ/サブスクライブ。消費者への唯一の消費者として、生産と消費のこれらのパターンのための1つ、ここで言及:例えば、ユーザーはSMSのヒントを送って登録。つまり、登録ユーザーがテキストメッセージを送信し、電子メールを送信し、私たちは、パブリッシュ・サブスクライブモードを使用しますが、単にチャンネルに加入する必要があると私たちの前の例は、多くの1つである、すべての加入者は、このチャネルのメッセージを受け取りますこれは消費します。そして、それを開始-
それは私たちが春のクラウドだと思うマイクロサービスに来るとき、私たちは今、何のサービスを、ビジネスの間の直接通話を切り離されていないので、我々は唯一の直接マイクロサービスアーキテクチャが行うことができます春のブートを使用しています。単に4つのモジュール、ユーザモジュール(hyfユーザ)に分割され、SMSモジュール(hyfメッセージ)、メッセージモジュール(hyfメール)、パブリッククラスモジュール(hyfカプセル化)。
起動します。
1は、プロジェクト構造は以下の通り:
2、なぜなら使用のRedisのは、我々は最初のRedisにその依存関係を導入する必要があります。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
3、およびapplication.propertiesに設定を記述します。
# redis服务端口
spring.redis.port=6379
# redis的服务地址
spring.redis.host=127.0.0.1
# 如果redis设置了密码这里也要配上
spring.redis.password=xxx
# 连接超时时间(毫秒)
spring.redis.timeout=10000
# Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0
spring.redis.database=0
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0
4.リリース情報:
サービスユーザーが直接指定されたチャンネルにメッセージを投稿することができ、デフォルトのStringRedisTemplateを呼び出すには
/**
* @author Howinfun
* @desc 用户Service
* @date 2019/5/13
*/
@Service
@Slf4j
@AllArgsConstructor
public class UserService {
private StringRedisTemplate stringRedisTemplate;
/**
* 用户注册
* @param user
*/
public void registerUser(User user){
log.info("用户:"+user.getName()+"注册成功");
// 给redis的channel中发布消息
String userInfo = JSON.toJSONString(user);
stringRedisTemplate.convertAndSend(UserConstants.USER_REGISTER,userInfo);
}
}
5、チャンネルを購読します:
1は、すべての抽象インタフェース情報の最初の消費者はほとんどトラブルを購読します:
public interface AbstractReceiver {
// 消费消息的方法
void receiveMessage(Object message);
}
2は、その後、送信テキストメッセージは、オーバーライドされたメソッド内で(メール共感を送信する)このインタフェースを実装するクラスを作成し、独自のビジネス・ロジックを実装する必要があります。
/**
* @author Howinfun
* @desc
* @date 2019/5/14
*/
@Component
public class MessageReceiver implements AbstractReceiver {
@Autowired
private MessageService messageService;
@Override
public void receiveMessage(Object message) {
User user = JSON.parseObject((String) message, User.class);
// 发送短信的业务逻辑
messageService.sendMessage(user);
}
}
3、その後、(同様にメールを送信)SMSの設定クラスにサブスクリプションを取得する必要があります:
/**
* @author Howinfun
* @desc
* @date 2019/5/14
*/
@Configuration
public class RedisConfig {
/**
* redis消息监听器容器
* 可以添加多个监听不同话题的redis监听器,只需要把消息监听器和相应的消息订阅处理器绑定,该消息监听器
* 通过反射技术调用消息订阅处理器的相关方法进行一些业务处理
* @param messageListener
* @return
*/
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter messageListener) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
//mailListener订阅了一个叫user:register 的通道
container.addMessageListener(messageListener, new PatternTopic(UserConstants.USER_REGISTER));
return container;
}
/**
* 消息监听器适配器,绑定消息处理器,利用反射技术调用消息处理器的业务方法
* @param receiver
* @return
*/
@Bean
MessageListenerAdapter messageListener(MessageReceiver receiver) {
//这个地方 是给messageListenerAdapter 传入一个消息接受的处理器,利用反射的方法调用“receiveMessage”
//MessageListenerAdapter提供的默认调用处理器的方法是handleMessage 可以自己到源码里面看
// 所以如果我们定义的方法不是这个,需要在构造函数这添加上
return new MessageListenerAdapter(receiver, "receiveMessage");
}
}
6、最終的に我々はそれをテストするためのプロジェクトを開始することができ、我々はすでに成功を見ることができます:
hyf-ユーザコンソール:
2019-05-15 09:55:16.493 INFO 13672 --- [nio-8080-exec-2] com.hyf.user.service.UserService : 用户:howinfun注册成功
2019-05-15 09:55:16.626 INFO 13672 --- [nio-8080-exec-2] io.lettuce.core.EpollProvider : Starting without optional epoll library
2019-05-15 09:55:16.627 INFO 13672 --- [nio-8080-exec-2] io.lettuce.core.KqueueProvider : Starting without optional kqueue library
hyfメッセージコンソール:
2019-05-15 09:55:17.422 INFO 8088 --- [ container-2] com.hyf.message.service.MessageService : 给用户howinfun发送短信,手机号码为:12345678900
hyfメールコンソール:
2019-05-15 09:55:17.422 INFO 15352 --- [ container-2] com.hyf.mail.service.MailService : 给用户howinfun发送邮件,EMail为:[email protected]
遂に
あまりにも膨大を望んでいないので、これだけコアコードを入れて、ビューのポイントを曇らせることができ、コードの詳細な知識が必要です:Redisのは、ビジネスのデカップリングソースが解決
Redisのはそれのこつ場合、それは何のことを意味しないだろう、一部の学生を求められることがあります私たちは、SMSや打ち上げメールを立ち上げてきましたか?答えは〜ハッハッハ、もちろん何もぶら下がっが送信されなかった権利です。しかし、この相関のために強い、いわゆる何もないではありません、あなたのSMSを登録していないことは、特に大きなものではありませんが、プロジェクトは、電気の供給者である発注や在庫が、強い一貫性を減らした場合、その後、その後、計画は何ですか、https://mp.weixin.qq.com/s/FAlv-qE1jjiiF0JPoMVcWAを参照しますか?