Netty

端口被占用的解决办法

这一生的挚爱 提交于 2020-08-11 13:15:42
背景 今天启动项目,报端口被占用。 Caused by: org.jboss.netty.channel.ChannelException: Failed to bind to: /0.0.0.0:20880 at org.jboss.netty.bootstrap.ServerBootstrap.bind(ServerBootstrap.java:303) at com.alibaba.dubbo.remoting.transport.netty.NettyServer.doOpen(NettyServer.java:92) at com.alibaba.dubbo.remoting.transport.AbstractServer.<init>(AbstractServer.java:63) ... 48 more Caused by: java.net.BindException: Address already in use: bind at sun.nio.ch.Net.bind0(Native Method) at sun.nio.ch.Net.bind(Net.java:433) at sun.nio.ch.Net.bind(Net.java:425) 不用想,肯定是某个进程没有被正常关闭,导致端口被占用了。(此时大概率是java 进程,因为本人启动的是java项目)

Netty源码死磕一(netty线程模型及EventLoop机制)

被刻印的时光 ゝ 提交于 2020-08-11 12:15:50
引言 好久没有写博客了,近期准备把 Netty 源码啃一遍。在这之前本想直接看源码,但是看到后面发现其实效率不高, 有些概念还是有必要回头再细啃的,特别是其线程模型以及 EventLoop 的概念。 当然在开始之前还是有务必要对 IO模型 要有清晰准确的认识。 传送门 事件循环机制(EventLoop) Netty线程模型中一个非常重要的概念: 事件循环机制(EventLoop) 这个概念在 JS 上体现的也非常淋漓尽致,下面在开始介绍netty的线程模型之前,允许我简单的介绍下事件循环机 制在 JS 中的体现 JS 的语言性质: 单线程非阻塞,单线程意味着,js代码在执行的任何时候,都只有一个主线程来处理所有的任务>。非阻塞则意味着,在进行异步IO任务时不会阻塞主线程,主线程会挂起这个任务,等待异步任务完成再执行对应>的回调。 那么JS是如何实现单线程非阻塞的呢? JS 引擎遇到一个异步事件后并不会一直等待其返回结果,而是会将此事件>挂起(例如交给浏览器去执行请求),主线程会继续执行方法栈中的其他任务。之后当异步任务返回结果后,(可>能是浏览器?)会将回调函数加入到事件队列( Task Queue )中,那么什么时候会从事件队列中取出回调函数执行>呢?当前执行栈中的所有任务都执行完毕,主线程处于闲置状态时会去查找事件队列是否有任务待执行,如果有则

Java多线程学习总结(4)——ThreadPoolExecutor 线程池的拒绝策略学习总结

时光总嘲笑我的痴心妄想 提交于 2020-08-11 11:37:52
前言 谈到java的线程池最熟悉的莫过于ExecutorService接口了,jdk1.5新增的java.util.concurrent包下的这个api,大大的简化了多线程代码的开发。而不论你用FixedThreadPool还是CachedThreadPool其背后实现都是ThreadPoolExecutor。ThreadPoolExecutor是一个典型的缓存池化设计的产物,因为池子有大小,当池子体积不够承载时,就涉及到拒绝策略。JDK中已经预设了4种线程池拒绝策略,下面结合场景详细聊聊这些策略的使用场景,以及我们还能扩展哪些拒绝策略。 池化设计思想 池话设计应该不是一个新名词。我们常见的如java线程池、jdbc连接池、redis连接池等就是这类设计的代表实现。这种设计会初始预设资源,解决的问题就是抵消每次获取资源的消耗,如创建线程的开销,获取远程连接的开销等。就好比你去食堂打饭,打饭的大妈会先把饭盛好几份放那里,你来了就直接拿着饭盒加菜即可,不用再临时又盛饭又打菜,效率就高了。除了初始化资源,池化设计还包括如下这些特征:池子的初始值、池子的活跃值、池子的最大值等,这些特征可以直接映射到java线程池和数据库连接池的成员属性中。 线程池触发拒绝策略的时机 和数据源连接池不一样,线程池除了初始大小和池子最大值,还多了一个阻塞队列来缓冲

Netty源码学习系列之5-NioEventLoop的run方法

