Talk is Cheap, Show me the Code! <<网站首页文章列表 Java网络编程之Netty学习(三)—— RPC的服务注册、发现、降级 前言上一篇[《Java网络编程之Netty学习(二)—— 简单RPC实现 》][prevLink] 简单介绍了如何使用netty实现远程过程调用。不过在很多方面都存在着问题,包括并发性、内存使用、负债均衡、服务发现、服务注册、服务降级。本章以及后续将会出现的章节,旨在逐步解决这些问题,当然解决这些问题的方式、方法都会是自己思考并结合dubbo相关源码。主要是通过这一系列的实践来学习Netty、dubbo等技术框架的应用。本章主要介绍如何通过zookeeper来实现Provider的注册、Counsumer订阅、本地降级。代码都是在本系列前置文章的源码的基础之上修改的,后续会逐步进行代码重构。经整理,本章内容的主要信息点如下:1. 获得provider服务器ip2. Zookeeper客户端curator的使用3. Zookeeper节点监听以及回调4. mock接口本地简单判断--- 知识点介绍 如何获得本机的IP地址这里指的是获得服务器的IP地址,而不是获得请求客户端的IP地址。一般情况下,我们如果想获得客户端的IP地址,通常会从HttpServletRequest对象中获取,比如:java private static final String NGINXIPHEADER "X-Real-IP"; private static final String NGINXXForwardedFor "X-Forwarded-For"; / 功能描述: 获取ip(兼容nginx转发) @param request @return / public static String getIpAddr(HttpServletRequest request) { String ips request.getHeader(NGINXXForwardedFor); String[] ipArray org.apache.commons.lang3.StringUtils.split(ips, ","); if (ArrayUtils.isNotEm Netty Java Dubbo RPC 2019-05-06 浏览(2219) 阅读原文>> Java网络编程之Netty学习(二)—— 简单RPC实现 前言本章实现一个最简单的RPC小工具,简单的不能称之为框架。它是在学习Netty框架时的一个简单应用,包含的常规知识点有动态代理、可重入锁、Java反射、序列化。+ 动态代理 根据接口定义,生成一个该接口的一个实现对象,这是一个代理对象。在消费者调用接口的某个方法的时候,我们可以在方法前后增加自定义逻辑。本例中,增加的逻辑就是封装接口信息、方法以及参数信息,然后通过RPC服务类将封装的好的信息传递给生产者,然后将返回结果返回给消费者,完成一个RPC调用过程。+ 可重入锁 通过ReentrantLock以及它的Condition属性对象来实现将Netty的NIO特性转为常规RPC的同步性。 ReentrantLock是一个可重入锁,它与在方法或者代码块上使用synchronized具有相同的并发特性和隐性监视器锁访问语义,不过,它具有更好的扩展性。这个锁被最后获得且未释放它的线程所拥有,一个线程如果尝试去获得一个未被任何线程拥有或者已被自己拥有的锁,都会立即成功。 关于synchronized的隐性监视器锁(参考其它文章): + 同步方法通过ACCSYNCHRONIZED关键字隐式的对方法进行加锁。当线程要执行的方法被标注上ACCSYNCHRONIZED时,需要先获得锁才能执行该方法。 + 同步代码块通过monitorenter和monitorexit执行来进行加锁。当线程执行到monitorenter的时候要先获得所锁,才能执行后面的方法。当线程执行到monitorexit的时候则要释放锁。 + 每个对象自身维护这一个被加锁次数的计数器,当计数器数字为0时表示可以被任意线程获得锁。当计数器不为0时,只有获得锁的线程才能再次获得锁,所以synchronized也是可重入锁。+ Java反射 Java反射机制可以让我们在编译期(Compile Time)之外的运行期(Runtime)获得任何一个类的字 Netty Java RPC 2019-05-06 浏览(1738) 阅读原文>> Java网络编程之Netty框架学习(一) 零、前言Netty致力于成为一个异步的事件驱动的网络应用框架,同时,它也是NIO(非阻塞IO)的。通过它,程序员可以简单快速开发出一种可维护、易扩展且高性能的服务端-客户端通信协议。它通极大的简化了连接激活、消息发送、消息接收等环节,通过在这些环节添加事件监听从而将网络编程退化为流式处理,也就是说,对于普通开发者可忽略这些环节的细节和异步性(实际上每个环节的动作都是异步的),我们可以专注各个环节需要处理的业务逻辑。比如基于UPD、TCP的Socket通信服务开发。简单快速并不意味着放弃了维护性和高性能表现。得益于在像FTP、SMTP、HTTP以及其他二进制协议或者更老的一些基于文本的协议丰富的开发实践经验,Netty团队成功的设计了一种方式,可以同时兼顾易开发、高性能、稳定性和易扩展等方面。Netty的设计哲学让它在众多的网络通信框架中显得与众不同。无论是阅读API文档还是通过它来编程,你都能感受到Netty给你带来的舒适体验,它只可意会不可言传的设计哲学让你今后的编程生涯变得更加简单有趣。上面关于Netty的描述都是我根据官网([https://netty.io/wiki/user-guide-for-4.x.html] [nettyHome])瞎翻译的,看看就好了。---- 一、开始前的准备有兴趣看到这里的,我相信你一定是“精通”java开发的码农,那么此时你拥有的JDK版本一定不低于1.6吧,那就ok了。同时,本例的项目是一个maven项目,因此我一起给出相关依赖:xml io.netty netty-buffer 4.1.16.Final io.netty netty-all 4.1.16.Final io.netty netty-transport-native-epoll 4.1.16.Final----- 二、Let's Do IT为 网络编程 Java Netty 2019-05-06 浏览(1813) 阅读原文>> 1 栏目导航 关于我 不止技术 工程化应用(23) 技术学习/探索(32) 自娱自乐(2) 还有生活 随便写写(1) 娱乐/放松(1) 点击排行 SpringBoot2从零开始(二)——多数据源配置 搜索引擎进阶——IK扩展之动态加载与同义词 从零开发参数同步框架(二)—— 前期准备之工具类 Nginx的nginx.conf配置部分解释 springMVC中controller参数拦截问题处理 Maven项目一键打包、上传、重启服务器 微信小程序深入踩坑总结 微信小程序的搜索高亮、自定义导航条等踩坑记录 标签云 Java(19) 搜索引擎(13) Solr(7) 参数同步(6) SpringBoot(4) ES(3) ElasticSearch(3) JVM(3) Netty(3) Spring(3) mongoDB(3) 设计模式(3) Curator(2) Docker(2) Dubbo(2) 大家推荐 魔神重返战场!厄祭战争的巴巴托斯:第四形态 搜索引擎入门——Solr查询参数详解以及如何使用Java完成对接 来聊一聊这个被淘汰的图片验证码 搜索引擎入门——聊聊schema.xml配置 搜索引擎入门——启动第一个Solr应用 君子性非异也,善假于物也——功能强大的Postman 择其善而从之——我为什么开始学习ElasticSearch 实现一个关于队列的伪需求是一种怎样的体验