項目2---十次方項目開發---後臺--mq---05

es分爲站內搜索和瀏覽器搜索,一般是logstash,但是要是實時的更新就要用到了mq發消息進行更新。

倒排索引,一個詞條對應一個文檔。

es是被優化的。

es可以實時但是solr是不能實時的,任意阻塞。

其實用的最多的還是這兩個:

redis是緩存數據庫。

mongodb是非關係數據庫最像數據庫的。

接口安全:cookie和session能對應上。

logstash:吃資源的。

----------------------------------------------------01-----------------------------------------------

內容介紹無用。

----------------------------------------------------02-----------------------------------------------

使用場景:異步處理 應用解耦  流量削峯  消息通信

----------------------------------------------------------------------------03-------------------------------------------------------------------------------------

--------------------------------------------------------------------------------04----------------------------------------------------------------------------------

win的安裝。直接忽略。

--------------------------------------------------------------------------------05----------------------------------------------------------------------------------

docker安裝部署rabbitmq。

docker run -di --name=tensquare_rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 15671:15671 -p 15672:15672 -p 25672:25672 rabbitmq:management

訪問:http://192.168.244.136:15672/  用戶密碼:guest

--------------------------------------------------------------------------------06----------------------------------------------------------------------------------

Driect模式:

第一步:創建隊列:

第二步:創建模塊

第三步:導包

 <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
    </dependencies>

第四步:配置yml

server:
  port: 8099
spring:
  rabbitmq:
    host: 192.168.244.136

第五步:寫啓動類

第六步:寫測試的生產者。

測試類

消息的生產者:

@Test
    public void sendMsg(){
        rabbitTemplate.convertAndSend("itcast","test直接模式");
    }

消息的消費者:


@SpringBootApplication
@EnableRabbit
public class RabbitmqApplication {

    public static void main(String[] args) {
        SpringApplication.run(RabbitmqApplication.class,args);
    }
}

消費一次都消費完畢,不管是插入了幾條。監聽直接消費。

我插入了三條數據消費者一次就消費完畢了,厲害了。目前我只有一個消費者。

---

三個人等着拿消息, 本身有負載均衡的。輪流拿。

實驗1的做法:直連模式三個都是。

實驗2的做法,消息隊列加入多個消息。

和實驗1是一樣的。

--------------------------------------------------------------------------------07----------------------------------------------------------------------------------

Fanout模式:

分裂模式:消息發給交換器,交換器綁定我的rountingKey。

第一步:搭架子,多個隊列。

往交換器發消息,就往三個綁定的隊列裏面發送,業務場景就是一個消息發送短信,郵件,微信。

第二步:測試

 /**
     * 分裂模式,使用交換機
     */
    @Test
    public void sendMsg2(){
        rabbitTemplate.convertAndSend("chuanzhi","","分裂模式消息");
    }

監控就是監控隊列。主題是分列模式的加強版。

--------------------------------------------------------------------------------08----------------------------------------------------------------------------------

主題模式:匹配規則.就是直接和分列的結合。

 /**
     * 主題模式
     */
    @Test
    public void sendMsg3(){
        rabbitTemplate.convertAndSend("topic84","good.abc","主題模式消息2");
    }

測試:第一步:

第二步:

 /**
     * 主題模式
     */
    @Test
    public void sendMsg3(){
        rabbitTemplate.convertAndSend("topic84","good.abc","主題模式消息2");
    }

術語解釋:

交換機的類型。

隊列的key。

--------------------------------------------------------------------------------09----------10------------------------------------------------------------------------

普通用戶和後臺用戶的區別:

--------------------------------------------------------------------------------11------------------------------------------------------------------------

新建模塊:

--------------------------------------------------------------------------------12------------------------------------------------------------------------

redist用於驗證。

mq用於發送消息。

註冊的手機驗證碼:

第一步:

	/**
	 * 發送短信驗證碼
	 * @return
	 */
	@PostMapping("/sendsms/{mobile}")
	public Result sendSms(@PathVariable String mobile){
		userService.sendSms(mobile);
		return new Result(true,StatusCode.OK,"發送成功");

	}

第二步:

導入long3的包。

  <dependency>
		  <groupId>org.apache.commons</groupId>
		  <artifactId>commons-lang3</artifactId>
		  <version>3.9</version>
	  </dependency>
