老司机午夜精品视频播放-老司机午夜精品视频观看-老司机午夜精品视频在线观看免费-老司机午夜精品网站在线观看-亚洲综合精品成人-亚洲综合精品成人啪啪

您所在的位置:主頁 > 短信動態 >

短信微服務設計(springcloud全家桶都有哪些)

2021-12-13 11:44

二.RabbitMQ的模式

1.直接模式:

直接模式(Direct):消息隊列中數據,只能有唯一消費者消費。[短信微服務設計(springcloud全家桶都有哪些)]。

**rabbitMQ自帶的Exchange:“”,直接模式不需要創建

**“RouteKey”,可以簡單的理解為要發送到的隊列名字

1、在RabbitMQ服務器根據情況手動創建交換器/隊列,完成交換器跟隊列綁定

2、編寫生產者代碼-測試-在管理頁面中查詢隊列中數據

3、編寫消費者代碼-測試-監聽到隊列中數據

生產者:

生產消息:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = RabbitMQApplication.class)
public class DirectProductTest {
 
 @Autowired
 private RabbitTemplate rabbitTemplate;
 
 @Test
 public void testsend(){
 
 rabbitTemplate.convertAndSend("itcast-queue-1","收到紅包了嗎");
 
 }
 
}

消費者:

編寫啟動類

編寫監聽類:

@Component
@RabbitListener(queues = "itcast-queue-1")//指定監聽哪個隊列
public class ConsumerDirectListner {
 
 //處理數據業務方法 方法參數跟生產者發送數據類型一致
 @RabbitHandler
 public void getMsg(String msg){
 System.out.println("從itcast-queue-1獲取到數據:"+msg);
 }
 
}

2.分裂模式Fanout

任何發送到Fanout Exchange的消息都會被轉發到與該Exchange綁定(Binding)的所有Queue上。

1.可以理解為路由表的模式

2.這種模式不需要RouteKey

3.這種模式需要提前將Exchange與Queue進行綁定,一個Exchange可以綁定多個Queue,一個Queue可以同多個Exchange進行綁定。

4.如果接受到消息的Exchange沒有與任何Queue綁定,則消息會被拋棄。

綁定后的結果

代碼:

 @Autowired
 private RabbitTemplate rabbitTemplate;
 
 @Test
 public void testsend(){
 
// rabbitTemplate.convertAndSend("itcast-queue-1","收到紅包了嗎");
 User user = new User();
 user.setId("1");
 user.setTelephone("123456");
 user.setEmail("itcast@qq.com");
 rabbitTemplate.convertAndSend("exange-ab","",user);
 }

消費者:

@Component

@RabbitListener(queues = "itcast-queue-a")//指定監聽哪個隊列

public class ConsumerDirectListnerA {

 

//處理數據業務方法 方法參數跟生產者發送數據類型一致

@RabbitHandler

public void getMsg(User user){

System.out.println("從itcast-queue-a獲取到數據:"+user.getTelephone());

}

 

}

b同樣

效果圖

3.主題模式Topic

任何發送到Topic Exchange的消息都會被轉發到所有關心RouteKey中指定話題的Queue上如上圖所示

創建隊列和交換器:

1.創建隊列

2.創建交換器

3.設置路由綁定

生產者:

rabbitTemplate.convertAndSend("exange-xyz","user.abc","這是user.abc的信息");
 rabbitTemplate.convertAndSend("exange-xyz","user.log","這是user.log的信息");
 rabbitTemplate.convertAndSend("exange-xyz","login.log","這是login.log的信息");

消費者:

@Component

@RabbitListener(queues = "itcast-queue-x")//指定監聽哪個隊列

public class ConsumerDirectListnerX {

 

//處理數據業務方法 方法參數跟生產者發送數據類型一致

@RabbitHandler

public void getMsg(String msg){

System.out.println("從itcast-queue-x獲取到數據:"+msg);

}

 

}

zy同樣

結果:

三.用戶微服務

需求分析:

通過這個實現,消息的生產者,生成驗證碼,存入到redis中并發送到rabbitMQ中

實現步驟:

1.首先我們在userService中是添加一個方法,用于發送消息

代碼:

@Autowired
	private RabbitTemplate rabbitTemplate;
	@Autowired
	private RedisTemplate redisTemplate;
 
	/**
	 * 發送驗證碼
	 */
	public void sendSms(String mobile){
		//TODO 生成驗證碼
		String checkcode = RandomStringUtils.randomNumeric(4);
		//輸出
		System.out.println("驗證碼為:"+checkcode);
		//使用阿里云發送短信
		Map<String ,String> map = new HashMap<>();
		map.put("mobile",mobile);
		map.put("templateCode","SMS_23423423");
		//根據短信模板中的參數進行
		Map<String,String> 	mapParams = new HashMap<>();
		mapParams.put("code",checkcode);
		//根據短信的動態參數,進行解析
		String templateJsonParse = JSON.toJSONString(mapParams);
		map.put("templateJsonParse",templateJsonParse);
		rabbitTemplate.convertAndSend("","itcast-sms",map);
		//將redis存儲5分鐘
		redisTemplate.opsForValue().set(mobile,checkcode,5, TimeUnit.MINUTES);
 
	}

