Dubbo动态负载均衡(socket环境实现)

Java rpc框架简易版,类似dubbo分布式实现 (纯socket实现) 简介 demo-rpc(标准maven工程) 使用纯Java socket及简单多线程技术,不依赖任何第三方库类,实现简单实现类似dubbo的rpc调用。仅用于学习了解rpc调用过程, 实现略显简单,只体现rpc调用的关键步骤,存在很多优化细节,大家可以自行补充发挥。对demo有疑问可以加群讨论。 立即下载

Dubbo动态负载均衡(socket环境实现)

消费者 去注册中心获取信息 然后缓存到本地 如果有生产者某个服务宕机了  会通过通知的方式告知 (订阅的方式)

 

微服务rpc远程调用框架中,服务的负载均衡都是采用本地负载均衡的,Spring Cloud  使用的ribbon(本地负载均衡)

 如果使用Nginx,那么获取到服务信息后,请求要交给Nginx,再由Nginx进行转发实现负载均衡

本地负载均衡:本地服务从注册中心上获取服务信息列表(缓存在JVM),然后在本地使用rpc远程调用技术,比如Netty、Netty。本地负载均衡更容易实时刷新新数据。

本地效率更高呀

 实现如下架构:

 在玩的时候注意 不要加端口号

完整路径:/ 一定要加  

 

pom

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.toov5.SocketForDubbo</groupId>
  <artifactId>com.toov5.SocketForDubbo</artifactId>
  <version>0.0.1-SNAPSHOT</version>
    <dependencies>
    <dependency>
        <groupId>com.101tec</groupId>
        <artifactId>zkclient</artifactId>
        <version>0.8</version>
    </dependency>
</dependencies>
</project>

 服务器端

package com.toov5.SocketForDubboServer;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

import org.I0Itec.zkclient.ZkClient;

//##ServerScoekt服务端
public class ZkServerScoekt implements Runnable {
    private static int port = 8080; // socket 服务启动后的所使用的 端口号
    private static String parentService = "/service";
    private static ZkClient zkClient = new ZkClient("192.168.91.5");

    public static void main(String[] args) throws IOException {
        ZkServerScoekt server = new ZkServerScoekt(port); // 构造函数传入port
        regServer(); // 去zk注册
        Thread thread = new Thread(server);
        thread.start();
    }

    public ZkServerScoekt(int port) {
        ZkServerScoekt.port = port;
    }

    // 注册服务
    public static void regServer() {
        // 先创建父节点 判断
        if (!zkClient.exists(parentService)) {
            // 创建父 节点
            zkClient.createPersistent(parentService); // 创建父节点(持久化)

        } //存在就不用管了
        // 创建子节点
        String serverKey = parentService + "/server_" + port; // 约定了个规范
        if (!zkClient.exists(serverKey)) { 
            zkClient.createEphemeral(serverKey, "127.0.0.1:" + port); // 临时的 上面的删除是必须的 删除一遍 在创建 保持最新的 本地获取到 进行负载均衡
        } else {
            zkClient.delete(serverKey);
        }
    }

    public void run() {
        ServerSocket serverSocket = null;
        try {
            serverSocket = new ServerSocket(port);
            System.out.println("Server start port:" + port);
            Socket socket = null;
            while (true) {
                socket = serverSocket.accept();
                new Thread(new ServerHandler(socket)).start();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (serverSocket != null) {
                    serverSocket.close();
                }
            } catch (Exception e2) {

            }
        }
    }

}
package com.toov5.SocketForDubboServer;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;

public class ServerHandler implements Runnable {
    private Socket socket;

    public ServerHandler(Socket socket) {
        this.socket = socket;
    }

    public void run() {
        BufferedReader in = null;
        PrintWriter out = null;
        try {
            in = new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
            out = new PrintWriter(this.socket.getOutputStream(), true);
            String body = null;
            while (true) {
                body = in.readLine();
                if (body == null)
                    break;
                System.out.println("Receive : " + body);
                out.println("Hello, " + body);
            }

        } catch (Exception e) {
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
            }
            if (out != null) {
                out.close();
            }
            if (this.socket != null) {
                try {
                    this.socket.close();
                } catch (IOException e1) {
                    e1.printStackTrace();
                }
                this.socket = null;
            }
        }
    }
}

客户端

package com.toov5.SocketForDubboClient;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.ArrayList;
import java.util.List;

