callistaenterprise / goblog Goto Github PK
View Code? Open in Web Editor NEWCode samples for the Go microservice blog series
Home Page: https://callistaenterprise.se/blogg/teknik/2017/02/17/go-blog-series-part1/
License: MIT License
Code samples for the Go microservice blog series
Home Page: https://callistaenterprise.se/blogg/teknik/2017/02/17/go-blog-series-part1/
License: MIT License
I built it from the repo of java microservice blog series.
diff --git a/support/edge-server/build.gradle b/support/edge-server/build.gradle
index fdf0e12..af6f1fb 100644
--- a/support/edge-server/build.gradle
+++ b/support/edge-server/build.gradle
@@ -49,7 +49,8 @@ dependencies {
// compile("org.springframework.cloud:spring-cloud-starter-oauth2")
// compile("org.springframework.cloud:spring-cloud-starter-security")
- compile("se.callista.microservises:util:0.0.1-SNAPSHOT")
+ // compile("se.callista.microservises:util:0.0.1-SNAPSHOT")
+ compile files('libs/util-0.0.1-SNAPSHOT.jar')
testCompile('org.springframework.boot:spring-boot-starter-test')
}
In part 3, the service is running but I get below message when I do the curl
curl: (52) Empty reply from server
It will cause error when docker image building.
package tracing
import (
"context"
"fmt"
"net/http"
"github.com/opentracing/opentracing-go"
"github.com/opentracing/opentracing-go/ext"
zipkinot "github.com/openzipkin-contrib/zipkin-go-opentracing"
"github.com/openzipkin/zipkin-go"
zipkinhttp "github.com/openzipkin/zipkin-go/reporter/http"
"github.com/sirupsen/logrus"
)
// Tracer instance
var tracer opentracing.Tracer
// SetTracer can be used by unit tests to provide a NoopTracer instance. Real users should always
// use the InitTracing func.
func SetTracer(initializedTracer opentracing.Tracer) {
tracer = initializedTracer
}
// InitTracing connects the calling service to Zipkin and initializes the tracer.
func InitTracing(zipkinURL string, serviceName string) {
logrus.Infof("Connecting to zipkin server at %v", zipkinURL)
reporter := zipkinhttp.NewReporter(fmt.Sprintf("%s/api/v1/spans", zipkinURL))
endpoint, err := zipkin.NewEndpoint(serviceName, "127.0.0.1:0")
if err != nil {
logrus.Fatalf("unable to create local endpoint: %+v\n", err)
}
nativeTracer, err := zipkin.NewTracer(reporter, zipkin.WithLocalEndpoint(endpoint))
if err != nil {
logrus.Fatalf("unable to create tracer: %+v\n", err)
}
// use zipkin-go-opentracing to wrap our tracer
tracer = zipkinot.Wrap(nativeTracer)
logrus.Infof("Successfully started zipkin tracer for service '%v'", serviceName)
}
// StartHTTPTrace loads tracing information from an INCOMING HTTP request.
func StartHTTPTrace(r *http.Request, opName string) opentracing.Span {
carrier := opentracing.HTTPHeadersCarrier(r.Header)
clientContext, err := tracer.Extract(opentracing.HTTPHeaders, carrier)
if err == nil {
return tracer.StartSpan(
opName, ext.RPCServerOption(clientContext))
} else {
return tracer.StartSpan(opName)
}
}
// MapToCarrier converts a generic map to opentracing http headers carrier
func MapToCarrier(headers map[string]interface{}) opentracing.HTTPHeadersCarrier {
carrier := make(opentracing.HTTPHeadersCarrier)
for k, v := range headers {
// delivery.Headers
carrier.Set(k, v.(string))
}
return carrier
}
// CarrierToMap converts a TextMapCarrier to the amqp headers format
func CarrierToMap(values map[string]string) map[string]interface{} {
headers := make(map[string]interface{})
for k, v := range values {
headers[k] = v
}
return headers
}
// StartTraceFromCarrier extracts tracing info from a generic map and starts a new span.
func StartTraceFromCarrier(carrier map[string]interface{}, spanName string) opentracing.Span {
clientContext, err := tracer.Extract(opentracing.HTTPHeaders, MapToCarrier(carrier))
var span opentracing.Span
if err == nil {
span = tracer.StartSpan(
spanName, ext.RPCServerOption(clientContext))
} else {
span = tracer.StartSpan(spanName)
}
return span
}
// AddTracingToReq adds tracing information to an OUTGOING HTTP request
func AddTracingToReq(req *http.Request, span opentracing.Span) {
carrier := opentracing.HTTPHeadersCarrier(req.Header)
err := tracer.Inject(
span.Context(),
opentracing.HTTPHeaders,
carrier)
if err != nil {
panic("Unable to inject tracing context: " + err.Error())
}
}
// AddTracingToReqFromContext adds tracing information to an OUTGOING HTTP request
func AddTracingToReqFromContext(ctx context.Context, req *http.Request) {
if ctx.Value("opentracing-span") == nil {
return
}
carrier := opentracing.HTTPHeadersCarrier(req.Header)
err := tracer.Inject(
ctx.Value("opentracing-span").(opentracing.Span).Context(),
opentracing.HTTPHeaders,
carrier)
if err != nil {
panic("Unable to inject tracing context: " + err.Error())
}
}
func AddTracingToTextMapCarrier(span opentracing.Span, val opentracing.TextMapCarrier) error {
return tracer.Inject(span.Context(), opentracing.TextMap, val)
}
// StartSpanFromContext starts a span.
func StartSpanFromContext(ctx context.Context, opName string) opentracing.Span {
span := ctx.Value("opentracing-span").(opentracing.Span)
child := tracer.StartSpan(opName, ext.RPCServerOption(span.Context()))
return child
}
// StartChildSpanFromContext starts a child span from span within the supplied context, if available.
func StartChildSpanFromContext(ctx context.Context, opName string) opentracing.Span {
if ctx.Value("opentracing-span") == nil {
return tracer.StartSpan(opName, ext.RPCServerOption(nil))
}
parent := ctx.Value("opentracing-span").(opentracing.Span)
child := tracer.StartSpan(opName, opentracing.ChildOf(parent.Context()))
return child
}
// StartSpanFromContextWithLogEvent starts span from context with logevent
func StartSpanFromContextWithLogEvent(ctx context.Context, opName string, logStatement string) opentracing.Span {
span := ctx.Value("opentracing-span").(opentracing.Span)
child := tracer.StartSpan(opName, ext.RPCServerOption(span.Context()))
child.LogEvent(logStatement)
return child
}
// CloseSpan logs event finishes span.
func CloseSpan(span opentracing.Span, event string) {
span.LogEvent(event)
span.Finish()
}
// LogEventToOngoingSpan extracts span from context and adds LogEvent
func LogEventToOngoingSpan(ctx context.Context, logMessage string) {
if ctx.Value("opentracing-span") != nil {
ctx.Value("opentracing-span").(opentracing.Span).LogEvent(logMessage)
}
}
// UpdateContext updates the supplied context with the supplied span.
func UpdateContext(ctx context.Context, span opentracing.Span) context.Context {
return context.WithValue(ctx, "opentracing-span", span)
}
Hello, when I execute the command
docker service scale accountservice=3
,
use the curl $ManagerIP:6767/accounts/10000
command to verify that all the same ip is returned to the service without seeing the ip transform. effect...
use command:
docker service inspect $service
docker inspect $container
diff --git a/support/edge-server/src/main/resources/application.yml b/support/edge-server/src/main/resources/application.yml
index e8ad250..ac54d54 100644
--- a/support/edge-server/src/main/resources/application.yml
+++ b/support/edge-server/src/main/resources/application.yml
@@ -87,20 +87,6 @@ endpoints:
health:
sensitive: false
-zuul:
- ignoredServices: "*"
- prefix: /api
- routes:
-# securedaccountservice:
-# path: /secured/account/**
-# url: http://securityservice:6666/account
- accountservice:
- path: /accounts/**
- url: http://accountservice:6767/accounts
- accountservicehealth:
- path: /accounts/health
- url: http://accountservice:6767/health
-
logging:
level:
ROOT: DEBUG
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.