編寫用戶的注冊開發:

service層

/**
	 * 用戶的注冊
	 */
	public void register(User user,String code){
		//首先我們判斷驗證碼是否正確
		String checkCode = (String) redisTemplate.opsForValue().get(user.getMobile());
		//判斷是否為空
		if (checkCode==null){
			throw new RuntimeException("驗證碼未發送或者已過期");
		}
		//判斷輸入的驗證碼是否與redis中驗證碼相同
		if (!code.equals(checkCode)){
			throw new RuntimeException("驗證碼填寫不正確");
		}
		user.setId(idWorker.nextId()+"");//主鍵值 
		user.setFanscount(0);//粉絲數 
		user.setFollowcount(0);//關注數 
		user.setOnline(0L);//在線時長 
		user.setRegdate(new Date());//注冊日期 
		user.setUpdatedate(new Date());//更新日期 
		userDao.save(user);
 
	}

controller層:

/**

* 發送驗證碼

*/

@PostMapping("/sendsms/{mobile}")

public Result sendSms(@PathVariable String mobile){

userService.sendSms(mobile);

return new Result(true,StatusCode.OK,"發送驗證碼成功");

}

/**

* 用戶的注冊

*/

@PostMapping("/register/{code}")

public Result register(@PathVariable String code,@RequestBody User user){

userService.register(user,code);

return new Result(true,StatusCode.OK,"注冊成功");

}

四.短信微服務開發

需求分析:

我們通過rabbitmq中提取消息,然后調用阿里大魚短信接口,這里主要是消息的消費者

步驟:

1.創建tensquare_sms微服務工程,導入阿里云的依賴

2.編寫配置文件,以及啟動類

3.編寫監聽類

@Component
@RabbitListener(queues = "itcast-sms")
public class SmsListener {
 @Autowired
 private SmsUtil smsUtil;
 /**
 * 發送短信
 */
 @RabbitHandler
 public void sendSms(Map<String,String> message){
 try {
 //System.out.println("手機號:"+message.get("mobile"));
 //System.out.println("驗證碼:"+message.get("code"));
 String mobile = message.get("mobile");
 String templateJsonParse = message.get("templateJsonParse");
 String templateCode = message.get("templateCode");
 System.out.println(mobile+" "+templateJsonParse+" "+ templateCode);
 SendSmsResponse sendSmsResponse = smsUtil.sendSms(mobile, templateCode, templateJsonParse);
 System.out.println(sendSmsResponse.getMessage());
 } catch (ClientException e) {
 e.printStackTrace();
 }
 }
 
}

sms工具類

package com.tensquare.sms.util;
 
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.SendSmsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
 
/**
 * @program: tensquare-72
 * @description:
 **/
@Component
public class SmsUtil {
 
 @Value("${aliyun.config.accessKeyId}")
 private String accessKeyId;
 @Value("${aliyun.config.accessKeySecret}")
 private String accessKeySecret;
 @Value("${aliyun.config.signName}")
 private String signName;
 
 //產品名稱:云通信短信API產品,開發者無需替換
 static final String product = "Dysmsapi";
 //產品域名,開發者無需替換
 static final String domain = "dysmsapi.aliyuncs.com";
 
 /**
 * 發送短信工具方法
 *
 * @return
 * @throws ClientException
 */
 public SendSmsResponse sendSms(String tel, String tempalteCode, String templateParamsJson) throws ClientException {
 SendSmsResponse sendSmsResponse = null;
 
 //可自助調整超時時間
 System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
 System.setProperty("sun.net.client.defaultReadTimeout", "10000");
 
 //初始化acsClient,暫不支持region化
 IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessKeyId, accessKeySecret);
 DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", product, domain);
 IAcsClient acsClient = new DefaultAcsClient(profile);
 
 //組裝請求對象-具體描述見控制臺-文檔部分內容
 SendSmsRequest request = new SendSmsRequest();
 //TODO 必填:待發送手機號
 request.setPhoneNumbers(tel);
 //必填:短信簽名-可在短信控制臺中找到
 request.setSignName(signName);
 //TODO 必填:短信模板-可在短信控制臺中找到
 request.setTemplateCode(tempalteCode);
 //TODO 可選:模板中的變量替換JSON串,如模板內容為"親愛的${name},您的驗證碼為${code}"時,此處的值為
 request.setTemplateParam(templateParamsJson);
 
 //選填-上行短信擴展碼(無特殊需求用戶請忽略此字段)
 //request.setSmsUpExtendCode("90997");
 
 //可選:outId為提供給業務方擴展字段,最終在短信回執消息中將此值帶回給調用者
 request.setOutId("yourOutId");
 
 //hint 此處可能會拋出異常,注意catch
 sendSmsResponse = acsClient.getAcsResponse(request);
 System.out.println(sendSmsResponse.getMessage());
 return sendSmsResponse;
 }
}



圖片展示

Copyright ? 2007-2020 萬商超信短信群發平臺  版權所有 Power by 備案號:粵ICP備20066710號-9

網站地圖 導航地圖