package com.demo.netty;

import org.junit.Before;
import org.junit.Test;

import io.netty.bootstrap.Bootstrap;
import io.netty.buffer.Unpooled;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.serialization.ClassResolver;
import io.netty.handler.codec.serialization.ClassResolvers;
import io.netty.handler.codec.serialization.ObjectDecoder;
import io.netty.handler.codec.serialization.ObjectEncoder;

public class Client {
private int port;
@Before
public void init() {
this.port=8088;
}
@Test
public void run() throws Exception {
NioEventLoopGroup boosAndWorkerGroup = new NioEventLoopGroup();
Bootstrap bootstrap = new Bootstrap();
bootstrap.group(boosAndWorkerGroup).channel(NioSocketChannel.class).option(ChannelOption.SO_KEEPALIVE, true)
.handler(new ChannelInitializer<SocketChannel>() {

@Override
protected void initChannel(SocketChannel ch) throws Exception {
//设置读取的字节大小为1kb也就是1024字节,同时禁止缓存类加载器
ch.pipeline().addLast(new ObjectDecoder(1024,ClassResolvers.cacheDisabled(this.getClass().getClassLoader())));
ch.pipeline().addLast(new ObjectEncoder());
ch.pipeline().addLast(new ClientHandler());

}
});
ChannelFuture sync = bootstrap.connect("127.0.0.1", port).sync();
sync.channel().closeFuture().sync();
}

}

package com.demo.netty;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;
import io.netty.util.ReferenceCountUtil;

public class ClientHandler extends ChannelHandlerAdapter{

@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
System.out.println(msg.toString());
}
public void channelActive(ChannelHandlerContext ctx) throws Exception {
//连接服务器后自动发出
Person person = new Person();
person.setName("客户端");
person.setAge(1);
ctx.writeAndFlush(person);
}
}

package com.demo.netty;

import org.junit.Before;
import org.junit.Test;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandler;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelOption;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.serialization.ClassResolver;
import io.netty.handler.codec.serialization.ClassResolvers;
import io.netty.handler.codec.serialization.ObjectDecoder;
import io.netty.handler.codec.serialization.ObjectEncoder;

public class Server {
private int port;

@Before
public void init() {
this.port = 8088;
}

@Test
public void run() throws Exception {
NioEventLoopGroup boosGroup = new NioEventLoopGroup();
NioEventLoopGroup workerGroup = new NioEventLoopGroup();
ServerBootstrap serverBootstrap = new ServerBootstrap();
serverBootstrap.group(boosGroup, workerGroup).channel(NioServerSocketChannel.class)
.option(ChannelOption.SO_BACKLOG, 1024).option(ChannelOption.SO_SNDBUF, 1024).option(ChannelOption.SO_RCVBUF, 1024).childOption(ChannelOption.SO_KEEPALIVE, true).childHandler(new ChannelInitializer<SocketChannel>() {

@Override
protected void initChannel(SocketChannel ch) throws Exception {
//发送pojo一定要调用解码处理器再调用编码处理器,这里编码处理器的参数的意思是,接收1m大小的字节,同时对类加载器进行缓存,当虚拟机缓存不足时,会自动释放缓存,为了防止异常码流和解码错位而导致的内存溢出
ch.pipeline().addLast(new ObjectDecoder(1024*1024,ClassResolvers.weakCachingConcurrentResolver(this.getClass().getClassLoader())));
ch.pipeline().addLast(new ObjectEncoder());
ch.pipeline().addLast(new ServerHandler());
}
});
ChannelFuture sync = serverBootstrap.bind(port).sync();
//对Server端进行阻塞,等待服务端监听端口关闭后,主线程才退出
sync.channel().closeFuture().sync();
}
}

package com.demo.netty;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerAdapter;
import io.netty.channel.ChannelHandlerContext;

public class ServerHandler extends ChannelHandlerAdapter {
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
Person per = (Person)msg;
System.out.println(per.toString());
Person person = new Person();
person.setName("服务端");
person.setAge(1);
ctx.writeAndFlush(person);
}
}

