网站首页 > 技术教程 正文
docker开箱即用的java版本nginx-clojure实现负载均衡
官方文档
- https://nginx-clojure.github.io
- 截止示例实现,nginx-clojure支持 Java 9、10、11、12
- 测试jdk17发现确实用不了,等以后支持再构建17相关版本
示例说明
- nginx做反向代理在我们开发运维的同志日常生活中已经非常常见,后端有多台服务的时候还可以用nginx做负债均衡
- 之前负载均衡都是使用upstream模块实现
- 但作为一个小javaer的我偶然看到眼前一亮的clojure
- 什么??java也可以写nginx插件,ok,那我们就使用java来写一个nginx的负载均衡小demo
autonumber
actor person order 0
participant nginx_clojure as nginx order 1
participant java order 2
collections urls order 3
nginx -> nginx: 容器包含nginx_clojure插件
java -> java: 实现NginxJavaRingHandler,编写权重访问url
java -> java: 打包jar,并挂载docker
person -> nginx: 访问
activate nginx
nginx -> java: 通过插件调用NginxJavaRingHandler实现类
activate java
java -> urls: 负载均衡访问url
activate urls
return
return
return
java代码实现
加入maven依赖
<dependency>
<groupId>nginx-clojure</groupId>
<artifactId>nginx-clojure</artifactId>
</dependency>
java伪代码从多个地址按照权重返回
private static final WeightRandom<String> weightApp = RandomUtil.weightRandom(
CollUtil.newArrayList(
new WeightRandom.WeightObj<>("http://127.0.0.1:8080/app1", 0.5),
new WeightRandom.WeightObj<>("http://127.0.0.1:8080/app2", 0.5)
)
);
@Override
public Object[] invoke(Map<String, Object> req) throws IOException {
String myhost = weightApp.next();
NginxClojureRT.log.info("随机访问:" + myhost);
// 用setVariable方法设置myhost变量的值,这个myhost在这个location中被定义,跳转的时候就用这个值作为path
((NginxJavaRequest) req).setVariable("myhost", myhost);
// 返回PHASE_DONE之后,nginx-clojure框架就会执行proxy_pass逻辑,
// 如果返回的不是PHONE_DONE,nginx-clojure框架就把这个handler当做content handler处理
return PHASE_DONE;
}
容器实例创建
拉取jdk8版本的nginx-clojure
nginx:
image: lianlianyi/nginx_clojure:0.5.3_jdk8
networks:
- npc_net
volumes:
- ./etc/nginx_clojure/nginx.conf:/nginx/conf/nginx.conf
# 程序生成的demo.jar
- ./data/nginx_clojure/my_nginx_clojure-1.0-SNAPSHOT.jar:/nginx/jars/demo.jar
# demo.jar需要依赖的库(不是必须)
- ./data/nginx_clojure/hutool-all-5.8.0.M3.jar:/nginx/jars/hutool-all-5.8.0.M3.jar
ports:
- 80:8080
- 443:443
本文涉及demo代码
https://github.com/lianlianyi/toutiao_demo
猜你喜欢
- 2024-10-11 如何使用Nginx对Artifactory进行http应用
- 2024-10-11 IntelliJ IDEA必装插件以及SpringBoot使用小技巧合集
- 2024-10-11 WeCube 2.8.0 发布,一站式IT架构管理和运维工具
- 2024-10-11 Kong系列(三)——Kong插件「IP Restriction」使用
- 2024-10-11 RTMP和RTSP的区别(rtp rtmp区别)
- 2024-10-11 「开源资讯」njs 0.4.1 发布,nginx 的 JavaScript 脚本语言
- 2024-10-11 Nginx如何支持OpenTracing - Jaeger
- 2024-09-22 免费又好用的缓存插件,非Speed Optimizer莫属
- 2024-09-22 web中间件nginx性能分析与调优(nginx中间件怎么看版本号?)
- 2024-09-22 orange(3)插件功能分析(property_rate_limiting)
你 发表评论:
欢迎- 最近发表
-
- Win10 TH2正式版官方ESD映像转换ISO镜像方法详解
- 使用iso镜像升级到Windows 10的步骤
- macOS Ventura 13.2 (22D49) Boot ISO 原版可引导镜像
- 安利一个用ISO镜像文件制作引导U盘的的小工具RUFUS
- CentOS 7使用ISO镜像配置本地yum源
- 用于x86平台的安卓9.0 ISO镜像发布下载:通吃I/A/N、完全免费
- AlmaLinux 9.6发布:升级工具、初步支持IBM Power虚拟化技术
- Rufus写入工具简洁介绍与教程(写入模式)
- 新硬件也能安装使用了,Edge版Linux Mint 21.3镜像发布
- 开源工程师:Ubuntu应该抛弃32位ISO镜像
- 标签列表
-
- 下划线是什么 (87)
- 精美网站 (58)
- qq登录界面 (90)
- nginx 命令 (82)
- nginx .http (73)
- nginx lua (70)
- nginx 重定向 (68)
- Nginx超时 (65)
- nginx 监控 (57)
- odbc (59)
- rar密码破解工具 (62)
- annotation (71)
- 红黑树 (57)
- 智力题 (62)
- php空间申请 (61)
- 按键精灵 注册码 (69)
- 软件测试报告 (59)
- ntcreatefile (64)
- 闪动文字 (56)
- guid (66)
- abap (63)
- mpeg 2 (65)
- column (63)
- dreamweaver教程 (57)
- excel行列转换 (56)
本文暂时没有评论,来添加一个吧(●'◡'●)