业务需求比较简单,就是希望在本地开发环境测试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