Zookeeper是一个开源的集群管理服务,虽然它本质上只提供两个功能,存储客户端发来的数据并将其以树形结构进行存储,还有对保存数据节点的监听,但是我们可以靠代码设计来通过这两个
功能来解决一系列的问题;
Zookeeper典型应用场景:
配置管理
集群管理
发布与订阅
数据库切换
分布式日志的收集
分布式锁,队列管理等等

Zookeeper数据类型与结构:
Zookeeper的所存储的数据结构我们成为Znode,它是通过路劲进行引用也就是/开头,顶层节点就是/,并且它兼具文件和目录两种特点,既可以保存数据,源信息,ACL,时间戳等数据结构,
又像目录一样可以作为路劲标识的一部分,每一个节点都是Znode,每个持久节点都可以拥有子节点(临时节点不能拥有),Znode由三个部分组成:
stat:此为状态信息描述该Znode的版本,权限等信息;
data:与该Znode关联的数据;
children:该节点下的子节点;
Zookeeper本质上数据类型只有两种,持久节点和临时节点,但因为它们都各自有另一种生成方式,也就是带有序列号的持久节点和临时节点,所以变成了4种(序列号的生成由
Zookeeper根据保存数据时事务成功时的顺序进行递增),同时每个节点又因为保存着版本号而拥有着不同的数据;

Zookeeper集群选举原理
Zookeeper集群分为三种角色,主(Leader),从(follower),obServer(Learner,很少用到,就是复制客户端的数据,只负责读,不需要leader主动分发任务,并且也不参与选举)
首先,要组成Zookeeper必须要三台或以上的服务器,第一台开机后,首先给自己投票,之后判断是否有其它机器,没有就进入Looking状态,如果有就发给其它服务器反馈信息让它们给自己投票;
第二台同理,只有到第三台的时候,才会使用选举算法根据服务器ID,越大投票分量越重(也就是我们在创建集群是,在zookeeper保存数据的地方新建一个myid的文件并存储值(这个值根据你搭建集群时给每个服务定的值,具体百度Zookeeper集群搭建)),
逻辑时钟(指的时每台服务器投票的次数),每台服务器都会把自己的ID和逻辑时钟的保存的次数发给其它服务器,其实还有关于服务器中保存数据的版本信息之类,不过这个占用的投票权利不大;之后一旦选举出leader,就算后面新增的服务器,
它的ID再怎么大,都只能是follower;
选举完成后由Leader来分发并且也只能由Leader任务给其它Follower,就算客户端是把保存数据的请求发送给了Follower,Follower也会转发给Leader,之后由Leader先保存这个数据,然后分派任务,让其它Follower也全部保存这个数据,
这样就保证了数据的一致性,当有大于一般数量的集群服务器保存了这个数据后,Leader就会返回消息给客户端,告知其保存成功;Zookeeper增删改都是原子性的,也就是说,只要你修改了某个节点中保存的数据,那么相应的,这条数据的版本信息,源信息都会被做相应处理;
同时Zookeeper是有事物支撑的;

