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 ...
随机推荐
- Android的事件处理机制之基于回调的事件处理
回调机制 如果说事件监听机制是一种委托式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源与事件监听器是统一的,换种方法说事件监听器完全消失了,当用户在GUI组件上激发某个事件 ...
- Golang gin开源实例——表设计
UML Model 基本模型定义 type Model struct { ID int `gorm:"primary_key" json:"id"` Creat ...
- pig安装配置及实例
一.前提 1. hadoop集群环境配置好(本人hadoop版本:hadoop-2.7.3) 2. windows基础环境准备: jdk环境配置.esclipse环境配置 二.搭建pig环境 1.下载 ...
- python二维图像输出操作大全(非常全)!
//2019.07.141.matplotlib模块输出函数图像应用时主要用的是它的ptplot模块,因此在导入使用该模块时可以直接用以下语句:import matplotlib.pyplot as ...
- C#常用类库简介(二)
原文出处:http://blog.csdn.net/weiwenhp/article/details/8140503 C#常用类库简介(一)的地址 System与mscorlib这两个dll中的类库是 ...
- 从0开始自己配置一个vps虚拟服务器(1)
我前几年买的虚拟机都被我荒废了,我已经配置过很多遍了,但是从来没有真的用过.因为我前几个月之前又新买了一个便宜的服务,准备写新的东西.供应商pacificrack,真的很烂,一直断,控制面板还打不开, ...
- java时间差
以下代码没什么意义,只是记录 long mstart = System.nanoTime(); int mIndex = 0 ; for (int i = 0; i < 100000000; i ...
- Adapter之自定义Adapter
前言: 在我们写程序是经常会用到适配器,当系统自带的适配器不够用时即可自己定义适配器 正文: 因为我们用到的ListView视图所以我们先初始化ListView,在我们的主活动中添加如下代码 < ...
- 英语学习 - 进行时态的被动 ( be being done )
be being done 例: The story book was being read by him .
- Java多线程涉及的概念(3)
Java多线程涉及的概念 在理解进程和线程概念之前首选要对并发有一定的感性认识,如果服务器同一时间内只能服务于一个客户端,其他客户端都再那里傻等的话,可见其性能的低下估计会被客户骂出翔来,因此并发编程 ...