Skip to content

Commit

Permalink
fix:去掉故障兜底能力 & 增加自定义dci的功能 (#894)
Browse files Browse the repository at this point in the history
  • Loading branch information
andrewshan authored Jan 16, 2023
1 parent c20f539 commit 65fd429
Show file tree
Hide file tree
Showing 5 changed files with 70 additions and 55 deletions.
59 changes: 27 additions & 32 deletions apiserver/eurekaserver/applications.go
Original file line number Diff line number Diff line change
Expand Up @@ -140,45 +140,15 @@ func (a *ApplicationsBuilder) BuildApplications(oldAppsCache *ApplicationsRespCa
return constructResponseCache(newApps, instCount, false)
}

func filterLatestHealthyInstances(instances []*model.Instance) ([]*model.Instance, int) {
var out = make([]*model.Instance, 0, len(instances))
var healthyCount = 0
for _, instance := range instances {
if instance.Healthy() {
out = append(out, instance)
healthyCount++
continue
}
healthCheck := instance.HealthCheck()
if healthCheck == nil {
continue
}
modifySince := time.Since(instance.ModifyTime)
if modifySince < DefaultSelfPreservationDuration {
out = append(out, instance)
}
}
return out, healthyCount
}

func (a *ApplicationsBuilder) constructApplication(app *Application, instances []*model.Instance) {
if len(instances) == 0 {
return
}
app.StatusCounts = make(map[string]int)

var fallbackUnhealthy bool
var healthyCount int
instances, healthyCount = filterLatestHealthyInstances(instances)
if a.enableSelfPreservation && len(instances) > 0 {
if (healthyCount/len(instances))*100 < DefaultSelfPreservationPercent {
fallbackUnhealthy = true
}
}

// 转换时候要区分2种情况,一种是从eureka注册上来的,一种不是
for _, instance := range instances {
if !instance.Healthy() && !fallbackUnhealthy {
if !instance.Healthy() {
continue
}
instanceInfo := buildInstance(app.Name, instance.Proto, instance.ModifyTime.UnixNano()/1e6)
Expand Down Expand Up @@ -277,6 +247,8 @@ func (a *ApplicationsBuilder) buildDeltaApps(oldAppsCache *ApplicationsRespCache
func parseStatus(instance *api.Instance) string {
if instance.GetIsolate().GetValue() {
return StatusOutOfService
} else if !instance.GetHealthy().GetValue() {
return StatusDown
}
return StatusUp
}
Expand Down Expand Up @@ -422,7 +394,7 @@ func buildInstance(appName string, instance *api.Instance, lastModifyTime int64)
Name: dciName,
}
} else {
instanceInfo.DataCenterInfo = DefaultDataCenterInfo
instanceInfo.DataCenterInfo = buildDataCenterInfo()
}
parseLeaseInfo(instanceInfo.LeaseInfo, instance)
for metaKey, metaValue := range metadata {
Expand Down Expand Up @@ -458,6 +430,29 @@ func buildInstance(appName string, instance *api.Instance, lastModifyTime int64)
return instanceInfo
}

func buildDataCenterInfo() *DataCenterInfo {
customDciClass, ok1 := CustomEurekaParameters[CustomKeyDciClass]
customDciName, ok2 := CustomEurekaParameters[CustomKeyDciName]
if ok1 && ok2 {
return &DataCenterInfo{
Clazz: customDciClass,
Name: customDciName,
}
} else if ok1 && !ok2 {
return &DataCenterInfo{
Clazz: customDciClass,
Name: DefaultDciName,
}
} else if !ok1 && ok2 {
return &DataCenterInfo{
Clazz: DefaultDciClazz,
Name: customDciName,
}
} else {
return DefaultDataCenterInfo
}
}

func buildLocationInfo(instanceInfo *InstanceInfo, instance *api.Instance) {
var region string
var zone string
Expand Down
50 changes: 29 additions & 21 deletions apiserver/eurekaserver/applications_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -235,25 +235,33 @@ func mockGetUnhealthyInstances(namingServer service.DiscoverServer, svcId string
return retValue, uuid.NewString(), nil
}

// TestApplicationsBuilder_BuildApplicationsSelfPreservation test selfPreservation ability
func TestApplicationsBuilder_BuildApplicationsSelfPreservation(t *testing.T) {
doUnhealthyFunctionMock()
builder := &ApplicationsBuilder{
namespace: DefaultNamespace,
enableSelfPreservation: true,
}
appResCache := builder.BuildApplications(nil)
applications := appResCache.AppsResp.Applications.Application
assert.Equal(t, unhealthySvcCount, len(applications))
for _, application := range applications {
serviceName := svcName{
name: strings.ToLower(application.Name),
namespace: DefaultNamespace,
}
svc, ok := mockUnhealthyServices[serviceName]
assert.True(t, ok)
instances := application.Instance
mInstances := mockUnhealthyInstances[svc.ID]
assert.Equal(t, len(mInstances), len(instances))
}
// TestBuildDataCenterInfo test to build dci info
func TestBuildDataCenterInfo(t *testing.T) {
CustomEurekaParameters[CustomKeyDciClass] = "com.netflix.appinfo.AmazonInfo"
CustomEurekaParameters[CustomKeyDciName] = "testOwn"
dciInfo := buildDataCenterInfo()
assert.Equal(t, CustomEurekaParameters[CustomKeyDciClass], dciInfo.Clazz)
assert.Equal(t, CustomEurekaParameters[CustomKeyDciName], dciInfo.Name)
delete(CustomEurekaParameters, CustomKeyDciName)
dciInfo = buildDataCenterInfo()
assert.Equal(t, CustomEurekaParameters[CustomKeyDciClass], dciInfo.Clazz)
assert.Equal(t, DefaultDciName, dciInfo.Name)
delete(CustomEurekaParameters, CustomKeyDciClass)
CustomEurekaParameters[CustomKeyDciName] = "testOwn"
dciInfo = buildDataCenterInfo()
assert.Equal(t, DefaultDciClazz, dciInfo.Clazz)
assert.Equal(t, CustomEurekaParameters[CustomKeyDciName], dciInfo.Name)
delete(CustomEurekaParameters, CustomKeyDciName)
dciInfo = buildDataCenterInfo()
assert.Equal(t, DefaultDciClazz, dciInfo.Clazz)
assert.Equal(t, DefaultDciName, dciInfo.Name)
}

// TestBuildInstance test to build the instance
func TestBuildInstance(t *testing.T) {
CustomEurekaParameters[CustomKeyDciClass] = "com.netflix.appinfo.AmazonInfo"
svc := &model.Service{ID: "111", Name: "testInst0", Namespace: "test"}
instance := buildMockInstance(0, svc, true, "xxx.com", "yyyy.com")
instanceInfo := buildInstance(svc.Name, instance.Proto, 123345550)
assert.Equal(t, CustomEurekaParameters[CustomKeyDciClass], instanceInfo.DataCenterInfo.Clazz)
}
2 changes: 1 addition & 1 deletion apiserver/eurekaserver/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ const (
optionConnLimit = "connLimit"
optionTLS = "tls"
optionEnableSelfPreservation = "enableSelfPreservation"
optionCaseSensitive = "caseSensitive"
optionPeerNodesToReplicate = "peersToReplicate"
optionCustomValues = "customValues"
)

const (
Expand Down
2 changes: 1 addition & 1 deletion apiserver/eurekaserver/log.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,4 @@ import (
commonlog "github.com/polarismesh/polaris/common/log"
)

var log = commonlog.GetScopeOrDefaultByName(commonlog.NamingLoggerName)
var log = commonlog.GetScopeOrDefaultByName(commonlog.APIServerLoggerName)
12 changes: 12 additions & 0 deletions apiserver/eurekaserver/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,9 @@ const (
statusSuffix = "/status"

statusCodeHeader = utils.PolarisCode

CustomKeyDciClass = "dataCenterInfoClass"
CustomKeyDciName = "dataCenterInfoName"
)

var (
Expand All @@ -112,6 +115,8 @@ var (
Name: DefaultDciName,
}
DefaultCountryId = strconv.Itoa(DefaultCountryIdInt)

CustomEurekaParameters = make(map[string]string)
)

// EurekaServer is the Eureka server
Expand Down Expand Up @@ -225,6 +230,13 @@ func (h *EurekaServer) Initialize(ctx context.Context, option map[string]interfa
enableSelfPreservation = DefaultEnableSelfPreservation
}
h.enableSelfPreservation = enableSelfPreservation

if raw, _ := option[optionCustomValues].(map[interface{}]interface{}); raw != nil {
for k, v := range raw {
CustomEurekaParameters[k.(string)] = fmt.Sprintf("%v", v)
}
}
log.Infof("[EUREKA] custom eureka parameters: %v", CustomEurekaParameters)
return nil
}

Expand Down

0 comments on commit 65fd429

Please sign in to comment.