2018/1/21 Netty通过解码处理器和编码处理器来发送接收POJO,Zookeeper深入学习的更多相关文章

  1. 【转】Netty系列之Netty编解码框架分析

    http://www.infoq.com/cn/articles/netty-codec-framework-analyse/ 1. 背景 1.1. 编解码技术 通常我们也习惯将编码(Encode)称 ...

  2. Netty系列之Netty编解码框架分析

    1. 背景 1.1. 编解码技术 通常我们也习惯将编码(Encode)称为序列化(serialization),它将对象序列化为字节数组,用于网络传输.数据持久化或者其它用途. 反之,解码(Decod ...

  3. Netty 编解码技术 数据通信和心跳监控案例

    Netty 编解码技术 数据通信和心跳监控案例 多台服务器之间在进行跨进程服务调用时,需要使用特定的编解码技术,对需要进行网络传输的对象做编码和解码操作,以便完成远程调用.Netty提供了完善,易扩展 ...

  4. Microsoft Artificial Intelligence Conference(2018.05.21)

    时间:2018.05.21地点:北京嘉丽大酒店

  5. China Intelligent Office Summit(2018.11.21)

    时间:2018.11.21地点:中关村软件园国际会议中心

  6. 2018/8/21 qbxt测试

    2018/8/21 qbxt测试 期望得分:0? 实际得分:0 思路:manacher   会写模板但是不会用 qwq 听了某人的鬼话,直接输出0,然后就gg了 #include <cstdio ...

  7. 什么是Netty编解码,Netty编解码器有哪些?Protostuff怎么使用?

    哈喽!大家好,我是小奇,一位热爱分享的程序员 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 文章持续更新 一.前言 书接上回,昨天下雨没怎么上街上 ...

  8. 使用Netty进行Android与Server端通信实现文字发送接收与图片上传

    ANOTHER TITLE: Let’s use netty to achieve text send and receive and  image transfer to server based ...

  9. 英特尔与 Facebook 合作采用第三代英特尔® 至强® 可扩展处理器和支持 BFloat16 加速的英特尔® 深度学习加速技术,提高 PyTorch 性能

    英特尔与 Facebook 曾联手合作,在多卡训练工作负载中验证了 BFloat16 (BF16) 的优势:在不修改训练超参数的情况下,BFloat16 与单精度 32 位浮点数 (FP32) 得到了 ...

随机推荐

  1. Java入门篇(四)——数组

    上篇在foreach中有引入一个数组的概念,数组是最为常见的一种数据结构,是相同类型的.用一个标识符封装到一起的基本类型数据序列或对象序列. 数组是具有相同数据类型的一组数据的集合,根据维数不同可以分 ...

  2. Ceph部署(一)集群搭建

    背景 Ceph简介 Ceph是一个分布式存储,可以提供对象存储.块存储和文件存储,其中对象存储和块存储可以很好地和各大云平台集成.一个Ceph集群中有Monitor节点.MDS节点(可选,用于文件存储 ...

  3. VMWare 安装ubuntu,虚机设置静态IP接入公网

    本文提供的kafka安装配置为Linux(ubuntu-16.04.3) 1.首先安装VMarea(14.0.0 build-6661328) 2.到http://www.ubuntu.org.cn/ ...

  4. [国嵌攻略][160][SPI驱动程序设计]

    SPI Flash驱动 1.打开/drivers/mtd/devices/m25p80.c驱动文件.找到初始化m25p80_init函数,其中通过spi_register_driver来注册spi设备 ...

  5. js判断是否为ie浏览器

    之前在开发时遇到浏览器的兼容性问题,涉及到对ie浏览器的判断.现在此做个笔记. 这里我以函数的形式来判断,在用的时候直接调用即可. var isIE = !!window.ActiveXObject ...

  6. Map,List,POJO深拷贝(序列化实现)方法与注意事项

    转载请注明出处,谢谢! 方法1: /*jdk >= 1.5*/ @SuppressWarnings("unchecked") public static <T> ...

  7. api接口token验证

    接口特点汇总: 1.因为是非开放性的,所以所有的接口都是封闭的,只对公司内部的产品有效: 2.因为是非开放性的,所以OAuth那套协议是行不通的,因为没有中间用户的授权过程: 3.有点接口需要用户登录 ...

  8. 怎么从一台电脑的浏览器输入地址访问另一台电脑服务器(WAMP服务器已搭建,PHPSTORM装好了)

    服务器电脑WAMP环境搭建好了,浏览器输入LOCALHOST就能访问本地 WAMP/WWW 目录下PHP文件,怎么样才能从另一台电脑通过浏览器访问呢?求详细步骤... glwbdtb | 浏览 180 ...

  9. Eclipse报错An internal error occurred during: "J2EE Component Mapping Update". java.lang.NullPointerException

    Eclipse每次打开.java文件时,报错信息如下: An internal error occurred during: "J2EE Component Mapping Update&q ...

  10. linux下用iptables做本机端口转发方法(转载)

    一 :从一台机到另一台机端口转发 启用网卡转发功能 #echo 1 > /proc/sys/net/ipv4/ip_forward 举例:从192.168.0.132:21521(新端口)访问1 ...