netty搭建游戲伺服器
Ⅰ 如何構建一個基於netty的後端伺服器
統一繼承ClientRequestModel,經過編碼統一轉化為domainMessage,交由disruptor來處理,其實oop里什麼繼承,實現,封裝思想,大部分都在圍繞一個東西在走,一句話,把看似各有稜角的東西如何轉化為共同的東西,求同存異啊
Ⅱ 如何構建一個基於netty的後端伺服器
最近在研究Netty來構建SOA架構,其中也包括了前端接入的HTTP/WebSocket方面的接入響應,而WebSocket方面的接入響應對於移動端的消息推送研發至關重要,這里就將在這塊研發時的非同步socket響應服務例子程序筆記記錄下來,系統總共分為4個處理類,即:
HttpRequestHandler -- HTTP請求處理類
TextWebSocketFrameHandler -- 對應Text消息的處理類
WebSocketServer -- 系統主類
WebSocketServerInitializer -- 服務主程序的初始化類
WebSocketServer 類代碼:
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
public final class WebSocketServer {
private int port = 0;
public WebSocketServer(int port) {
this.port = port;
}
public void run() throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new WebSocketServerInitializer())
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true);
System.out.println("WebsocketChatServer 啟動了");
// 綁定埠,開始接收進來的連接
ChannelFuture f = b.bind(port).sync();
// 等待伺服器 socket 關閉 。在這個例子中,這不會發生,但你可以優雅地關閉你的伺服器。
f.channel().closeFuture().sync();
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
System.out.println("WebsocketChatServer 關閉了");
}
}
Ⅲ 如何構建一個基於netty的後端伺服器
HttpRequestHandler -- HTTP請求處理類
TextWebSocketFrameHandler -- 對應Text消息的處理類
WebSocketServer -- 系統主類
WebSocketServerInitializer -- 服務主程序的初始化類
WebSocketServer 類代碼:
import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelOption;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
public final class WebSocketServer {
private int port = 0;
public WebSocketServer(int port) {
this.port = port;
}
public void run() throws Exception {
EventLoopGroup bossGroup = new NioEventLoopGroup();
EventLoopGroup workerGroup = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(bossGroup, workerGroup)
.channel(NioServerSocketChannel.class)
.childHandler(new WebSocketServerInitializer())
.option(ChannelOption.SO_BACKLOG, 128)
.childOption(ChannelOption.SO_KEEPALIVE, true);
System.out.println("WebsocketChatServer 啟動了");
// 綁定埠,開始接收進來的連接
ChannelFuture f = b.bind(port).sync();
// 等待伺服器 socket 關閉 。在這個例子中,這不會發生,但你可以優雅地關閉你的伺服器。
f.channel().closeFuture().sync();
} finally {
workerGroup.shutdownGracefully();
bossGroup.shutdownGracefully();
System.out.println("WebsocketChatServer 關閉了");
}
}
Ⅳ 基於Netty開發的游戲伺服器,是如何做到分布式管理呢
看你是什麼游戲了,不同的游戲其伺服器分布式的實現方式也不相同。
Ⅳ netty框架做游戲伺服器怎麼樣
如果你指的是單機的話,不說Netty會怎麼樣,伺服器都有可能直接崩潰掉,你的算一下,按平均每鏈接傳輸數據1K,100W鏈接大概數據量會在1G左右,G級伺服器網卡也受不了的,我們在網路編程中對單機來講,成功解決了C10K的問題,這種M級別的鏈接,可能暫時解決不了。對於如此大的並發,一般我們都是通過負載均衡的方式進行處理,如新浪微博,同時在線100W以上,通過約100多個節點處理,每個節點也就才10000並發左右。
Ⅵ 如何構建一個基於netty的後端伺服器
xml工具採用xstram來處理,兩個字,方便。
json工具採用jackson\不知道和業界出名的fastjson\gson\sf.json有何區別,待鑒定。
客戶端的請求,統一繼承ClientRequestModel,經過編碼統一轉化為domainMessage,交由disruptor來處理,其實oop里什麼繼承,實現,封裝思想,大部分都在圍繞一個東西在走,一句話,把看似各有稜角的東西如何轉化為共同的東西,求同存異啊(比如,水,石頭,空氣等,如果在這一層,我們沒法統一用一個特徵來表示,我們可以先把它轉化為分子,那是不是可以用同一個東西來表示呢?如何高度抽象封裝,這真是一門藝術)。
Ⅶ 如何構建一個基於netty的後端伺服器
public class HttpServerPipelineFactory implements ChannelPipelineFactory {
private ChannelUpstreamHandler channelUpstreamHandler;
public ChannelPipeline getPipeline() throws Exception {
// Create a default pipeline implementation.
ChannelPipeline pipeline = pipeline();
// Uncomment the following line if you want HTTPS
//SSLEngine engine = SecureChatSslContextFactory.getServerContext().createSSLEngine();
//engine.setUseClientMode(false);
//pipeline.addLast("ssl", new SslHandler(engine));
pipeline.addLast("decoder", new HttpRequestDecoder());
// Uncomment the following line if you don't want to handle HttpChunks.
pipeline.addLast("aggregator", new HttpChunkAggregator(1048576));
pipeline.addLast("encoder", new HttpResponseEncoder());
// Remove the following line if you don't want automatic content compression.
pipeline.addLast("deflater", new HttpContentCompressor());
//pipeline.addLast("handler", new HttpRequestHandler());
pipeline.addLast("handler", channelUpstreamHandler);
return pipeline;
}
public void setChannelUpstreamHandler(ChannelUpstreamHandler channelUpstreamHandler) {
this.channelUpstreamHandler = channelUpstreamHandler;
}
}
相關spring配置
Java代碼
<bean id="httpServerPipelineFactory" class="com.yunchao.cm.network.http.HttpServerPipelineFactory">
<property name="channelUpstreamHandler" ref="httpRequestHandler"/>
</bean>
Java代碼
<bean id="httpRequestHandler" class="com.yunchao.cm.network.http.HttpRequestHandler">
<property name="urlMaps">
<map>
<entry key="/payorder">
<ref bean="payOrderCodecFactory"/>
</entry>
<entry key="/question">
<ref bean="questionCodecFactory"/>
</entry>
<entry key="/sms">
<ref bean="smsCodecFactory"/>
</entry>
代碼太多,不全部貼出來,後面整理一下放到我的github上去。
基如此,我們還是得定義一個handler,繼承simpleChannelUpstreamHander,並重寫了messageReceied方法,具體在這里。
Java代碼
QueryStringDecoder queryStringDecoder = new QueryStringDecoder(request.getUri());
String url = queryStringDecoder.getPath();
CodecFactory codecFactory = urlMaps.get(url);
if (null == codecFactory) {
logger.error("unsupported url:{} request.", url);
//sendError(ctx, BAD_REQUEST);
e.getChannel().close();
return;
}
//獲取cmwap網路中的手機號碼
String phone = PhoneUtils.getPhone(request.getHeader("x-up-calling-line-id"));
if (request.getMethod().equals(HttpMethod.POST)) {
ChannelBuffer content = request.getContent();
String postParams = content.toString(CharsetUtil.UTF_8);
logger.debug("request content:{}", postParams);
ClientRequestModel model = (ClientRequestModel) codecFactory.decode(postParams);
model.setProperty(model.MESSAGE_EVENT_KEY, e);
model.setProperty(model.HTTP_REQUEST_KEY, request);
model.setProperty(model.HTTP_PHONE_KEY, phone);
InetSocketAddress remoteAddress = (InetSocketAddress) e.getRemoteAddress();
model.setProperty(model.IP_KEY, remoteAddress.getAddress().getHostAddress());
logger.info("user request model:{}", model);
model.fireSelf();
Java代碼
@Override
public DomainMessage fireSelf() {
DomainMessage em = new DomainMessage(this);
EventUtils.fireEvent(em, "alipayNotifyState");
return em;
}
看到這里基本上能夠清楚了,是如何把客戶端請求包裝成ClientRequestModel了,且後面涉及到處理的對象,全部繼承它,在整個架構之
中,has a 優於 is
a,對於客戶端netty的一些對象,也是存儲在ClientRequestModel中,codec無非也是採用了xml/json/kv,如斯,實現
了位元組與對象之間的轉換。
除
此之外,突然想到剛來杭州工作的第一家公司,基於此,採用的架構師servlet充當伺服器,因為這是一個公司內部的server,而不是一個平台,採用
的數據格式也比較單一,就是xml,但是採用的外部類庫也是xstream來處理的,但是整個系統維持的日調用量也是在百萬級別,運用的client則是
採用httpclient,對於不同請求後面掛的handler,是在容器啟動時載入到內存中,其餘也沒有什麼亮點了。
Ⅷ 如何構建一個基於netty的後端伺服器
Netty服務端創建
當我們直接使用JDK NIO的類庫開發基於NIO的非同步服務端時,需要使用到多路復用器Selector、ServerSocketChannel、SocketChannel、ByteBuffer、SelectionKey等等,相比於傳統的BIO開發,NIO的開發要復雜很多,開發出穩定、高性能的非同步通信框架,一直是個難題。
Netty為了向使用者屏蔽NIO通信的底層細節,在和用戶交互的邊界做了封裝,目的就是為了減少用戶開發工作量,降低開發難度。ServerBootstrap是Socket服務端的啟動輔助類,用戶通過ServerBootstrap可以方便的創建Netty的服務端。
Ⅸ 如何構建一個基於netty的後端伺服器
最近在研究Netty來構建SOA架構,其中也包括了前端接入的HTTP/WebSocket方面的接入響應,而WebSocket方面的接入響應對於移動端的消息推送研發至關重要,這里就將在這塊研發時的非同步socket響應服務例子程序筆記記錄下來,系統總共分為4個處理類,...