norbert 高并发分布式服务例证 examples (二)
2015-12-30 15:50
288 查看
norbert 高并发分布式服务例子 examples (二)
iteye编辑器在IE8下太不好用了,写了保存到草稿里结果再编辑格式就都没了,晕
接上面的 http://rabbit9898.iteye.com/blog/1508968,继续
5. 写服务器端代码
servernode1.java
其中在ServerUtil.startServer中有:
public static void startServer(String serviceName, int nodeId, String zkConnectStr)
{
NetworkServerConfig config = new NetworkServerConfig();
config.setServiceName(serviceName);
...
NetworkServer ns = new NettyNetworkServer(config);
//server中绑定需要处理的消息类型和功能
ns.registerHandler(new NodePingRequestHandler(), new PingSerializer());
ns.registerHandler(new NodeSumRequestHandler(), new ReqProtoSerializer());
ns.bind(nodeId);
}
NodeSumRequestHandler.java 代码,实现加和:
同样创建servernode2.java
6. 写客户端测试调用代码
ClientSum.java
7. 客户端测试Server调用
启动servernode1和servernode2,可以看到:
servernode1的控制台输出
启动ClientSum.java 控制台输出:
在servernode1 或者servernode2下可以看到多了一行输出:
多启动几次ClientSum.java ,可以看到会分发到不同的node上。
转载请标明出处。上程序附件。
==================完=====================
iteye编辑器在IE8下太不好用了,写了保存到草稿里结果再编辑格式就都没了,晕
接上面的 http://rabbit9898.iteye.com/blog/1508968,继续
5. 写服务器端代码
servernode1.java
package norbert.exam.server; import norbert.exam.util.ServerUtil; import com.linkedin.norbert.javacompat.cluster.ClusterClient; public class ServerNode1 { public static void main(String[] args) { //创建clusterClient ClusterClient cc = ServerUtil.configCluster(ServerUtil.clusterName, ServerUtil.zkConnectStr); //添加node1,端口绑定5001 cc.removeNode(1); cc.addNode(1, "localhost:5001"); //启动node1 ServerUtil.startServer(ServerUtil.clusterName, 1, ServerUtil.zkConnectStr); } }
其中在ServerUtil.startServer中有:
public static void startServer(String serviceName, int nodeId, String zkConnectStr)
{
NetworkServerConfig config = new NetworkServerConfig();
config.setServiceName(serviceName);
...
NetworkServer ns = new NettyNetworkServer(config);
//server中绑定需要处理的消息类型和功能
ns.registerHandler(new NodePingRequestHandler(), new PingSerializer());
ns.registerHandler(new NodeSumRequestHandler(), new ReqProtoSerializer());
ns.bind(nodeId);
}
NodeSumRequestHandler.java 代码,实现加和:
public class NodeSumRequestHandler implements RequestHandler<Request,Reponse>{ @Override public Reponse handleRequest(Request request) throws Exception { Reponse r= new Reponse(); if(request!=null){ r.setSum(request.num + request.num); } System.out.println("receive request=" + request.num +" sum="+ r.getSum()); return r; } }
同样创建servernode2.java
6. 写客户端测试调用代码
ClientSum.java
public class ClientSum { public static void main(String[] args) { NetworkClientConfig config = new NetworkClientConfig(); config.setServiceName(ServerUtil.clusterName); config.setZooKeeperConnectString(ServerUtil.zkConnectStr); //.... //采用roundrobin策略 随机调用node上的功能 NetworkClient nc = new NettyNetworkClient(config, new RoundRobinLoadBalancerFactory()); int num =3; final Request request = new Request(num); Future<Reponse> responseFuture = nc.sendRequest(request, new ReqProtoSerializer()); try { final Reponse sumResp = responseFuture.get(); System.out.println("num=" + num +" ; got sum resp: " + sumResp.getSum()); } catch( InterruptedException e ) {... } }
7. 客户端测试Server调用
启动servernode1和servernode2,可以看到:
servernode1的控制台输出
connected to cluster: [] nodes changed,current node size= 0 nodes changed,current node size= 0 nodes changed,current node size= 0 nodes changed,current node size= 0 nodes changed,current node size= 1 node: JavaNode(1,localhost:5001,true,[]); nodes changed,current node size= 1 node: JavaNode(1,localhost:5001,true,[]); nodes changed,current node size= 1 node: JavaNode(1,localhost:5001,true,[]); nodes changed,current node size= 2 node: JavaNode(2,localhost:5002,true,[]); node: JavaNode(1,localhost:5001,true,[]);
启动ClientSum.java 控制台输出:
num=3 ; got sum resp: 6
在servernode1 或者servernode2下可以看到多了一行输出:
receive request=3 sum=6
多启动几次ClientSum.java ,可以看到会分发到不同的node上。
转载请标明出处。上程序附件。
==================完=====================
相关文章推荐
- PHP文件包含语句 include、include_once、require、require_once
- Linux下安装JDK1.7
- iOS一段文字设置多种颜色格式
- 验证表格多行某一input是否为空
- 实验四 主存空间的分配和回收模拟
- java 字符串初始化=“” 和=null的区别
- Linux下打开vsftpd服务器失败的解决办法
- stm32模拟iic——引脚配置、代码
- struct和typedef struct的使用区别
- 同步get获取所关注的最新微博
- 初遇设计模式
- 【设计模式】 之 建造者模式
- Android之AlarmManager(全局定时器/闹钟)指定时长或以周期形式执行某项操作
- LeetCode 090 Subsets II
- JS练习:选择颜色,得到其HEX 和RGB
- 实验四 主存空间的分配和回收模拟
- 获取到中文乱码时的解决思路
- java中request对象各种方法的使用实例分析
- javaweb学习总结——Servlet开发(一)
- Java读取指定目录下的文件内容