简介

OpenResty(也称为 ngx_openresty)是一个全功能的 Web 应用服务器。它打包了标准的 Nginx 核心,很多的常用的第三方模块,以及它们的大多数依赖项。

通过揉和众多设计良好的 Nginx 模块,OpenResty 有效地把 Nginx 服务器转变为一个强大的 Web 应用服务器,基于它开发人员可以使用 Lua 编程语言对 Nginx 核心以及现有的各种 Nginx C 模块进行脚本编程,构建出可以处理一万以上并发请求的极端高性能的 Web 应用。

ngx_openresty 目前有两大应用目标:

  1. 通用目的的 web 应用服务器。在这个目标下,现有的 web 应用技术都可以算是和 OpenResty 或多或少有些类似,比如 Nodejs, PHP 等等。ngx_openresty 的性能(包括内存使用和 CPU 效率)算是最大的卖点之一。
  2. Nginx 的脚本扩展编程,用于构建灵活的 Web 应用网关和 Web 应用防火墙。有些类似的是 NetScaler。其优势在于 Lua 编程带来的巨大灵活性。

引用自:OpenResty最佳实践

入门教程

  • OpenResty 最佳实践
  • 跟我学OpenResty(Nginx+Lua)开发

目前已经有大佬写了很完整的教程,没有必要重复造轮子了,我觉得这两个是最好的。更多openresty相关资料可以看这里https://blog.fengjx.com/awesome/#lua--openresty

网关服务开发

整体架构

服务启动时,将自己的节点信息注册到etcd,包括:服务名称、ip、端口

网关服务从etcd监听服务节点信息变更,保存到缓存中,从客户端请求的url中提取服务名称,通过服务名称查找节点信息,将请求转发到后端服务

> 关于etcd的使用,这里不再阐述

url规范

  1. 对外api前缀:/open/api/service_name/ www.jinniuylziz.cn **,后端服务路由:/open/api/**
  2. 对内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'

    1. 生成requestId,方便链路跟踪和问题排查
    2. 解析请求服务名称
    3. 重写后端请求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作为注册中心)的更多相关文章

  1. 适合新手:从零开发一个IM服务端(基于Netty,有完整源码)

    本文由“yuanrw”分享,博客:juejin.im/user/5cefab8451882510eb758606,收录时内容有改动和修订. 0.引言 站长提示:本文适合IM新手阅读,但最好有一定的网络 ...

  2. 一个网关服务性能问题的Dump分析

    本篇文章分为三部分,首先简单介绍一下分析的工具Windbg,其次针对一个网关服务性能问题进行逐步刨析,最后针对性能问题的分析总结. 一 Windbg介绍 1.Windbg是个非常强大的调试器,它设计了 ...

  3. 基于SpringBoot开发一个Restful服务,实现增删改查功能

    前言 在去年的时候,在各种渠道中略微的了解了SpringBoot,在开发web项目的时候是如何的方便.快捷.但是当时并没有认真的去学习下,毕竟感觉自己在Struts和SpringMVC都用得不太熟练. ...

  4. 【spring cloud】一个ms微服务想要给注册中心eureka发现,需要满足这些条件,微服务不能被eureka注册中心发现的解决方案

    在spring cloud中,一个新的微服务想要被注册中心发现,需要注意几个地方: 1.pom.xml文件依赖中需要有这个依赖 spring boot 2.x 需要这个依赖 <dependenc ...

  5. 微服务系列之 Consul 注册中心

    原文链接:https://mrhelloworld.com/posts/spring/spring-cloud/consul-service-registry/ Netflix Eureka 2.X ...

  6. spring cloud系列教程第八篇-修改服务名称及获取注册中心注册者的信息

    spring cloud系列教程第八篇-修改服务名称及获取注册中心注册者的信息 本文主要内容: 1:管理页面主机名及访问ip信息提示修改 2:获取当前注册中心的服务列表及每个服务对于的服务提供者列表 ...

  7. spring cloud 入门,看一个微服务框架的「五脏六腑」

    Spring Cloud 是一个基于 Spring Boot 实现的微服务框架,它包含了实现微服务架构所需的各种组件. 注:Spring Boot 简单理解就是简化 Spring 项目的搭建.配置.组 ...

  8. Spring Cloud 微服务一:Consul注册中心

    Consul介绍 Consul is a service mesh solution providing a full featured control plane with service disc ...

  9. SpringCloud(一)之微服务核心组件Eureka(注册中心)的介绍和使用

    一 Eureka服务治理体系1.1 服务治理服务治理是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册和发现. Spring Cloud Eureka是Spring Clou ...

随机推荐

  1. GetHub上很实用的几个Demo

    手机号匹配的正则表达式:https://github.com/VincentSit/ChinaMobilePhoneNumberRegex/blob/master/README-CN.md FEBS- ...

  2. MQTT 协议学习:000-有关概念入门

    背景 从本章开始,在没有特殊说明的情况下,文章中的MQTT版本均为 3.1.1. MQTT 协议是物联网中常见的协议之一,"轻量级物联网消息推送协议",MQTT同HTTP属于第七层 ...

  3. (转)浅谈 Linux 内核无线子系统

    前言 Linux 内核是如何实现无线网络接口呢?数据包是通过怎样的方式被发送和接收呢? 刚开始工作接触 Linux 无线网络时,我曾迷失在浩瀚的基础代码中,寻找具有介绍性的材料来回答如上面提到的那些高 ...

  4. windows清理命令

    总是有一些设备需要清理,第三方的软件有不可以安装,那么,就需要这两条命令来做: cleanmgr /sageset:99 #设置要被清理的东西 cleanmgr /sagerun:99 #执行清理操作 ...

  5. 08.swoole学习笔记--异步tcp客户端

    <?php //创建异步tcp客户端 $client=new swoole_client(SWOOLE_SOCK_TCP,SWOOLE_SOCK_ASYNC); //注册连接成功的回调函数 $c ...

  6. MVC 实例详解,蛮好的,适合新手

    https://blog.csdn.net/f627422467/article/category/6360437

  7. C# enable为false时不变颜色

            [System.Runtime.InteropServices.DllImport("user32.dll ")]         public static ex ...

  8. 十九、React UI框架Antd(Ant Design)的使用——及react Antd的使用 button组件 Icon组件 Layout组件 DatePicker日期组件

    一.Antd(Ant Design)的使用:引入全部Css样式 1.1 antd官网: https://ant.design/docs/react/introduce-cn 1.2 React中使用A ...

  9. DevOps - 与传统方式区别

    章节 DevOps – 为什么 DevOps – 与传统方式区别 DevOps – 优势 DevOps – 不适用 DevOps – 生命周期 DevOps – 与敏捷方法区别 DevOps – 实施 ...

  10. 标准C的标记化结构初始化语法

    1 struct file_operations { 2         struct module *owner; 3         loff_t (*llseek) (struct file * ...