OpenResty从入门到开发一个网关服务(使用etcd作为注册中心)
简介
OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器。它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项。
通过揉和众多设计良好的 Nginx 模块,OpenResty 有效地把 Nginx 服务器转变为一个强大的 Web 应用服务器,基于它开发人员可以使用 Lua 编程语言对 Nginx 核心以及现有的各种 Nginx C 模块进行脚本编程,构建出可以处理一万以上并发请求的极端高性能的 Web 应用。
ngx_openresty 目前有两大应用目标:
- 通用目的的 web 应用服务器。在这个目标下,现有的 web 应用技术都可以算是和 OpenResty 或多或少有些类似,比如 Nodejs, PHP 等等。ngx_openresty 的性能(包括内存使用和 CPU 效率)算是最大的卖点之一。
- Nginx 的脚本扩展编程,用于构建灵活的 Web 应用网关和 Web 应用防火墙。有些类似的是 NetScaler。其优势在于 Lua 编程带来的巨大灵活性。
引用自:OpenResty最佳实践
入门教程
- OpenResty 最佳实践
- 跟我学OpenResty(Nginx+Lua)开发
目前已经有大佬写了很完整的教程,没有必要重复造轮子了,我觉得这两个是最好的。更多openresty相关资料可以看这里https://blog.fengjx.com/awesome/#lua--openresty
网关服务开发
整体架构
服务启动时,将自己的节点信息注册到etcd,包括:服务名称、ip、端口
网关服务从etcd监听服务节点信息变更,保存到缓存中,从客户端请求的url中提取服务名称,通过服务名称查找节点信息,将请求转发到后端服务
> 关于etcd的使用,这里不再阐述
url规范
- 对外api前缀:
/open/api/service_name/ www.jinniuylziz.cn **,后端服务路由:/open/api/** - 对内api前缀:
/inner/api/service_name/ www.tianjiptzc.cn **,后端服务路由:/**
例如/open/api/user/fav会转发到user服务的/open/api/fav接口;/inner/api/user/info会转发到user服务的/info接口。通过url规范我们就能很轻易的做api鉴权,而不需要将对外api和对内api部署成2个服务(当然也要考虑实际情况,是否符合实际项目要求)。
源码解析
github: https://github.com/fengjx/resty-gateway
init_by_lua_file
www.muyuyulept.com
"lua/init.lua"
初始化项目配置
init_worker_by_lua_file www.yixingxzc.cn "lua/init_worker.lua"
初始化服务发现组件,监听服务节点变更信息
rewrite_by_lua_file 'lua/rewrite.lua'
- 生成requestId,方便链路跟踪和问题排查
- 解析请求服务名称
- 重写后端请求url,去掉服务名
access_by_lua_file www.yixingyule7.com 'lua/gateway.lua'
通过服务发现组件查询服务节点信息
balancer_by_lua_file 'lua/server_www.niujinzc.cn rr.lua'
通过查询到的节点信息,轮训其中一个节点,将请求转发到后端服务
user.conf
模拟用户服务
auth.conf
模拟认证服务
运行测试
安装openresty: http://www.xxinyoupt.cn openresty.org/cn/installation.html
启动服务
git clone https://github.com/fengjx/resty-gateway.git
cd resty-gateway
# -g 'daemon off;是在前台运行,如果想后台运行可以去掉
openresty -p `pwd` -c conf/nginx.conf -g 'daemon off;'
向etcd注册节点信息,当然实际情况是在服务启动的时候自动注册的,这里为了测试,手动模拟的服务注册过程
# 注册user服务
etcdctl put /micros/service/user/127.0.0.1:1024 1
etcdctl put /micros/service/user/127.0.0.1:1025 1
# 注册auth服务
etcdctl put /micros/service/auth/127.0.0.1:1026 1
etcdctl put /micros/service/auth/127.0.0.1:1027 1
发送http请求
# 测试auth服务
curl http://localhost:10000/open/api/auth/login
curl http://localhost:10000/inner/api/auth/has-login
# 测试user服务
curl http://localhost:10000/inner/api/user/fav
curl http://localhost:10000/inner/api/user/info
todo
- [x] 服务发现,动态路由
- [x] 自动生成requestId,方便链路跟踪
- [ ] 动态ip防火墙
- [ ] 限流器
- [ ] 用户登录认证
- [ ] 接口协议加解密
OpenResty从入门到开发一个网关服务(使用etcd作为注册中心)的更多相关文章
- 适合新手:从零开发一个IM服务端(基于Netty,有完整源码)
本文由“yuanrw”分享,博客:juejin.im/user/5cefab8451882510eb758606,收录时内容有改动和修订. 0.引言 站长提示:本文适合IM新手阅读,但最好有一定的网络 ...
- 一个网关服务性能问题的Dump分析
本篇文章分为三部分,首先简单介绍一下分析的工具Windbg,其次针对一个网关服务性能问题进行逐步刨析,最后针对性能问题的分析总结. 一 Windbg介绍 1.Windbg是个非常强大的调试器,它设计了 ...
- 基于SpringBoot开发一个Restful服务,实现增删改查功能
前言 在去年的时候,在各种渠道中略微的了解了SpringBoot,在开发web项目的时候是如何的方便.快捷.但是当时并没有认真的去学习下,毕竟感觉自己在Struts和SpringMVC都用得不太熟练. ...
- 【spring cloud】一个ms微服务想要给注册中心eureka发现,需要满足这些条件,微服务不能被eureka注册中心发现的解决方案
在spring cloud中,一个新的微服务想要被注册中心发现,需要注意几个地方: 1.pom.xml文件依赖中需要有这个依赖 spring boot 2.x 需要这个依赖 <dependenc ...
- 微服务系列之 Consul 注册中心
原文链接:https://mrhelloworld.com/posts/spring/spring-cloud/consul-service-registry/ Netflix Eureka 2.X ...
- spring cloud系列教程第八篇-修改服务名称及获取注册中心注册者的信息
spring cloud系列教程第八篇-修改服务名称及获取注册中心注册者的信息 本文主要内容: 1:管理页面主机名及访问ip信息提示修改 2:获取当前注册中心的服务列表及每个服务对于的服务提供者列表 ...
- spring cloud 入门,看一个微服务框架的「五脏六腑」
Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 注:Spring Boot 简单理解就是简化 Spring 项目的搭建.配置.组 ...
- Spring Cloud 微服务一:Consul注册中心
Consul介绍 Consul is a service mesh solution providing a full featured control plane with service disc ...
- SpringCloud(一)之微服务核心组件Eureka(注册中心)的介绍和使用
一 Eureka服务治理体系1.1 服务治理服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现. Spring Cloud Eureka是Spring Clou ...
随机推荐
- redis配置文件中常用配置详解
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/suprezheng/article/de ...
- pip install .whl文件时is not a supported wheel on this platform.解决方法
首先,在python中输入import pip和print(pip.pep425tags.get_supported()),从而获取pip支持的文件名和版本. somnus@somnus-HP-Pa ...
- MongoDB 监控指标
MongoDB uptime 启动时长 asserts.user 用户的断言数量 asserts.warning 警告的断言数量 connections.current 当前的连接数 大于 650co ...
- 123.ModelForm的使用
ModelForm 在我们的实例中,需要通过models.py中定义相关的模型字段,之后在forms.py中同样需要定义每个字段进行相应的验证,这样的话,我们会需要重复定义,这样的话,就相对比较麻烦, ...
- 016、MySQL取本年第一季度开始日期
#取第1季度开始日期 SELECT date_add( dy, INTERVAL ( ) MONTH ) dy FROM ( ) dy ) x ; 效果如下: 不忘初心,如果您认为这篇文章有价值,认同 ...
- JAVA笔记01 变量的取名
第2章 有意义的命名2.1 介绍2.2 名副其实 变量名太随意,haha.list1.ok 这些都没啥意义2.3 避免误导 包含List等关键字.字母o与数字0等2.4 做有意义的区分 反面教材,变量 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-fast-forward
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- S7-300 实训3 异步电机正反转控制
含有视频 方便以后查阅 参考书籍 跟我动手学 S7-300/400 PLC 第2版 廖常初 主编 实训3 异步电动机 正反转控制 步骤1 步骤2 在 cycle execution 前方 右击 插入 ...
- wireshark混杂模式
来自:https://blog.csdn.net/mukami0621/article/details/78645825 通过设置网卡为混杂模式就能捕获局域网内所有发包内容,包括非广播包和非发给自己主 ...
- UVA - 122 Trees on the level (二叉树的层次遍历)
题意:给定结点值和从根结点到该结点的路径,若根到某个叶结点路径上有的结点输入中未给出或给出超过一次,则not complete,否则层次遍历输出所有结点. 分析:先建树,建树的过程中,沿途结点都申请了 ...