Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

script, front, admin #57

Merged
merged 11 commits into from
Sep 25, 2023
Merged
Show file tree
Hide file tree
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,10 @@ target/
.DS_Store
Thumbs.db

dubbo-admin-server/src/main/resources/public
dubbo-admin-server/target
dubbo-admin-ui/dist
dubbo-admin-ui/node
dubbo-admin-ui/node-modules

ui/dist
ui/node
ui/node-modules

coverage.txt

Expand Down
6 changes: 2 additions & 4 deletions .licenserc.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -73,10 +73,8 @@ header:
- '**/vendor/**'
- '**/go.sum'
- '**/addons/manifests/**'
- '**/cmd/ui/dist/**'
- '**/ui/public/echarts-en.min.js'
- '**/ui/tests/**'
- '**/dubbo-ui/**'
- '**/dubbo-ui/dist/**'
- '**/ui/**'
- '**/governance_config_mock.go'
- '**/templates/**'
- '**/testdata/**'
Expand Down
30 changes: 0 additions & 30 deletions .run/Admin.run.xml

This file was deleted.

17 changes: 9 additions & 8 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ FROM golang:1.20.1-alpine3.17 as builder
ARG TARGETOS
ARG TARGETARCH
ARG LDFLAGS
ARG PKGNAME
ARG BUILD

WORKDIR /go/src/github.com/apache/dubbo-kubernetes
Expand All @@ -40,20 +39,22 @@ RUN go mod download

# Copy the go source
COPY pkg pkg/
COPY cmd cmd/
COPY app app/
COPY api api/
COPY conf conf/

# Build
RUN env
RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -ldflags="${LDFLAGS}" -a -o ${PKGNAME} /go/src/github.com/apache/dubbo-kubernetes/cmd/${PKGNAME}/main.go
RUN CGO_ENABLED=0 GOOS=${TARGETOS:-linux} GOARCH=${TARGETARCH} go build -ldflags="${LDFLAGS}" -a -o dubbo-cp /go/src/github.com/apache/dubbo-kubernetes/app/dubbo-cp/main.go


FROM alpine:3.17
# Add tzdata package
RUN apk add --no-cache tzdata
# Set Timezone
FROM scratch

# Build
WORKDIR /
ARG PKGNAME
COPY --from=builder /go/src/github.com/apache/dubbo-kubernetes/${PKGNAME} .
COPY --from=builder /go/src/github.com/apache/dubbo-kubernetes/dubbo-cp .
COPY --from=builder /go/src/github.com/apache/dubbo-kubernetes/conf/admin.yml .
ENV ADMIN_CONFIG_PATH=./admin.yml

ENTRYPOINT ["./dubbo-cp", "run"]
155 changes: 52 additions & 103 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,8 @@ REGISTRY_USER_NAME?=""
REGISTRY_PASSWORD?=""

# Image URL to use all building/pushing image targets
DUBBO_ADMIN_IMG ?= "${REGISTRY}/${REGISTRY_NAMESPACE}/dubbo-admin:${GIT_VERSION}"
DUBBO_AUTHORITY_IMG ?= "${REGISTRY}/${REGISTRY_NAMESPACE}/dubbo-ca:${GIT_VERSION}"
DUBBO_ADMIN_UI_IMG ?= "${REGISTRY}/${REGISTRY_NAMESPACE}/dubbo-admin-ui:${GIT_VERSION}"
DUBBO_CP_IMG ?= "${REGISTRY}/${REGISTRY_NAMESPACE}/dubbo-cp:${GIT_VERSION}"
DUBBO_UI_IMG ?= "${REGISTRY}/${REGISTRY_NAMESPACE}/dubbo-ui:${GIT_VERSION}"
DUBBO_DUBBOCTL_BUILDX_DIR ?= "./bin/dubboctl"

# Get the currently used golang install path (in GOPATH/bin, unless GOBIN is set)
Expand All @@ -57,22 +56,19 @@ $(LOCALBIN):
mkdir -p $(LOCALBIN)