痞子三分冷 提交于 2020-08-11 11:06:12
前言 NioEventLoop的run方法,是netty中最核心的方法,没有之一 。在该方法中,完成了对已注册的channel上来自底层操作系统的socket事件的处理(在服务端时事件包括客户端的连接事件和读写事件,在客户端时是读写事件)、单线程任务队列的处理(服务端的注册事件、客户端的connect事件等),当然还包括对NIO空轮询的规避、消息的编解码等。下面一起来探究一番,首先奉上run方法的源码: 1 protected void run() { 2 for (;;) { 3 try { 4 try { 5 // 1、确定处理策略 6 switch (selectStrategy.calculateStrategy(selectNowSupplier, hasTasks())) { 7 case SelectStrategy.CONTINUE: 8 continue ; 9 case SelectStrategy.BUSY_WAIT: 10 case SelectStrategy.SELECT: 11 // 2、表示有socket事件,需要进行处理 12 select(wakenUp.getAndSet( false )); 13 if (wakenUp.get()) { 14 selector.wakeup(); 15 } 16 default : 17 } 18 }

netty源码-server端绑定端口流程

自古美人都是妖i 提交于 2020-08-11 10:33:08
仅用于记录在分析netty源码的日志 源码调用关系图 Netty Server示例 EventLoopGroup boss = new NioEventLoopGroup(1); EventLoopGroup io = new NioEventLoopGroup(); ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(boss, io); bootstrap.channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<NioSocketChannel>() { @Override protected void initChannel(NioSocketChannel ch) throws Exception { } }); bootstrap.bind(25001).sync().addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { if (future.isSuccess()) { System.out.println(

从Java Socket非阻塞到Netty入门流程

余生颓废 提交于 2020-08-11 09:30:50
Java IO,Socket非阻塞通信流程 这里我们使用一个内嵌的永久循环,来让Socket成为一个非阻塞的通信流程。 如上图所示,ServerSocket是我们自建的一个类,通过启动线程,且线程内置一个真循环, 防止accept阻塞 ; 在客户端监听类上,将监听到的socket作为参数,传递到客户端监听类上,并再次启动线程,获取一个InputStream,同时再次在这个刚刚启动线程内置一个真循环,为的是 不断获取信息并回写 ; 这里要注意的是,第一个真循环是 保证获取新连接不会阻塞 ,第二个真循环是 保证不停的获取客户端信息并回写 ; 关于客户端则通过端口和IP,启动线程,通过一个循环不停的向服务端写数据; Netty入门 基于上面的图,我们也可以学习Netty相关的基础入门。 NioEventLoop(事件循环) 1、新连接接入 2、连接上的数据读取 Channel(抽象连接) Socket、SocektChannel(IO\NIO)抽象 ChannelHandler(业务逻辑处理) 读写数据期间的业务层 PipeLine(动态链处理) 多个ChannelHandler组成,让消息可以层层处理 ByteBuf(数据接收) 基本的数据处理基于ByteBu 来源: oschina 链接: https://my.oschina.net/u/4553591/blog/4326425

netty源码-server端绑定端口流程

半腔热情 提交于 2020-08-11 08:57:22
仅用于记录在分析netty源码的日志 源码调用关系图 Netty Server示例 EventLoopGroup boss = new NioEventLoopGroup(1); EventLoopGroup io = new NioEventLoopGroup(); ServerBootstrap bootstrap = new ServerBootstrap(); bootstrap.group(boss, io); bootstrap.channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<NioSocketChannel>() { @Override protected void initChannel(NioSocketChannel ch) throws Exception { } }); bootstrap.bind(25001).sync().addListener(new ChannelFutureListener() { @Override public void operationComplete(ChannelFuture future) throws Exception { if (future.isSuccess()) { System.out.println(

太牛皮啦!阿里P8架构师,呕心48小时整理的分布式系统技术和实战笔记

你离开我真会死。 提交于 2020-08-11 07:50:06
前言 现在的架构很多,各种各样的,如高并发架构、异地多活架构、容器化架构、微服务架构、高可用架构、弹性化架构等,还有和这些架构相关的管理型的技术方法,如 DevOps、应用监控、自动化运维、SOA 服务治理、去 IOE 等等,还有很多。 那什么是分布式系统?分布式系统是支持分布式处理的软件系统,是由通信网络互联的多处理机体系结构上执行任务的系统。包括分布式操作系统、分布式程序设计语言及其编译系统、分布式文件系统分布式数据库系统等,当然这些也是分布式的关键技术。 分布式需要了解的重点 1、ActivMQ 分布式消息总线 在大型分布式系统中,在遵循JMS规范的前提下 ,进行系统之间的大规模异步消息通信和集中常用的通信机制。 能对JMS规范有深入的了解,以及分布式系统架构中的异步通信机制。 2、高并发编程必备之NIO基础 NIO的基本原理以及实现过程 能对传统IO和NIO的区别进行系统的了解并能学会NIO的实现原理 3、Redis内存数据库 在大型分布式系统中,怎样在高并发的情况下解决某些非结构化数据快速存取的解决方案。 能对非关系数据库和非关系数据库有个系统的了解 以及Redis内存数据库的基本数据类型和各自的应用场景。 4、高并发编程之NIO流行框架之Netty NIO框架Netty的简介以及netty的应用场景。 能运用netty实现客户端和服务器端的基本通信。 5、Lucene

Spring Boot 2.3.0 新特性Redis 拓扑动态感应

大憨熊 提交于 2020-08-11 07:31:52
本文为原创文章。欢迎任何形式的转载,但请务必注明出处 冷冷 https://lltx.github.io。 Spring Boot 2.3 新特性优雅停机详解 Spring Boot 2.3 新特性分层 JAR 本篇是 spring boot v2.3 系列第三篇,来分享一下 v2.3 关于 spring data redis 的故障转移优化。 背景 关于 Redis 在生产中我们一般情况下都会选择 redis cluster 高可用架构部署,既能保证数据分片并且实现节点的故障自动转移。 基本部署拓扑如下: 创建测试集群 这里通过我封装的 pig4cloud/redis-cluster:4.0 镜像,即可构建一个 6 个节点的 redis cluster 测试环境。 docker run --name redis-cluster -d -e CLUSTER_ANNOUNCE_IP=宿主机IP \ -p 7000-7005:7000-7005 -p 17000-17005:17000-17005 pig4cloud/redis-cluster:4.0 查看集群节点信息 ⋊> ./redis-cli -h 172.17.0.111 -p 7000 -c 16:09:48 172.17.0.111:7000> cluster nodes

netty实现分布式高性能rpc框架

我是研究僧i 提交于 2020-08-11 07:13:51
1)netty是什么? 对nio进行了改造 2)netty的作用 3)netty的核心 4)zookeeper是什么? kafka 5)我们这套rpc架构与dubbo相比有哪些区别? 我们的是0配置 schemas。 debbuo很繁琐,很多配置 我们的支持protobuf和json。 序列化很多 server只支持netty。 tomcat、netty等。 代理采用springcglib里面。 javassistProxy和JDK自带。 监控模块(前期不做) 重试机制(去掉) 负载均衡(加权的随机算法) 来源: oschina 链接: https://my.oschina.net/u/4374904/blog/4483468