| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 | 
							- package main
 
- import (
 
- 	"context"
 
- 	"flag"
 
- 	"fmt"
 
- 	"github.com/longjoy/micro-go-course/section19/cargo/component"
 
- 	"github.com/longjoy/micro-go-course/section19/cargo/endpoint"
 
- 	"github.com/longjoy/micro-go-course/section19/cargo/transport"
 
- 	"net/http"
 
- 	"os"
 
- 	"os/signal"
 
- 	"syscall"
 
- 	"time"
 
- 	"github.com/go-kit/kit/log"
 
- 	"gopkg.in/mgo.v2"
 
- 	"github.com/longjoy/micro-go-course/section19/cargo/dao/inmem"
 
- 	"github.com/longjoy/micro-go-course/section19/cargo/dao/mongo"
 
- 	"github.com/longjoy/micro-go-course/section19/cargo/inspection"
 
- 	shipping "github.com/longjoy/micro-go-course/section19/cargo/model"
 
- 	"github.com/longjoy/micro-go-course/section19/cargo/service/booking"
 
- 	"github.com/longjoy/micro-go-course/section19/cargo/service/handling"
 
- )
 
- const (
 
- 	defaultPort       = "8080"
 
- 	defaultHost       = "localhost"
 
- 	defaultMongoDBURL = "mongodb://129.211.63.96:27117"
 
- 	defaultDBName     = "cargo"
 
- )
 
- func main() {
 
- 	var (
 
- 		port   = envString("PORT", defaultPort)
 
- 		addr   = envString("HOST", defaultHost)
 
- 		dburl  = envString("MONGODB_URL", defaultMongoDBURL)
 
- 		dbname = envString("DB_NAME", defaultDBName)
 
- 		//consulHost = flag.String("consul.host", "114.67.98.210", "consul server ip address")
 
- 		consulHost = flag.String("consul.host", "106.15.233.99", "consul server ip address")
 
- 		consulPort = flag.String("consul.port", "8500", "consul server port")
 
- 		serviceHost  = flag.String("service.host", addr, "service ip address")
 
- 		servicePort  = flag.String("service.port", port, "service port")
 
- 		mongoDBURL   = flag.String("db.url", dburl, "MongoDB URL")
 
- 		databaseName = flag.String("db.name", dbname, "MongoDB database name")
 
- 		inmemory     = flag.Bool("inmem", false, "use in-memory repositories")
 
- 	)
 
- 	flag.Parse()
 
- 	ctx := context.Background()
 
- 	var logger log.Logger
 
- 	logger = log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr))
 
- 	logger = log.With(logger, "ts", log.DefaultTimestampUTC)
 
- 	// Setup repositories
 
- 	var (
 
- 		cargos         shipping.CargoRepository
 
- 		locations      shipping.LocationRepository
 
- 		voyages        shipping.VoyageRepository
 
- 		handlingEvents shipping.HandlingEventRepository
 
- 	)
 
- 	if *inmemory {
 
- 		cargos = inmem.NewCargoRepository()
 
- 		locations = inmem.NewLocationRepository()
 
- 		voyages = inmem.NewVoyageRepository()
 
- 		handlingEvents = inmem.NewHandlingEventRepository()
 
- 	} else {
 
- 		session, err := mgo.Dial(*mongoDBURL)
 
- 		if err != nil {
 
- 			panic(err)
 
- 		}
 
- 		defer session.Close()
 
- 		session.SetMode(mgo.Monotonic, true)
 
- 		cargos, _ = mongo.NewCargoRepository(*databaseName, session)
 
- 		locations, _ = mongo.NewLocationRepository(*databaseName, session)
 
- 		voyages, _ = mongo.NewVoyageRepository(*databaseName, session)
 
- 		handlingEvents = mongo.NewHandlingEventRepository(*databaseName, session)
 
- 	}
 
- 	// Configure some questionable dependencies.
 
- 	var (
 
- 		handlingEventFactory = shipping.HandlingEventFactory{
 
- 			CargoRepository:    cargos,
 
- 			VoyageRepository:   voyages,
 
- 			LocationRepository: locations,
 
- 		}
 
- 		handlingEventHandler = handling.NewEventHandler(
 
- 			inspection.NewService(cargos, handlingEvents, nil),
 
- 		)
 
- 	)
 
- 	// Facilitate testing by adding some cargos.
 
- 	storeTestData(cargos)
 
- 	//fieldKeys := []string{"method"}
 
- 	var bs booking.Service
 
- 	bs = booking.NewService(cargos, locations, handlingEvents)
 
- 	bs = booking.NewLoggingService(log.With(logger, "component", "booking"), bs)
 
- 	var hs handling.Service
 
- 	hs = handling.NewService(handlingEvents, handlingEventFactory, handlingEventHandler)
 
- 	hs = handling.NewLoggingService(log.With(logger, "component", "handling"), hs)
 
- 	endpoints := &endpoint.CargoEndpoints{
 
- 		endpoint.MakeBookCargoEndpoint(bs),
 
- 		endpoint.MakeLoadCargoEndpoint(bs),
 
- 		endpoint.AssignCargoToRouteEndpoint(bs),
 
- 		endpoint.ChangeDestinationEndpoint(bs),
 
- 		endpoint.CargosEndpoint(bs),
 
- 		endpoint.LocationsEndpoint(bs),
 
- 		endpoint.RegisterHandlingEventEndpoint(hs),
 
- 	}
 
- 	r := transport.MakeHttpHandler(ctx, endpoints)
 
- 	//创建注册对象
 
- 	//TODO replace with pkg consul
 
- 	registar := component.Register(*consulHost, *consulPort, *serviceHost, *servicePort, logger)
 
- 	errs := make(chan error, 2)
 
- 	go func() {
 
- 		logger.Log("transport", "http", "address", servicePort, "msg", "listening")
 
- 		//启动前执行注册
 
- 		registar.Register()
 
- 		errs <- http.ListenAndServe(":"+*servicePort, r)
 
- 	}()
 
- 	go func() {
 
- 		c := make(chan os.Signal, 1)
 
- 		signal.Notify(c, syscall.SIGINT)
 
- 		errs <- fmt.Errorf("%s", <-c)
 
- 	}()
 
- 	error := <-errs
 
- 	//服务退出取消注册
 
- 	registar.Deregister()
 
- 	logger.Log("terminated", error)
 
- }
 
- func envString(env, fallback string) string {
 
- 	e := os.Getenv(env)
 
- 	if e == "" {
 
- 		return fallback
 
- 	}
 
- 	return e
 
- }
 
- func storeTestData(r shipping.CargoRepository) {
 
- 	test1 := shipping.NewCargo("FTL456", shipping.RouteSpecification{
 
- 		Origin:          shipping.AUMEL,
 
- 		Destination:     shipping.SESTO,
 
- 		ArrivalDeadline: time.Now().AddDate(0, 0, 7),
 
- 	})
 
- 	if _, err := r.Store(test1); err != nil {
 
- 		panic(err)
 
- 	}
 
- 	test2 := shipping.NewCargo("ABC123", shipping.RouteSpecification{
 
- 		Origin:          shipping.SESTO,
 
- 		Destination:     shipping.CNHKG,
 
- 		ArrivalDeadline: time.Now().AddDate(0, 0, 14),
 
- 	})
 
- 	if _, err := r.Store(test2); err != nil {
 
- 		panic(err)
 
- 	}
 
- }
 
 
  |