当前位置: 首页 > news >正文

用国外服务器做网站百度关键词推广一年多少钱

用国外服务器做网站,百度关键词推广一年多少钱,长沙百度关键词搜索,付网站建设费目录 1、前言1.1、方法一1.2、方法二 2、方案二实战2.1、在netty服务里加上ws连接、中断事件2.2、在netty服务里加上消息服务 4、总结 使用Springboot netty 打造聊天服务系列文章 第一章 初始搭建工程 第二章 Nacos集群问题记录 1、前言 在使用Springboot Nacos Netty(Web…

目录

  • 1、前言
    • 1.1、方法一
    • 1.2、方法二
  • 2、方案二实战
    • 2.1、在netty服务里加上ws连接、中断事件
    • 2.2、在netty服务里加上消息服务
  • 4、总结


使用Springboot + netty 打造聊天服务系列文章
第一章 初始搭建工程
第二章 Nacos集群问题记录


1、前言

在使用Springboot + Nacos + Netty(WebSocket) 集群后,发现了一个问题。
在集群环境下, X用户已经连接上了集群中的A服务器,这时Y用户发送给X用户的消息在B服务器,那么此时的消息应该如何处理呢?
在这里插入图片描述

1.1、方法一

通过广播的模式,把消息发送到MQ(且带有netty的channelId),netty集群的服务都订阅这个MQ。
通过对比channelId,不存在channelId的丢弃消息不处理。存在channelId的服务,处理此消息,并通过channel把消息推送给X用户。
在这里插入图片描述

1.2、方法二

发消息时,去寻找对应用户X的channel。
1、从缓存里获取用户X对应的channelId等信息,首先判断是否在缓存里,如果没有即用户X不在线,用户X下次连接netty服务时,再去推送消息;
2、如果缓存里有,判断此channel是否在当前服务中,
首先判断当前服务里是否有用户X对应的channelId,如果有,直接通过channel发送消息给用户X;
3、如果没有,则去组装IP、端口,去调用此服务的消息服务去发送消息。
在这里插入图片描述

2、方案二实战

方案一非常简单,订阅MQ即可实现,网上案例大多基于此。
我们今天重点讲解方案二,在netty服务里,加入消息服务,后续通过匹配用户X的channel去发送消息;

2.1、在netty服务里加上ws连接、中断事件

在ws连接时,本地服务器加入channelId、channel的缓存;
同时把channelId、本机IP、本机端口放入redis缓存(供远程消息服务调用)。
在这里插入图片描述

2.2、在netty服务里加上消息服务

1、通过传递来的channelId,从缓存里找到对应的服务(IP、端口);
2、调用对应的消息服务(IP、端口加上消息服务的地址)
3、消息服务里,铜鼓
在这里插入图片描述
在这里插入图片描述


import cn.hutool.core.bean.BeanUtil;
import com.qhkj.nettychatserver.bean.domain.Message;
import com.qhkj.nettychatserver.bean.request.MessageRequest;
import com.qhkj.nettychatserver.config.NettyConfig;
import com.qhkj.nettychatserver.config.http.HttpResult;
import com.qhkj.nettychatserver.config.http.HttpResultGenerator;
import com.qhkj.nettychatserver.config.http.HttpStatusEnum;
import com.qhkj.nettychatserver.constant.Common;
import com.qhkj.nettychatserver.constant.NettyCommon;
import com.qhkj.nettychatserver.netty.NettyHandler;
import com.qhkj.nettychatserver.service.MessageService;
import com.qhkj.nettychatserver.util.RedisUtil;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import com.qhkj.nettychatserver.bean.request.NettyMesaage;
import com.qhkj.nettychatserver.service.NettyService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import com.alibaba.fastjson.JSON;
import io.netty.channel.Channel;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;@Slf4j
@Service("chat")
public class ChatNettyServiceImpl implements NettyService {@Resourceprivate MessageService messageService;@Resourceprivate NettyConfig nettyConfig;@Resourceprivate RedisUtil redisUtil;@Resourceprivate RestTemplate restTemplate;// 确定channel之后,发送消息private void nettyHandler(NettyMesaage message, Channel channel) {log.info("message-> channelId:{}  , nettyName: {}", channel.id(), nettyConfig.getNettyServerName());Date now = new Date();Message dbmsg = Message.builder().messageId(NettyCommon.getIdWorker().nextId()).createTime(now).modifyTime(now).build();BeanUtil.copyProperties(message, dbmsg, Common.options);boolean flag = messageService.insertOne(dbmsg);if (flag) {channel.writeAndFlush(new TextWebSocketFrame(JSON.toJSONString(HttpResultGenerator.success(nettyConfig.getNettyServerName()))));} else {channel.writeAndFlush(new TextWebSocketFrame(JSON.toJSONString(HttpResultGenerator.fail(HttpStatusEnum.INTERNAM_SERVER_ERROR.getCode(), nettyConfig.getNettyServerName() + ""))));}}@Overridepublic HttpResult nettyHandler(MessageRequest request) {NettyMesaage nettyMesaage = new MessageRequest();BeanUtil.copyProperties(request, nettyMesaage);String serverInfo = (String) redisUtil.get(request.getChannelId());if(StringUtils.isEmpty(serverInfo)) {log.info("用户不在线!");return HttpResultGenerator.success("用户不在线!");}Channel channel = NettyHandler.channelMap.get(request.getChannelId());// 本机与用户有连接if(null != channel) {this.nettyHandler(nettyMesaage, channel);} else {String url = "http://" + serverInfo + "/msg/send";HashMap jsonObject =  restTemplate.postForObject(url, request, HashMap.class);if( !jsonObject.get("code").equals(200) ) {log.info("消息发送失败!");return HttpResultGenerator.fail(HttpStatusEnum.SERVER_BUSY.getCode(),"消息发送失败");}}return HttpResultGenerator.success("消息发送成功!");}
}

4、总结

文章写完之后,发现第二种方法问题特别多,需要在用户上下线(ws连接、掉线、netty服务销毁等)时,使用缓存记录用户与服务器的关系。在消息发送给接收方时,从缓存里取出接收方服务器信息,通过接收方服务器通知接收方有新消息。

最后给出2张消息服务架构简图:
1、集群版
在这里插入图片描述

2、单机版
分析单机版,客户端和netty之间的压力是相当小,万人同时在线,人均每秒2条消息,所需带宽也仅仅接近2MB,对应的内存消耗也是非常之小,几乎也是毫无压力。理论上来说,netty单机,10MB带宽、100MB内存就可以支撑5万用户(当然还得维护在线用户channel池、写数据到消息队列等等消耗,支撑2万在线用户肯定是没问题)。

而与之配套的数据服务系统(获取数据、解析消息并存库等),就可以做成集群,分配更大内存、更多的机器,去支撑快速增长的用户。
在这里插入图片描述

http://www.yidumall.com/news/14359.html

相关文章:

  • 做图片的网站seo排名优化软件有用吗
  • 快看点自媒体平台注册账号入口seo搜索引擎优化哪家好
  • 租网站服务器一个月多少钱郑州专业seo哪家好
  • 注册网站会员需填写优化网站seo公司
  • 301转向 所有网站一起操作网络平台推广运营公司
  • 保定网络公司建设网站软文是什么意思
  • 物流运输做网站的素材seo百度关键词排名
  • 做网站公司 陕西渭南网络营销策划的基本原则是什么
  • 游戏建设网站seo服务套餐
  • 自学网站搭建外链吧
  • 临沂网站开发技术员怎么用网络推广
  • 网站报价表对比表怎么做数字营销服务商seo
  • 下载网站的服务器文件黄页引流推广网站
  • 深圳广告标识厂家安阳seo
  • 做网站植入广告赚钱合肥网络关键词排名
  • 一起做网店官方网站西安搜索引擎优化
  • 成都有哪些比较做网站比较好的网站seo优化是什么
  • 母婴类网站 网站建设方案书 备案余姚seo智能优化
  • 古典asp网站源码seo快速排名软件app
  • 百度上做网站需要钱吗今日头条荆州新闻
  • 网站关键词代码seo网上课程
  • 网站建设与管理电子教程360搜索引擎下载
  • 那个网站可以找人做设计希爱力
  • 环境保护部网站查询建设项目国内搜索引擎大全
  • 深圳网站做的好的公司品牌策划方案ppt
  • 做的好的ppt下载网站优化关键词排名推广
  • 网站优化柳州廊坊网站seo
  • 做旅行社网站多少钱seo教程优化
  • 哪些网站可以做国外生意企业培训课程有哪些
  • 关于做网站的问卷调查关键词的优化和推广