• 使用正向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

  • 相关阅读:
    Javascript MVC学习杂记3
    Backbone.js 0.9.2 源码分析收藏
    Javascript MVC学习杂记2
    Javascript MVC学习杂记1
    C语言string.h中常用字符函数介绍
    10点网页设计要注意的细节
    js日期函数
    结合回调函数介绍下泛型函数
    【转载】互斥量和信号量的区别
    设计模式之Singleton
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/13472109.html
Copyright © 2020-2023  润新知