Java從單體到微服務打造房產銷售平臺

概述

最近在學習某課的《Java從單體到微服務打造房產銷售平臺》,也算是我學習的第一門微服務課程,在此開貼記錄一下知識點,若有不當請多指教!nginx

Spring Mail發送激活連接

功能實現:在註冊用戶時經過spring mail發送激活連接到用戶的郵箱,在有效期內用戶點擊連接後更新用戶狀態爲激活狀態。redis

引入spring-mail依賴spring

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

配置appliacation.properties文件數據庫

#用來發送郵件
domain.name=127.0.0.1:8090
#spring-mail
spring.mail.host=smtp.163.com  #163郵箱
spring.mail.username=chenwuguii@163.com 
spring.mail.password=czy123456  #163郵箱受權碼
spring.mail.properties.mail.smtp.auth=truehouse
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true

MailService瀏覽器

@Service
public class MailService {

    @Autowired
    private JavaMailSender mailSender;

    @Value("${spring.mail.username}")
    private String from;


    @Value("${domain.name}")
    private String domainName;

    @Autowired
    private UserMapper userMapper;

    //緩存key-email鍵值對,當超過15分鐘有效期後,若用戶還未激活則從數據庫刪除用戶信息
    private final Cache<String, String> registerCache =
            CacheBuilder.newBuilder().maximumSize(100).expireAfterAccess(15, TimeUnit.MINUTES)
                    .removalListener(new RemovalListener<String, String>() {

                        @Override
                        public void onRemoval(RemovalNotification<String, String> notification) {
                            String email = notification.getValue();
                            User user = new User();
                            user.setEmail(email);
                            List<User> targetUser = userMapper.selectUsersByQuery(user);
                            if (!targetUser.isEmpty() && Objects.equal(targetUser.get(0).getEnable(), 0)) {
                                userMapper.delete(email);// 代碼優化: 在刪除前首先判斷用戶是否已經被激活,對於未激活的用戶進行移除操做
                            }
                        }
                    }).build();


    /**
     * 發送郵件
     */
    @Async
    public void sendMail(String title, String url, String email) {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom(from);//發送方郵箱
        message.setSubject(title);//標題
        message.setTo(email);//接收方郵箱
        message.setText(url);//內容
        mailSender.send(message);
    }

    /**
     * 1.緩存key-email的關係
     * 2.藉助spring mail 發送郵件
     * 3.藉助異步框架進行異步操做
     *
     * @param email
     */
    @Async
    public void registerNotify(String email) {
        String randomKey = RandomStringUtils.randomAlphabetic(10);
        registerCache.put(randomKey, email);
        String url = "http://" + domainName + "/accounts/verify?key=" + randomKey;
        //發送郵件
        sendMail("房產平臺激活郵件", url, email);
    }
}

Nginx代理

前提:當用戶上傳圖片時,咱們在數據庫存放的是相對地址,而後保存圖片到本地,在瀏覽器須要展現圖片時咱們取出相對路徑後拼接上前綴路徑,這裏咱們使用nginx代理咱們圖片的存放位置緩存

配置application.properties文件服務器

#本地存放的文件路徑,對應nginx.conf裏alias對應目錄(D:\user\images)
file.path=/user/images/
#靜態資源地址前綴(若本地安裝了nginx服務器,開啓以下配置)
file.prefix=http://127.0.0.1:8081/images

配置nginx.conf文件app

server {
        listen       8081;//監聽8081端口
        server_name  localhost;
        charset utf-8;
        //代理   
        location /images {
            alias /user/images/;
            expires 1d;
        }

這樣配置的話,當nginx監聽到http://localhost:8081/images的路徑時,會代理到http://lcoalhost:8081/user/images下,也就是D:\user\images目錄下去尋找圖片。框架

Redis存儲熱點數據

在展現房源信息時咱們須要顯示熱點房源,這裏咱們使用redis的有序集合實現熱門房源的存儲,用戶查看房源詳情在redis對熱度加1dom

Redis Zincrby 命令對有序集合中指定成員的分數加上增量 increment
Redis Zremrangebyrank 命令用於移除有序集中,指定排名(rank)區間內的全部成員。
Redis Zrevrange 命令返回有序集中,指定區間內的成員。其中成員的位置按分數值遞減(從大到小)來排列

RecommendService

@Service
public class RecommendService {

    private static final String HOT_HOUSE_KEY = "hot_house";

    @Autowired
    private HouseService houseService;

    /**
     * 房產熱度+1
     * 原理:在redis建立有序集合存放熱點房產id
     */
    public void increase(Long id) {
        try {
            Jedis jedis = new Jedis("127.0.0.1");
            jedis.auth("123");
            //對redis有序集合中指定id的分數加上1
            jedis.zincrby(HOT_HOUSE_KEY, 1.0D, id + "");
            //0表明第一個元素,-1表明最後一個元素,由於要保留熱度最高的10位,因此刪除第1位到倒數第11位的元素,剩下10位熱度最高的
            jedis.zremrangeByRank(HOT_HOUSE_KEY, 0, -11);
            jedis.close();
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
        }

    }

    //返回熱點房產id
    public List<Long> getHot() {
        try {
            Jedis jedis = new Jedis("127.0.0.1");
            jedis.auth("123");
            //按從高到低排序取出全部元素  z + reverse + range
            Set<String> idSet = jedis.zrevrange(HOT_HOUSE_KEY, 0, -1);
            jedis.close();
            //Set<String>轉換成List<Long>
            List<Long> ids = idSet.stream().map(Long::parseLong).collect(Collectors.toList());
            return ids;
        } catch (Exception e) {
            logger.error(e.getMessage(), e);
            return Lists.newArrayList();
        }

    }

    /**
     * 獲取熱點房產
     */
    public List<House> getHotHouse(Integer size) {//size爲須要顯示的熱點房產數
        House query = new House();
        //獲取熱點房產id集合
        List<Long> list = getHot();
        list = list.subList(0, Math.min(list.size(), size));
        if (list.isEmpty()) {
            return Lists.newArrayList();
        }
        query.setIds(list);
        final List<Long> order = list;
        //根據id集合查詢房產集合
        List<House> houses = houseService.queryAndSetImg(query, PageParams.build(size, 1));
        //由於上面會打亂順序,因此使用Ordering類讓houses根據在order中的id順序從新進行排序
        Ordering<House> houseSort = Ordering.natural().onResultOf(hs -> order.indexOf(hs.getId()));
        return houseSort.sortedCopy(houses);
    }
相關文章
相關標籤/搜索