Időnként azóta is előveszem a Go t, most épp az egyik tervezett melóhelyi átállás adta az ötletet a következő játékhoz.
Van egy solr core-unk és egy nodejs microservice-ünk, amik ugyanazokat az adatokat tárolják, csak picit máshogy, és másutt is használjuk őket. Ezt akarjuk kiváltani egyetlen kibővített core-ral, ami mindkét célra alkalmas.
A configot az ini csomaggal olvasom:
cfg , err = ini . LoadSources ( ini . LoadOptions {},
"/etc/icom/settings_locationserver.ini" )
if err != nil {
panic ( err )
}
A solr csomag felett meg van egy saját wrapperem, ami összeállít és megfuttat egy queryt:
func ( sc SolrClient ) simpleQuery ( q string , rows int )
* solr . SelectResponse {
query := solr . Query {
Params : solr . URLParamMap {
"q" : [] string { q },
},
Rows : rows ,
}
res , err := sc . connection . Select ( & query )
if err != nil {
log . Printf ( "solr error: %s \n " , err )
}
return res
}
Ezzel az ID szerinti lekérdezés ilyen egyszerű:
func ( sc SolrClient ) FindById ( id int )
( map [ string ] interface {}, bool ) {
res := sc . simpleQuery ( "location_id:" + strconv . Itoa ( id ), 1 )
if res . Results . Len () == 0 {
return nil , false
}
return res . Results . Get ( 0 ) . Fields , true
}
mert az ID saját forrásból jön (mysql auto_inc mező).
Ezekkel a http requestet megoldjuk pár sorral:
func returnJson ( w http . ResponseWriter , data interface {}) {
w . Header () . Set ( "Content-Type" , "application/json" )
err := json . NewEncoder ( w ) . Encode ( data )
if err != nil {
log . Fatal ( err )
}
}
func getLocationById ( w http . ResponseWriter , r * http . Request ,
ps httprouter . Params ) {
id , _ := strconv . Atoi ( ps . ByName ( "id" ))
location , found := solrClient . FindById ( id )
if ! found {
w . WriteHeader ( 404 )
return
}
returnJson ( w , location )
}