func ExampleLBClient() { // Requests will be spread among these servers. servers := []string{ "google.com:80", "foobar.com:8080", "127.0.0.1:123", } // Prepare clients for each server var lbc fasthttp.LBClient for _, addr := range servers { c := &fasthttp.HostClient{ Addr: addr, } lbc.Clients = append(lbc.Clients, c) } // Send requests to load-balanced servers var req fasthttp.Request var resp fasthttp.Response for i := 0; i < 10; i++ { url := fmt.Sprintf("http://abcedfg/foo/bar/%d", i) req.SetRequestURI(url) if err := lbc.Do(&req, &resp); err != nil { log.Fatalf("Error when sending request: %s", err) } if resp.StatusCode() != fasthttp.StatusOK { log.Fatalf("unexpected status code: %d. Expecting %d", resp.StatusCode(), fasthttp.StatusOK) } useResponseBody(resp.Body()) } }
func (c *Client) run() { var resp fasthttp.Response r := new(fasthttp.Request) c.request.CopyTo(r) for range c.Jobsch { s := time.Now() err := c.Do(r, &resp) if err != nil { if err == fasthttp.ErrTimeout { timeouts.Inc() } errors.Inc() c.withErrorMessage(err.Error()).Inc() } sc := resp.StatusCode() if c.successStatusCode == sc { requestSuccess.Inc() } c.withStatusCode(sc).Inc() requestDuration.Observe(float64(time.Since(s).Seconds())) requestSum.Inc() } }
func fetchFromUpstream(h *fasthttp.RequestHeader, key []byte) *ybc.Item { upstreamUrl := fmt.Sprintf("%s://%s%s", *upstreamProtocol, *upstreamHost, h.RequestURI()) var req fasthttp.Request req.SetRequestURI(upstreamUrl) var resp fasthttp.Response err := upstreamClient.Do(&req, &resp) if err != nil { logRequestError(h, "Cannot make request for [%s]: [%s]", key, err) return nil } if resp.StatusCode() != fasthttp.StatusOK { logRequestError(h, "Unexpected status code=%d for the response [%s]", resp.StatusCode(), key) return nil } contentType := string(resp.Header.ContentType()) if contentType == "" { contentType = "application/octet-stream" } body := resp.Body() contentLength := len(body) itemSize := contentLength + len(contentType) + 1 txn, err := cache.NewSetTxn(key, itemSize, ybc.MaxTtl) if err != nil { logRequestError(h, "Cannot start set txn for response [%s], itemSize=%d: [%s]", key, itemSize, err) return nil } if err = storeContentType(h, txn, contentType); err != nil { txn.Rollback() return nil } n, err := txn.Write(body) if err != nil { logRequestError(h, "Cannot read response [%s] body with size=%d to cache: [%s]", key, contentLength, err) txn.Rollback() return nil } if n != contentLength { logRequestError(h, "Unexpected number of bytes copied=%d from response [%s] to cache. Expected %d", n, key, contentLength) txn.Rollback() return nil } item, err := txn.CommitItem() if err != nil { logRequestError(h, "Cannot commit set txn for response [%s], size=%d: [%s]", key, contentLength, err) return nil } atomic.AddInt64(&stats.BytesReadFromUpstream, int64(n)) return item }
func runRequests(b *testing.B, pb *testing.PB, c *fasthttp.HostClient) { var req fasthttp.Request req.SetRequestURI("http://foo.bar/baz") var resp fasthttp.Response for pb.Next() { if err := c.Do(&req, &resp); err != nil { b.Fatalf("unexpected error: %s", err) } if resp.StatusCode() != fasthttp.StatusOK { b.Fatalf("unexpected status code: %d. Expecting %d", resp.StatusCode(), fasthttp.StatusOK) } } }