import javax.mail.Address;

import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;
import org.apache.zookeeper.data.Stat;
import org.jboss.netty.channel.StaticChannelPipeline;
import org.jboss.netty.util.internal.SystemPropertyUtil;
import org.omg.CORBA.PUBLIC_MEMBER;
import org.w3c.dom.ls.LSInput;

public class ZkServerClient {
    public static List<String> listServer = new ArrayList<String>();
    private static ZkClient zkClient = new ZkClient("192.168.91.5");
    private static String parentService = "/service";

    public static void main(String[] args) {
        initServer();
        ZkServerClient client = new ZkServerClient();
        BufferedReader console = new BufferedReader(new InputStreamReader(System.in));
        while (true) {
            String name;
            try {
                name = console.readLine();
                if ("exit".equals(name)) {
                    System.exit(0);
                }
                client.send(name);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    // 注册所有server
    public static void initServer() {
        // 读取所有节点 信息
    List<String> children = zkClient.getChildren(parentService);
    getChildren(zkClient, children);    
    zkClient.subscribeChildChanges(parentService, new IZkChildListener() {
        public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
            System.out.println("注册中心服务列表信息有变化"); 
            getChildren(zkClient, currentChilds);//如果监听到有变化了 就要重新读取哦
        }
    });    
        
    }
  
 public static    void getChildren(ZkClient zkClient, List<String> children) {
     listServer.clear();
    for (String ch : children) {
        String serverAddr = zkClient.readData(parentService + "/" + ch); // 拿到服务地址
        listServer.add(serverAddr);
    }
    System.out.println("服务接口地址"+listServer.toString()); 
}
    
    
    // 请求总数
    private static int reqCount = 1;
//  //服务个数    
//    private static int  serverCount = 0; //初始值是0

    // 获取当前server信息
    public static String getServer() {
        int index = reqCount % listServer.size();
        String address = listServer.get(index);
        System.out.println("客户端请求服务器" + address);
        reqCount++;
        return address;
    }

    public void send(String name) {

        String server = ZkServerClient.getServer();
        String[] cfg = server.split(":");

        Socket socket = null;
        BufferedReader in = null;
        PrintWriter out = null;
        try {
            socket = new Socket(cfg[0], Integer.parseInt(cfg[1]));
            in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
            out = new PrintWriter(socket.getOutputStream(), true);

            out.println(name);
            while (true) {
                String resp = in.readLine();
                if (resp == null)
                    break;
                else if (resp.length() > 0) {
                    System.out.println("Receive : " + resp);
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (out != null) {
                out.close();
            }
            if (in != null) {
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (socket != null) {
                try {
                    socket.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

 

 

客户端去获取下面的 地址信息 就好办了:

 

 运行结果

 动态的哦

 

 

Java rpc框架简易版,类似dubbo分布式实现 (纯socket实现).zip 立即下载

相关推荐

无人机避障——感知篇(采用Mid360复现Fast-lio)

本文介绍了在Ubuntu 18.04和ROS Melodic环境下,使用Xavier-nx电脑和Livox Mid-360激光雷达编译和运行FAST-LIO工程的步骤,包括创建工作空间、编译驱动和FAST-LIO源码,以及运行launch文件进行建图的过程。

weixin_45390670的博客 3546

Alibaba Dubbo框架同步调用原理分析-1

由于Dubbo底层采用Socket进行通信,自己对通信理理论也不是很清楚,所以顺便把通信的知识也学习一下。 n  通信理论 计算机与外界的信息交换称为通信。基本的通信方法有并行通信和串行通信两种。 1.一组信息(通常是字节)的各位数据被同时传送的通信方法称为并行通信。并行通信依靠并行I/O接口实现。并行通信速度快,但传输线根数多,只适用于近距离(相距数公尺)的通信。 2.一组信息的各位数据

互联网架构之路 1万+

保姆级教程:手把手教你用CANoe/CANalyzer读取汽车故障码(UDS 0x19服务实战)

本文提供了一份详细的CANoe/CANalyzer使用教程,指导如何通过UDS 0x19服务读取汽车故障码。从硬件配置到报文构建,再到故障码解析,手把手教你完成汽车诊断全流程,特别适合汽车电子工程师和诊断开发人员。

weixin_42524945的博客 260

Dubbo底层Socket通信详解

查看Dubbo文档及源代码可知,Dubbo底层使用Socket发送消息的形式进行数据传递,结合了mina框架,使用IoSession.write()方法,这个方法调用后对于整个远程调用(从发出请求到接收到结果)来说是一个异步的,即对于当前线程来说,将请求发送出来,线程就可以往后执行了,至于服务端的结果,是服务端处理完成后,再以消息的形式发送给客户端的。1, 客户端线程调用远程接口,向服务端发送请求,同时当前线程应该处于“暂停“状态,即线程不能向后执行了,必需要拿到服务端给自己的结果后才能向后执行。

优秀技术文章收录 1028

Kalibr标定避坑指南:如何用AprilGrid板快速完成双目IMU标定

本文详细介绍了使用AprilGrid板进行Kalibr双目IMU联合标定的实战技巧,包括标定工具选型、数据采集优化、标定流程及结果验证。通过AprilGrid板的唯一标识性和抗遮挡优势,结合IMU静止标定和运动激励设计,显著提升标定精度。文章还提供了常见报错处理和高级优化技巧,帮助开发者高效完成传感器标定。

sunny的博客 282

Linux -- 图形界面配置Samba;system-config-samba工具

图形界面配置Samba6.6.1 system-config-sambasystem-config-samba是Red Hat公司专门为Samba服务器管理编写的图形界面的管理工具,通过system-config-samba几乎可以完成对Samba服务器的所有配置,所以在只希望通过Samba服务器实现一些简单的资源共享时,system-config-samba是一个不错的选...

weixin_33695450的博客 2200

Socket长连接与短连接

长连接与短连接 所谓长连接,指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接,一般需要自己做在线维持。  短连接是指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接,一般银行都使用短连接。   比如http的,只是连接、请求、关闭,过程时间较短,服务器若是一段时间内没有收到请求即可关闭连接。 

在你最感兴趣的事物上,隐藏着你人生的秘密 2万+

为什么我的 Spark Executor / Yarn Container 只有一个vCore?

在很多集群里,在关闭了Spark的DynamicAllocation的前提下(避免自动申请空闲资源,干扰测试结果),都会观察到:提交Spark作业时,申请 1 个 driver + n 个 executor 会在Yarn上会对应创建 n+1 个 container,但是每个container只有一个vCore,通过--driver-cores和--executor-cores设定的vCore数都未奏效。有人会因此错误的认为Yarn上的一个vCore对应一个Spark的executor,这是非常错误的,正确的

Laurence的技术博客 916

Dubbo底层采用Socket进行通信详解(分析源代码得到的基本原理、以及数据是如何进行传输的)

转载:https://blog.youkuaiyun.com/IRhythm/article/details/82254110

sky198989的博客 304

高通SDX35平台 modem启动异常分析

SDX35 MIFI项目在生产时出现modem反复重启问题。经排查发现是modem在初始化GNSS模块时访问了不存在的硬件地址导致崩溃,原因是产线使用的SDX35 000-AB型号芯片阉割了GNSS功能,而本地测试使用的AA型号支持该功能。解决方案是通过修改modem编译选项,采用高通新提供的genlmm2选项(保留IMS和SMS功能但去除GNSS支持),最终解决了启动异常问题并满足VZW认证需求。

四儿家的小祖宗的博客 275

风电功率预测项目技术白皮书:短期、超短期、中长期全尺度算法详解与工程落地

聚焦风电功率预测的时间尺度与算法:短期(0~72h)以XGBoost/LightGBM/CatBoost及深度学习为主,超短期(0~4h)采用ARMA+LSTM,中长期用LightGBM等,并涵盖概率预测、多气象源融合、AI大模型+物理模型混合策略、极端天气应对及工程运维要点。

算法工程师 325

dubbo原理

一、什么是dubbo Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看, Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。关于注册中心、协议支持、服务监控等内容,详见后面描述。 Webservice也是一种服务框架,但是webservice并不是分布式的服务框架,

weixin_36936504的博客 1004

DeerFlow 系列教程 第三篇 | 核心技术深度剖析:Skills、Memory 与 Context Engineering

摘要化是 Context Engineering 中最关键的组件——它直接决定了长对话的可用性。Skills 技能系统通过渐进式加载的三层模型,在保持系统提示词轻量的同时,支持无限数量的技能扩展。从发现到执行的 10 个生命周期阶段,配合 AI 驱动的安全扫描和多层缓存,构成了一个生产级的技能管理框架。Memory 长期记忆系统通过文件系统持久化、LLM 驱动的信息提取和防抖动异步更新,实现了跨会话的认知持久化。六类事实分类体系和修正信号检测机制,让 Agent 能够从交互中持续学习和改进。

weixin_43674738的博客 280

RPC框架到Dubbo的服务动态注册,服务路由,负载均衡演化

一句话明白RPC原理   RPC即远程过程调用,它的实现方式有很多,比如webservice等。框架调多了,烦了,没激情了,我们就该问自己,这些框架的作用到底是什么,来找回当初的激情。   一般来说,我们写的系统就是一个单机系统,一个web服务器一个数据库服务,但是当这单台服务器的处理能力受硬件成本的限制,是不能无限的提升处理性能的。这个时候我们使用RPC将原来的本地调用转变为调用远端的服务器上的方法,给系统的处理能力和吞吐量带来了提升。   RPC的实现包括客户端和服务端,即服务的调用方和服务的提.

如果频繁就私信一下呢 438

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

dubbo

知识总结。 Dubbo dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东西,是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册) 1). 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求...

yanhhuan的博客 481

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

阿里开源框架Dubbo的入门及原理分析

文章目录 Socket网络传输 Socket问题所在 WebService RPC Dubbo 利用Zookeeper辅助Dubbo完成监听 dubbo-zk-demo https://github.com/2NaCl/dubbo-demo 我们一般调用一个jvm里的类或者方法,往往都是直接new,然后调用,但是dubbo的意义在于,可以让我们去调用到在不同jvm中的方法,只通过new就肯定做不到了,它会提示我们找不到对应的方法。 咱们先不说dubbo的事,就说我们如果想实现,

m0_67401134的博客 825

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

RPC原来就是Socket——RPC框架到dubbo的服务动态注册,服务路由,负载均衡演化...

  序:RPC就是使用socket告诉服务端我要调你的哪一个类的哪一个方法然后获得处理的结果。服务注册和路由就是借助第三方存储介质存储服务信息让服务消费者调用。然我们自己动手从0开始写一个rpc功能以及实现服务注册,动态上下线,服务路由,负载均衡。 一句话明白RPC原理   RPC即远程过程调用,它的实现方式有很多,比如webservice等。框架调多了,烦了,没激情了,我们就该问自己,这些框...

weixin_34355881的博客 101

Dubbo框架学习

PRC:远程过程调用,是一个计算机的通信协议,需要运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外的为整个交互过程编程。面向对象就是远程方法调用;例如http,tcp、socket都是RPC协议; dubbo特性 面向接口代理的高性能RPC调用:提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。 服务自动注册与发现:支持多种注册中心...

wzEminem的博客CRIQT*zz41(f 305

dubbo 简单介绍

大家好,我是修真院 武汉分院 第十五期 java 学员,今天 我给大家分享的是——  dubbo  简单介绍   1.背景介绍 2.知识剖析 3.常见问题 4.编码实战 5.扩展思考 6.参考文献 7.更多讨论   1.背景介绍 什么是DUBBO? 1、一款分布式服务框架; 2、高性能和透明化的RPC远程服务调用方案; 3、SOA服务治理方案。 应用架构进化史 1、单一...

qq_42218123的博客 311

Dubbo中的Invoker与Exporter机制详解

Dubbo作为一款成熟的高性能、轻量级的Java RPC框架,其核心机制之一便是Invoker与Exporter机制,它们在服务提供端和服务消费端扮演着至关重要的角色,是实现服务调用和管理的基础。下面将详细解析这两个核心组件的工作原理及其在Dubbo框架中的作用。

木南曌的博客 893

分布式 Dubbo Zookeeper

整合文件的介绍 依赖:不强制依赖:将公共的jar放到common工程中,后期开发其他的工程需要独立的jar在该工程中在去配置。 Dao层 提供链接数据库的资源文件 提供mybatis的核心配置文件 提供mybatis与spring整合的配置文件(注意:mybatis核心配置文件中的配置项在该配置文件中都可以去配置的。) Service层 管理service的bean的配置文件(spring与dubbo整合的配置—无缝整合) 管理事务的配置文件: 注解式:简单。 声明式:save*、update*

梦想是很难很难的,所以先勇敢一点 435
上一篇: DubboAdmin平台
下一篇: SpringBoot2.0之整合Dubbo
Art&Code
博客等级 码龄7年 77粉丝 554原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值