caddy & grpc(3) 为 caddy 添加一个 反向代理插件

caddy-grpc 为 caddy 添加一个 反向代理插件

项目地址:https://github.com/yhyddr/caddy-grpc


前言

上一次我们学习了如何在 Caddy 中扩展自己想要的插件。博客中只提供了大致框架。这一次,我们来根据具体插件 caddy-grpc 学习。

选取它的原因是,它本身是一个独立的应用,这里把它做成了一个 Caddy 的插件。或许你有进一步理解到 Caddy 的良好设计。

插件作用

该插件的目的与Improbable-eng/grpc-web/go/grpcwebproxy目的相同,但作为 Caddy 中间件插件而不是独立的Go应用程序。

而这个项目的作用又是什么呢?

这是一个小型反向代理,可以使用gRPC-Web协议支持现有的gRPC服务器并公开其功能,允许从浏览器中使用gRPC服务。
特征:

  • 结构化记录(就是 log 啦)代理请求到stdout(标准输出)
  • 可调试的 HTTP 端口(默认端口8080
  • Prometheus监视代理请求(/metrics在调试端点上)
  • Request(/debug/requests)和连接跟踪端点(/debug/events
  • TLS 1.2服务(默认端口8443):
    • 具有启用客户端证书验证的选项
  • 安全(纯文本)和TLS gRPC后端连接:
    • 使用可自定义的CA证书进行连接

其实意思就是,把这一个反向代理做到了 caddy 服务器的中间件中。

使用

在你需要的时候,可以通过

example.com 
grpc localhost:9090

第一行example.com是要服务的站点的主机名/地址。 第二行是一个名为grpc的指令,其中可以指定后端gRPC服务端点地址(即示例中的localhost:9090)。 (注意:以上配置默认为TLS 1.2到后端gRPC服务)

Caddyfile 语法

grpc backend_addr {
   
   
    backend_is_insecure 
    backend_tls_noverify
    backend_tls_ca_files path_to_ca_file1 path_to_ca_file2 
}

backend_is_insecure

默认情况下,代理将使用TLS连接到后端,但是如果后端以明文形式提供服务,则需要添加此选项

backend_tls_noverify

默认情况下,要验证后端的TLS。如果不要验证,则需要添加此选项

backend_tls_ca_files

用于验证后端证书的PEM证书链路径(以逗号分隔)。 如果为空,将使用 host 主机CA链。

源码

目录结构

caddy-grpc
├── LICENSE
├── README.md
├── proxy // 代理 grpc proxy 的功能实现
│   ├── DOC.md
│   ├── LICENSE.txt
│   ├── README.md
│   ├── codec.go
│   ├── director.go
│   ├── doc.go
│   └── handler.go
├── server.go // Handle 逻辑文件
└── setup.go // 安装文件

Setup.go

按照我们上次进行的 插件编写的顺序来看,如果不记得,请看:如何为 caddy 添加插件扩展

首先看 安装的 setup.go 文件

init func
func init() {
   
   
	caddy.RegisterPlugin("grpc", caddy.Plugin{
   
   
		ServerType: "http",
		Action:     setup,
	})
}

可以知道,该插件 注册的 是 http 服务器,名字叫 grpc

setup func

然后我们看到最重要的 setup 函数,刚才提到的使用方法中,负责分析 caddyfile 中的选项的正是它。它也会将分析到的 directive 交由 Caddy 的 controller 来配置自己这个插件

// setup configures a new server middleware instance.
func setup(c *caddy.Controller) error {
   
   
	for c.Next() {
   
   
		var s server

		if !c.Args(&s.backendAddr) {
   
    //loads next argument into backendAddr and fail if none specified
			return c.ArgErr()
		}

		tlsConfig := &tls.Config{
   
   }
		tlsConfig.MinVersion = tls.VersionTLS12

		s.backendTLS = tlsConfig
		s.backendIsInsecure = false

		//check for more settings in Caddyfile
		for c.NextBlock() {
   
   
			switch c.Val() {
   
   
			case<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值