草庐IT

ssl - 获取网络/http : TLS handshake timeout when run golang app on docker container host

coder 2023-06-28 原文

这是我的代码:

func Login(w http.ResponseWriter, r *http.Request) {
    fmt.Println("Login prccessing")
    email := r.FormValue("email")
    password := r.FormValue("password")
    fmt.Println(email + password)
    var netTransport = &http.Transport{
        Dial: (&net.Dialer{
            Timeout: 50 * time.Second,
        }).Dial,
        TLSHandshakeTimeout: 50 * time.Second,
    }
    var netClient = &http.Client{
        Timeout:   time.Second * 50,
        Transport: netTransport,
    }
    res, err := netClient.Get("https://account.sloppy.zone/accounts/" + email)
    if err != nil {
        fmt.Println(err.Error())
        http.Redirect(w, r, "/", http.StatusSeeOther)
    }

    responeData, errs := ioutil.ReadAll(res.Body)
    fmt.Println(string(responeData))
    if errs != nil {
        log.Fatal(errs)
    }
    var info LoginInfo
    json.Unmarshal(responeData, &info)
    if email == info.Id && password == info.Password {
        http.Redirect(w, r, "/manager", http.StatusSeeOther)
    } else {
        http.Redirect(w, r, "/", http.StatusSeeOther)
    }
}

我正在尝试运行使用 docker 容器化的服务并将其部署在 docker 容器主机 (sloppy.io) 上,此服务调用另一个服务(帐户服务)以从该服务获取帐户和密码并通过用户输入验证它们在同一台主机上。问题是当我登录到我的页面时,出现 502 Bad Gateway。跟踪日志我看到错误:TLS 握手超时。

我该如何解决这个问题?

最佳答案

由于您的 golang 应用程序依赖于帐户服务,因此您应该在您的设置中定义此依赖项并使用 docker 的网络功能连接这两个服务。这样做还将使您能够以 docker swarm 或在另一个可扩展的集群基础设施(如 sloppy.io)中运行任意数量的实例。

这还有一个好处,就是您无需向公众公开您的后端(帐户服务)。

您可以使用 docker-compose 或 sloppy.io 的命令行界面来构建和运行您的应用程序。草率的配置文件与 docker-compose.yml 文件非常相似。参见 http://kb.sloppy.io/features/connecting-containers

这里是一个示例配置为 sloppy.yml

version: "v1"
project: "myproject"
services:
  frontend:
    golang_service:
      dependencies:
        - "../backend/account_service"
      domain: "//my_golang_service.sloppy.zone"
      env:
        - ACCOUNT_HOST: "account_service.backend.myproject"
      image: "dockerhub_username/golang_service:1.0.0"
      port: 80
  backend:
    account_service:
      image: "dockerhub_username/account_service:1.0.0"

这只是基本配置。您可能想要添加卷和环境变量。如果您已有现有的 docker-compose.yml,则可以使用 sloppose ( github.com/sloppyio/sloppose) 将其转换为 sloppy.yml。

关于ssl - 获取网络/http : TLS handshake timeout when run golang app on docker container host,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45786562/

有关ssl - 获取网络/http : TLS handshake timeout when run golang app on docker container host的更多相关文章

  1. ruby - 如何模拟 Net::HTTP::Post? - 2

    是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

  2. ruby - 简单获取法拉第超时 - 2

    有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url

  3. ruby - 从 Ruby 中的主机名获取 IP 地址 - 2

    我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge

  4. ruby - 获取模块中定义的所有常量的值 - 2

    我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c

  5. ruby-on-rails - 获取 inf-ruby 以使用 ruby​​ 版本管理器 (rvm) - 2

    我安装了ruby​​版本管理器,并将RVM安装的ruby​​实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby​​。有没有办法让emacs像shell一样尊重ruby​​的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el

  6. ruby - 用 Ruby 编写一个简单的网络服务器 - 2

    我想在Ruby中创建一个用于开发目的的极其简单的Web服务器(不,不想使用现成的解决方案)。代码如下:#!/usr/bin/rubyrequire'socket'server=TCPServer.new('127.0.0.1',8080)whileconnection=server.acceptheaders=[]length=0whileline=connection.getsheaders想法是从命令行运行这个脚本,提供另一个脚本,它将在其标准输入上获取请求,并在其标准输出上返回完整的响应。到目前为止一切顺利,但事实证明这真的很脆弱,因为它在第二个请求上中断并出现错误:/usr/b

  7. Ruby 从大范围中获取第 n 个项目 - 2

    假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit

  8. ruby - Net::HTTP 获取源代码和状态 - 2

    我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

  9. ruby - 没有类方法获取 Ruby 类名 - 2

    如何在Ruby中获取BasicObject实例的类名?例如,假设我有这个:classMyObjectSystem我怎样才能使这段代码成功?编辑:我发现Object的实例方法class被定义为returnrb_class_real(CLASS_OF(obj));。有什么方法可以从Ruby中使用它? 最佳答案 我花了一些时间研究irb并想出了这个:classBasicObjectdefclassklass=class这将为任何从BasicObject继承的对象提供一个#class您可以调用的方法。编辑评论中要求的进一步解释:假设你有对象

  10. ruby-on-rails - 如何在 Gem 中获取 Rails 应用程序的根目录 - 2

    是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在

随机推荐