netty 构建一个简易服务
前言构建一个只有Server服务端的netty服务,不需要额外的编写client去访问,也就是说使用现在的软件去访问。最简单的就是使用浏览器去访问,浏览是HTTP协议,所以服务必须是一个支持HTTP协议的应用。
实现使用:IDEA + netty + gradle 构建一个简单的HTTP服务,用来学习netty。
主要角色netty 构建一个服务,需要三个角色参与
Server 运行服务
Initializer 组装组件
Handle 业秋处理
项目构建可以创建一个gradle的空项目,这下面的代码复制进到项目中。
build.gradle复制内容
12345678910111213141516171819202122232425262728293031323334//插件管理plugins { id 'java'}//座标group 'com.liukai.netty'version '1.0-SNAPSHOT'//源和目标编译版本sourceCompatibility = 1.8targetC ...
docker--运行纯linux容器并进入
前言这个为什么单独拿出来说,因为这不是运行一个应用,而是运行一个单独的系统,和运行应用的方式不同。一般运行一个docker,都是运行某个应用如 tomcat、nginx等,直接运行的话很少,一般都是为了手动安装一些应用后,再commit成一个新的镜象。
运行linux容器1234# 拉取centosdocker pull centos:centos7docker run -d -i -t <imageID> /bin/bash
注意如果少了/bin/bash的话,Docker会生成一个Container但是马上就停止了,不会一直运行即使有了-d参数。
进入系统容器1docker attach <ContainerID>
netty 简述
什么是nettyNetty是一个异步的基于事件驱动(Reactor)的网络框架。Netty是一个NIO客户服务器框架,它能够快速和容易地开发网络应用,如协议服务器和客户端。它大大简化了网络编程,如TCP和UDP套接字服务器。
为什么选择netty主要原因是 netty 简化了使用nio时对网络编程的复杂性,提供更多的抽象性和功能方便网络编程开发。
列举一个特点:1.Netty支持三种IO模型同时支持三种Reactor模式。
2.Netty支持很多应用层的协议,提供了很多decoder和encoder。
3.Netty能够解决TCP长连接所带来的缺陷(粘包、半包等)
4.Netty支持应用层的KeepAlive。
5.Netty规避了JAVA NIO中的很多BUG,性能更好。
使用 netty 能做什么1.实现节点间通信2.实现自己的协议 dubbo、rocketmq 等底层都使用 netty 实现自己的协议
Spring Gateway 静态路由
简述以代码 或 配置文件形式进行配置。RewritePath:路径匹配切割StripPrefix: 路径载取
参数说明
id: 路由IDuri: 目标地址,可以是服务,如果服务Spring推荐用全大写,实际调用大小写不敏感,都可以调通。predicates: 匹配路径,以浏览器请求的端口号后面的第一级路径为起始。filters: 过滤器,包含Spring Gateway 内置过滤器,可以自定义过滤器。
1.请求转发,转发到目标地址123456routes: # 跳转URL - id: 163_route uri: http://www.163.com/ predicates: - Path=/163
2.切路径1234567# oauth2 认证- id: OAUTH2 uri: lb://OAUTH-SERVER predicates: - Path=/oauth-server/** filters: - StripPrefix=1
参数说明
StripPrefix的意思是将路径切掉一级,这个例子中 oauth-serve ...
面试-产生线程死锁的原因和处理方式
背景:线程同步(就是加锁)会有一个问题,就是产生死锁所谓死锁: 是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
帮助理解:地上放着两个桶泡面,一个老坛酸菜,一个小鸡炖磨茹。有两个人:一个产品(线程1),一个测试(线程2),同时扑向抢老坛酸菜(锁A)和小鸡炖磨茹(锁B),产品拿到老坛酸菜,测试拿到小鸡炖磨茹,同一时刻,产品伸要去拽测试怀里的小鸡炖磨茹,测试伸手去拽产品的老坛酸菜,互使剪刀脚两个僵持不下,就卡死在那了,叫这就死锁。如果没有一个开发将他们各打一顿解救出来(中断状态),它们将无法推进下去。
发生死锁的具体原因如下:
因为系统资源不足。
进程运行推进的顺序不合适。
资源分配不当。
举列说明场景:死锁是因为多线程访问共享资源,由于访问的顺序不当所造成的,通常是一个线程锁定了一个资源A,而又想去锁定资源B;在另一个线程中,锁定了资源B,而又想去锁定资源A以完成自身的操作,两个线程都想得到对方的资源,而不愿释放自己的资源,造成两个线程都在等待,而无法执行的情况。
死锁预防如果只使用一个锁就不会有死锁的问题,不 ...
使用递归实现地址数据菜单
跟网上的不同的是,我这种方式是以时间换空间的做法,不会一次性把数据全查出来再慢慢遍历,而是每次查询是否存在子级,有就递归下去查。数据量大时,查库的次数比较多,数据量少时对数据库查询次数少,压力较小,但是多次查询不会出现一次查询数据量很大卡住的情况。
思路
先获取一级菜单,对每个一级菜单设子区域。
如果子区域还有子区域,就递归查询,直到查不到子区域返回。
递归的核心就是在方法中设置一个返回条件,防止无限递归下去。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 * @author liukai * @since 2019/6/12 16:14. */public class SignTree { private static RegionDao regi ...
server和client模式的区别
这两个相反的,由jvm启动时自动选择。
-server 模式:初始空间大,默认启动并行 VM,启动慢,运行快-client 模式:初始空间小,默认启动串行 VM,启动快,运行慢
一般情况下 -server 模式多
64位系统只能使用 server 模式
1234java -versionjava version "11.0.2" 2019-01-15 LTSJava(TM) SE Runtime Environment 18.9 (build 11.0.2+9-LTS)Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.2+9-LTS, mixed mode)
32位了解即可
测试 java -D 命令 -D 后面传入的命令,会解析成 System 中的属性12345678910public static void main(String[] args) { //java -DtestJvm=test TestGetSystemProperties String test = Sys ...
github--解决github文件不能超过100M
错误上传github文件带了测试数据,结果测试数据太大,上传不了:
1234567891011121314Enumerating objects: 66, done.Counting objects: 100% (66/66), done.Delta compression using up to 8 threadsCompressing objects: 100% (52/52), done.Writing objects: 100% (55/55), 170.58 MiB | 1.55 MiB/s, done.Total 55 (delta 26), reused 0 (delta 0), pack-reused 0remote: Resolving deltas: 100% (26/26), completed with 5 local objects.remote: error: Trace: 405ebb8940b239aec85cd8d2b57faa2b154ec135647a1ae27c891ec512d61129remo ...
java 修改JAVA_HOME无效问题
问题最近需要验一下JDK的版本兼容性,找了一台JDK11的机器,改了一上JAVA_HOME,然后source /etc/profile后,发现版本没有改过来!?查看了一下.bash_profile和.bashrc都没有配置,奇怪了。难道是/usr/bin中指定了?因为如果使用openJDK会从/usr/bin去指定java的路径,还是看一看还真是
再ll查看一下这个软链指向哪里
想暴力删一下,但是万一改坏了就不好,还是温柔一点,使用 update-alternatives 命令
修改使用 update-alternatives 命令修改
格式如下:
12345678910usage: alternatives --install <link> <name> <path> <priority> [--initscript <service>] [--family <family>] [--slave ...
spring cloud eureka 注册服务显示IP端口号
Spring cloud 显示 INSTANCE-ID 如果以IP + 端口号的形式显示,会更清析的定位每个服务所在的机器节点的状态。
依赖的 pom12345<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-commons</artifactId> <version>2.1.0.RELEASE</version></dependency>
yml 相关配置1234567eureka: client: service-url: defaultZone: http://10.168.16.101:8761/eureka/ instance: instance-id: ${spring.cloud.client.ip-address}:${spring.application.instance_id:${serve ...