使用正向proxy 连调部署在k8s 中的spring cloud 中的rest服务

业务需求比较简单,就是希望在本地开发环境测试k8s 中部署的spring cloud 服务

进行调试的几个问题

  • 网络不通
    因为容器有自己的网络,spring cloud 中注册的是容器ip,网络不通
  • 我们进行调试的服务不能注册到注册中心
    如果我们的服务注册到注册中心了,就会有流量访问,可能会影响线上业务,而且很多时候我们希望调整线上的服务
    基于trace 的模式不错,比如arthas,同时如果我们的日志输出比较全也不错,同时还需要一个比较好中心化存储方案

参考解决方案

  • 参考图

 

 

  • 说明
    client ide 会开发的电脑,我们需要运行的本地代码,local 为本地对应的一个版本,proxy 为一个正向代理服务(代码很简单,同时方法也很多,后边会介绍
    一个基于golang 的开发)remote 为部署在k8s 中的服务,同时proxy 分为了测试以及生产,类似的可以扩展。
    连调说明:
    我们需要本地直接访问部署在k8s 中的服务,同时也不想修改太多的配置,因为依赖注册中心,所以我们需要暴露一个注册中心的外部访问(nodeport
    就可以了)

代码参考修改

  • 本地服务不自动注册到注册中心
    Edgware 版本的支持autoRegister 可以解决我们的问题
 
@EnableDiscoveryClient(autoRegister = false)
  • 启动proxy
    如果为了调试我们可以通过maven 运行以及在spring boot plugin 添加jvm 参数解决
    maven 运行, 注意版本,不同的spring boot run 的jvm 参数可能不一样,此中配置所有的请求都会到我们部署在k8s 中的proxy
 
mvn clean -Pdev spring-boot:run -Drun.jvmArguments="-Djava.net.useSystemProxies=true -Dhttps.proxyHost=ip -Dhttps.proxyPort=port  -Dhttp.proxyHost=ip -Dhttp.proxyPort=port"

plugin 模式配置

 <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <jvmArguments>
                        -Dhttp.proxyHost=ip
                        -Dhttp.proxyPort=port
                    </jvmArguments>
                </configuration>
</plugin>
  • 说明
    如果不出问题,连调就可以了,但是关于eureka client 有一个问题,就是如果不是使用proxy 的模式,那我我们直接使用k8s service 模式
    是不能访问的,会有host 解析的问题,解决方法(通过nodeport),或者使用proxy 模式链接

proxy 代码

代码很简单,使用了golang 的一个包,同时我们基于nginx 配置正向代理(效果不是很好)以及ngx_http_proxy_connect_module 模块也可以实现

  • 代码
    很简单,就是几行代码就可以解决了
    go.mod
 
module mygoproxy
go 1.14
require github.com/elazarl/goproxy v0.0.0-20200809112317-0581fc3aee2d

main.go

package main
import (
    "log"
    "net/http"
    "github.com/elazarl/goproxy"
)
func main() {
    goproxy := goproxy.NewProxyHttpServer()
    goproxy.Verbose = true
    log.Fatal(http.ListenAndServe(":18080", goproxy))
}
 
 
  • dockerfile
FROM golang:1.14-alpine AS build-env
WORKDIR /go/src/app
RUN  /bin/sed -i 's,http://dl-cdn.alpinelinux.org,https://mirrors.aliyun.com,g' /etc/apk/repositories
ENV  GO111MODULE=on
ENV  GOPROXY=https://goproxy.cn
COPY go.mod  .
COPY go.sum  .
COPY main.go  .
RUN apk update && apk add git \
    && go build
FROM alpine:latest
WORKDIR /app
RUN  /bin/sed -i 's,http://dl-cdn.alpinelinux.org,https://mirrors.aliyun.com,g' /etc/apk/repositories
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*
COPY --from=build-env /go/src/app/mygoproxy /app/
EXPOSE 18080
CMD ["/app/mygoproxy"]

说明

以前也我写过一个基于nginx 正向代理访问k8s 服务的文章,这次是基于golang实现的一个正向代理,以上实现比较简单,暂时没有考虑安全的问题
实际上goproxy 是很强大的,可以灵活的配置

参考资料

https://github.com/chobits/ngx_http_proxy_connect_module
http://tengine.taobao.org/document_cn/proxy_connect_cn.html
https://github.com/elazarl/goproxy

posted on 2020-08-10 20:55  荣锋亮  阅读(687)  评论(0编辑  收藏  举报

导航