## Tool Binaries
KUSTOMIZE ?= $(LOCALBIN)/kustomize
CONTROLLER_GEN ?= $(LOCALBIN)/controller-gen
SWAGGER ?= $(LOCALBIN)/swag
GOLANG_LINT ?= $(LOCALBIN)/golangci-lint
GOFUMPT ?= $(LOCALBIN)/gofumpt


## Tool Versions
KUSTOMIZE_VERSION ?= v3.8.7
CONTROLLER_TOOLS_VERSION ?= v0.10.0
SWAGGER_VERSION ?= v1.16.1
GOLANG_LINT_VERSION ?= v1.52.2
GOFUMPT_VERSION ?= latest
## docker buildx support platform
PLATFORMS ?= linux/arm64,linux/amd64


##@ General

# The help target prints out all targets with their descriptions organized
Expand All @@ -92,17 +88,9 @@ help: ## Display this help.

##@ Development

.PHONY: manifests
manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects.
$(CONTROLLER_GEN) object:headerFile="hack/boilerplate.go.txt" crd:allowDangerousTypes=true webhook paths="./pkg/authority/apis/..." output:crd:artifacts:config=deploy/manifests

.PHONY: generate
generate: controller-gen ## Generate code containing DeepCopy, DeepCopyInto, and DeepCopyObject method implementations.
#$(CONTROLLER_GEN) object:headerFile="./hack/boilerplate.go.txt" crd:allowDangerousTypes=true paths="./..."

.PHONY: swagger
swagger: swagger-install ## Generate dubbo-admin swagger docs.
$(SWAGGER) init --parseDependency -d cmd/admin,pkg/admin -o hack/swagger
swagger: swagger-install ## Generate dubbocp swagger docs.
$(SWAGGER) init --parseDependency -d app/dubbo-cp,pkg/admin -o hack/swagger
@rm -f hack/swagger/docs.go hack/swagger/swagger.yaml

.PHONY: fmt
Expand All @@ -129,99 +117,80 @@ test: fmt vet ## Run all tests.

.PHONY: test-dubboctl
test-dubboctl: fmt vet ## Run tests for dubboctl
go test -coverprofile coverage.out -covermode=atomic github.com/apache/dubbo-kubernetes/pkg/dubboctl/...
go test -coverprofile coverage.out -covermode=atomic github.com/apache/dubbo-kubernetes/app/dubboctl/...

.PHONY: test-admin
test-admin: fmt vet ## Run tests for admin
go test -coverprofile coverage.out -covermode=atomic github.com/apache/dubbo-kubernetes/pkg/admin/...

.PHONY: test-authority
test-authority: fmt vet ## Run tests for authority
go test -coverprofile coverage.out -covermode=atomic github.com/apache/dubbo-kubernetes/pkg/authority/...
.PHONY: test-dubbocp
test-dubbocp: fmt vet ## Run tests for dubbo control-plane
go test -coverprofile coverage.out -covermode=atomic github.com/apache/dubbo-kubernetes/pkg/...


.PHONY: echoLDFLAGS
echoLDFLAGS:
@echo $(LDFLAGS)

.PHONY: build
build: build-admin build-authority build-dubboctl ## Build binary with the dubbo admin, authority, and dubboctl
build: build-dubbocp build-dubboctl ## Build binary with the dubbo control-plane and dubboctl

.PHONY: all
all: generate test build

.PHONY: build-admin
build-admin: ## Build binary with the dubbo admin.
CGO_ENABLED=0 GOOS=$(GOOS) go build -ldflags $(LDFLAGS) -o bin/admin cmd/admin/main.go
all: test build

.PHONY: build-authority
build-authority: ## Build binary with the dubbo authority.
CGO_ENABLED=0 GOOS=$(GOOS) go build -ldflags $(LDFLAGS) -o bin/authority cmd/authority/main.go
.PHONY: build-dubbocp
build-dubbocp: ## Build binary with the dubbo control plane.
CGO_ENABLED=0 GOOS=$(GOOS) go build -ldflags $(LDFLAGS) -o bin/dubbocp app/dubbo-cp/main.go