public void sendSms(String mobile) {
		//生成六位隨機數字
		String code = RandomStringUtils.randomNumeric(6);
		//向緩存中放一份
		redisTemplate.opsForValue().set("tensquare_checkCode_"+mobile,code,6, TimeUnit.MINUTES);
		Map<String,String>map=new HashMap<>();
		map.put("mobile",mobile);
		map.put("checkcode",code);
		//給用戶發一份
		rabbitTemplate.convertAndSend("sms",map);

		//在控制檯顯示一份
		System.out.println("驗證碼爲"+code);
	}

第三步:加redis

    <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

第四步:導入mq的包

第五步:測試:

localhost:9007/user/sendsms/15854132997

--------------------------------------------------------------------------------13------------------------------------------------------------------------

註冊:

第一步:

	/**
	 * 驗證碼
	 * @param mobile
	 */
	public void sendSms(String mobile) {
		//生成六位隨機數字驗證碼
		String code = RandomStringUtils.randomNumeric(6);
		//向緩存中放一份 判斷填的對不對的 指定刪除時間6小時
		redisTemplate.opsForValue().set("tensquare_checkCode_"+mobile,code,6, TimeUnit.HOURS);
		Map<String,String>map=new HashMap<>();
		map.put("mobile",mobile);
		map.put("checkcode",code);
		//給用戶發一份 不需要等 直接的模式發送的 消息隊列裏面的數據直接發送給了運營商。
		rabbitTemplate.convertAndSend("sms",map);
		//在控制檯顯示一份
		System.out.println("驗證碼爲"+code);
	}

第二步:

完善基本信息

	/**
	 * 增加
	 * @param user
	 */
	public void add(User user) {
		user.setId( idWorker.nextId()+"" );
		//密碼加密
		user.setPassword(user.getPassword());
		user.setFollowcount(0);//關注數
		user.setFanscount(0);//粉絲數
		user.setOnline(0L);//在線時長//
		user.setRegdate(new Date());//註冊日期
		user.setUpdatedate(new Date());//更新日期
		user.setLastdate(new Date());//最後登陸日期
		userDao.save(user);
	}

--------------------------------------------------------------------------------14------------------------------------------------------------------------

消費者環境的搭建:

第一步:新建模塊。導包。

只發短信。

第二步:yml

server:
  port: 9008
spring:
  application:
    name: tensquare-sms
  rabbitmq:
    host: 192.168.244.136

第三步:

步驟i的詳解:驗證碼發送的消息隊列,馬上就消費掉髮送給運營商。

@Component
@RabbitListener(queues = "sms")
public class SmsListener {

//    @Autowired
//    private SmsUtil smsUtil;

//    @Value("${aliyun.sms.template_code}")
//    private String template_code;
//
//    @Value("${aliyun.sms.sign_name}")
    private String sign_name;
    @RabbitHandler
    public void executeSms(Map<String,String> map){
        String mobile=map.get("mobile");
        String checkcode=map.get("checkcode");
        System.out.println("手機號"+map.get("mobile"));
        System.out.println("驗證碼"+map.get("checkcode"));
//        try {
//            smsUtil.sendSms(mobile,template_code,sign_name,"{\"code\":\""+checkcode+"\"}");
//        } catch (ClientException e) {
//            e.printStackTrace();
//        }
    }
}

--------------------------------------------------------------------------------15------------------------------------------------------------------------

短信服務:

第一步:充值,獲得用戶的AccessKey

第二步:下載代碼(舊版),導入阿里雲的包。

第四步:寫代碼。改yml。

第五步:寫監聽器。

流程:輸入電話號點擊確定,發送驗證碼,一個存redis,一個存消息隊列,消息消費者馬上監聽消費,調用阿里短信,給這個手機號發送短信,註冊,短信的code和redis的code比對即可。

	@PostMapping("/register/{code}")
	public Result register(@PathVariable String code,@RequestBody User user){
		//得到緩存中的驗證碼
		String checkcodeRedis=(String)redisTemplate.opsForValue().get("tensquare_checkCode_"+user.getMobile());
		if(StringUtils.isEmpty(checkcodeRedis)){
			return new Result(false,StatusCode.ERROR,"請先獲取手機驗證碼");
		}
		if(!checkcodeRedis.equals(code)){
			return new Result(false,StatusCode.ERROR,"請輸入正確的驗證碼");
		}
		userService.add(user);
		return new Result(true,StatusCode.OK,"註冊成功");
	}

註冊的完整代碼。

--------------------------------------------------------------------------------16-------17-----------------------------------------------------------------

發佈了304 篇原創文章 · 獲贊 11 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章