| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 | package serviceimport (	"context"	"encoding/json"	"errors"	"github.com/afex/hystrix-go/hystrix"	"github.com/longjoy/micro-go-course/section24/goods/common"	"io/ioutil"	"net/http"	"net/url")type GoodsDetailVO struct {	Id       string	Name     string	Comments common.CommentListVO}type Service interface {	GetGoodsDetail(ctx context.Context, id string) (GoodsDetailVO, error)}func NewGoodsServiceImpl() Service {	return &GoodsDetailServiceImpl{}}type GoodsDetailServiceImpl struct{}func (service *GoodsDetailServiceImpl) GetGoodsDetail(ctx context.Context, id string) (GoodsDetailVO, error) {	detail := GoodsDetailVO{Id: id, Name: "Name"}	var err error	commonResult, err := GetGoodsComments(id)	detail.Comments = commonResult.Detail	if err != nil {		return detail, err	}	return detail, nil}func GetGoodsComments(id string) (common.CommentResult, error) {	var result common.CommentResult	serviceName := "Comments"	err := hystrix.Do(serviceName, func() error {		requestUrl := url.URL{			Scheme:   "http",			Host:     "127.0.0.1" + ":" + "8081",			Path:     "/comments/detail",			RawQuery: "id=" + id,		}		resp, err := http.Get(requestUrl.String())		if err != nil {			return err		}		body, _ := ioutil.ReadAll(resp.Body)		jsonErr := json.Unmarshal(body, &result)		if jsonErr != nil {			return jsonErr		}		return nil	}, func(e error) error {		// 断路器打开时的处理逻辑,本示例是直接返回错误提示		return errors.New("Http errors!")	})	if err == nil {		return result, nil	} else {		return result, err	}}
 |