.PHONY: build-dubboctl
build-dubboctl: ## Build binary with the dubbo dubboctl.
CGO_ENABLED=0 GOOS=$(GOOS) go build -ldflags $(LDFLAGS) -o bin/dubboctl cmd/dubboctl/main.go
CGO_ENABLED=0 GOOS=$(GOOS) go build -ldflags $(LDFLAGS) -o bin/dubboctl app/dubboctl/main.go


.PHONY: build-ui
build-ui: ## Build the distribution of the admin ui pages.
docker build --build-arg LDFLAGS=$(LDFLAGS) --build-arg PKGNAME=dubbo-admin-ui -t ${DUBBO_ADMIN_UI_IMG} ./dubbo-admin-ui -o type=local,dest=./bin/build/dubbo-admin-ui
rm -f -R ./cmd/ui/dist/*
rm -f ./bin/build/dubbo-admin-ui/usr/share/nginx/html/50x.html
cp -R ./bin/build/dubbo-admin-ui/usr/share/nginx/html/* ./cmd/ui/dist/
rm -f -R ./bin/build/dubbo-admin-ui
build-ui: $(LOCALBIN)## Build the distribution of the dubbocp ui pages.
docker build --build-arg LDFLAGS=$(LDFLAGS) --build-arg PKGNAME=ui -t ${DUBBO_UI_IMG} ./ui
docker run -d --name dubbo-ui ${DUBBO_UI_IMG}
docker cp dubbo-ui:/usr/share/nginx/html/ $(LOCALBIN)/ui
rm -f -R ./app/dubbo-ui/dist/*
rm -f ./bin/ui/50x.html
mkdir -p ./app/dubbo-ui/dist
cp -R ./bin/ui/* ./app/dubbo-ui/dist/
rm -f -R ./bin/ui

.PHONY: image
image: image-admin image-authority image-admin-ui ## Build docker image with the dubbo admin, authority and admin-ui
image: image-dubbocp image-ui ## Build docker image with the dubbocp dubbo-ui

.PHONY: image-admin
image-admin: ## Build docker image with the dubbo admin.
docker build --build-arg LDFLAGS=$(LDFLAGS) --build-arg PKGNAME=admin -t ${DUBBO_ADMIN_IMG} .
.PHONY: image-dubbocp
image-dubbocp: ## Build docker image with the dubbocp.
docker build --build-arg LDFLAGS=$(LDFLAGS) --build-arg PKGNAME=dubbo-cp -t ${DUBBO_CP_IMG} .

.PHONY: image-authority
image-authority: ## Build docker image with the dubbo authority.
docker build --build-arg LDFLAGS=$(LDFLAGS) --build-arg PKGNAME=authority -t ${DUBBO_AUTHORITY_IMG} .

.PHONY: image-ui
image-ui: ## Build docker image with the dubbo admin ui.
docker build --build-arg LDFLAGS=$(LDFLAGS) --build-arg PKGNAME=dubbo-admin-ui -t ${DUBBO_ADMIN_UI_IMG} ./dubbo-admin-ui
image-ui: ## Build docker image with the dubbo ui.
docker build --build-arg LDFLAGS=$(LDFLAGS) --build-arg PKGNAME=dubbo-ui -t ${DUBBO_UI_IMG} ./ui



.PHONY: buildx
buildx: buildx-admin buildx-authority ## Build and push docker cross-platform image for the dubbo admin and authority
buildx: buildx-dubbocp ## Build and push docker cross-platform image for the dubbo control-plane


.PHONY: buildx-admin
buildx-admin: ## Build and push docker image with the dubbo admin for cross-platform support
.PHONY: buildx-dubbocp
buildx-dubbocp: ## Build and push docker image with the dubbo control plane for cross-platform support
# copy existing Dockerfile and insert --platform=${BUILDPLATFORM} into Dockerfile.cross, and preserve the original Dockerfile
sed -e '1 s/\(^FROM\)/FROM --platform=\$$\{BUILDPLATFORM\}/; t' -e ' 1,// s//FROM --platform=\$$\{BUILDPLATFORM\}/' Dockerfile > Dockerfile_admin.cross
- docker buildx create --name project-dubbo-admin-builder
docker buildx use project-dubbo-admin-builder
- docker buildx build --build-arg LDFLAGS=$(LDFLAGS) --build-arg PKGNAME=admin --push --platform=$(PLATFORMS) --tag ${DUBBO_ADMIN_IMG} -f Dockerfile_admin.cross .
#- docker buildx build --build-arg LDFLAGS=$(LDFLAGS) --build-arg PKGNAME=admin --output type=local,dest=./bin/buildx/dubbo-admin --platform=$(PLATFORMS) --tag ${DUBBO_ADMIN_IMG} -f Dockerfile_admin.cross .
- docker buildx rm project-dubbo-admin-builder
rm Dockerfile_admin.cross

.PHONY: buildx-authority
buildx-authority: ## Build and push docker image with the dubbo authority for cross-platform support
# copy existing Dockerfile and insert --platform=${BUILDPLATFORM} into Dockerfile.cross, and preserve the original Dockerfile
sed -e '1 s/\(^FROM\)/FROM --platform=\$$\{BUILDPLATFORM\}/; t' -e ' 1,// s//FROM --platform=\$$\{BUILDPLATFORM\}/' Dockerfile > Dockerfile_authority.cross
- docker buildx create --name project-dubbo-authority-builder
docker buildx use project-dubbo-authority-builder
- docker buildx build --build-arg LDFLAGS=$(LDFLAGS) --build-arg PKGNAME=authority --push --platform=$(PLATFORMS) --tag ${DUBBO_AUTHORITY_IMG} -f Dockerfile_authority.cross .
#- docker buildx build --build-arg LDFLAGS=$(LDFLAGS) --build-arg PKGNAME=authority --output type=local,dest=./bin/buildx/dubbo-authority --platform=$(PLATFORMS) --tag ${DUBBO_AUTHORITY_IMG} -f Dockerfile_authority.cross .
- docker buildx rm project-dubbo-authority-builder
rm Dockerfile_authority.cross
sed -e '1 s/\(^FROM\)/FROM --platform=\$$\{BUILDPLATFORM\}/; t' -e ' 1,// s//FROM --platform=\$$\{BUILDPLATFORM\}/' Dockerfile > Dockerfile_dubbocp.cross
- docker buildx create --name project-dubbo-cp-builder
docker buildx use project-dubbo-cp-builder
- docker buildx build --build-arg LDFLAGS=$(LDFLAGS) --push --platform=$(PLATFORMS) --tag ${DUBBO_CP_IMG} -f Dockerfile_dubbocp.cross .
- docker buildx rm project-dubbo-cp-builder
rm Dockerfile_dubbocp.cross

.PHONY: buildx-dubboctl
buildx-dubboctl: ## Build the dubboctl distribution for cross-platform support
@rm -f -R $(DUBBO_DUBBOCTL_BUILDX_DIR)
@mkdir $(DUBBO_DUBBOCTL_BUILDX_DIR)
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags $(LDFLAGS) -o $(DUBBO_DUBBOCTL_BUILDX_DIR)/linux/amd64/dubboctl cmd/dubboctl/main.go
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags $(LDFLAGS) -o $(DUBBO_DUBBOCTL_BUILDX_DIR)/linux/arm64/dubboctl cmd/dubboctl/main.go
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags $(LDFLAGS) -o $(DUBBO_DUBBOCTL_BUILDX_DIR)/darwin/amd64/dubboctl cmd/dubboctl/main.go
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags $(LDFLAGS) -o $(DUBBO_DUBBOCTL_BUILDX_DIR)/darwin/arm64/dubboctl cmd/dubboctl/main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags $(LDFLAGS) -o $(DUBBO_DUBBOCTL_BUILDX_DIR)/windows/amd64/dubboctl.exe cmd/dubboctl/main.go
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags $(LDFLAGS) -o $(DUBBO_DUBBOCTL_BUILDX_DIR)/linux/amd64/dubboctl app/dubboctl/main.go
CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags $(LDFLAGS) -o $(DUBBO_DUBBOCTL_BUILDX_DIR)/linux/arm64/dubboctl app/dubboctl/main.go
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags $(LDFLAGS) -o $(DUBBO_DUBBOCTL_BUILDX_DIR)/darwin/amd64/dubboctl app/dubboctl/main.go
CGO_ENABLED=0 GOOS=darwin GOARCH=arm64 go build -ldflags $(LDFLAGS) -o $(DUBBO_DUBBOCTL_BUILDX_DIR)/darwin/arm64/dubboctl app/dubboctl/main.go
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags $(LDFLAGS) -o $(DUBBO_DUBBOCTL_BUILDX_DIR)/windows/amd64/dubboctl.exe app/dubboctl/main.go

tar -cvzf $(DUBBO_DUBBOCTL_BUILDX_DIR)/dubboctl-${GIT_VERSION}-linux-amd64.tar.gz -C $(DUBBO_DUBBOCTL_BUILDX_DIR)/linux/amd64/ dubboctl
tar -cvzf $(DUBBO_DUBBOCTL_BUILDX_DIR)/dubboctl-${GIT_VERSION}-linux-arm64.tar.gz -C $(DUBBO_DUBBOCTL_BUILDX_DIR)/linux/arm64/ dubboctl
Expand All @@ -233,45 +202,25 @@ buildx-dubboctl: ## Build the dubboctl distribution for cross-platform support


.PHONY: push-images
push-images: push-image-admin push-image-ui push-image-authority
push-images: push-image-dubbocp push-image-ui

.PHONY: push-image-admin
push-image-admin: ## Push admin images.
.PHONY: push-image-dubbocp
push-image-dubbocp: ## Push dubbocp images.
ifneq ($(REGISTRY_USER_NAME), "")
docker login -u $(REGISTRY_USER_NAME) -p $(REGISTRY_PASSWORD) ${REGISTRY}
endif
docker push ${DUBBO_ADMIN_IMG}
docker push ${DUBBO_CP_IMG}

.PHONY: push-image-authority
push-image-authority: ## Push authority images.
ifneq ($(REGISTRY_USER_NAME), "")
docker login -u $(REGISTRY_USER_NAME) -p $(REGISTRY_PASSWORD) ${REGISTRY}
endif
docker push ${DUBBO_AUTHORITY_IMG}

.PHONY: push-image-ui
push-image-ui: ## Push admin ui images.
push-image-ui: ## Push dubbocp ui images.
ifneq ($(REGISTRY_USER_NAME), "")
docker login -u $(REGISTRY_USER_NAME) -p $(REGISTRY_PASSWORD) ${REGISTRY}
endif
docker push ${DUBBO_ADMIN_UI_IMG}


docker push ${DUBBO_UI_IMG}


KUSTOMIZE_INSTALL_SCRIPT ?= "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh"
.PHONY: kustomize
kustomize: $(LOCALBIN) ## Download kustomize locally if necessary. If wrong version is installed, it will be removed before downloading.
@if test -x $(LOCALBIN)/kustomize && ! $(LOCALBIN)/kustomize version | grep -q $(KUSTOMIZE_VERSION); then \
echo "$(LOCALBIN)/kustomize version is not expected $(KUSTOMIZE_VERSION). Removing it before installing."; \
rm -rf $(LOCALBIN)/kustomize; \
fi
test -s $(LOCALBIN)/kustomize || { curl -Ss $(KUSTOMIZE_INSTALL_SCRIPT) | bash -s -- $(subst v,,$(KUSTOMIZE_VERSION)) $(LOCALBIN); }

.PHONY: controller-gen
controller-gen: $(LOCALBIN) ## Download controller-gen locally if necessary. If wrong version is installed, it will be overwritten.
test -s $(LOCALBIN)/controller-gen && $(LOCALBIN)/controller-gen --version | grep -q $(CONTROLLER_TOOLS_VERSION) || \
GOBIN=$(LOCALBIN) go install sigs.k8s.io/controller-tools/cmd/controller-gen@$(CONTROLLER_TOOLS_VERSION)

.PHONY: swagger-install
swagger-install: $(LOCALBIN) ## Download swagger locally if necessary.
Expand All @@ -289,4 +238,4 @@ golangci-lint-install: $(LOCALBIN) ## Download golangci lint locally if necessar
.PHONY: gofumpt-install
gofumpt-install: $(LOCALBIN) ## Download gofumpt locally if necessary.
test -s $(LOCALBIN)/gofumpt || \
GOBIN=$(LOCALBIN) go install mvdan.cc/gofumpt@$(GOFUMPT_VERSION)
GOBIN=$(LOCALBIN) go install mvdan.cc/gofumpt@$(GOFUMPT_VERSION)
2 changes: 1 addition & 1 deletion app/dubbo-cp/cmd/root.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import (
func GetRootCmd(args []string) *cobra.Command {
// rootCmd represents the base command when called without any subcommands
cmd := &cobra.Command{
Use: "dubbo-admin",
Use: "dubbo-cp",
Short: "Console and control plane for microservices built with Apache Dubbo.",
Long: `Console and control plane for microservices built with Apache Dubbo.`,

Expand Down
4 changes: 2 additions & 2 deletions app/dubbo-cp/cmd/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ func newRunCmdWithOpts(opts cmd.RunCmdOpts) *cobra.Command {
}{}
cmd := &cobra.Command{
Use: "run",
Short: "Launch Dubbo Admin",
Long: `Launch Dubbo Admin.`,
Short: "Launch Dubbo Control plane",
Long: `Launch Dubbo Control plane.`,
RunE: func(cmd *cobra.Command, _ []string) error {
cfg := dubbo_cp.DefaultConfig()
err := config.Load(args.configPath, &cfg)
Expand Down
3 changes: 1 addition & 2 deletions app/dubbo-ui/dist/index.html
Original file line number Diff line number Diff line change
@@ -1,2 +1 @@

<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><title>Dubbo Admin</title><link href=/admin/OpenSans.css rel=stylesheet type=text/css><link rel="shortcut icon" href=/admin/dubbo.ico type=image/x-icon><script src=/admin/echarts-en.min.js></script><link href=/admin/static/css/app.4791f1de.css rel=preload as=style><link href=/admin/static/css/chunk-vendors.52f99f04.css rel=preload as=style><link href=/admin/static/js/app.74d999b7.js rel=preload as=script><link href=/admin/static/js/braceBase.39ce0e20.js rel=preload as=script><link href=/admin/static/js/chunk-vendors.604d7b41.js rel=preload as=script><link href=/admin/static/css/chunk-vendors.52f99f04.css rel=stylesheet><link href=/admin/static/css/app.4791f1de.css rel=stylesheet></head><body><div id=app></div><script src=/admin/static/js/braceBase.39ce0e20.js></script><script src=/admin/static/js/chunk-vendors.604d7b41.js></script><script src=/admin/static/js/app.74d999b7.js></script></body></html>
<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Dubbo Admin</title><link href="OpenSans.css" rel="stylesheet"><link rel="shortcut icon" href="dubbo.ico" type="image/x-icon"><script src="echarts-en.min.js"></script><script defer="defer" src="static/js/braceBase.26ea46f8.js"></script><script defer="defer" src="static/js/chunk-vendors.6ea1db8a.js"></script><script defer="defer" src="static/js/app.13889972.js"></script><link href="static/css/chunk-vendors.90cf4675.css" rel="stylesheet"><link href="static/css/app.4ab00ae8.css" rel="stylesheet"></head><body><div id="app"></div></body></html>
Loading
Loading